1.当uC/OS-III转向执行另一个任务的时候,它保存了当前任务的
CPU寄存器到堆栈。并从新任务的的堆栈中CPU寄存器载入CPU。
这个过程叫做上下文切换。

上下文切换需要一些开支。 CPU的寄存器越多, 开支越大。

上下文切换部分的代码是移植uC/OS-III时需编写的。该部分代码
要适用于处理器。这些代码被放在C和汇编语言文件中: OS_CPU.H,
OS_CPU_C.C, OS_CPU_A.ASM。

2.在uC/OS-III中,任务切换时的堆栈设置类似于中断发生时的那
样,所有的CPU寄存器都被保存。我们假定任务堆栈中的信息将要
被载入到CPU中,

TSP指向任务堆栈中最后一个被保存的寄存器。程序指针寄存器
和状态寄存器是最先被保存在任务堆栈中。事实上,当中断发生时这
些是被CPU自动执行的。其它的寄存器通过软件被压入任务堆栈,
TSP不会被保存到堆栈,但会被保存到任务的TCB。

ISP指向当前中断堆栈的顶部。当中断服务程序被执行时,处理
器把R14"作为堆栈指针用于指向函数和局部参数。

3.有两种上下文切换方式:一个是任务级,一个是中断级。任务级
切换通过调用OSCtxSw()实现,实际上它是被宏OS_TASK_SW()调用
的。中断级切换通过调用OSIntCtxSw()实现。它是用汇编语言写的,

保存于OS_CPU_A.ASM。

4.OSCtxSw()

当有一个高优先级就绪任务需要被执行,任务级调度器会调用
OSCtxSw()。

5.OSIntCtxSw()

在ISR中就绪了高优先级任务B, ISR返回时将不会回到中断前的任
务A, 而是直接转向到执行高优先级任务B。 此时, 由于中断产生时
已经将任务A的状态保存在任务A的堆栈中,所以ISR返回时无需
再保存任务A的状态,而是直接载入任务B的CPU寄存器到硬件
CPU寄存器中即可。

上下文切换包括两部分内容,保存旧任务的内容,载入新任务的
内容。
任务级切换时, 通过调用OSSched()实现。 中断级切换时, 通过调
用OSIntExit()实现。

OSSched()中调用OSCtxSw()实现上下文切换。 OSIntExit()中调用
OSIntCtxSw()实现上下文切换。然而, OSIntCtxSw()只需用做上下文
切换的第二部分,因为中断时被中断任务的CPU寄存器已经被保存
到被中断任务的堆栈中了。

13.0-uC/OS-III上下文切换的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

      目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...

  4. 第一篇 HTML5打包APP之VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

    1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macOS 10.1 ...

  5. CrossOver 13.0 发布,Windows 模拟器

    允许在 Linux 和 OS X 平台运行 Win32 程序的 CrossOver 套件发布 13.0 版本,带来了完全重构的 3D 处理流程,将大幅度提高游戏性能. Linux 平台相关变化有: 带 ...

  6. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  7. 关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法

    关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法 近期在评估使用NIOS II处理器进行项目的 ...

  8. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  9. uC/OS 的任务调度解析 (转)

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

  10. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

随机推荐

  1. Python时间,日期,时间戳之间转换,时间转换时间戳,Python时间戳转换时间,Python时间转换时间戳

    #1.将字符串的时间转换为时间戳方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strp ...

  2. Deep Dive into Spark SQL’s Catalyst Optimizer(中英双语)

    文章标题 Deep Dive into Spark SQL’s Catalyst Optimizer 作者介绍 Michael Armbrust, Yin Huai, Cheng Liang, Rey ...

  3. Tomcat热部署的三种方式

    原文地址:https://blog.csdn.net/nlwangxin/article/details/49734659热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB ...

  4. tensorflow 笔记14:tf.expand_dims和tf.squeeze函数

    tf.expand_dims和tf.squeeze函数 一.tf.expand_dims() Function tf.expand_dims(input, axis=None, name=None, ...

  5. Docker指令

    将showdoc容器下的/var/www 拷贝到主机 /home/bonker/showdocTsp1.214下 docker cp showdoc:/var/www /home/bonker/sho ...

  6. MYSQL数据库高可用方案探究

    MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master ...

  7. iOS 开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  8. 解剖 Elasticsearch 集群 - 之二

    解剖 Elasticsearch 集群 - 之二 本篇文章是一系列涵盖 Elasticsearch 底层架构和原型示例的其中一篇.在本篇文章中,我们会讨论 Elasticsearch 是如何处理 3C ...

  9. Postman-REST-Client_v0.8.1之chrome插件下载

    一.前言 安装chrome浏览器postman-rest-client插件,实现基于资源RestFul的http协议的GET.POST.DELETE.PUT等方式请求调用,具体安装使用步骤如下所示 二 ...

  10. 又一次认识java(七) ---- final keyword

    你总以为你会了,事实上你仅仅是一知半解. final 关键字概览 final关键字可用于声明属性.方法.參数和类,分别表示属性不可变.方法不可覆盖.參数不可变和类不能够继承. 我们来分别看看它的使用方 ...