当前位置:首页 > 技术心得 > 正文内容

Keil优化导致代码出错

xjtudll10年前 (2017-02-11)技术心得18670

Keil在优化代码的时候,对于一些隐式调用,会出错的。

例如(以下例子来源于参考资料):

你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:

void (*UserProgram)();          //函数指针

UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x00002000

(*UserProgram)();//调用test()函数

这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.

在OSAL的移植到51的过程中,也碰到了类似的问题,OSAL里也是通过指针的方式调用函数的

clip_image001[1]

一旦优化了,OSAL就运行不正常了。

因此,某些时候,某些代码是禁止优化的。

至于Keil如何设置不优化,此处就不赘述了。

参考资料:

http://blog.csdn.net/bendyning/article/details/8091631

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://www.xjtudll.cn/Exp/439/

标签: keil
分享给朋友:

“Keil优化导致代码出错” 的相关文章

Android Studio xml编译error: Apostrophe not preceded by \

Android Studio xml编译error: Apostrophe not preceded by \

问题: Resource Path Location Type error: Apostrophe not preceded by \ (in Search' Titles) strings.xml 原因: 在string.xml中使用了转义字符 解决办法: 在编译出...

Xcode:failed to get the task for process XXX 解决办法

问题:     iOS真机调试程序,报如下错误信息:failed to get the task for process XXX 原因: 证书问题,project和target的证书都必须是开发证书,不能用分发证书。 解决方案:     p...

Mac OS :安装老旧的 Java SE 6 运行环境

问题描述: 某个旧app 需要安装旧 Java SE 6 运行环境 解决办法: 从下面的链接下载javaforosx.dmg并安装,然后再执行上面出错的app,问题就可以解决了。 https://support.apple.com/kb/DL1572?viewlocale=zh_CN&loc...

Office 2003正版验证破解方法

唉,公司电脑自动更新后,突然提示我Office是盗版,于是每次打开office文件,都会提示盗版,任务栏也有个图标。在网上搜索了一下,找到了解决办法。操作如下:运行:regedit命令,打开注册表删除注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\1...

source insight导入配置文件

source insight导入配置文件

Source insight的配置文件默认路径如下:\Documents\Source Insight\Settings 中文版本的在: \我的文档\Source Insight\设置 option -- load configuration可以选择source insight使用的配置文件。 &...

sqlserver数据库触发器调用外部exe

sqlserver数据库触发器调用外部exe

https://www.cnblogs.com/syp1Blog/p/9482088.html sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行。 使用master..xp_cmdshell 之...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。