打印
[经验分享]

keil5编译器将全局变量优化问题

[复制链接]
760|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mollylawrence|  楼主 | 2024-7-14 06:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
kei5中,对于访问频繁的全局变量,编译器可以尝试将其值分配到处理器的寄存器中。这样可以减少内存访问的开销,提高程序性能。

但是这也会带来难以察觉的bug的

先定义一个全局变量作为任务结束的标志位

static int g=0;
然后编写一个任务,在这个任务执行完之后将标志位置1

static int g=1;
再编写一个任务2,等待任务1执行完成后,再执行任务内容

while( g==0)
但是任务1执行完成后,已经将标志位置一了,通过调试器查看g的值,g的值已经为1,但是程序卡在这里死循环

while( g==0)
原因就是编译器优化了全局变量问题

全局变量到寄存器分配:对于访问频繁的全局变量,编译器可以尝试将其值分配到处理器的寄存器中。这样可以减少内存访问的开销,提高程序性能。

编译器一开始就将g的值放入了处理器的寄存器中,放进去的就是g=0的值,并不去访问ram,而是一直在调用处理器中寄存器的原始值,导致无法运行,解决方法是

static volatile int  g=0;
定义时告诉寄存器,这个值不需要优化,就放到ram里面。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

1483

帖子

1

粉丝