WARNING L15: MULTIPLE CALL TO SEGMENT

1、什么是Function Multiple Call Warning

关于这个问题Keil C 给出的解释如下:
简单来说,某一个函数被Main 函数调用的时候,这个时候发生了中断,在中断中这个函数被再次调用,这个时候就会导致之前的传参,临时变量被替换掉。需要讲一下,C51 由于堆栈空间很小,因此它利用一种 Overlay 的机制,将函数中的变量不存放在堆栈中,而是固定在memory 空间中。这种方式好处是节省堆栈空间。坏处就是函数不可重入,无法被multiple call。
如果是高阶的MCU就不会有这个问题。

2、Function Multiple Call 原因

有两种情况:
1、同一个函数(不可重入), 在正常执行的时候,被中断调用,即上面描述的情况。这个时候原先的变量和传参可能会被破坏掉。
2、两个不同的函数a、b,但由于上面将的Overlay 机制,内部的变量和参数的地址空间是同一个,(Overlay 机制认为两个函数不会被同时调用,因此分配相同的地址空间是没问题的),当a 在执行时,b 被中断调用,这个时候,a的参数,变量会被b 修改掉。

3、解决方法
1、 忽视警告(不推荐)

如果该函数不会以重入的方式执行,并且没有使用任何的memory空间(参数传递和局部变量都没有用到),则可以忽略该warning。

2、 Overlay 指令

使用链接器的OVERLAY指令将函数从覆盖分析(overlay analysis)中除去
这可以让该函数独享某一块内存区域,而不参与overlay。该函数是不可重入的,但是可以在不影响其他函数memory的情况下,被多个thread调用。尽管如此,还是需要确保该函数不被多个thread 同时调用。

3、 复杂情况下应对方式

当某个函数在执行时会被其他thread打断并调用时,则可以使用如下方式:
1) main调用该函数时禁止中断,可以在该函数被调用时用
#pragma disable 语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数从覆盖分析中除去。
调用时禁止中断,而不是在函数中禁止中断,因为函数参数传递也有可能用到memory,同时需要使用OVERLAY指令。

2)复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。
最简单可靠的实现,代码量会增加。

3)将该函数设为重入型
例如:

 void myfunc(void) reentrant {       ...         }

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

4、参考文档如下:

https://www.keil.com/support/docs/805.htm
Overly 机制参考:
https://blog.csdn.net/shenjin_s/article/details/107212719

MULTIPLE CALL TO SEGMENT相关推荐

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

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

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

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

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

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

  4. 【TPAMI 2022】A Survey on Vision Transformer

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

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

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

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

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

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

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

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

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

  9. java实现简繁体转换demo

    第一步:引入jar包 <!--字符繁体简体转换--><dependency><groupId>com.github.houbb</groupId>< ...

最新文章

  1. Nginx配置使用积累[不断更新]
  2. python import的一些问题
  3. POJ - 3252 Round Numbers(数位dp)
  4. QQ病毒越来越人性化了
  5. html5 规定输入字段,HTML5 Input属性详解
  6. 10无法勾选隐藏的项目_Excel超好用的隐藏操作,不可多得
  7. oracle 字段以逗号结尾的更新 数据库_Oracle数据库某个字段的值为逗号分隔的多个值组成的字符串,以一个多选的下拉框进行查询...
  8. svn更换url地址怎么办
  9. 从右边开始放_幸福的生活,从入住新房开始,效果很漂亮,忍不住给大家晒晒全屋...
  10. 大公司都有哪些开源项目~~~简化版
  11. GMA Round 1 三视图
  12. WeUI首页、文档和下载 - 专为微信设计的 UI 库 - 开源中国社区
  13. MAC M1 安装 matlab2020a
  14. centos7 配置阿里yum源
  15. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)
  16. ps2手柄linux,索尼为PS5 DualSense手柄推出官方Linux驱动程序
  17. 工作占用了太多私人时间_当公司老板过多占用你的个人时间,虽然不是什么大事但很想辞职怎么办?...
  18. 大数据开发岗面试30天冲刺 - 日积月累,每日五题【Day01】——Hive1
  19. java 将html转为word导出 (富文本内容导出word)
  20. Python爬取微信公众号文章、标题、文章地址

热门文章

  1. HFSS-MATLAB-API
  2. Qt(C++)项目中使用 Basler 工业相机(2 参数设置)
  3. P13 正交向量和正交子空间【线性代数】
  4. Java空字符串和null
  5. SQL存储过程的优缺点
  6. hashcat 1.3 运行函数
  7. win10家庭版远程桌面连接(RDP)
  8. 服务器系统事件1014,如何排除每天都会在事件查看器中出现的来源:DNS Client Events 事件 ID:1014 的警告记录呢?...
  9. 港科资讯 | 香港科技大学(广州)获一亿元广州市财政局拨款
  10. 易语言修改html协议头,协议头在易语言怎么写