*** WARNING L15: MULTIPLE CALL TO SEGMENT

news/2025/1/15 15:36:01/

.***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?。。。?。。。
CALLER1: ?。。。?MAIN
CALLER2: ?C_C51STARTUP

该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。

 

出现这种警告的原因一般有两种:

第一:这个函数是不可重入函数,当该函数运行时可能被打断,打断后该函数又被再次运行,从而造成函数内部数据丢失;

第二:该函数的内部变量数据所占有的内存在link时被连接器认为是可覆盖的,因此在连接时进行了数据覆盖优化,但是连接器同时发现该函数在运行时被打断后,其他函数(如中断服务子程序)的运行造成了该函数的数据被覆盖。

 

对于第二种原因,我们举个例子:

void task1()

{

     int val1;

    ......//其他程序

}

 

void task2()

{

   int val2;

  ......//其他程序

}

void int_ISR()//中断服务子程序

{

   int aaa;

  task2();

}

这里有两个任务函数task1和task2,它们之间没有直接的调用关系,因此连接器在连接时就会做数据覆盖优化,也就是说va11和val2这两个变量会占用相同的内存空间。但是当task1运行时发生了中断,在中断服务子程序中又调用了task2,那么task1的val1值很可能会被覆盖(数据被破坏)。这种情况的解决办法一般有两种:

 

1、使用连接器(linker)OVERLAY 指令将函数从覆盖分析(overlay analysis)中除去;即告知连接器不对task1的val1做覆盖优化,让它独享自己的内存空间;这种方法的唯一缺点是task1不能做递归调用(个人认为,没做验证),要想一个函数可递归调用,唯一的方法是声明该函数为可重入。

 

2、定义两个相同功能的函数,分别在中断和中断外调用;

 

当然,你可以把task1设为可重入函数,产生一个可重入堆栈,用于存储函数的参数和局部变量,但是这种方法会消耗更多的RAM 并会降低重入函数的执行速度。

 

上述是个人理解心得,如有问题请回帖讨论,我会加以更正。


http://www.ppmy.cn/news/436065.html

相关文章

L15.linux命令每日一练 -- 第二章 文件和目录操作命令 -- chmod、chgrp和umask命令

2.23 chmod:设置及更改文件及目录权限命令 2.23.1 命令说明 ​ 【命令星级】 ★★★★★ ​ 【功能说明】 ​ chmod命令是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才能够执行这个命令。 ​ 【语法格式】 chmod [option] [mod…

***WARNING L15: MULTIPLE CALL TO SEGMENT错误信息的处理

***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 该警告表示连接器发现有一个函数可能会被…

时序分析28 - 时序预测 格兰杰因果关系(中) python实践1

时序分析28 - 时序预测 - 格兰杰因果关系(中) Python 实践 1 上一篇文章我们介绍了格兰杰因果关系的基本概念、背景以及相关统计检验法。本篇文章我们使用Python编程实践一下。 实践1:股票价格数据之间的格兰杰因果关系 问题:苹果公司今天的股价是否…

数电——Multisim仿真设计两位乘法器

数电——Multisim仿真两位乘法器 两位乘法器设计 实验目的 掌握组合逻辑电路的分析和设计方法,以及仿真测试方法。 实验原理 本实验使用了两个74HC138和1个三输入与非门、1个四输入与非门、一个六输入与非门和1个非门 实验内容 (一)、…

1.5

1.编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回 值value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(…

Keilc *** WARNING L15: MULTIPLE CALL TO SEGMENT

.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?。。。?。。。CALLER1: ?。。。?MAINCALLER2: ?C_C51STARTUP 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。…

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

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

Zynq PS之MIO、EMIO调试

目录 原理框图 Vivado中添加&配置Zynq UltraScale MPSoc IP UART设置(仅用于调试,非必需) MIO、EMIO设置 DDR配置 执行Generate Output Products 执行Create HDL Wrapper 执行File -> Export ->Export Hardware 执行Launch S…