KELl警告: MULTIPLE CALL TO SEGMENT

发布者:文江桂青最新更新时间:2016-07-01 来源: eefocus关键字:KELl警告  MULTIPLE  CALL  SEGMENT 手机看文章 扫描二维码
随时随地手机看文章
今天来说说*** WARNING L15: MULTIPLE CALL TO SEGMENT这个问题!

其实这个问题实际上就是函数重入问题,在操作系统的多线程很常见。应该是引起注意的,有可能引起程序冲突,但是一般时候程序运行不会有问题,但是如果出来问题,那将会是很讨厌的问题.

分析一下 产生这一警告的一个根源是:例如在主循环里调用了一个函数,而在中断服务中,你又一次调用了同样的函数。这样当主循环运行到该函数中时,一旦产生中断,则在中断里又再次调用该函数!而使得该子函数发生了重入,这时,尽管概率很低,但是很可能出错!这样,编译器就给出了警告!告诉你*** WARNING L15: MULTIPLE CALL TO SEGMENT ,表达的意思是发生了重入!字面意思自己理解去吧~~~

想要避免这种情况的方法

一.用reentrant使函数重入

关于reentrant的说明:

1,重入函数不能传递bit类型的参数和变量;

2,重入函数建立的是模拟堆栈区,所以不使用一般函数位于存储模式默认空间的可覆盖式堆栈,而是在同一空间从顶端另行分配一个非覆盖式的重入堆栈。

     small  默认空间是 data;

     compact  默认空间是 pdata;

     largr  默认空间是 xdata;

3,由于要保存参数和局部变量,所以会消耗很大的栈空间;尽量少用这种模式;

4、    在同一程序中可以定义和使用不同存储器模式的重入函数,任意模式的重入函数不能调用不同存储器模式的重入函数,但可以调用普通函数。
5、    实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数。

二.如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用

别的方法没研究出来,嘿嘿~~~对了 我建议用第二种方法好点,第一种有些限制,不爽~~

 

 在其它环境下(比如PC,比如ARM),函数重入的问题一般不是要特别注意的问题.只要你没有使用static变量,或者指向static变量的指针,一般情况下,函数自然而然地就是可重入的.

  但C51不一样,如果你不特别设计你的函数,它就是不可重入的.

  引起这个差别的原因在于:一般的C编译器(或者更确切点地说:基于一般的处理器上的C编译器),其函数的局部变量是存放于堆栈中的,而C51是存放于一个可覆盖的(数据)段中的.

 

WARNING L15: MULTIPLE CALL TO SEGMENT(转--感觉讲的不错)

这个问题必须注意,可能引起程序冲突,假设你用于自动化领域,则可能导致信号产生尖峰。 产生这一警告的一个根源是:你在主循环里调用了一个函数(如aaa),而在中断服务函数里,你用调用了这个函数(如aaa)。这样当主循环运行到该函数中是,一旦产生中断,则在中断里又再次调用该函数!这时,很可能出错! 避免这种情况的方法很多:如,在进中断的时候置需调用该函数的标志,而在主循环中调用该函数
Keil C -WARNING L15: MULTIPLE CALL TO SEGMENT

1.第一种错误信息

***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT:   ?PR?_WRITE_GMVLX1_REG?D_GMVLX1
CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN
CALLER2:   ?C_C51STARTUP

    该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
    出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以
运行,但是相应数据不会丢失)。
    原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。
    例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。
解决方法:
    如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。
    如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlay analysis)中除去,例如:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
   上面的指令防止了该函数使用的内存区被其他函数覆盖。如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外。这种OVERLAY指令能使编译器除去上述警告信息。
   如果函数可以在其执行时被调用,则情况会变得更复杂一些。这时可以采用以下几种方法:
1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数从覆盖分析中除去。
2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。
3.将该函数设为重入型。例如:
void myfunc(void) reentrant 
{
...
}

   这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。
这种方法消耗更多的RAM并会降低重入函数的执行速度。

关键字:KELl警告  MULTIPLE  CALL  SEGMENT 引用地址:KELl警告: MULTIPLE CALL TO SEGMENT

上一篇:关于单片机的using使用
下一篇:Keil的代码优化产生的问题

推荐阅读最新更新时间:2024-03-16 14:59

Android Auto车载系统正在进行大规模的视觉革新
在对新的车载信息娱乐系统进行新一轮革新的过程中,除了加入了新的深色方案,谷歌还简化了导航栏,并添加了用户一直要求的其他功能。 与老版本相比,Android Auto的设计更加流畅、整洁,而且暗色调也让人愉悦。 对于那些只想钻进车里,让信息娱乐系统与安卓手机无缝对接的司机来说,Android Auto已经悄然改变了行业的游戏规则。它功能强大,使用简单,总体上比大多数制造商自己的信息娱乐系统要好几百倍。 谷歌周一宣布,Android Auto正在进行全面的视觉改造,坦率地说,我们很喜欢我们所看到的。虽然它比之前的版本(全黑暗色调)好看多了,但总体设计并没有太大的变化,因此看起来并不陌生。 除了纯粹的视觉增强之外,
[汽车电子]
Android Au<font color='red'>to</font>车载系统正在进行大规模的视觉革新
Loto实践干货(3) 测量CAN总线通讯数据
最近在做运动控制卡的项目,调试样机的过程中,需要验证CAN总线通讯功能的正确性。以前只限于理论上认识CAN总线,使用的CANbus的通讯卡也是有上位机例程,基本上简单地配置上位机软件就可以正常工作了。这次调试需要深入测试CAN接口的通讯过程,正好把之前的对CAN的认识再复习深化一下。 之相对远的距离,在工业现场抗干扰能力也很强。下图是我按照CAN总线的要求做的一条双绞线,黄色和绿色分别是CAN_High线和CAN_Low线。要求绞距20mm,不绞合的距离不超过50mm。所以采用CAN总线,是因为它只需要两根双绞线就可以连接多个通讯节点,并且可以传输 规定的双绞线传输距离与CAN总线的传输速率的关系如下表。我们的传输距离很短
[测试测量]
Lo<font color='red'>to</font>实践干货(3) 测量CAN总线通讯数据
分析称摩托罗拉Moto G利润率低于5%
    腾讯科技 李路 12月7日编译 由于旗舰高档机Moto X销量不尽如人意,谷歌(微博)旗下的摩托罗拉移动近期推出了一款相对廉价的机型Moto G。不过,据市场研究公司TechInsights测算,Moto G的利润率明显低于其他公司的同档次产品。谷歌的低价策略可能让行业领先者苹果和三星置于新的压力之下。 经过拆解,存储空间为16G的Moto G手机,其零组件成本为123美元,而这款产品在美国市场的裸机售价为199美元。再加上其他成本,美国投资银行Sanford C. Bernstein分析师马克·纽曼(Mark Newman)预计,Moto G的营业利润率低于5%。对此,摩托罗拉发言人则称:“我们公司售出的每台设备都挣钱。
[手机便携]
MSP432 MCU 提供多个实时操作系统 (RTOS) 解决方案
当你需要提升产品性能时,你也许会考虑将你现有MSP430 MCU设计移植到TI全新高性能MSP432 MCU平台上。或者,当你需要降低产品功耗时,你也许会考虑将现有的ARM设计移植到我们全新的低功耗MSP432 MCU平台上。用32位ARM系统进行开发时通常需要立即应对多个操作—在这种情况下,实时操作系统 (RTOS) 会派得上用场。 MSP432 MCU提供与数个TI RTOS解决方案(其中包括TI-RTOS和ENergia MT)和第三方RTOS解决方案(其中包括FreeRTOS,ARM CMSIS-RIX和Micrium-OS)的兼容性。 由于无需从头开始创建基本系统软件函数,RTOS的使用可以加快开发进度,并且可以
[单片机]
MSP432 MCU 提供多个实时操作系统 (R<font color='red'>TO</font>S) 解决方案
MOTO新机谍照曝光
   虽然不少人如今对于摩托罗拉的关注都放在MOTO 360这款智能手表上,但现在我们看到的曝光图则是一款摩托罗拉尚未发布的新机。背面很显然采用了凯夫拉材质,因此很可能是摩托罗拉DROID系列的下一款产品。 凯夫拉后盖双摄像头? MOTO新机谍照曝光(图片引自hellemotoHK)   可以看到这款后盖上有两个比较明显的圆孔,有些类似HTC One M8背部的设计,因此这款DROID新品很可能也将采用两颗摄像头,或者是摄像头与传感器的背部组合。这款摩托罗拉新品的发布时间与其他配置都没有公开,我们只能继续等待后期进一步的曝光。
[手机便携]
监测一小步变化的直流电压-Monitoring a Smal
Abstract: Simple level shifting circuit using a precision op amp tracks small DC voltage changes. When we want to capture a low level, long duration signal riding on a much higher DC level, we need to have adequate resolution of the input step and the capacity to offset the large DC level. This is a function that can
[电源管理]
监测一小步变化的直流电压-Moni<font color='red'>to</font>ring a Smal
R&S RTO示波器提供业内首款支持1000Base-T1一致性测试方案
车载以太网已经发展成为标准的通讯架构。汽车工业的主流厂商希望依靠有成本效益的方案来解决车内快速数据传输的需要。最新IEEE 1000Base-T1标准的发布促进了车载以太网的成功部署。罗德与施瓦茨公司在业内首家推出1000Base-T1一致性测试方案。 2017年3月15日,罗德与施瓦茨公司发布R&S RTO-K87选件,成为业内首家支持IEEE 1000Base-T1自动化一致性测试的厂商。车载以太网的快速数据传输是辅助驾驶系统和无人驾驶等应用的关键。罗德与施瓦茨公司作为IEEE和OPEN联盟等国际标准组织的积极参与者,发挥其在这一领域的优势,帮助驱动可靠测试方案的开发。 在R&S RTO数字示波器上,用户现
[汽车电子]
R&S R<font color='red'>TO</font>示波器提供业内首款支持1000Base-T1一致性测试方案
基于TOPSwitch-GX系列的多输出开关电源
1 引言 多路输出开关电源广泛应用在各种复杂小功率电子系统中,就多路输出而言,通常只有输出电压低、输出电流变化范围大的一路作为主电路进行反馈调节控制,以保证在输入电压及负载变化时保持输出电压稳定,由于受变压器各个绕组间的漏感和绕组电阻等的影响,辅助输出电压随输出负载的变化而变化,通常,当主输出满载和辅助输出轻载时,辅助输出电压将升高,而当主输出轻载和辅助输出满时,辅助输出电压将降低,这就是多路输出的负载交叉调整率问题,笔者基于 TOPSwitch-GX系列设计了一种多路输出开关电源,很好的解决了多路输出的负载交叉调整率问题,该电源在各种工况下都能稳定输出,主输出电压纹波小于3%,各路辅助输出纹波小于5%,负载交叉调整率小于5
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved