1.概述

UCOS的任务切换是当前任务在系统延时函数OSTimeDly()或OSTimeDlyHMSM()中进行的;延时函数调用任务调度函数OSSched(),调度函数通过软件触发RTOSINT中断函数来完成任务切换。

2.任务切换步骤:

①保存当前任务(进程)对应的CPU寄存器值至该任务的栈空间中。

②保存当前任务的SP(栈指针寄存器)值到它的TCB变量中:

OSTCBCurPtr->OSTCBStkPtr = SP;

③调用OSTaskSwHook()钩子函数。

④从就绪列表中得到当前最高优先级的任务:

OSPrioCur = OSPrioHighRdy;

⑤得到当前就绪任务(线程)的TCB:

OSTCBCurPtr = OSTCBHighRdyPtr;

⑥从⑤中的TCB中获得新任务的SP:

SP = OSTCBHighRdyPtr->OSTCBStkPtr;

⑦从新任务的栈中恢复该任务的AR1H,AR0H, XAR2..XAR7, XT, RPC寄存器的值。

⑧用当前的IER值覆盖先前切换任务时保存的IER值;

⑨执行异常返回(中断返回),恢复原任务留下的其他上下文。

3.任务切换的源码

即RTOSINT中断函数的源码,用汇编编写:

.asmfunc
_OS_CPU_RTOSINT_Handler:OS_CTX_SAVE                            ; 伪码指示,保存寄存器值。MOVL  XAR0, #_OSTCBCurPtr              ; 保存当前任务的栈指针MOVL  XAR1, *XAR0                      ; 获得当前任务的栈指针首变量MOV   AL  , @SPMOV   *AR1,  ALASP                                    ; 对齐栈指针—起始为奇地址。LCR    #_OSTaskSwHook                  ; 调用任务切换钩子函数OSTaskSwHook.NASP                                   ; 恢复栈指针对齐; 对应C代码:OSPrioCur = OSPrioHighRdyMOVL   XAR0, #_OSPrioHighRdyMOVL   XAR1, #_OSPrioCurMOV    ACC, *XAR0                      ; *XAR0即OSPrioHighRdy首变量MOV    *XAR1, ACC                      ; *XAR1即OSPrioCur首变量; 下面对应C代码:OSTCBCurPtr = OSTCBHighRdyPtrMOVL    XAR0, #_OSTCBHighRdyPtrMOVL    XAR1, #_OSTCBCurPtrMOVL    ACC, *XAR0MOVL    *XAR1, ACC; 从新进程中获得栈指针MOVL    XAR0, *XAR1 MOV     AL  , *AR0MOV     @SP , AL                       ; OSTCBCurPtr写入SP寄存器中。OS_CTX_RESTORE                         IRET                                  ;中断返回,恢复自动保存的寄存器值和其余上下文内容..endasmfunc

4.小结

任务切换关键步骤是:①进入RTOSINT中断,保存当前任务的栈指针;②获得优先级最高的任务的TCB指针;③获得新任务的栈指针并写入SP寄存器中;④中断返回,恢复其他寄存器值。

由此可见,任务的TCB和栈空间是任务切换的关键:TCB包含了任务的优先级、函数入口;栈空间存储任务的临时变量、切换时存储的上下文。所以要求,各个任务的栈空间要彼此独立,不能覆盖。

UCOSIII总结(3)——在C28x中任务切换相关推荐

  1. linux系统中用户切换

    1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...

  2. 如何切换默认python版本_Debian中如何切换默认Python版本

    基于系统修改 Python 版本: 我们可以使用 update-alternatives 来为整个系统更改 Python 版本.以 root 身份登录,首先罗列出所有可用的 python 替代版本信息 ...

  3. 中使用swiper不能自动切换_液晶拼接墙显示系统中矩阵切换器使用的注意事项

    近年来在液晶拼接墙显示系统中矩阵切换器的使用已变得越来越普遍.这主要是因为各矩阵切换器品牌商根据众多用户的实际需求对矩阵进行了同能扩展与完善.这也使得矩阵切换器除了使用在大屏拼接显示系统外还适用于多媒 ...

  4. python中cmd如何切换盘_redis 中如何切换db

    redis 中如何切换db redis数据库个数是可以配置的,默认为16个 如上图 我们如何切换呢? 我在redis客户端查询如下 通过用select N 你想要的数据库 就能切到对应的数据库去了 每 ...

  5. 自动化测试中自动化切换网络----解决方案

    自动化测试中自动化切换网络----解决方案 思路 通过安装一个控制网络的APP,在测试脚本中,通过shell命令来控制实现 使用方式 关闭WIFI,切换到4G网络(测试手机默认流量是开着的) adb ...

  6. DLL中资源切换的两种方法

    DLL中资源切换的两种方法 方法1 AFX_MANAGE_STATE(AfxGetAppModuleState());                // MFC扩展dll 或 AFX_MANAGE_ ...

  7. php里切换不了输入法,电脑中怎么切换输入法

    电脑中怎么切换输入法? 设置输入法的切换键步骤: 1,要设置输入法的切换键,第一步是,在任务栏的输入法图标上右键点击,在菜单中选择"设置"项. 2,在"文字服务和输入语言 ...

  8. 【Unity3D 灵巧小知识点】☀️ | Unity 中 怎样切换 天空盒 背景

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  9. 在keil中如何切换stm32的大中小容量芯片

    在keil中如何切换stm32的大中小容量芯片 stm32的三种不同容量芯片及对应的启动文件** : startup_stm32f10x_ld.s: 适用于小容量 产品----->STM32F1 ...

最新文章

  1. Tomcat 调优及 JVM 参数优化
  2. 16张思维导图+学习路线图,囊括所有Python基础,可打印
  3. SpringMVC4集成ehcache
  4. vuex页面数据丢失_使用vuex解决刷新页面state数据消失的问题记录
  5. boost的chrono模块模拟线程接口的测试程序
  6. jQuery导航菜单防刷新
  7. ios 开发需要看的书籍
  8. 第七章 consul docker集群
  9. 疯狂挂载:Linux连接常用外部设备的方法
  10. [Android Security] DEX文件格式分析
  11. VirtualBox虚拟机,WIN7的性能远远落后于LINUX及解决办法
  12. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址(1)
  13. 三维点云数据处理软件供技术原理说明_十大点云数据处理技术梳理
  14. MarkDown学习手册
  15. 关于Windows7系统不能访问XP创建的DVD的问题
  16. C++实用的闹钟程序
  17. 修改谷歌浏览器ua的简单方法
  18. JAVA广度优先搜索---寻找从A点到B点最短路径
  19. [计算机漫谈]网络初步:一个分组的生命历程
  20. linux去重复程序,Linux下大文件的排序和去重复

热门文章

  1. 菜鸟android教程
  2. ADODB.Command #x27;800a0bb9#x27; 错误[参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。]
  3. 自定义九宫格解锁控件
  4. rng.uniform
  5. Linux中SVN的安装与使用
  6. 实在RPA专家课:AI+RPA如何赋能电商的数智化升级
  7. 〖产品思维训练白宝书 - 产品思维认知篇⑥〗- 职场人所面临困惑与迷茫应该如何破局?
  8. Java利用stream将一个List中部分字段复制到另一个List中
  9. 番外:英语单词应该怎么记(五)什么是记单词的好方法?快!
  10. 干货分享!值得珍藏的6大资源网站,值得珍藏