问题描述
我在C语言中解析字符串时遇到问题。它最终导致HardFault
。
MCU:LPC1769, 操作系统:FreeRTOS 10, 工具链:IAR
为了进行测试,如果我继续发送相同的数据帧(您可能会在message
函数的parseMessage
变量中看到以下示例),
经过5到6次解析后,解析正常,解析按预期进行,然后在我向函数再发送一个完全相同的字符串时突然陷入HardFault
。
我在OnlineGDB中测试了该功能。我还没有发现任何问题。
尽管结果相同,但我在下面的函数中有几个稍微不同的版本;
char *substr3(char const *input,size_t start,size_t len) {
char *ret = malloc(len+1);
memcpy(ret,input+start,len);
ret[len] = '\0';
return ret;
}
为了更好地进行监控,我提取了功能块:
(不必注意stripEOL(message);
调用,它只是去除行尾字符,但是您可以在我的gdbonline份额中看到它)
void parseMessage(char * message){
//char* message= "7E00002A347C31323030302D3132353330387C33302E30372E323032307C31317C33307C33317C31352D31367C31357C317C57656E67657274880D";
// Parsing the frame
char* start;
char* len;
char* cmd;
char* data;
char* chksum;
char* end;
stripEOL(message);
unsigned int messagelen = strlen(message);
start = substr3(message,2);
len = substr3(message,2,4);
cmd = substr3(message,6,2);
data = substr3(message,8,messagelen-8-4);
chksum = substr3(message,messagelen-4,2);
end = substr3(message,messagelen-2,2);
}
只有data
变量的长度不同。
例如数据->“ 347C31323030302D3132353330387C33302E30372E323032307C31317C33307C33317C31352D31367C31357C317C57656E67657274”
HardFault调试日志:
LR = 0x8667处于反汇编状态
PC = 0x2dd0反汇编
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)