C51中的reentrant

发布者:科技小巨人最新更新时间:2016-11-14 来源: eefocus关键字:C51  reentrant 手机看文章 扫描二维码
随时随地手机看文章

关于reentrant的使用keil的官方论坛上有详细的讨论.

Andy Neil(官方工程师)建议

"Are you sure that you really need to make everything reentrant?...

A reading of the Keil app notes & knowledgebase articles on this subject 

showed that it was not necessary. "

由于每一次调用被reentrant声明的函数都要把函数的参数和内部变量压栈,所以

很容易使堆栈区溢出,S52只有256Bytes的data段,一个简单的函数如果有一个参数

三个内部变量,则需要压栈4字节以上,这还不包括函数调用堆栈.

reentrant其实并不是适合低端的单片机,keil论坛上有人说对于那些有KB以上RAM的

单片机reentrant才适合.

BUTCHER提到的问题我一直很奇怪自己怎么没有出现,仔细检查代码才发现我所有的

函数都在一开始添加了EA=0;也就是屏蔽了中断,这样就绝对没有函数重载的问题!

不过这个方法也许对我们很适合,我的函数段基本都很小,而且定时器查询速度很高,

基本不需要外部中断,所以可以适当优化代码避免中断嵌套,就不会出现同一时刻

有一个函数被二次重载了.

对于BUTCHER的问题,Andy有类似的解答,"I can redo the calling tree by hand in

 order to avoid using reentrancy, but it will take some time checking and 

profiling the code." 

 

*** WARNING L15: MULTIPLE CALL TO SEGMENT

说说几个小问题吧,一般我们在用KEIL的时候,只要编译器报

 - 0 Error(s) 一般我们都不去管多少个 Warning(s).了,一般这样程序基本都能运行,但是其实仔细想想,这里还是有问题的,否则编译器没事吃饱了撑得,报什么警告啊~~~

今天来说说*** 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、    实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数。

二.如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用

别的方法没研究出来,嘿嘿~~~对了 我建议用第二种方法好点,第一种有些限制,不爽~~

关键字:C51  reentrant 引用地址:C51中的reentrant

上一篇:C51单片机程序编写注意事项
下一篇:604液晶屏输入输出C51源程序

推荐阅读最新更新时间:2024-03-16 15:20

C51】源码 3 -- 电子时钟(独立按键、8 位数码管、定时器)
自购自学单片机有一段日子了,300 多页的 pdf 教程看到一半了,正好看完定时器和独立按键部分,综合前边的数码管,试着编写了 电子时钟 ,将源码发上来,用于备份 注:由于使用了中断以及各种延时程序,此程序并不是真正准确的 电子时钟 ,想要真正准确,需要特别的外部模块,如时钟芯片 DS1302。 附上源码:(初出茅庐,难免有写的不好的地方,仅作备份之用,欢迎指点,喷子退散 ) /********************************************************************************** 电子时钟 1、初始从 00-00-00
[单片机]
一个X25045的C51读写程序
  * x25045的读写程序 用c51写的 */   #define CS P2.7 /*单片机p2.7为片选 可以改为你的实际引脚 */   #define SO P2.6 /*数据输出 */   #define SK P2.5 /* 时钟 */   #define SI P2.4 /* 数据输入*/   /* here is the instrution of x25045*/   #define WREN 0x06   #define WRDI 0x04   #define RDSR 0x05   #define W RS R 0x01   #define READ0 0x03   #define READ1 0x0b
[单片机]
一个X25045的<font color='red'>C51</font>读写程序
KEIL C51中的_at_关键字
绝对位置变量 变量可以在你的C程序中的绝对内存地址位于源模块使用_at_关键字。此功能的用法是: 类型 _ memory_space _ 变量名 _at _ 常数 ; 其中:memory_space是为变量的内存空间。如果缺少声明,默认的存储器空间使用。请参阅第94页的“记忆体模型”的更多信息默认的内存空间。 类型是可变的类型。 变量名是变量名。 不变的是哪个地址找到变量。 _at _ 后的绝对地址必须符合的物理边界,为变量的内存空间。C X 51的编译器检查无效地址规范。 注意:如果您使用_at_关键字来声明一个变量,访问XDATA外设,你可能需要的volatile关键字,以确保C编译器不优化所需的内存访问。   绝对位置变量以
[单片机]
C51 中断接收 G代码 并发送回去 by mingwen
//=========================================================== // step motor 串口通信G代码 // //86 step motor,3200cts/r,f=20kHz=20000/r, //n=20000/3200=6.25r/s=375rpm, ratio=5 //n_out=75rpm, n_old=1500/75=20rpm // //f : //times=1,delay0.05ms=20000Hz=20kHz //times=2,delay0.1ms=10000Hz=10kHz //times=3,delay0.15ms
[单片机]
<font color='red'>C51</font> 中断接收 G代码 并发送回去 by mingwen
C51单片机对抽油机的智能功率控制电路设计
为了实现抽油机能自动根据负载需要实时进行Δ/Y双向切换和间歇定时控制的目标,采用嵌入式控制技术设计了如图1所示的控制电路。 智能功率控制器的硬件系统以新华龙电子公司为C8051F206配套的实验板为基础,新增输出电路和键盘显示电路后形成。直接利用实验板上的C8051F206MCU、JTAG接口、晶振、复位及电源电路,大大降低了硬件设计工作量。 (1)输出电路 本系统的被控对象是电机的开关。为满足星角切换和开机/停机要求,需要对3只交流接触器(C1~C3)按一定组合关系进行控制,其电路原理和控制真值表如图2(a)和图2(b)所示。考虑到现场抗干扰的需要,在输出端口P0.1,P0.3和P0.5后采用了光电隔离电路(图2(c)),其
[单片机]
<font color='red'>C51</font>单片机对抽油机的智能功率控制电路设计
240x128液晶T6963控制器驱动程序(C51
简介:本文主要介绍了240x128液晶T6963控制器驱动程序(C51)。 #include absacc.h #include math.h #include ASCII816.h //标准ASCII库 #include HZTable.h //汉字点阵库(自做) #include menu.h //菜单库(自做) #define ComPort 0xB101 #define DataPort 0xB000 #define GraphAddr 0x0000 //head of graph //以8*8字符计算,显示屏横向、纵向可以显示的字符个数 //以240*128为例: #define LineChar
[单片机]
如何实现C51单片机和PLC之间通讯
1、 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。 它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2、Modbus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 M
[单片机]
单片机驱动74HC595的c51程序
//该子程序为74HC595发送字符的程序,该程序是先发送的是最低位! //芯片74HC595的时钟引脚为第11脚 //芯片74HC595的数据引脚为第14脚 //芯片74HC595的锁存引脚为第12脚 //当有多片74HC595串联时,只有当所有数据都发送完成后,再锁存信号! //同样74hc164与51单片机连接也可以由这个程序来驱动 #include #define uchar unsigned char #define uint unsigned int sbit clk=P3^5; sbit dat=P3^6; sbit shuo_cun=P3^7; uchar volatile e,f; uchar code ta
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved