keil5编译时出现这个怎么办?

很多人在用keil5时编译项目无错误无警告但是程序右边会出现红色叉号,如下图所示

这是因为keil新增的同步查错功能,想要关闭的方法是:

4 //其他属性和方法。。。。 13 //其他属性方法的初始化。。。。 25 //以上为类定义部分,下面为该类的一个实例,执行updata方法 28 //编译时出现的错误提示,指向第26行的代码

。解决方法有两种,一种是将这个函数指针说明为可重入函数(reentrant);另一种是根据参数指针指向的存储空间类型,给该参数指针加上相应的类型限制,以便编译器正确翻译成相应的汇编代码。

  经过尝试,这两种方法都可解决该问题。

  但是,方法一会导致另一种错误,并且错误的位置不固定,去掉几条代码编译时指示某个函数错误,加上几条代码又指示另一个函数错误,反复检查代码又不存在问题。错误提示为:error l121: improper fixup。检索后大概原因是将函数标记位 reentrant 后,会导致调用函数时将更多的信息压入栈区,而8051的栈空间过小,从而导致该错误。

  方法二是个不错的选择,如果该参数指针指向 xdata 区,只需要在函数声明时,给该指针参数前加上 xdata 修饰即可。上面代码片段第5行相应位置添加 xdata 即可:

下面是该文章的原文,对应的翻译标记为黄色。

C51:向间接调用函数传递参数



我使用面向对象技术使用了函数指针。大多数时间程序运行正常。但是,当试图向函数传递几个指针类型的参数时,编译出现以下错误信息:

与大多数16位和32位微控制器不同,8051不是基于堆栈的体系结构。当参数不适合CPU寄存器时,Keil Cx51编译器默认使用直接内存定位的方式传递参数。这种技术生成高效的代码,但限制了传递给间接调用函数的参数。当通过函数指针传递给函数的参数无法装入寄存器时,编译器无法确定在内存中放置参数的位置,因为函数在调用时是未知的。

  1. 创建可重入函数。编译器模拟了一种基于堆栈的体系结构,它可以将几乎无限数量的参数传递给间接调用的函数。例如:  

  限制参数的数量和类型,使它们都适合CPU寄存器。当您需要最佳性能或程序大小非常重要时,请执行此操作。例如:

《C51/Cx51编译器用户指南》中描述了参数传递方法。请参阅此项以确定如何更改函数参数以适应寄存器。

我要回帖

更多关于 keil编译时出现L48 的文章

 

随机推荐