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

BL51: WARNING L13 (RECURSIVE CALL TO SEGMENT) WITH CONSTANTS 解决

xjtudll9年前 (2018-04-21)技术心得16930

问题描述:

 

将函数名存储在table里,通过函数指针的方式调用函数。

编译提示:

BL51: WARNING L13 (RECURSIVE CALL TO SEGMENT) WITH CONSTANTS

使用环境:

C51 Version 7.00

代码例程(使用Keil官方资料来说明):

文件名是:EXAMPLE1.C

void func1 (unsigned char *msg) {

  ;

}

void func2 (void) {

  unsigned char uc;

  func1("xxxxxxxxxxxxxxx");

}

code void (*func_array[])() = { func2 };

void main( void ) {

  (*func_array[0])();

}

编译的时候就会提示:

*** WARNING 13: RECURSIVE CALL TO SEGMENT

SEGMENT: ?CO?EXAMPLE1

CALLER: ?PR?FUNC2?EXAMPLE1

原因:

In this program example, func2 defines a constant string ("xxx...xxx") which is located in the constant code segment ?CO?EXAMPLE1. The definition:

code void (*func_array[])() = { func2 };

generates a reference between segment ?CO?EXAMPLE1 (where the code table is located) and the executable code segment ?PR?FUNC2?EXAMPLE1. Since func2 also refers to segment ?CO?EXAMPLE1, BL51 assumes that there is a recursive call.

官方的解决办法:

RESOLUTION

To avoid this problem, you must manually remove the reference between func2 and the ?CO?EXAMPLE1 segment. The following overlay directive does that:

bl51 EXAMPLE1.OBJ IX OVERLAY (?CO?EXAMPLE1 ~ FUNC2, MAIN ! FUNC2)

?CO?EXAMPLE1 ~ FUNC2 deletes the implied call reference between func2 and the code constant segment in the example. Then, MAIN ! FUNC2adds a reference between MAIN and FUNC2. This is required because main calls func2 indirectly. Note that automatic overlay analysis does not allow for references made to functions via pointers. References of this type must be manually implemented, as in the example above.

另一个办法:

将code void (*func_array[])() = { func2 }; 放在另一个C文件里,这样就规避了所谓的递归调用了。

 

参考文献:

http://www.keil.com/support/docs/2379.htm

http://blog.csdn.net/avideointerfaces/article/details/32687899

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

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

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

标签: keil
分享给朋友:

“BL51: WARNING L13 (RECURSIVE CALL TO SEGMENT) WITH CONSTANTS 解决” 的相关文章

Mac OS安装心得

配置我就不说了,我的是Acer 4738G 安装的系统:东皇V3.2 下载地址:http://www.verycd.com/topics/2887773/ 具体安装教程可参照: 《新手windows下安装苹果教程。最详细,最全面,最值得看的教程》http://bbs.pcbeta.com/v...

BOS单据审核后插件中解锁字段

m_BillInterface.LockCell   Dim dct As KFO.Dictionary     Dim lBillStatusBak As String     lBillStatusBak = m_BillIn...

sqlserver查询数据的所有表名和行数

https://www.cnblogs.com/luxj/p/9227385.html //查询所有表名select name from sysobjects where xtype='u' select * from sys.tables //查询数据库中所有的表名及行数 SELECT a....

windows环境下TortoiseSVN多仓库(repository)转移合并(修改+转载)

http://www.lilin.net/blog/?p=1346 问题: 两个不同的版本库,放在不同的及其上,各有数个项目在里面,为了统一管理,我现在都集中在一个仓库内,然后用金山快盘,多个机器同步。 回答: 完美包含版本信息,把双库融合,方便管理同步。 自己尝试后发现问题...

CrystalDecisions.Windows.Forms.CrystalReportViewer.DisplayGroupTree”已过时

问题:早期工程升级到VS2010 提示: CrystalDecisions.Windows.Forms.CrystalReportViewer.DisplayGroupTree”已过时 解决办法: this.crystalReportViewer1.DisplayGroupTree =...

数模转换器分类

数模转换器分类

权电阻网络DAC (1)电路结构 构成权电阻网络的电阻的阻值,与该位的位权值成反比。 (2)工作原理 运算放大器的Σ点是虚地,该点电位总是近似为零。对于输入二进制数中的任意一位Di有: 若Di=0,流过该位权电阻的电流为Ii=0; 若Di=1,流过该位权电阻的电流为: 所以,流过Di...

发表评论

访客

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