关于*** WARNING L15: MULTIPLE CALL TO SEGMENT
编写51程序的时候,有时候会在主函数和中断函数里面调用同一个函数,如果正的出现这种情况,编译器会提出 这种警告: *** WARNING L15: MULTIPLE CALL TO SEGMENT(重复调用同一个函数)
这种情况时因为函数发生了重入,
尽管这样出现错误的概率很低,但是一旦出现错误,将会是很讨厌的错误,在网上我看到的一篇博文里面,说这个错误必须引起注意,特别是像我们这种做控制和自动化的,一点小小的错误和异常都可能引起一次事故和灾难,必须小心谨慎。
因为它可能引起程序冲突,导致信号产生尖峰。 产生这一警告的一个根源是:你在主循环 里调用了一个函数(如aaa),而在中断服务函数里,你用调用了这个函数(如aaa)。这样当主循环运行到该函数中 是,一旦产生中断,则在中断里又再次调用该函数!这时,很可能出错! 避免这种情况的方法很多:如,在进中断的时候置需调用该函数的标志,而在主循环中调用该函数。
解决方法:
1、可以定义两个功能相同的函数,在中断和主函数里面分别调用,但是需要很多额外重复函数;
2、在中断函数里面设置一个标志,然后在主循环里面调用该函数。
下面具体说说的我的情况和解决办法。
在主函数里面我多次调用 show_string函数,用TFT来显示需要的信息,当中断产生的时候,我又需要在TFT里面显示其他信息,这样就出现了函数的重入,但是又不能取消,进入中断和主函数都是必须的。
当我用第一种方法来解决的时候,发现需要重新定义的函数太多了,太占内存,不能用。于是考虑第二种方法,在中断里面设置标志,然后在主循环里面实现。
void int0() interrupt { delayms();
if(k3_set==){ set_flag = ~set_flag;//标志
chose_flag = ;
ds1302_init();//如果没有这句的话,设置完后又会回到原来的数字 }
}
在主循环里面:
while(){ if(set_flag==){//正常
ds1302_readtime();
show_string(,," ");//刷新提示区,就是这个,不能写在中断里面
} else{
key_init();
}
这样这个问题就解决了。当然,当你调用的函数不是很大的情况下,第一种方法也不错。
关于*** WARNING L15: MULTIPLE CALL TO SEGMENT的更多相关文章
- 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT
填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...
- WARNING L15: MULTIPLE CALL TO SEGMENT
原网页:http://www.cnblogs.com/CuriosityWzk/archive/2011/12/25/2301090.html WARNING L15: MULTIPLE CALL T ...
- C51 的重入问题 WARNING L15: MULTIPLE CALL TO SEGMENT
WARNING L15: MULTIPLE CALL TO SEGMENT 这个问题必须注意,可能引起程序冲突,假设你用于自动化领域,则可能导致信号产生尖峰. 产生这一警告的一个根源是:你在主循环里调 ...
- Keil C -WARNING L15: MULTIPLE CALL TO SEGMENT
1.第一种错误信息 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ...
- Keil使用中的若干问题
一.混合编程 1.模块内接口: 使用如下标志符: #pragma asm 汇编语句 #pragma endasm 注意:如果在c51程序中使用了汇编语言,注意在keil编译器中需要激活Properti ...
- KEIL C编译器常见警告与错误信息的解决办法
对于函数的自变量.局部变量和全局变量声明如果没有指定内存类型,则内存模式将成为内定的内存类型.如果指定了内存类型的变量,则不理会内存模式,完全有所指定的内存类型为主. SMALL模式:小模式 ...
- keil c编译器错误与解决方法
1. Warning 280:’i’:unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告 2 Warning 206:’ ...
- EMS-keil C51常用错误
1. LAB100.C(12): error C216: subscript on non-array or too many dimensions 原程序如下: #include <reg51 ...
- MDK常见错误详解集合
错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identi ...
随机推荐
- Java正则表达式的使用和详解(下)
1.常用正则表达式 规则 正则表达式语法 一个或多个汉字 ^[\u0391-\uFFE5]+$ 邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$ 邮箱 ^[a-zA ...
- 【转】Java中的多线程学习大总结
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- redis配置文件相关
1. 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonize no 2. 当Redis在后台运行时,Redis默认会把pid写入/var/run/red ...
- Hightchart 技巧
http://blog.csdn.net/u014796515/article/details/24428131
- 用XYNTService把Python程序变为服务
1. XYNTService的使用 1.1. 介绍 1.2. XYNTService 2. 用XYNTService把Python程序变为服务 1. XYNTService的使用 1.1. 介绍 通常 ...
- Python中的and/or
在Python中,可以通过and,or和not进行逻辑运算,下面就来看看and和or的简单介绍. 逻辑与-and 对于包含and运算的表达式,Python解释器将从左到右扫描,返回第一个为假的表达式值 ...
- Weblogic CVE-2018-2894 漏洞复现
0x01 前言 Oracle官方发布了7月份的关键补丁更新CPU(Critical Patch Update),其中针对可造成远程代码执行的高危漏洞 CVE-2018-2894 进行修复:http:/ ...
- EhCache初体验
一.简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存 ...
- [转]logging使用
来源:https://www.cnblogs.com/nancyzhu/p/8551506.html日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事 ...
- Android设计和开发系列第一篇:Notifications通知(Design)
Design篇 Notifications The notification system allows users to keep informed about relevant and timel ...