历史上的今天
返回首页

历史上的今天

今天是:2025年01月05日(星期日)

正在发生

2018年01月05日 | C51程序设计中断及寄存器使用方法

2018-01-05 来源:eefocus

如果在中断服务函数ISR中使用寄存器,那么必须处理好using的使用问题:
1、中断服务函数使用using指定与主函数不同的寄存器组(主函数一般使用Register bank 0)。
2、中断优先级相同的ISR可用using指定相同的寄存器组,但优先级不同的ISR必须使用不同的寄存器组,在ISR中被调用的函数也要使用using指定与中断函数相同的寄存器组。用reentranr指明可重入函数。
3、如果不用using指定,在ISR的入口,C51默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0
这点保证了,没使用using指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。
4、使用using关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的PUSH和POP操作,可以节省RAM空间,加速MCU执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。在ISR或使用实时操作系统RTOS中,寄存器非常有用。

寄存器组使用的原则:
1、8051的最低32个字节分成4组8寄存器。分别为寄存器R0到R7。寄存器组由PSW的低两位选择。在ISR中,MCU可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51编译器规定使用using或禁止中断的函数(#pragma dISAble)均不能返回bit类型的值。
2、主程序(main函数)使用一组,如bank 0;低中断优先级的所有中断均使用第二组,如bank 1;高中断优先级的所有中断均使用再另外一组,如bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。
3、在ISR中调用其它函数,必须和中断使用相同的寄存器组。当没用NOAREGS命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用using或REGISTERBANK指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。
举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:
1、如果ISR和主程序使用同一寄存器组(主程序缺省使用BANK 0,若ISR没有使用using为其指定寄存器区,则缺省也使用BANK 0),则不需其他设置。
2、如果ISR和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR使用using指定了其他BANK),则被调用函数必须放在:
#pragma NOAREGS
#pragma AREGS
控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在Options->C51,选中“Dont use absolute register aCCesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改OVERLAY参数,做重入说明。
3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。
因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。

#pragma disable
在函数前声明,只对一个函数有用,该函数调用过程中,将不可被中断。

递归或可重入函数指定


在主程序和中断程序都调用的函数容易出现问题,用寄存器传递参数,内部变量在RAM中,函数重入时候,会破坏上次的数据,用下面两种方法解决函数重入问题:
在相应的函数前,加“#pramga disable”声明,只允许主程序或者中断之一调用该函数;
将该函数说明为可重入:VOID func(para..) reentrant;


指定存储模式



由small comPACt及large说明,例如:



void fun1(void) small { }



提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的


地方可以这样声明,以提高运行速度。


推荐阅读

史海拾趣

Eurofarad公司的发展小趣事

在追求经济效益的同时,Eurofarad也积极履行社会责任,注重环保和可持续发展。公司采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,Eurofarad还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了基础。

FWBELL公司的发展小趣事
将检测到的温度信号与预设的温度阈值进行比较。这通常通过电压比较器实现,比较器的输出信号会根据温度与阈值的关系变化。
Baneasa SA公司的发展小趣事

Baneasa SA公司成立之初,便专注于电子元器件的研发与生产。公司凭借创始团队的技术积累和市场洞察力,成功开发出一款高性能的半导体芯片,迅速在行业内崭露头角。这款芯片以其出色的稳定性和可靠性赢得了市场的广泛认可,为Baneasa SA的发展奠定了坚实的基础。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

随着产品的逐渐成熟,Baneasa SA开始积极寻求市场拓展的机会。公司通过与各大电子设备制造商建立合作伙伴关系,成功将其产品应用于手机、电脑、家电等多个领域。这些合作伙伴关系的建立不仅为Baneasa SA带来了稳定的订单量,还进一步提升了公司的品牌知名度和市场份额。

Comus_International公司的发展小趣事

Comus International深知,要想在竞争激烈的电子行业中立足,除了不断创新外,还需要注重产品质量和服务。因此,公司一直将质量和服务作为核心竞争力,不断提升产品质量和服务水平。正是这种对质量和服务的执着追求,使得Comus International在市场上赢得了客户的广泛认可和信赖。

ELM [ELM Electronics]公司的发展小趣事

在追求经济效益的同时,ELM也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,ELM还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了ELM的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

PLC、DCS、FCS三大控制系统的特点(转贴)

FCS是由PLC发展而来的;而在另一些行业,FCS又是由DCS发展而来的,所以FCS与PLC及DCS之间有着千丝万缕的联系,又存在着本质的差异。本文试就PLC、DCS、FCS三大控制系统的特点和差异作一分析,指出它们之间的渊源及发展方向。    摘 要: ...…

查看全部问答>

【请教】superIO 的watchdog 问题

本人在做一个硬件项目的软件方面的东西,现在遇到一个问题,请求解决。 是一个主板连接一个MCU,由MCU控制内存的电压调节或超频从而测试内存的性能。 现在要在DOS下,使用MCU去超频。假如死机,利用superIO的watchdog功能,发出一个信号告诉MCU, ...…

查看全部问答>

易懂的单片机入门书

易懂的单片机入门书…

查看全部问答>

版主这个时序定时器要怎么配置才能实现

版主这个时序怎么定时器要怎么配置才能实现啊! 下载 (21.83 KB) 2010-3-1 14:41 …

查看全部问答>

关于用JLINK调试博创UP-TECH2410板子目标板自动重启的问题的解决方法

问题是这样的大概一个月前,我在IAR6.1上建了一个S3C2410的工程,我这边有两种板子,一块优龙FS2410板子,两块博创UP-TECH2410的板子,对应的也有两种调试器,优龙的使用的是DragonJtag,一端跟电脑的并口相连接,一端连接板子的JTAG接口,优龙的板 ...…

查看全部问答>

编写程序

我想用MSP430编写程序,怎样通过编程输出显示已知频率的幅度值啊…

查看全部问答>

开发板,仿真器,测试样机,串口服务器超低价.

XDS510    100元 KL05Z   开发板,全新.  50元 串口服务器,全新,带光盘.  50元 M动力  F28035开发板,加焊485芯片  100元. 测试样品  推挽正激加并网.  200元. ...…

查看全部问答>

如何利用MSP430对一个信号与定值比较

如何利用MSP430对一个4-20mA信号与给定值进行比较,然后驱动灯泡亮灭,并将信号给上位机。 是利用MSP430的比较器呢?还是如何操作?谁能给个思路?谢谢!!!!! \0\0\0eeworldpostqq…

查看全部问答>

大侠求助!FPGA1.2V对地短路

自己焊了个板子,本来运行好好的,突然程序配置不成功了,测量发现1.2V只要一上电就会短路,最后把1.2V电源芯片下掉也是这个问题,3.3V一接通,1.2V的引脚跟地就短路,是什么问题???按理说不上电时1.2 V对地电阻是120欧左右,3.3V对地是330欧左 ...…

查看全部问答>