WordPress主题中文主题,合肥网站推广优化公司,建立一个平台需要几部分,自适应网站开发教程arm下gcc编译添加 -Ox 优化后#xff0c;程序无法正常运行
一、问题描述
今天学习正点原子的阿尔法开发板裸机开发的时候#xff0c;遇到了一个问题#xff0c;在没有使用 -Ox 优化的时候#xff0c;编译出来的程序能够正常运行#xff0c;但是添加了-Ox之后#xff0c…arm下gcc编译添加 -Ox 优化后程序无法正常运行
一、问题描述
今天学习正点原子的阿尔法开发板裸机开发的时候遇到了一个问题在没有使用 -Ox 优化的时候编译出来的程序能够正常运行但是添加了-Ox之后程序运行就出了问题。
二、问题查找与解决
最开始还以为是自己敲的代码和视频中的代码出入比较大影响到了程序的运行不过事实证明发现过程比较复杂这里就不详写了也确实是下面是两者的差异代码前者是我自己写的后者是视屏中的
//我写的
void Delay(volatile unsigned int n) {unsigned int n_s 0;while(n --) {n_s 0x7FF;while(n_s --);}
}//官方例程
void Delay_Short(volatile unsigned int n)
{while(n--){}
}void Delay(volatile unsigned int n) {while(n--) {Delay_Short(0x7ff);}
}在逻辑上确实没啥大问题但是编译出来的效果却截然不同后者能够正常运行前者运行就是异常的最终发现差异就在一个平时很少见的关键词 volatile我写的 unsigned int n_s 0; 就没有添加 volatile 前缀后面把前缀加上问题就解决了程序也能正常运行了。
//以下代码能够正常运行
void Delay(volatile unsigned int n) {volatile unsigned int n_s 0;while(n --) {n_s 0x7FF;while(n_s --);}
}三、总结
本次问题的最终问题就出在一个关键词上边做了三年的嵌入式开发了遇到使用 volatile 关键词来修饰的变量屈指可数一直觉得这个关键词不重要唯一影响深刻的就是在学习 stm32 的时候正点原子介绍一种叫做位带操作的时候出现过一次其他时候出现的概率都很小不过最主要还是没遇到过 -Ox 这种编译优化今天也是无意中遇到了然后特意学习了一下明白了大致原因经过 -Ox 编译优化处理过后的一些数据会被一直放在寄存器中内存不会对其进行再次写入操作所以他的值得不到改变所以最终导致了程序运行异常这种操作叫做 内存覆盖所以程序会运行异常。
参考博文 1.《C语言关键字详解五带你全面了解 volatile 关键字》 https://blog.csdn.net/m0_62391199/article/details/123746218 2.《C语言丨深入理解volatile关键字》 https://blog.csdn.net/m0_53157173/article/details/129344954
学习分享一起成长以上为小编的经验分享若存在不当之处请批评指正