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

Keil优化导致代码出错

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

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# 动态加载DLL 通过反射 调用参数、方法、窗体

.net中常会用到动态加载DLL,而DLL中可能包含各种参数、方法、窗体,如何来调用动态加载这些参数、方法、窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System.Reflection命名空间 (1)   AppDomain:应用程序域,可以将...

vs2010添加OLE/COM对象查看器

VS2010:工具——外部工具——"添加" 标题:OLE/COM对象查看器 命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\OleView.Exe 点击&qu...

OKI单片机-如何查看编译后的汇编代码

OKI单片机-如何查看编译后的汇编代码

使用OKI单片机时,有几种情况需要看汇编代码: 1、精确延时,这个用C基本上无法实现; 2、用汇编编程,但某部分程序用汇编写感觉有难度。此时先用C编写,然后查看其汇编代码,借鉴一二。 有两种方式可以看到编译后的汇编代码: 1、程序编译完成后,编译器自动生成各C文件的汇编代码 (1)能看到绝大部分汇编...

DokuWiki数据备份和迁移

DokuWiki数据备份和迁移

DokuWiki只需要备份以下选中的目录即可...

金蝶K3:插件中设置工具栏按钮控件的可见性

'根据单据ID和按钮名称查找该按钮的关键字FKey     'SELECT FKey,* FROM ICClassCtl WHERE FClassTypeID=单据类型ID AND FCaptionc_chs Like '%按钮名称%'   &nbs...

二极管主要技术参数

描述二极管特性的物理量称为二极管的参数,它是反映二极管电性能的质量指标,是合理选择和使用二极管的主要依据。 1、电气参数 (1)正向压降VF VF:Forward Voltage,正向压降。是二极管在规定正向电流IF规定结温Tj下的正向电压。 (2)反向电流IR IR:Reverse Cu...

发表评论

访客

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