01前言在嵌入式软件的开发中,由于代码质量差,线程冲突,堆栈溢出等问题,会引起Arm's HardFault。
这种异常通常具有偶然性,不确定性和重复发生的特点。
同时,软件在重复运行后已经失控,很难找到程序异常的地方以及异常时的临时变量环境。
在开发中出现此问题后,通常意味着很长的时间来重现问题并进行调试,并且常常陷入无知的调查之中,这消耗了大量的程序员。
头发。
现在,我总结了一些处理此类共享问题的经验。
02串行端口打印跟踪在代码中插入要打印的串行端口,并查看崩溃时最后一个串行端口信息的输出位置。
但是,从代码中的串行端口输出到硬件输出数据存在一定的延迟。
错误代码在最后一个输出串行端口后面,无法准确定位。
找到近似的误差范围后,请根据经验验证代码以查看是否存在明显的误差。
03仿真器跟踪有必要使用仿真器跟踪串行端口崩溃的搜索时间何时超过两个小时。
在代码中插入一个全局变量,并在每个部分中为该全局变量分配一个值。
在中断的void HardFault_Handler(void)函数中设置一个断点。
当机器崩溃时,输入断点以查看全局变量的值以确定崩溃位置。
另外,崩溃是在视图->调用堆栈中看到错误时调用的函数,以及该函数中局部变量的值,并且可以从该信息中推断出错误的原因。
。
04在堆栈中查找最后一条语句。
在中断HardFault_Handler中放置一个断点,程序运行后将在此处停止:在寄存器中找到R14(LR)的值。
在内存中找到MSP的值:0x20008828,然后在相应的行中找到地址:右键单击“反汇编”,然后选择“在地址处显示代码”。
搜索您刚得到的地址,即可找到相应的代码。
此处的代码是进入循环中断之前的情况。
仔细检查函数的此部分的调用或数组的内存使用情况。
05避免问题除以零。
例如:N = 0; Sum = 0; for(i = a; i& lt; b; i ++){Sum + = x [i]; N ++;}和/ = N;当a> b时,N为0,则发生错误。
建议:在每个除法之前判断除数是否为0。
if(N& gt; 0){和/ = N;}数据超出范围。
例如:U8 x [100]; N = 0; Sum = 0; // a和b是根据上述(i = a; i< b; i ++){ + = x [i]; N ++;}当b& gt; 100,数组超出范围。
建议:在调用数组之前,判断它是否在数组范围内。
for(i = a; i& lt; b; i ++){if(b& lt; 100){Sum + = x [i]; N ++; }}负值小于因负值引起的超出范围。
U16 a,b,c; U8 x [100]; a = b-c; //呼叫x [a]。
当b建议时:1.确定减号和减号的大小。
2.在调用数组之前,判断它是否在数组范围内。
堆栈溢出。
函数中的局部变量数组太大,超过了堆栈的大小。
建议:在较大的局部变量之前添加“静态”,或将局部变量更改为全局变量。
中断与循环冲突。
同时在中断和循环中写入变量。
编程时避免使用此措辞。
任务冲突。
多个任务同时写入相同的变量而发生冲突。
编程时避免使用此措辞。
免责声明:本文内容经21ic授权后发布,版权归原作者所有。
该平台仅提供信息存储服务。
本文仅代表作者的个人观点,并不代表该平台的立场。
如有任何疑问,请与我们联系,谢谢!