告诉任务进入中断服务,禁止调度,执行完时再调用OSIntExit()来退出中断服务程序,这样,按键任务要做的就是等待按键(比如调用OSQPend()挂起),待唤醒后对按键进行为行处理,同样可以用邮箱等方式与流水等任务通信,告知流水灯任务如何运行,这样,这两个任务就可以有条不紊的运转起来了
ucos-ii中断结构及中断嵌套的问腔脊题中断处理樱圆谈流程
1:IRQ中断发生后调用UCOS_IRQHandler()
2:UCOS_IRQHandler()先压脊碰栈
3:后调用OSIntEnter()
4:根据IRQ偏移量查找处理函数
5:用户中断处理函数
6:OSIntExit()
7:如果发生中断切换调用INTCTXSW否则恢复现场至中断前任务
代码如下:
UCOS_IRQHandler
stmfd sp!,{r0-r12,lr}
bl OSIntEnter
bl C_IRQHandler
bl OSIntExit
ldr r0,=OSIntCtxSwFlag 调用OSIntCtxSw后置1
ldr r1,[r0]
cmp r1,#1
beq _IntCtxSw
ldmfd sp!,{r0-r12,lr}
subs pc,lr,#4
_IntCtxSw
mov r1,#0
str r1,[r0]
ldmfd sp!,{r0-r12,lr}
stmfd sp!,{r0-r3}
mov r1,sp
add sp,sp,#16
sub r2,lr,#4
mrs r3,spsr
orr r0,r3,#NOINT
msr spsr_c,r0
ldr r0,=.+8
movs pc,r0
stmfd sp!,{r2} push old task's pc
stmfd sp!,{r4-r12,lr} push old task's lr,r12-r4
mov r4,r1 Special optimised code below
mov r5,r3
ldmfd r4!,{r0-r3}
stmfd sp!,{r0-
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)