历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2018年12月19日 | 在中断函数和MAIN函数中同时调用同一个函数的有趣现象

2018-12-19 来源:eefocus

此处的信息适用于:


C51所有版本


症状


我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告:


***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?_WRITE_GMVLX1_REG?D_GMVLX1

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP


***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?_SPI_SEND_WORD?D_SPI

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP


***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?SPI_RECEIVE_WORD?D_SPI

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP


上面这些都是什么?我该如何解决这个问题呢?


原因


Warning 15向我们表明了linker发现了一个函数,这个函数不仅在main code里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。


这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。


另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。


举例来说,对于你的第一个警告,WRITE_GMVLX1_REG是会被多个root所调用。其被定义在D_GMVLX1.C或者D_GMVLX1.A51中。他不仅会被ISR(或者被ISR调用的函数)而且也会被MAIN.C中的VSYNC_INTERRUPT函数所调用。


解决方法


有几种方法去解决这个问题


如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告。


如果此函数使用了内存,你就要使用OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下:


OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)


如上语句能阻止被此函数使用的内存遭到覆盖。如果这个函数调用了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。


如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。你可能需要:


无论何时当从main中调用此函数时,需要关闭中断。你可能需要对被调用的函数使用#pragma disable。你也必须使用OVERLAY directive将此函数从overlay analysis中移除。


为此函数创建两个副本。一个给main,一个给ISR。


使此函数可重入。举例如下:

void myfunc(void) reentrant {

 ...

}


上面的定义会产生一个用来存储参数和本地变量的可重入的栈。如果使用了这种方法那么这个可重入的栈必须在STARTUP.A51中配置。这样会花费更多的RAM并且会减缓可冲入函数的执行。


推荐阅读

史海拾趣

Eurofarad公司的发展小趣事

Eurofarad,作为Exxelia Technologies旗下的知名品牌,自1965年成立以来,就专注于电子元件的设计和制造。在创立初期,Eurofarad凭借对电子技术的深入研究和对市场需求的敏锐洞察,迅速推出了多款高性能、高质量的电子元件产品。这些产品在市场上获得了广泛的认可,为Eurofarad的后续发展奠定了坚实的基础。

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
监控人员进出,确保安全。
埃派克森微电子(Apexone)公司的发展小趣事

自2002财年以来,埃派克森微电子的业绩呈现出连续增长的态势。公司凭借出色的产品性能和市场竞争力,成功打入多家国内外知名企业,逐渐在目标市场占据了一席之地。经过数年的发展,埃派克森在全球模拟芯片供应商中已占据重要地位,其产品在通讯核心芯片、多媒体电子、消费电子、汽车电子等领域均有着广泛的应用。

ETERNA公司的发展小趣事

随着中国市场的崛起,ETERNA开始将目光投向了亚洲市场。2011年,中国从德国保时捷家族手中接过ETERNA的旗帜,开始在全球大力拓展ETERNA品牌。在中国市场的推动下,ETERNA的知名度和影响力不断提升。同时,公司还加强了与其他国家和地区的合作与交流,通过参加国际展会和举办品牌活动等方式,进一步扩大了品牌影响力。这些努力使ETERNA在全球电子行业中逐渐崭露头角,成为了一个备受瞩目的品牌。

Eclipse Magnetics公司的发展小趣事

1995年,ETERNA被保时捷家族收购,为公司的发展注入了新的活力。保时捷家族对制表业有着深厚的兴趣,他们投入大量资金用于研发和生产。在保时捷家族的支持下,ETERNA不断推出具有创新性的产品,如Spherodrive系统和超薄自动上炼机芯3030等。这些技术的成功应用,使ETERNA在制表业中取得了举足轻重的地位。同时,保时捷家族还通过全球营销战略,将ETERNA品牌推向了更广阔的市场。

达晶微(CREATEK)公司的发展小趣事

达晶微(CREATEK)公司成立于XXXX年,由一群具有丰富半导体行业经验的专家创立。公司初期主要专注于IGBT、MOSFET、FRD、TVS、SBD等功率半导体芯片与器件的研发。凭借其对技术的深刻理解和市场需求的敏锐洞察,达晶微迅速在市场中崭露头角。

问答坊 | AI 解惑

CORTEX核现状之我见

CORTEX核现状之我见 ARM 在推出CORTEX核时,最先应用到芯片的是Luminary,但其没做好产品宣传业绩平平,现被TI收购,可以说举国投降。后来,ST及其它厂家都在推CORTEX核,而ST抓住先机,首先投产并不断打市场这张牌。现基本占领大部市场,但其采用 ...…

查看全部问答>

LED芯片知识-MB、GB、TS、AS芯片定义与特点

replyreload += \',\' + 384096;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

CE6编译错误

编译时候出现如下错误 找不到 C:\\WINCE600\\platform\\smdk2416\\*.bif 开发板给的BSP 我编译的时候没有改里面的任何东西 直接编译 高手看下是什么问题…

查看全部问答>

哪位有fault tolerent 系统的相关资料?

哪位有fault tolerent 系统的相关资料?…

查看全部问答>

来晚了,先秀一下PCB

这段时间工作太忙了,现在这段时间刚好是我们这行最忙的时候。还在等几样元器件,挺难申请的,又买不到!…

查看全部问答>

PWM波形的相位调节

最近看了这个方面的资料,看到好像没有介绍这个相位方面调节的内容,请问各位高手,2407或2812的怎么调节产生的PWM波形阿,比如让其相位相差90度等等,谢谢先,忘高手尽快回答…

查看全部问答>

高手 或者有经验的新手请进,,

谁有nrf24l01的  调节好的51程序 , 或者是增强型单片机 12c5a60s2的  也可以…

查看全部问答>

【设计工具】简化Xilinx 和AlteraFPGA调试过程

引言随着设计尺寸和设计复杂性不断增长, 使得基于现场可编程门陈列(FPGA)的系统设计验证和验证过程成为一个关键部分。接入内部信号有限、先进的FPGA封装和印刷电路板(PCB)的电气噪声, 都会导致设计调试和验证成为设计周期中最困难的流程。 您经常 ...…

查看全部问答>

肖特基二极管作用

选用了电流为2A的肖特基二极管SS24串接到电源当中。当电流大于2A时。肖特基二极管会断开吗?当电流变小时,会不会再恢复。 …

查看全部问答>