打印
[STM32F1]

一百种方法不如一句volatile

[复制链接]
716|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shipeng1989|  楼主 | 2020-3-22 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shipeng1989 于 2020-3-24 18:17 编辑

移植了网上的一个FSMC驱动LCD程序,由于硬件也完全照抄,代码拷下来后几乎不用改动在STM32CubeIDE环境下直接debug编译就直接出了显示。调整了一下显示界面后准备换为Release编译看。谁能想到居然白屏了!立即mother fucker,Holly shit,卧槽全招呼上,然而它却不为所动。不过换回debug编译它还是能正常显示的这就让我大概猜到了问题出现的原因了,应该是编译器优化导致的。起初我一直以为是优化后导致的执行速度太快导致LCD时序出错才白屏。百度了一下不知道是不是因为我这个问题不好描述还是真没什么人遇到过,网上搜索结果寥寥无几。只看到一篇说白屏可能是FSMC时序配置太快了导致的,但是我这个debug状态是可以正常显示和他的情况应该不太一样,在尝试修改了几次FSMC的时序配置后都无功而返。差点就准备在每句LCD读写操作后都加一条延时语句了。可这不是我的性格,我严重鄙视这种做法,因为它太笨缺乏创造性,还会严重牺牲显示刷新速度不到万不得已我绝不妥协。最后还是想到了volatile这个阻止编译器优化的“特效药”。只需两句volatile便药到病除,久违的显示就出来了。
//LCD地址结构体
typedef struct
{
volatile u16 LCD_REG;
volatile u16 LCD_RAM;
} LCD_TypeDef;

使用特权

评论回复
沙发
mmuuss586| | 2020-3-24 10:15 | 只看该作者
支持

使用特权

评论回复
板凳
zchong| | 2020-3-30 07:43 | 只看该作者
也许是“特效药”,但不是“万能药”,提高医术,对症下药,仍然是解决各种问题的寻常路。

使用特权

评论回复
地板
東南博士| | 2020-3-30 10:03 | 只看该作者
看来 以后所有的变量都加上 volatile  就是万能良方了!

楼主难道没有试过IAR吗?

这个要更好一些!

使用特权

评论回复
5
shipeng1989|  楼主 | 2020-3-31 08:15 | 只看该作者
東南博士 发表于 2020-3-30 10:03
看来 以后所有的变量都加上 volatile  就是万能良方了!

楼主难道没有试过IAR吗?

收费的软件都不敢用了,被奥腾坑过有阴影,volatile会降低编译器的优化效率慎用

使用特权

评论回复
6
kkzz| | 2020-4-1 20:05 | 只看该作者
shipeng1989 发表于 2020-3-31 08:15
收费的软件都不敢用了,被奥腾坑过有阴影,volatile会降低编译器的优化效率慎用 ...

AVRstduio一样           

使用特权

评论回复
7
xiaoqizi| | 2020-4-7 13:43 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
磨砂| | 2020-4-7 13:44 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
晓伍| | 2020-4-7 13:44 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
八层楼| | 2020-4-7 13:44 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
11
观海| | 2020-4-7 13:45 | 只看该作者
非常感谢楼主分享

使用特权

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

本版积分规则

29

主题

134

帖子

1

粉丝