您的当前位置:首页interrupt

interrupt

2024-01-10 来源:爱问旅游网
当中断发生时,编译器插入的代码 被运行,它 将 累加器 ,B,DPTR和PSW(程序状态字)入栈。最后,在退出中断程序时,预先存储在 栈中 被恢复。最后的\结束符号

将 插入 RETI到 中断程序的最后,

为了用 Keil‘C’语言创建一个中断服务程序(ISR),利用 interrupt 关键词和正确的中断号声明一个 static void 函数。Keil‘C’编译器自动生成中断向量,以及中断程序的进口、出口代码。Interrupt 函数属性标志着该函数为 ISR。可用 using 属性指定ISR使用哪一个寄存器区,这是可选的。有效的寄存器区范围为1到3。

中断源的矢量位置

中断源 Keil中断编号 矢量地址 最高优先级 6 0x0033 外部中断0 0 0x0003 定时器0溢出 1 0x000B 外部中断1 2 0x0013 定时器1溢出 3 0x001B 串口 4 0x0023 定时器2溢出 5 0x002B DMA 7 0x003B 硬件断点 8 0x0043 JTAG 9 0x004B 软件断点 10 0x0053 监视定时器 12 0x0063

1.

函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于3级时)。(本人也不太清楚为什么,大概因为在调用前定义则调用函数已经知道被调用函数对寄存器的使用情况,则可对函数本身进行优化;而在调用后进行定义则函数不知被调用函数对寄存器的使用情况,它默认被调用函数对寄存器(ACC、 B、 DPH、 DPL、 PSW、 R0、 R1、 R2、 R3、R 4、 R5、, R6、 R7)都已经改变,因此不在这些寄存器中存入有效的数据)

2.

函数调用函数时除在堆栈中存入返回地址之外,不在堆栈中保存其它任何寄存器(ACC、 B、 DPH、 DPL、 PSW、 R0、 R1、 R2、 R3、R 4、 R5、, R6、 R7)的内容。(除非被调用函数使用了using特性)

3.

中断函数是一个例外,它会计算自身及它所调用的函数对寄存器(ACC、 B、 DPH、

DPL、 PSW、 R0、 R1、 R2、 R3、R 4、 R5、, R6、 R7)的改变,并保存相应它认为被改变了的寄存器。

4.

使用C写程序时,尽量少使用using n (n=0,1,2,3)特性。(这个特性在本人使用的过程中存在一些问题,不知算不算是一个小bug)

因篇幅问题不能全部显示,请点此查看更多更全内容