一、成绩复现本文援用地点:稳固复现成绩才干准确的对成绩停止定位、处理以及验证。个别来说,越轻易复现的成绩越轻易处理。1.1 模仿复现前提有的成绩存在于特定的前提下,只要要模仿呈现成绩的前提即可复现。对依附外部输入的前提,假如前提比拟庞杂难以模仿能够斟酌顺序里预设直接进入对应状况。1.2 进步相干义务履行频率比方某个义务长时光运转才呈现异样则能够进步该义务的履行频率。1.3 增年夜测试样本量顺序长时光运转后呈现异样,成绩难以复现,能够搭建测试情况多套装备同时停止测试。二、成绩定位缩小排查范畴,确认引入成绩的义务、函数、语句。2.1 打印LOG依据成绩的景象,在抱有疑难的代码处增添LOG输出,以此来追踪顺序履行流程以及要害变量的值,察看能否与预期符合。2.2 在线调试在线调试能够起到跟打印LOG相似的感化,别的此方式特殊合适排查顺序瓦解类的BUG,当顺序堕入异样中止(HardFault,看门狗中止等)的时间能够直接STOP检查call stack以及内核存放器的值,疾速定位成绩点。2.3 版本回退应用版本治理东西时能够经由过程一直回退版本并测实验证来定位初次引入该成绩的版本,之后能够缭绕该版本增改的代码停止排查。2.4 二分解释二分解释即以相似二分查找法的方法解释失落局部代码,以此断定成绩能否由解释失落的这局部代码惹起。详细方式为将与成绩不相关的局部代码解释失落一半,看成绩能否处理,未处理则解释另一半,假如处理则持续将解释范畴缩小一半,以此类推逐步缩小成绩的范畴。2.5 保留内核存放器快照Cortex M内核堕入异样中止时会将多少个内核存放器的值压入栈中,如下图:咱们能够在堕入异样中止时将栈上的内核存放器值写入RAM的一段复位后保存默许值的地区内,履行复位操纵后再从RAM将该信息读出并剖析,经由过程PC、LR确认事先履行的函数,经由过程R0-R3剖析事先处置的变量能否异样,经由过程SP剖析能否可能呈现栈溢出等。三、成绩剖析处置联合成绩景象以及定位的成绩代码地位剖析形成成绩的起因。3.1 顺序持续运转3.1.1 数值异样3.1.1.1 软件成绩· 数组越界写数组时下标超越数组长度,招致对应地点内容被修正。如下:此类成绩平日须要联合map文件停止剖析,经由过程map文件察看被改动变量地点邻近的数组,检查对该数组的写入操纵能否存在如上图所示不保险的代码,将其修正为保险的代码。· 栈溢出如上图,此类成绩也须要联合map文件停止剖析。假设栈从洼地址往低地点增加,假如产生栈溢出,则g_val的值会被栈上的值笼罩。呈现栈溢出时要剖析栈的最年夜应用情形,函数挪用层数过多,中止效劳函数内停止函数挪用,函数外部声名了较年夜的常设变量等都有可能招致栈溢出。处理此类成绩有以下方式:在计划阶段应当公道调配内存资本,为栈设置适合的巨细;将函数内较年夜的常设变量加”static”要害字转化为静态变量,或许应用malloc()静态调配,将其放到堆上;转变函数挪用方法,下降挪用层数。· 断定语句前提写错断定语句的前提轻易把相称运算符“==”写成赋值运算符“=”招致被断定的变量值被变动,该类过错编译期不会报错且老是前往真。倡议将要断定的变量写到运算符的左边,如许错写为赋值运算符时会在编译期报错。还能够应用一些静态代码检讨东西来发明此类成绩。· 同步成绩比方操纵行列时,出队操纵履行的进程中产生中止(义务切换),而且在中止(切换后的义务)中履行入队操纵则可能损坏行列构造,对这类情形应当操纵时关中止(应用互斥锁同步)。· 优化成绩如上图顺序,本意是等候irq中止之后不再履行foo()函数,但被编译器优化之后,现实运转进程中flg可能被装入存放器而且每次都断定存放器内的值而不从新从ram里读取flg的值,招致即便irq中止产生foo()也始终运转,此处须要在flg的声名前加“volatile”要害字,强迫每次都从ram里获取flg的值。3.1.1.2 硬件成绩· 芯片BUG芯片自身存在BUG,在某些特定情形下给单片机前往一个过错的值,须要顺序对读回的值停止断定,过滤异样值。· 通讯时序过错比方电源治理芯片Isl78600,假设当初两片级联,当同时读取两片的电压采样数据时,高端芯片会以牢固周期经由过程菊花链将数据传递到低端芯片,而低端芯片上只有一个缓存区.假如单片机不在划定时光内将低端芯片上的数据读走那么新的数据到来时将会笼罩以后数据,招致数据丧失。此类成绩须要细心剖析芯片的数据手册,严厉满意芯片通讯的时序请求。3.1.2 举措异样3.1.2.1 软件成绩· 计划成绩计划中存在过错或许疏漏,须要从新评审计划文档。· 实现与计划不符代码的实现与计划文档不符合须要增添单位测试笼罩全部前提分支,停止代码穿插review。· 状况变量异样比方记载状况机以后状况的变量被改动,剖析该类成绩的方式同前文数值异样局部。3.1.2.2 硬件成绩· 硬件生效目的IC生效,接受把持指令后不举措,须要排查硬件。· 通讯异样与目的IC通讯过错,无奈准确履行把持下令,须要应用示波器或逻辑剖析仪去察看通讯时序,剖析能否收回的旌旗灯号错误或许遭到外部烦扰。3.2 顺序瓦解3.2.1 结束运转3.2.1.1 软件成绩· HardFault,以下情形会形成HardFault:在外设时钟门未使能的情形下操纵该外设的存放器;跳转函数地点越界,平日产生在函数指针被改动,排查方式同数值异样;解援用指针时呈现对齐成绩。以小端序为例,假如咱们申明了一个强迫对齐的构造体如下:此时a.val1的地点为0x00000001,假如以uint16_t范例去解援用此地点则会由于对齐成绩进入HardFault,假如必定要用指针方法操纵该变量则应该应用memcpy()。· 中止效劳函数中未肃清中止标记中止效劳函数退出前不准确肃清中止标记,当顺序履行从中止效劳函数内退出后又会破刻进入中止效劳函数,表示出顺序的“假逝世”景象。· NMI中止调试时曾碰到SPI的MISO引脚复用NMI功效,当经由过程SPI衔接的外设破坏时MISO被拉高,招致单片机复位后在把NMI引脚设置成SPI功效之前就直接进入NMI中止,顺序挂逝世在NMI中止中。这种情形能够在NMI的中止效劳函数内禁用NMI功效来使其退出NMI中止。3.2.1.2 硬件成绩· 晶振未起振· 供电电压缺乏· 复位引脚拉低3.2.2 复位3.2.2.1 软件成绩看门狗复位除了喂狗超时招致的复位以外,还要留神看门狗设置的特别请求,以Freescale KEA单片机为例,该单片机看门狗在设置时须要履行解锁序列(向其存放器持续写入两个差别的值),该解锁序列必需在16个总线时钟内实现,超时则会惹起看门狗复位。此类成绩只能熟读单片机数据手册,留神相似的细节成绩。3.2.2.2 硬件成绩· 供电电压不稳· 电源带载才能缺乏四、回归测试成绩处理后须要停止回归测试,一方面确认成绩能否不再复现,另一方面要确认修正不会引入其余成绩。五、教训总结总结本次成绩发生的起因及处理成绩的方式,思考相似成绩以后怎样防备,对雷同平台产物能否值得鉴戒,做到触类旁通,从掉败中汲取教训。版权申明:本文起源收集,收费转达常识,版权归原作者全部。如波及作品版权成绩,请接洽我停止删除。