共2条
1/1 1 跳转至页
问
我是一个初学者用的是周工的2100开发套用的是模板可是不会开嵌套中断有那位楼主可以指点一下给个例子呀?
答 1:
关于中断嵌套:
进入IRQ中断后,ARM会自动关闭中断。
之所以这样做,也是有原因的:
IRQ模式下的LR是用来保存中断返回地址的,如果在IRQ1中断中被IRQ2中断所中断,那么LR就会保存新中断IRQ2的返回地址,这样中断IRQ1就无法正确返回!要做到中断嵌套可以:
在中断入口处除了保存一些重要数据外,还应该将LR-4(返回地址)保存。此时再开中断,并通知中断控制器中断处理结束(向其写入0)。
中断返回时,记得恢复LR后再执行返回。 答 2: 非也非也,中断时PC值自动复制到 IRQ 模式的 LR 中所以,仅仅保存LR是不够的,必须切换工作模式。
简单的步骤:
--> IRQ 中断
--> 保存所有寄存器,包括 LR,SPSR 到 IRQ 的堆栈;
--> 切换到其它特权模式(比如系统模式),并使用的该模式的堆栈;
--> 开中断,允许嵌套
......
--> 关中断
--> 切换到IRQ模式
--> 恢复所有寄存器,包括 LR,SPSR
-> 中断返回
要注意各模式下的堆栈的使用。 答 3: 添加:
深思大虾提醒的对,不过需要补充的是:
1.当你的中断程序中不会进行子程序跳转时,
是可以通过保存LR来完成中断嵌套的
2.如果IRQ中断中进行子程序调用,那么就需
要进行模式切换以达到最好的安全性,因为
子程序跳转也是要用到LR寄存器的保存返回
地址的,所以如果在子程序执行过程中被中
断,子程序是无法返回的(LR被覆盖)。
答 4: 下同是LPC2214上的UCOS一段有关中断的代码,void IRQCTimer0(void){
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
TIMER0_IR = 0x01;
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
OSTimeTick();
}
问题1:如果不运行OS_ENTER_CRITICAL();时,此时中断是开着的还是关着的,为什么要运行这个关中断指令呢?
问题2:当执行完OS_EXIT_CRITICAL();,中断处于打开状态,此时调用其它函数,它是怎么保存LR的呢,并且能可靠返回呢?
谢谢! 答 5: re:注意:
这里使用宏调用,中断产生后,经过汇编程序处理后才会跳转到C语言程序。
所以保护LR等操作在IRQ.INC文件中汇编程序来实现。
ADS的汇编程序的宏调用,还是很方便的。
即:Timer0_Handler HANDLER Timer0_Exception
你再仔细看看。 答 6: 第二个问题我搞清楚了,LR中断时,已经保存 MACRO
$IRQ_AsmEntery HANDLER $IRQ_CEntry
EXPORT $IRQ_AsmEntery ; 输出的标号
IMPORT $IRQ_CEntry ; 引用的外部标号
$IRQ_AsmEntery
stmfd sp!,{r0-r3,r12,lr}
bl OSIntEnter
bl $IRQ_CEntry
bl OSIntExit
ldr r0,=OSIntCtxSwFlag
ldr r1,[r0]
cmp r1,#1
beq _IntCtxSw
ldmfd sp!,{r0-r3,r12,lr}
subs pc,lr,#4
MEND 答 7: re:可以参考例子http://www.zlgmcu.com/download/downs.asp?ID=1114
进入IRQ中断后,ARM会自动关闭中断。
之所以这样做,也是有原因的:
IRQ模式下的LR是用来保存中断返回地址的,如果在IRQ1中断中被IRQ2中断所中断,那么LR就会保存新中断IRQ2的返回地址,这样中断IRQ1就无法正确返回!要做到中断嵌套可以:
在中断入口处除了保存一些重要数据外,还应该将LR-4(返回地址)保存。此时再开中断,并通知中断控制器中断处理结束(向其写入0)。
中断返回时,记得恢复LR后再执行返回。 答 2: 非也非也,中断时PC值自动复制到 IRQ 模式的 LR 中所以,仅仅保存LR是不够的,必须切换工作模式。
简单的步骤:
--> IRQ 中断
--> 保存所有寄存器,包括 LR,SPSR 到 IRQ 的堆栈;
--> 切换到其它特权模式(比如系统模式),并使用的该模式的堆栈;
--> 开中断,允许嵌套
......
--> 关中断
--> 切换到IRQ模式
--> 恢复所有寄存器,包括 LR,SPSR
-> 中断返回
要注意各模式下的堆栈的使用。 答 3: 添加:
深思大虾提醒的对,不过需要补充的是:
1.当你的中断程序中不会进行子程序跳转时,
是可以通过保存LR来完成中断嵌套的
2.如果IRQ中断中进行子程序调用,那么就需
要进行模式切换以达到最好的安全性,因为
子程序跳转也是要用到LR寄存器的保存返回
地址的,所以如果在子程序执行过程中被中
断,子程序是无法返回的(LR被覆盖)。
答 4: 下同是LPC2214上的UCOS一段有关中断的代码,void IRQCTimer0(void){
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
TIMER0_IR = 0x01;
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
OSTimeTick();
}
问题1:如果不运行OS_ENTER_CRITICAL();时,此时中断是开着的还是关着的,为什么要运行这个关中断指令呢?
问题2:当执行完OS_EXIT_CRITICAL();,中断处于打开状态,此时调用其它函数,它是怎么保存LR的呢,并且能可靠返回呢?
谢谢! 答 5: re:注意:
这里使用宏调用,中断产生后,经过汇编程序处理后才会跳转到C语言程序。
所以保护LR等操作在IRQ.INC文件中汇编程序来实现。
ADS的汇编程序的宏调用,还是很方便的。
即:Timer0_Handler HANDLER Timer0_Exception
你再仔细看看。 答 6: 第二个问题我搞清楚了,LR中断时,已经保存 MACRO
$IRQ_AsmEntery HANDLER $IRQ_CEntry
EXPORT $IRQ_AsmEntery ; 输出的标号
IMPORT $IRQ_CEntry ; 引用的外部标号
$IRQ_AsmEntery
stmfd sp!,{r0-r3,r12,lr}
bl OSIntEnter
bl $IRQ_CEntry
bl OSIntExit
ldr r0,=OSIntCtxSwFlag
ldr r1,[r0]
cmp r1,#1
beq _IntCtxSw
ldmfd sp!,{r0-r3,r12,lr}
subs pc,lr,#4
MEND 答 7: re:可以参考例子http://www.zlgmcu.com/download/downs.asp?ID=1114
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |