嵌入式学习小组
直播中

李允麒

7年用户 258经验值
私信 关注

OSCtxSw函数是怎么触发PendSV_Handler函数的?

OSCtxSw    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)    LDR     R1, =NVIC_PENDSVSET    STR     R1, [R0]    BX      LR[/mw_shl_code]
在ucos中,这个汇编代码应该是起到切换任务的作用吧!听说他是通过调用PendSV_Handler这个汇编函数实现任务的切换。


PendSV_Handler    CPSID   I                                                   ; Prevent interruption during context switch    MRS     R0, PSP                                             ; PSP is process stack pointer    CBZ     R0, OS_CPU_PendSVHandler_nosave                     ; Skip register save the first time    SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack    STM     R0, {R4-R11}    LDR     R1, =OSTCBCur                                       ; OSTCBCur->OSTCBStkPtr = SP;    LDR     R1, [R1]    STR     R0, [R1]                                            ; R0 is SP of process being switched out[/mw_shl_code]
可是我还是不懂,OSCtxSw这个函数怎么就触发PendSV_Handler函数的?
NVIC_INT_CTRL他的宏定义应该是指一个寄存器的地址把,改一下寄存器的值就可以触发中断了?

回帖(10)

何珊

2019-9-3 07:36:06
NVIC_INT_CTRL   EQU     0xE000ED04
他所代表的是一个寄存器的地址,其中不同的位可以引发不同的中断。我这么理解对吗?
举报

乐侨珂

2019-9-3 07:48:03
Cortex-M内核中有个寄存器的一个bit(具体哪个寄存器的哪个bit忘了),向这个bit写1就会引发PendSV中断。
举报

白珊

2019-9-3 07:53:21
我刚才查了一下,在cortex权威指南里面找到一个类似的函数

[C] 纯文本查看 复制代码
OSCtxSw    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)    LDR     R1, =NVIC_PENDSVSET    STR     R1, [R0]    BX      LR
而这里面r1被给的值应该是0x10000000,是不是0x10000000代表PendSV,0x20000000代表SysTick?
举报

魏渝韦

2019-9-3 08:06:09
@zuozhongkai,你说的是上面的那个意思吗?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分