Keil优化导致代码出错
Keil在优化代码的时候,对于一些隐式调用,会出错的。
例如(以下例子来源于参考资料):
你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:
void (*UserProgram)(); //函数指针
UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x00002000
(*UserProgram)();//调用test()函数
这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.
在OSAL的移植到51的过程中,也碰到了类似的问题,OSAL里也是通过指针的方式调用函数的
一旦优化了,OSAL就运行不正常了。
因此,某些时候,某些代码是禁止优化的。
至于Keil如何设置不优化,此处就不赘述了。
参考资料: