今天来说说*** 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 TO SEGMENT相关推荐

  1. KEILC51警告:WARNING L15: MULTIPLE CALL TO SEGMENT

    *** WARNING L15: MULTIPLE CALL TO SEGMENT 说说几个小问题吧,一般我们在用KEIL的时候,只要编译器报 - 0 Error(s) 一般我们都不去管多少个 War ...

  2. MULTIPLE CALL TO SEGMENT

    WARNING L15: MULTIPLE CALL TO SEGMENT 1.什么是Function Multiple Call Warning 关于这个问题Keil C 给出的解释如下: 简单来说 ...

  3. c语言编译器error,KEIL C编译器常见警告与错误信息的解决办法

    对于函数的自变量.局部变量和全局变量声明如果没有指定内存类型,则内存模式将成为内定的内存类型.如果 指定了内存类型的变量,则不理会内存模式,完全有所指定的内存类型为主. SMALL模式:小模式 所有的 ...

  4. keilC51编译常见错误和警告说明

    如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享! ( 1 )L15 重复调用 ***WARNING L15: MULTIPLE CALL TO SEGM ...

  5. 【Keil】使用Keil5时出现的错误(持续更新)

    目录 1.常见编译错误 2.常见逻辑错误 3.常见仿真错误 1.常见编译错误 error C141: `syntax error near 'extern', expected 'hdata'` (错 ...

  6. KEIL软件错误代码及错误信息

    KEIL软件错误代码及错误信息 错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3 ...

  7. 在中断函数和MAIN函数中同时调用同一个函数的有趣现象

    此处的信息适用于: C51所有版本 症状 我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15: MULTIPLE CALL TO SEGMENT ...

  8. 51单片机函数加了reentrant,设备就不动了

    51单片机函数加了reentrant,设备就不动了,删掉之后又可以工作了. 加reentrant是为了解决下面的警告,又在中断用又在main()函数用的函数 *** WARNING L15: MULT ...

  9. linux 等待进程,Linux 进程等待队列

    Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制. 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待 ...

  10. 【TPAMI 2022】A Survey on Vision Transformer

    文章目录 WHAT Contents 2. Formulation of Transformer 2.1 Self-Attention 2.2 Other Key Concepts in Transf ...

最新文章

  1. 使用 IntraWeb (8) - 系统模板
  2. DWORD dwSendTime =::GetTickCount();
  3. 解决spring-boot-maven-plugin not found爆红
  4. laravel的重定向
  5. 如何使Xcode占用更少的空间 Xcode占用空间太大解决方法
  6. java jxl上传excel_JAVA JXL -----excel文件上传和解析
  7. iec104点号_IEC104规约详细讲解全解.ppt
  8. HammerDB造数报错
  9. Winsock API编程之UDP小结
  10. mysql7.6安装_CentOS7.6离线安装MySql5.7
  11. 网络歌曲《丁香花》背后的真实故事
  12. boost::asio 学习
  13. 华为HarmonyOS鸿蒙系统介绍,华为鸿蒙OS系统怎么样 华为HarmonyOS鸿蒙系统介绍
  14. ubuntu 卸载pytorch_科学网—Pytorch installation on Ubuntu18.04 - 高琳琳的博文
  15. 前两天搞的东西 象棋棋谱字符转换
  16. 【fake location破解版】加强版随风2.0定位助手使用方法
  17. 中标麒麟卸载安装yum和python
  18. Webservice接口与HTTP接口学习笔记。
  19. [INVEST]2018年国庆后黄金是否值得投资小结
  20. R语言如何绘制簇状、堆积、填充柱形图(16)

热门文章

  1. Altium Designer 18生成Gerber教程
  2. java项目开发的生命周期
  3. CV领域的国际国内期刊会议介绍
  4. Java贪吃蛇小游戏
  5. GitHub排名第一!免费最”强“12306抢票神器,程序员再不用跪求加速包!
  6. Matlab实现的数学模型(2020新整理)
  7. GRE阅读-GRE佛脚备考系列之阅读分册volume 2-机经练习(1)
  8. OD点击寄存器变色OD
  9. 独立游戏大电影观后感
  10. 解决fake_useragent报错