
KEIL警告:段的多重调用问题
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文章主要讨论在使用Keil进行程序开发时遇到的一个常见问题——段的多重调用错误,并提供了解决方案和预防措施。
KEIL警告:MULTIPLE CALL TO SEGMENT是KEIL编译器中的一个提示,表明检测到某个函数可能在主程序及至少一个中断服务例程中被调用,或者同时由多个不同的中断服务例程进行调用。
这个警告源于重入性问题,在多线程操作系统环境中较为常见。尽管这通常不会导致运行时错误,但若出现问题,则可能导致难以解决的冲突情况。
为避免此类问题,有两种策略:
一、使用reentrant使函数可重复进入。关于reentrant的说明如下:
1. 重入口函数不能传递位类型参数和变量;
2. 重入函数建立的是模拟堆栈区,在默认存储模式空间之外分配非覆盖式堆栈;
3. 使用大量堆栈空间,因此应尽量减少使用这种模式;
4. 同一程序中可以定义不同存储器模式的重入口函数,但是不能调用相同模式下未标记为可重入属性的间接调用函数。但可以调用普通函数。
5. 实际参数可以传递给间接调用的重入函数。
二、创建两个功能相同的副本,并分别在中断和非中断环境下调用它们。
默认情况下,KEIL编译器中的任何未特别指定为可重复进入的函数都是不可重入性的。这是因为这些函数局部变量存储于一个覆盖式段中而非堆栈上。
警告L15: MULTIPLE CALL TO SEGMENT表明连接器检测到有函数可能同时被主程序和中断服务例程(或调用该服务例程的其他函数)所访问,或者由多个不同的中断服务例程同时进行访问。这可能导致数据冲突及变量丢失。
原因可能是此函数为不可重入性,并在运行中可能会因中断而被打断,导致内存覆盖问题。解决方法包括:如果确定两个调用不会在同一时间发生(即主程序执行该函数时禁止所有可能的中断),并且该函数不使用任何存储空间,则可以忽略此警告;若其占用内存资源,则应利用连接器OVERLAY指令将函数排除在覆盖分析之外,确保其不可重入性。
全部评论 (0)


