zoukankan      html  css  js  c++  java
  • 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 OSCtxSw
    12         PUSH    {R4, R5}
    13         LDR     R4, =NVIC_INT_CTRL      ;触发PendSV异常 (causes context switch)
    14         LDR     R5, =NVIC_PENDSVSET
    15         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_Handler
    12     CPSID   I                                                   ; Prevent interruption during context switch
    13     MRS     R0, PSP                                             ; PSP is process stack pointer 如果在用PSP堆栈,则可以忽略保存寄存器,参考CM3权威中的双堆栈-白菜注
    14     CBZ     R0, PendSV_Handler_Nosave                            ; Skip register save the first time
    15 
    16     SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack
    17     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的通用寄存器,助于理解上面汇编指令。

  • 相关阅读:
    使用Layui上传图片,并进行压缩(非原创,证实可用)
    mysql 存储过程及事件
    Redis一些简单的笔记
    RIOT 技术笔记-01 RIOT介绍
    杂七杂八-ubuntu安装eclipse
    杂七杂八-sqlyog连接mysql错误码2058
    杂七杂八-Mysql8.0忘记root密码
    RIOT学习笔记-01 cygwin安装
    Ubutun-安装远程桌面
    中间件-RocketMQ 02 Docker下的安装
  • 原文地址:https://www.cnblogs.com/prayer521/p/5899712.html
Copyright © 2011-2022 走看看