我在没有调试功能的嵌入式平台上工作。所以很难说错误来源是什么。
我在头文件中定义了:
typedef struct cm_packet {
CM_Header Header; //header of packet 3 bytes
uint8_t *Data; //packet data 64 bytes
CM_Footer Footer; //footer of packet 3 bytes
} CM_Packet;
typedef struct cm_inittypedef{
uint8_t DeviceId;
CM_Packet Packet;
} CM_InitTypeDef;
extern CM_InitTypeDef cmHandler;
void CM_Init(CM_InitTypeDef *handler);
CM_AppendResult CM_AppendData(CM_InitTypeDef *handler, uint8_t identifier
, uint8_t *data, uint8_t length);
在实现的某个地方我有:
uint8_t bufferIndex = 0;
void CM_Init(CM_InitTypeDef *cm_initer) { //init a handler
cmHandler.DeviceId = cm_initer->DeviceId;
CM_Packet cmPacket;
cmPacket.Header.DeviceId = cm_initer->DeviceId;
cmPacket.Header.PacketStart = CM_START;
cmPacket.Footer.PacketEnd = CM_END;
//initialize data array
uint8_t emptyBuffer[CM_MAX_DATA_SIZE] = {0x00};
cmPacket.Data = emptyBuffer;
cm_initer->Packet = cmPacket;
}
CM_AppendResult CM_AppendData(CM_InitTypeDef *handler, uint8_t identifier
, uint8_t *data, uint8_t length){
//some check to see if new data does not make Data overflow
uint8_t i;
/*** ERROR HAPPENS HERE!!!! ***/
handler->Packet.Data[bufferIndex++] = identifier;
//now add the data itself
for(i = 0; i < length; i++) {
handler->Packet.Data[bufferIndex++] = data[i];
}
//reset indexer
if(bufferIndex > 64) {
PacketReady(); //mark packet as ready
bufferIndex = 0
};
//return result
}
想法是从一些可以访问handler
的其他源代码更新Packet.Data
。例如,一些其他来源可以调用该 Append
函数来更改 Packet.Data
。但是正如您在代码中看到的那样,我已经对导致微 Controller 进入硬故障模式的地方进行了注释。我不确定这里发生了什么。我所知道的就是在那条线上微进入硬故障模式并且永远不会恢复!
这可能是一个竞争条件,但首先我想知道我写了正确的 c
!!!代码,然后我尝试排除其他问题。
最佳答案
在函数 CM_Init
中,您将 cmPacket.Data
设置为指向本地数组:
uint8_t emptyBuffer[CM_MAX_DATA_SIZE] = {0x00};
cmPacket.Data = emptyBuffer;
在函数范围之外访问此内存地址会产生未定义的行为。
关于c - 尝试更新数组元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812942/