原创 C51中的interrupt 和 using

2011-10-20 23:22 1728 13 13 分类: MCU/ 嵌入式


void IsrTimer0(void) interrupt [x] using [y]

 

1. x为中断号,中断号指明编译器中断程序的入口地址,中断序号对应着 8051中断使能寄存器IE 中的使能位。

①中断号与入口地址对应关系:

中断号           中断名                   中断向量地址

0    INT 0(外部中断0)                      0003H

1    TIMER/COUNTER 0(定时/计数器0)       000BH

2    INT 1(外部中断1)                      0013H

3    TIMER/COUNTER 1(定时/计数器1)       001BH

4    SERIAL PORT(串口中断)               0023H

5   TIMER/COUNTER 2(定时/计数器2)       002BH

外注:         上电复位                    0000H

 

②中断号与IE使能位的对应关系:

使能位      中断号             中断源

IE.0       0                     外部中断0

IE.1           1                         定时器0 溢出

IE.2            2                          外部中断1

IE.3            3                       定时器1 溢出

IE.4           4                         串口中断

IE.5           5                         定时器2 溢出

 

2. y为指定终端服务程序使用的寄存器组。8051一般有4R0~R7寄存器。所以y的取值位0~3.

 

 R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1RS0位决定的。

using 0时设置 RS1=0RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07HR000H....R707H

using 1时设置 RS1=0RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07HR008H....R70FH

using 2时设置 RS1=1RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FHR010H....R717H

using 3时设置 RS1=1RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07HR018H....R71FH

优点:一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。

缺点:所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。

如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:

1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。

2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。

3、如果不用 using 指定,自动选择。

4、 使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候, 一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上 了。在 ISR 或使用实时操作系统RTOS 中,寄存器非常有用。

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条