Keil代码调试卡住于永久循环的解决方法:突破while(1)循环卡顿

一、情景在现

今天用cubemx配置了个在STM32F407上使用DMA ADC,DMA使用了循环模式、ADC单通道连续转换,然后输出代码,进行编译,然后通过仿真来调试,结果发现程序卡在了循环判断while(1)这步,反正就是不进循环。我一度以为是因为中断的问题,然后又关闭了所有的中断,但是发现还是这样。后来经过查找资料和询问大佬,才解决了这个问题。这里将遇到的问题和解决方法分享给大家!

二、问题点

STM32 编译环境优化等级设置不正确,调试卡在了while(1),不进循环。

三、解决方法

1.选择优化等级为-O0级

2.在对应常变的变量前添加volatlie,防止因编译器优化而忽略

四、所涉知识点

1.编译器优化等级

1)设置不同的优化等级,修改编译器的编译参数

2)debug的时候不开优化

这里的优化主要针对4个方面:

  • 代码的运行效率
  • 生成的目标代码的体积
  • 调试信息是否完整准确
  • 生成目标代码的构建时间长短
  • 等级越高,对目标代码的优化就越多,运行效率就越高,但是在提高了运行效率的同时,会使其它几个方面的变差,比如会增加目标代码的体积、调试信息失真,以及需要更长的编译时间。

    2. volatile关键字

    1)概念:volatile关键字用于修饰变量,告诉编译器该变量的值可能会在程序外部被改变,因此编译器在每次使用该变量时都必须重新从内存中读取其值,而不是使用可能已经存储在寄存器中的缓存值。

    2)用途:在多线程环境下、在硬件访问中、防止编译器优化

    3)注意:

  • volatile只能保证变量的可见性,即一个线程修改了变量的值后,其他线程能够看到这个修改。但它并不能保证操作的原子性、有序性或内存屏障的效果。
  • 在使用volatile时,需要谨慎考虑其适用场景。在不需要volatile的场景下使用它,可能会降低程序的性能。
  • 在多线程编程中,如果需要保证操作的原子性和有序性,可能需要考虑使用其他同步机制(如锁、信号量等)。
  • 这里所涉及具体知识点,可以查看下面两篇文章。

    五、参考资料

    【1】C语言编译的优化等级应该选哪个?O0、O1、O2还是O3_优化等级o3-CSDN博客

    【2】volatile详解(任何人都能懂的那种)-CSDN博客

    作者:小,萌新

    物联沃分享整理
    物联沃-IOTWORD物联网 » Keil代码调试卡住于永久循环的解决方法:突破while(1)循环卡顿

    发表回复