[资料下载] Keil优化导致代码出错

[复制链接]
 楼主| 51xlf 发表于 2023-2-13 10:22 | 显示全部楼层 |阅读模式
Keil在优化代码的时候,对于一些隐式调用,会出错的。
例如(以下例子来源于参考资料):
你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:
void (*UserProgram)();          //函数指针
UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x00002000
(*UserProgram)();//调用test()函数
这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.

jkl21 发表于 2023-3-3 20:48 | 显示全部楼层
编译优化选择设置为0(不优化)就可以了。
primojones 发表于 2023-3-3 20:55 | 显示全部楼层
keil如何防止代码被优化?              
uiint 发表于 2023-3-3 21:10 | 显示全部楼层
Keil在优化代码的时候,对于一些隐式调用,会出错的。
hilahope 发表于 2023-3-3 21:16 | 显示全部楼层
Keil并不完美,有些优化方式存在bug
plsbackup 发表于 2023-3-3 21:21 | 显示全部楼层
有些优化也并不是编程者所需的目的,会导致程序流程与编程预期不符。
sdlls 发表于 2023-3-3 21:44 | 显示全部楼层
貌似代码有被优化掉               
mmbs 发表于 2023-3-3 21:50 | 显示全部楼层
好久好久以前,出现过keil编译优化错误,无编译错误提示,但是,逻辑却是错的。
gygp 发表于 2023-3-3 22:15 | 显示全部楼层
优化级别越高,出问题的可能性越大。
nomomy 发表于 2023-3-3 22:24 | 显示全部楼层
KEIL代码执行异常?              
kmzuaz 发表于 2023-3-4 12:59 | 显示全部楼层

开发既要代码小,又想速度快,该如何优化?
vivilyly 发表于 2023-3-4 19:29 | 显示全部楼层
之前遇到过,当优化级别为o1时,程序中局部变量值被突然更改;程序运行uart发送时,会进入HardFault_Handler
backlugin 发表于 2023-3-5 10:43 | 显示全部楼层
之前遇到过,当优化级别为o1时,程序中局部变量值被突然更改;程序运行uart发送时,会进入HardFault_Handler
tifmill 发表于 2023-3-5 10:53 | 显示全部楼层

开发既要代码小,又想速度快,该如何优化?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

9919

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部

547

主题

9919

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部