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

Keil优化导致代码出错

xjtudll9年前 (2017-02-11)技术心得12840

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://xjtudll.cn/Exp/439/

标签: keil
分享给朋友:

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

BOS自定义单据对应模块后台查找

bos数据大量更改新增之后,会出现数据存放位置忘记的情况,下面为单据及单据转换后台查询对应模块的语句,如有需要可参考查询--自定义单据忘记存放在哪个模块可使用以下语句进行查询SELECT it.FID,it.FFunctionID as FSubSysID,it.FNa...

VS2010:此项目与Visual Studio的当前版本不兼容

VS2010:此项目与Visual Studio的当前版本不兼容

问题: 网上下载了一个C#工程,是用VS2013开发的,但是本地只有VS2010。打开后提示:此项目与Visual Studio的当前版本不兼容 解决办法: 1、用记事本打开解决方案文件“解决方案名.sln”,然后修改最上面两行为如下代码: Microsoft...

Altium Keepout层内覆铜

Altium Keepout层内覆铜

Altium绘制PCB时,PCB Keepout层难免是异形,各种乌七八糟的形状都有可能出现。很多时候,只想在Keepout层内覆铜,该咋办呢? 其实很简单,勾选“Remove Dead Copper”,覆铜时覆盖整个Keepout层,覆铜操作结束后,则只在Keepout...

SQL去掉小数点有效数字后的所有0

第一种方法 select cast(2.5000000000000   as  real) select cast(2   as  real) select cast(2.00000   as  r...

DDS原理

DDS原理

DDS原理框图 假设时钟为2MHz,数据保持寄存器选择N Bit,在时钟驱动下,累加器输出结果S被反馈到累加器输入端B,B和A的数据被累加到S,下一个时钟脉冲又将S反馈到B,再次与A累加到S,下一个时钟脉冲又将S反馈到B,如此循环累加,实现按步进值,按时钟节拍循环累加,使得N Bit数据被徐循...

PHP:Call to undefined function bindtextdomain()

all to undefined function bindtextdomain() bindtextdomain() 是系统函数为什么会出现上面情况 我的是 PHP/5.2.9 (PHP 4, PHP 5) bindtextdomain ? Set...

发表评论

访客

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