Cod*_*oet 4 c embedded optimization
我有一些嵌入式代码将命令写入内存地址以控制外围,如下所示:
void intelStartEraseBlock(uint16_t *wordAddress) {
*wordAddress = 0x20; //block erase
*wordAddress = 0xD0; //block erase confirm
}
Run Code Online (Sandbox Code Playgroud)
我怀疑优化器正在跳过第一个任务.这是不稳定的工作吗?还是有更好的解决方案......
注意:这是遗留的api代码,所以我不打算重构很多.我在这里寻找'本地'解决方案.
是的,只需声明wordAddress为volatile数据指针:
void intelStartEraseBlock(volatile uint16_t *wordAddress) {
...
}
Run Code Online (Sandbox Code Playgroud)
该volatile关键字告诉语义都必须由C语言规定的抽象虚拟机匹配的编译器-换句话说,每次写入一个volatile变量,代码实际上写入内存,每次你读从volatile变量中,代码必须实际从内存中读取.
即使编译器认为它们是冗余的,也不允许编译器优化掉这些读写操作.
需要注意的是它必须是指向的数据被声明volatile,而不是指针本身.与const关键字一样,它会产生很大的不同.因为wordAddress它本身是堆栈中的变量,所以我们不关心它的读/写实际上是去堆栈内存,但是我们关心它指向的内存(可能是某种类型的内存映射I/O)实际上是读/写的.