下载此文档

UCOS III STM32上下文切换过程.doc


文档分类:IT计算机 | 页数:约3页 举报非法文档有奖
1/3
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/3 下载此文档
文档列表 文档介绍
UCOSIII中上下文切换是通过调用OSCtxSw()函数实现,OSCtxSw()用汇编语言编写:OSCtxSwLDR R0,=NVIC_INT_CTRL获取中断控制寄存器地址LDR R1,=NVIC_PENDSVSET 获取PendSV中断向量STR R1,[R0] 触发PendSV中断BX LR 函数返回OSCtxSW实际上只是触发了PendSV中断还是没有看到任务究竟是如何调度,接下来程序会执行PendSV中断函数,看看中断函数里边做了哪些工作实现了任务调度的。OS_CPU_PendSVHandlerCPSIDI ;PreventinterruptionduringcontextswitchMRSR0,PSP;PSPisprocessstackpointerCBZR0,OS_CPU_PendSVHandler_nosave;SkipregistersavethefirsttimeTSTLR,#0x10 ITEQVSTMDBEQR0!,{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];R0isnewprocessSP ;SP=OSTCBHighRdyPtr->StkPtr;LDMIAR0!,{R3-R11} MOVLR,R3 TSTLR,#0x10 ITEQ VLDMIAEQR0!,{S16-S31} MSRPSP,R0;LoadPSPwithnewprocessSPCPSIEIBXLR;ExceptionreturnwillrestoreremainingcontextENDPendSV中断服务程序主要的工作就是将SP指针指向将要执行的任务堆栈起始地址,这样当中断退出时,单片机自动出栈,更新寄存器xPSR,PC,LR,R12以及R3-R0;出栈的地址发生改变,xPSR,PC,LR,R12以及R3-R0改变,实现任务切换。任务在创建时都会调用OSTaskStkInit函数:CPU_STK*OSTaskStkInit(OS_TASK_PTRp_task,void*p_arg,CPU_STK*p_stk_base,CPU_STK*p_stk_limit,CPU_STK_SIZEstk_size,OS_OPTopt){CPU_STK*p_stk;(void)opt;/*piler

UCOS III STM32上下文切换过程 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数3
  • 收藏数0 收藏
  • 顶次数0
  • 上传人zbfc1172
  • 文件大小26 KB
  • 时间2019-11-06