RTOS学习---uCOSii任务切换

简介

所谓任务切换,就是从原来的任务中离开,转去执行新的任务。任务切换的核心是:保存上下文、恢复要去执行的任务的上下文、然后跳转到新任务中执行即可。下面我们从函数开始分析。

函数分析

OS_SchedNew

在三个地方调用

OSStart()///< 系统初始化
OSIntExit()///<
OS_Sched()///< 系统调度

此函数主要是通过查表法找到最高优先级的任务,然后保存到OSPrioHighRdy变量中。

OSStartHighRdy

该函数是一个汇编函数,具体如下:

OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14     ; Set the PendSV exception priority  设置 PendSV 异常优先级
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                 ; Set the PSP to 0 for initial context switch call 将 PSP 设置为 0 以进行初始上下文切换调用
    MSR     PSP, R0

    LDR     R0, =OSRunning         ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL     ; Trigger the PendSV exception (causes context switch) 触发 PendSV 异常(导致上下文切换)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                       ; Enable interrupts at processor level 在处理器级别启用中断

OSStartHang
    B       OSStartHang             ; Should never get here  永远不应该到这里

PendSV 与SVC、SysTick 的关系

SVC: 用于产生系统函数的调用请求(系统调用)。优先级很高。
SysTick :滴答定时器,是系统心跳。优先级比较高。
PendSV :用于执行上下文切换的一个中断,优先级较低。

PendSV的产生:

1、用户在切换任务时,会调用相关指令产生SVC中断,然后在中断中pend一个PendSV中断
2、在SysTick中断时,也会产生查询任务就续表,如果有更高优先级就绪任务,就会产生一个PendSV.

注:uCOS2使用的是抢占式的实时调度算法,调度原则是:在每一个systick的hanlder中,都要去判断下64个任务中所有处于就绪态的任务里,谁的优先级最高,就执行谁就行了。

当前没有比PendSV中断更高的中断时,方可执行PendSV中断,执行任务上下文切换。

在执行任务的时候,可以被其他IRQ打断,在SysTick中断中只做了pend一个PendSV的操作,然后等后面有空了再执行PendSV中断进行
任务切换。

PSP:线程栈指针
MSP:内核栈指针

由于 Cortex-M3 和 M4 内核具有双堆栈指针, MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP任务堆栈指针也是可以的。在 FreeRTOS、uCOSii等 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的, 进程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 uCOSii任务中,所有栈空间的使用都是通过PSP 指针进行指向的。 一旦进入了中断函数以及可能发生的中断嵌套都是用的 MSP 指针。

触发一个pendsv

OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OSRunning                                      ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                                   ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang                                         ; Should never get here

更多细节,请查看《Cortex-M3权威指南(中文)》 121页-124页

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值