KEIL5中 ARM Compiler版本号和程序优化等级使用问题

在使用Keil5调试程序时遇到问题,程序在while循环中无法跳出,即使变量已不满足条件。问题由结构体变量优化导致,解决方法是设置-O0优化等级或添加volatile关键字。然而,将优化等级改为-O0后在板卡上运行程序失败,经排查发现可能与ARMCompiler版本和堆栈大小有关,通过调整版本和保持-O0优化,程序最终能正常运行。
摘要由CSDN通过智能技术生成

对出现的问题简单描述

  1. 本次用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版本号和程序优化等级之间的关联,后续有时间查到资料了回来再补。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值