共2条
1/1 1 跳转至页
ucos 关于ucos退出中断的处理,不解
![](http://uphotos.eepw.com.cn/jackwang/thumb/avatar.jpg)
问
OS_core.c文件里的函数OSIntExit()调用了一句OSIntCtxSw();
请问这句话的作用到底是Includes.h里的
#define OSIntCtxSw() return
还是OS_cpu_a.s里的汇编代码?
请高手指点,谢谢:)
答 1: 顶一下,要沉了 答 2: OSIntCtxSw用于中断退出时的任务切换。实际没有在OSIntExit中进行任务切换,而是使用了OS_cpu_a.s中的OSIntCtxSw。
...
BL OSIntExit ; 调用中断退出系统函数
LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =OSIntCtxSw ; 进行任务切换
请问这句话的作用到底是Includes.h里的
#define OSIntCtxSw() return
还是OS_cpu_a.s里的汇编代码?
请高手指点,谢谢:)
答 1: 顶一下,要沉了 答 2: OSIntCtxSw用于中断退出时的任务切换。实际没有在OSIntExit中进行任务切换,而是使用了OS_cpu_a.s中的OSIntCtxSw。
...
BL OSIntExit ; 调用中断退出系统函数
LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =OSIntCtxSw ; 进行任务切换
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |