请教一下ucos中什么情况下会执行PendSV_Handler

2019-12-14 12:53发布

本帖最后由 zjtzlqr 于 2013-1-14 20:57 编辑

PendSV_Handler
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, PendSV_Handler_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]

中断发生都是有条件的,什么情况下pendsv中断服务程序会执行
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
netawater
1楼-- · 2019-12-14 15:38
 精彩回答 2  元偷偷看……
i55x
2楼-- · 2019-12-14 19:54
开中断马上就进pendsv,谁用谁知道。
zjtzlqr
3楼-- · 2019-12-14 23:36
i55x 发表于 2013-1-14 23:40
开中断马上就进pendsv,谁用谁知道。

开中断指的是不是OS_EXIT_CRITICAL();

但是我在debug的时候
执行OS_EXIT_CRITICAL();之前pendsv中断enable(1),pending(1),active(0)
之后enable(1),pending(1),active(0)
开中断好像pendsv中断好像都没激活过
悠然科技
4楼-- · 2019-12-15 01:11
你在任务里调用OSTimeDly包括OSTimeDlyHMSM,源码里面有个OSCtxSw,叫做任务级切换,在中断里包括systick滴答时钟中断里面,必须调用OSIntExit(),这个叫做中断级切换,这俩的源码是汇编的,一样的,都会调用PendSV_Handler,即进行系统主栈内容的替换以达到切换的目的。
希望你能够找一份能运行的ucos源码,和一本教材任哲和邵贝贝的都行,多跟踪和多看下原理。
这样一句一句的问,都很辛苦,效率也低。
zjtzlqr
5楼-- · 2019-12-15 05:37
悠然科技 发表于 2013-1-15 12:05
你在任务里调用OSTimeDly包括OSTimeDlyHMSM,源码里面有个OSCtxSw,叫做任务级切换,在中断里包括systick滴 ...

PendSV_Handler
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, PendSV_Handler_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]

主要是这段代码貌似只是触发一个pendsv异常而已并没有产生pendsv中断,而且我调试的时候跑这段代码pendsv中断服务程序也没有active
it_yrj
6楼-- · 2019-12-15 07:44
 精彩回答 2  元偷偷看……

一周热门 更多>