UCOSIIISTM32上下文切换过程UCOSIIIstm32上下文切换详细过程UCOSIII中上下文切换是通过调用OSCtxSw()函数实现,OSCtxSw()用汇编语言编写:OSCtxSwLDRR0,=NVIC_INT_CTRL获取中断控制寄存器地址LDRR1,=NVIC_PENDSVSET获取PendSV中断向量STRR1,[R0]触发PendSV中断BXLR函数返回OSCtxSW实际上只是触发了PendSV中断还是没有看到任务究竟是如何调度,接下来程序会执行PendSV中断函数,看看中断函数里边做了哪些工作实现了任务调度的。OS_CPU_PendSVHandlerCPSIDI;PreventinterruptionduringcontextswitchMRSR0,PSP;PSPisprocessstackpointerCBZR0,OS_CPU_PendSVHandler_nosave;SkipregistersavethefirsttimeTSTLR,#0x10ITEQVSTMDBEQR0!,{S16-S31}MOVR3,LRSTMDBR0!,{R3-R11}LDRR1,=OSTCBCurPtr;OSTCBCurPtr->OSTCBStkPtr=SP;LDRR1,[R1]STRR0,[R1];R0isSPofprocessbeingswitchedout;Atthispoint,entirecontextofprocesshasbeensavedOS_CPU_PendSVHandler_nosavePUSH{R14};SaveLRexc_returnvalueLDRR0,=OSTaskSwHook;OSTaskSwHook();BLXR0POP{R14}LDRR0,=OSPrioCur;OSPrioCur=OSPrioHighRdy;LDRR1,=OSPrioHighRdyLDRBR2,[R1]STRBR2,[R0]LDRR0,=OSTCBCurPtr;OSTCBCurPtr=OSTCBHighRdyPtr;LDRR1,=OSTCBHighRdyPtrLDRR2,[R1]STRR2,[R0]LDRR0,[R2];R0isnewprocessSPShenLongbaolookintheeyes,,pickedupabrickreservoirincottonvest,walkedintoasmallalleycorner,,leave;SP=OSTCBHighRdyPtr->StkPtr;LDMIAR0!,{R3-R11}MOVLR,R3TSTLR,#0x10ITEQVLDMIAEQR0!,{S16-S31}MSRPSP,R0;LoadPSPwithnewprocessSPCPSIEIBXLR;Exceptionreturnwillre
UCOS+III+STM32上下文切换过程 来自淘豆网www.taodocs.com转载请标明出处.