×
单片机 > 单片机程序设计 > 详情

using 在C51中断中的使用问题

发布时间:2020-05-30 发布时间:
|

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务 
处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下: 
中断源 中断向量 
--------------------------- 
上电复位 0000H 
外部中断0 0003H 
定时器0 溢出 000BH 
外部中断1 0013H 
定时器1 溢出 001BH 
串行口中断 0023H 
定时器2 溢出 002BH 

interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下: 
IE寄存器 C51中的 8051的 
的使能位 中断号 中断源 
-------------------------------- 
IE.0 0 外部中断0 
IE.1 1 定时器0 溢出 
IE.2 2 外部中断1 
IE.3 3 定时器1 溢出 
IE.4 4 串口中断 
IE.5 5 定时器2 溢出 

有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051系列(增强型)中多达 27 个中断源。 
using 关键字用来指定中断服务程序使用的寄存器组。用法是:using 后跟一个0 到3 的数,对应着 4 组工作寄存器。一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。 

举个例子来说: 
定义一个延时函数 
void delay(unsigned int n)  //n=10000,延时90.05毫秒, 默认寄存器组0

{

    while(n--);

}
有如下一个中断函数 
void int_0(void) interrupt 0 using 1 { //默认寄存器组1
    ...
   Delay(2000);
   ...


在默认状态下,delay()使用寄存器组0(BANK0),那么当int_0调用delay()时时会造成参数传递错误. 这里必需把delay()的寄存器组也设为1.

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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法