项目场景:
OP操作面板,flash空间不够用,需要优化代码,然后采取优化方式O2,编译通过,但却无法运行
问题描述
`接着上一个话题OP操作面板,一个主机linux+一个单片机OP,二者通过I2C进行通信。具备升级功能。单片机的flash空间位128K,我的设计方案是30K的boot+45K的app运行空间+45K的app备份空间,另外的8K空间用于用户数据存储。
也就是说真正运行代码空间只有45K,虽说flash位128K的。
那这个时候就需要进行代码的优化,采取编译器的O2优化方案。原本41K的运行空间被优化后为35K的空间。感觉不错,烧写代码,发现根本不能用,单步调试根本也没用。
原因分析:
`经过注释分析发现定时器那里出现问题。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c32ee8b130a66a0da1758b573ca43de3.png)
通过定时器我会制作不同时间的标记,注意,volatile 是后来解决问题加入的
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7d7e83918f547da87042432b30380a74.png)
解决方案:
通过加入volatile 完美解决。
学习感悟:
我们学C的时候都知道,volatile是什么意思,易挥发的,容易改变的,面试的时候也会被问到,但是不经历这种问题是不会深刻理解的。中断中的变量时刻会被改变。
最后来一个总结:在中断中用到的变量全部都加上volatile。而如果是全局标记的变量,不怎么参与逻辑的变量也要加上,防止被优化掉,编译器认为这个不用的变量而舍弃
下次我们来聊聊const volatile 的多线程使用方式
爱你的“世外桃源”