Browse Source

优化内存使用

master
zhaohe 2 years ago
parent
commit
4da6d69b36
  1. 5
      components/zcancmder/basic.hpp
  2. 6
      components/zcancmder/zcanreceiver.cpp
  3. 13
      components/zcancmder/zcanreceiver_master.cpp
  4. 7
      components/zcancmder/zcanreceiver_master.hpp
  5. 2
      components/zprotocols/zcancmder_v2

5
components/zcancmder/basic.hpp

@ -15,8 +15,9 @@ typedef enum {
} packet_type_t;
typedef struct {
CAN_RxHeaderTypeDef pHeader;
uint8_t aData[8]; /*8byte table*/
// CAN_RxHeaderTypeDef pHeader;
uint8_t dlc;
uint8_t aData[8]; /*8byte table*/
} CANPacket;
}; // namespace zcr

6
components/zcancmder/zcanreceiver.cpp

@ -322,7 +322,7 @@ void ZCanCmder::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle)
}
if (rxbuf->m_canPacketNum < 255) {
rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader;
rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC;
memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8);
rxbuf->m_canPacketNum++;
}
@ -344,8 +344,8 @@ void ZCanCmder::loop() {
if (rxbuf->dataIsReady) {
int dataoff = 0;
for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) {
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].pHeader.DLC);
dataoff += rxbuf->m_canPacket[i].pHeader.DLC;
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc);
dataoff += rxbuf->m_canPacket[i].dlc;
}
rxbuf->rxdataSize = dataoff;

13
components/zcancmder/zcanreceiver_master.cpp

@ -166,6 +166,9 @@ int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModu
return errocode;
}
void ZCanCommnaderMaster::sendRawPacket(uint8_t *packet, size_t len) { sendPacket(packet, len); }
void ZCanCommnaderMaster::regRawPacketListener(rawpacket_t rawpacketcb) { m_rawpacketcb = rawpacketcb; }
int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t subModuleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff;
cmdheader->packetType = kptv2_cmd;
@ -263,6 +266,10 @@ bool ZCanCommnaderMaster::isListenerReg(uint16_t index) {
void ZCanCommnaderMaster::callListener(CanPacketRxBuffer *report) {
uint16_t index = report->get_cmdheader()->packetindex;
if (m_rawpacketcb) {
m_rawpacketcb(report->get_data(), report->get_datalen());
}
if (report->get_cmdheader()->packetType == kptv2_ack || report->get_cmdheader()->packetType == kptv2_error_ack) {
zlock_guard l(m_on_packet_map_lock);
auto it = m_on_packet_map.find(index);
@ -454,7 +461,7 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c
rxbuf->lastrxtime = zos_get_tick();
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) {
rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader;
rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC;
memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8);
rxbuf->m_canPacketNum++;
}
@ -479,8 +486,8 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_Error(CAN_HandleTypeDef *canHandle) {
void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) {
int dataoff = 0;
for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) {
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].pHeader.DLC);
dataoff += rxbuf->m_canPacket[i].pHeader.DLC;
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc);
dataoff += rxbuf->m_canPacket[i].dlc;
rxbuf->rxdataSize = dataoff;
}
if (rxbuf->lostpacket) {

7
components/zcancmder/zcanreceiver_master.hpp

@ -17,6 +17,8 @@ class ZCanCommnaderMasterListener {
zcan_commnader_master_onpacket_t on_ack;
};
typedef function<void(uint8_t *packet, size_t len)> rawpacket_t;
class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
public:
class CFG {
@ -58,6 +60,8 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
uint16_t m_index_off = 0;
onpacket_t m_on_event;
rawpacket_t m_rawpacketcb = nullptr;
zmutex txlock;
public:
@ -70,6 +74,9 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
virtual int32_t sendCmdAndReceiveBuf(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) override;
virtual void regEventPacketListener(onpacket_t on_event) override;
void sendRawPacket(uint8_t *packet, size_t len);
void regRawPacketListener(rawpacket_t rawpacketcb);
public:
virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);

2
components/zprotocols/zcancmder_v2

@ -1 +1 @@
Subproject commit 445108a21644b9b770452e7f463615e248f5c504
Subproject commit 222df2f465a817d54f5d0589d167ac3690c5716e
Loading…
Cancel
Save