1、任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务。uC/OS使用的是OSStartHighRdy

OSStartHighRdyLDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priorityLDR     R1, =NVIC_PENDSV_PRISTRB    R1, [R0]MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch callMSR     PSP, R0LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)LDR     R1, =NVIC_PENDSVSETSTR     R1, [R0]CPSIE   I

需要解释的是,正是由于是启动第一个任务,所以当前的PSP的值为0(本因该是当前任务的堆栈指针),将该指针置零后才进行任务切换。

2、本来任务切换有两个,一个是任务级任务调度,一个是中断级任务调度,即OSCtxSw和OSIntCtxSw,任务切换就是产生中断,来进行SP的偷梁换柱,中断级任务调度时,就处在中断中,所以没有必要再次产生中断,可以直接偷梁换柱,只要稍作处理即可,但是一般的RTOS为了偷懒,OSIntCtxSw和OSCtxSw是一样的,没有做特殊处理

OSCtxSwLDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)LDR     R1, =NVIC_PENDSVSETSTR     R1, [R0]BX      LR

OSIntCtxSwLDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)LDR     R1, =NVIC_PENDSVSETSTR     R1, [R0]BX      LR

3、任务切换的代码就在Pen大SV中断函数中,一般是使用汇编实现,具体如下:

OS_CPU_PendSVHandlerCPSID   I                                                   ; Prevent interruption during context switchMRS     R0, PSP                                             ; PSP is process stack pointerCBZ     R0, OS_CPU_PendSVHandler_nosave                     ; Skip register save the first timeSUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stackSTM     R0, {R4-R11}LDR     R1, =OSTCBCurPtr                                    ; OSTCBCurPtr->OSTCBStkPtr = SP;LDR     R1, [R1]STR     R0, [R1]                                            ; R0 is SP of process being switched out; At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosavePUSH    {R14}                                               ; Save LR exc_return valueLDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();BLX     R0POP     {R14}LDR     R0, =OSPrioCur                                      ; OSPrioCur   = OSPrioHighRdy;LDR     R1, =OSPrioHighRdyLDRB    R2, [R1]STRB    R2, [R0]LDR     R0, =OSTCBCurPtr                                    ; OSTCBCurPtr = OSTCBHighRdyPtr;LDR     R1, =OSTCBHighRdyPtrLDR     R2, [R1]STR     R2, [R0]LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stackADDS    R0, R0, #0x20MSR     PSP, R0                                             ; Load PSP with new process SPORR     LR, LR, #0x04                                       ; Ensure exception return uses process stackCPSIE   IBX      LR

在上面提到,一开始启动任务时,PSP的值为0,所以在此中断中进行了一次判断(Skip register save the first time),此时是不需要进行现场保护的(R4-R11),否则保护现场之后,改变当前的OSPrioCur,OSTCBCurPtr ,然后恢复即将切换到任务的现场。

转载于:https://www.cnblogs.com/cpf123/archive/2012/10/14/2723273.html

uC/OS 的任务调度解析相关推荐

  1. 基于STM32的uc/OS系统移植及用Saleae Logic 16抓取分析波形

    文章目录 一.关于uc/OS系统 1.操作系统与裸机的区别 2.uc/OS运行流程 二.详细移植过程 1.STM32Cubex创建工程 2.为工程添加源码 3.添加头文件路径 4.添加代码 1)bsp ...

  2. 笔记之uC/OS 多任务机制OSTaskCreate()

    想让uC/OS-Ⅱ管理用户的任务,用户必须要先建立任务.用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() 或 OSTaskCreateExt().OSTas ...

  3. uC/OS和uClinux的比较

    摘    要: 嵌入式操作系统是嵌入式系统应用的核心.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结了嵌入式操作系统应用中的若干问题,归纳了嵌入式操作系统的选型依据. 引言     随着现代 ...

  4. UC/OS和UCLinux比较

    随着现代计算机技术的飞速发展和互联网技术的广泛应用,从pc时代过渡到了以个人数字助理.手持个人电脑和信息家电为代表的3c(计算机.通信.消费电子)一体的后pc时代.后pc时代里,嵌入式系统扮演了越来越 ...

  5. 嵌入式系统 操作系统 uC/OS uClinux

    摘要:嵌入式操作系统是嵌入式系统应用的核心软件.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结嵌入式操作系统应用中的若干问题,归纳嵌入式操作系统的选型依据. 关键词:嵌入式系统 操作系统 u ...

  6. uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)

    uc/OS中任务的学习目录 注:本章未写完的在后面章节会继续书写 (1)任务的基本概念 (2)任务堆栈 (3)任务控制块及任务控制块链表 (4)任务就绪表及任务调度 (5)任务的创建 (6)任务的挂起 ...

  7. uC/OS 的进程调度(上)

    操作系统最重要的任务之一就是进程调度,它涉及三个主要方面: 何时进行调度 如何选择下一个活动进程 如何实现进程切换 每种操作系统差别很大,本文对uC/OS的进程调度机制进行一些细致分析. 何时进行调度 ...

  8. 嵌入式系统开发16——嵌入式实时操作系统uC/OS的简介及简单应用

    本文主要介绍嵌入式实时操作系统(RTOS),并且以uc/OS为例,将其移植到stm32F103C8T6上,构建3个任务:其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制:另外一个ta ...

  9. uc/os程序设计点滴记录

    任务有切换,但切换到某个任务,总是出现hardfault错误? [现象:给出错的任务换一个大小一样但名字不一样的堆栈就可以,使用原来名字的堆栈就是出错] 解决: 查看hardfault寄存器,找到出错 ...

最新文章

  1. android中设置控件获得焦点
  2. Web开发需弄懂的知识点(.NET)
  3. Android中实现保存和读取文本文件到内部存储器(实现简易的记事本为例)
  4. SQLServer常用的日期和时间函数梳理
  5. Fragment 横竖屏切换问题
  6. FCKeditor上传漏洞总结
  7. 详解nginx 代理多个服务器(多个server方式)
  8. 20200502:力扣185周周赛下
  9. eclipse lombok插件安装_Eclipse安装virgo插件
  10. FF与IE兼容性总结(转载)
  11. MSN Messenger的用户管理
  12. 遍历数组-forEach
  13. 计算机切换用户快捷键,电脑操作中如何快速切换用户?
  14. python 基于smb通信协议实现NAS服务器文件上传和下载
  15. 1.9无穷小新生五十年
  16. 小学生python游戏编程2----飞机大战1
  17. 使用pyecharts绘制系统依赖关系图
  18. QT 带 进度条 解压缩文件方法 - QuaZip
  19. Cadence教程1——ncsu-cdk安装
  20. 信创云“华山论剑” 五强鼎力谁与争锋?

热门文章

  1. 天天动听 半透明Menu效果
  2. 科发财务凭证登陆出现错误:40002
  3. adb 51 android.rules,使用51-android-rules解决ubuntu上不识别 android手机的问题
  4. 实现ip数据包抓取并分析_一些网站https证书出现问题的情况分析
  5. 作为开发,你对进程和线程能否区分开来呢?
  6. EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
  7. 5-11attention网络结构
  8. mysql查询表变量_MySQL 之SQL语言、表库操作、查询及变量精讲
  9. linux 如何查看远程代码分支,linux看git 创建分支、删除本地分支、查看远程分支、本地分支例子...
  10. er图转换成关系模型的例题,将ER图转换为关系模型