首页 > 代码库 > ucosii任务切换OS_TASK_SW()
ucosii任务切换OS_TASK_SW()
stm32F103中任务切换定义
1 //任务切换宏,由汇编实现.2 #define OS_TASK_SW() OSCtxSw()
os_cpu_a.asm中任务切换函数的定义
1 NVIC_INT_CTRL EQU 0xE000ED04 ; 中断控制寄存器2 NVIC_SYSPRI2 EQU 0xE000ED20 ; 系统优先级寄存器(2)3 NVIC_PENDSV_PRI EQU 0xFFFF0000 ; PendSV中断和系统节拍中断4 ; (都为最低,0xff).5 NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值.
1 ;/************************************************************************************** 2 ;* 函数名称: OSCtxSw 3 ;* 4 ;* 功能描述: 任务级上下文切换 5 ;* 6 ;* 参 数: None 7 ;* 8 ;* 返 回 值: None 9 ;***************************************************************************************/10 11 OSCtxSw12 PUSH {R4, R5}13 LDR R4, =NVIC_INT_CTRL ;触发PendSV异常 (causes context switch)14 LDR R5, =NVIC_PENDSVSET15 STR R5, [R4]16 POP {R4, R5}17 BX LR
1)任务切换很简单, 由以下两步完成, 将被挂起任务的微处理器寄存器推入堆栈, 然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。
在uC/OS-II中, 就绪任务的栈结构总是看起来跟刚刚发生过中断一样, 所有微处理器的寄存器都保存在栈中。 换句话说, uC/OS-II运行就绪态的任务所要做的一切, 只是恢复所有的CPU寄存器并运行中断返回指令。
为了做任务切换, 运行OS_TASK_SW(),人为模仿了一次中断。 多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。 中断服务子程序或陷阱处理(Trap hardler), 也称作事故处理(exception handler), 必须提供中断向量给汇编语言函数OSCtxSw()。 OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务, 参见第8章, 移植uC/OS-II, 有关于OSCtxSw()的更详尽的解释。
人为模仿中断分析http://www.cnblogs.com/WeyneChen/p/4891885.html
通过向中断控制及状态寄存器ICSR的第28位写1来人为悬起中断,若是当前没有高优先级中断产生,那么程序将会进入PendSV handler
1 ;/************************************************************************************** 2 ;* 函数名称: OSPendSV 3 ;* 4 ;* 功能描述: OSPendSV is used to cause a context switch. 5 ;* 6 ;* 参 数: None 7 ;* 8 ;* 返 回 值: None 9 ;***************************************************************************************/10 11 PendSV_Handler12 CPSID I ; Prevent interruption during context switch13 MRS R0, PSP ; PSP is process stack pointer 如果在用PSP堆栈,则可以忽略保存寄存器,参考CM3权威中的双堆栈-白菜注14 CBZ R0, PendSV_Handler_Nosave ; Skip register save the first time15 16 SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack17 STM R0, {R4-R11}18 19 LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;20 LDR R1, [R1]21 STR R0, [R1] ; R0 is SP of process being switched out
下面是cortex-M3的通用寄存器,助于理解上面汇编指令。
ucosii任务切换OS_TASK_SW()
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。