对出现的问题简单描述
- 本次用keil5 来调试程序时发现,程序卡在 while循环语句中无法跳出,但根据调试窗口里面观察变量值来看已经不满足 while 循环条件,理应跳出循环
定义的结构体中的变量是:
uint16 DSP_Send_Idle;
DMA将一帧数据发送完成后,会在1ms中断中将变量累加1,发现当结构体变量DSP_Send_Idle赋值不满足while循环条件时,这个while依然跳转不出来,如下是仿真观察到的变量和while不跳出情形,DSP_Modbus_SendGap的宏定义值为2
调试查了半天问题还是没发现具体是哪里出现了问题,然后网上查了一下资料,发现可能是结构体变量被优化的原因造成的,然后我下图中-O1优化等级改为了-O0
然后重新编译启动debug调试后,发现问题得到了解决。还有另外一种方式不通过改变优化等级也可以达到目的,就是在DSP_Send_Idle前面加一个volatile。
至于这样个原因通过网上搜索资料发现:
在进入循环的时候,实际上是将A从内存加载到寄存器里面运行,在整个循环中,A这个变量都只是在读取寄存器里面的值。而当进入中断的时候,中断里面会从内存加载A到寄存器,修改完之后又存到内存里,然后退出中断,再回到循环里面。但这个时候循环里使用的A并没有重新从内存加载A这个变量,所以一直都在循环里面。
一般来说,问题到这里也解决的差不多了,但是在下载固件到板卡时又出现了另外的问题:
将-O1优化等级改为了-O0后,将程序编译下载到板卡上发现程序跑不起来,遂又将优化等级改回-O1,并在DSP_Send_Idle前面加一个volatile,此时将程序重新编译并下载到板卡中,程序能正常运行,网上搜索资料有的说可能是堆栈大小的不对,又去将startup.s文件中的Stack改大,但还是不行,后来,我又看一下KEIL5中 ARM Compiler的选项为 “Use default compiler version 6”,然后改为“Use default compiler version 5”或者“V5.06 update 6(build 750)”后,并将-O1优化等级改为了-O0,重新编译下载到板卡上同样能正常运行。
目前还没有细细研究关于ARM Compiler版本号和程序优化等级之间的关联,后续有时间查到资料了回来再补。