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

Keil优化导致代码出错

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

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优化导致代码出错” 的相关文章

C#让TextBox滚动条一直位于最下部

TextChanged事件 滚动条自动处于TextBox最下部需要在Form1类中加上下段代码:   private void txtReceiveMsgChanged(object sender, EventArgs e) {     //...

二极管电容效应

二极管电容效应

二极管具有电容效应。它的电容包括势垒电容CB和扩散电容CD。 半导体二极管等效模型 1、势垒电容CB PN结内缺少导电的载流子,其电导率很低,相当于介质;而PN结两侧的 P区、N区的电导率高,相当于金属导体。从这一结构来看,PN结等效于一个电容器。 事实上,当PN结两端加正向电压时,PN...

无线网络连接受限

   今天换了个房间,于是原来的网线不够长了,想到Dlink DI-624路由器是无线的,那我就用无线上网的方式,这样就不用跑去买网线了。   说干就干,路由器设置还是非常简单的,无非就是选择连接方式,SSID,然后加密方式,设置密码,保存...

金蝶K3系统单据对应ICTemplate表单ID信息

SELECT FID,FCaption FROM ICTemplate where FFieldName = 'FBillCaption' FID    FCaption A01    外购入库单 A02  &n...

金蝶K3老单插件开发-如何刷新单据、锁定单据

在金蝶K3工业老单插件开发中,用SQL在后台更新了单据数据,如何刷新单据,将新的值显示在单据上?用 m_BillTransfer.DoRefreshControl方法是不行的,需要使用如下方法: m_BillTransfer.BillFunc.ReFillBill 再介绍几个K3工业老单BillFu...

Altium在生成PCB时,怎样取消掉room空间?

Altium在生成PCB时,怎样取消掉room空间?

从原理图生成PCB时 总会生成一个或多个网络区域 该区域ROOM在一般的情况下没有什么作用 反而会对我们的设计会带来一些不便 那怎么样才能取消此区域(room空间)呢! 方法一 在导入到pcb中时 我们执行变更的 选项栏中将room的选项的勾去掉 这样导入pcb时就不会把room导入了 方法二...

发表评论

访客

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