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. v2ray和ss的安装资料整理

    v2ray: 1. https://yuan.ga/v2ray-complete-tutorial/ 2. https://toutyrater.github.io/ 推荐使用:v2ray,会比ss快 ...

  2. 利用百度API(js),怎样通过地址获取经纬度

    根据经纬度找到具体地址:http://api.map.baidu.com/geocoder?location=纬度,经度&output=输出格式类型&key=用户密钥如:http:// ...

  3. Sublime插件Emmet的安装及Tab补全代码

    Emmet是一款Web前端开发工具Sublime非常有用的插件,使用仿CSS选择器的语法来生成代码,大大提高了HTML和CSS代码编写的速度,只需按住Tab键即可把一个简写展开成HTML和CSS的代码 ...

  4. ubuntu设置分辨率

    前言 装过ubuntu的虚拟机人应该都知道,刚刚装完系统时,分辨率小的令人发指,根本就不能愉快的使用,所以必须调整,但是有些分辨率ubuntu里面也没有,这就需要我们自己自定义. 自定义分辨率 1. ...

  5. sql server中的用户临时表和全局临时表的区别

    临时表分为: 本地临时表,仅限于当前访问者访问,创建方法去如下:create table #TableName(表结构)储存于数据库tempdb内(硬盘),当前用户断开连接(把当前的),自动删除如果使 ...

  6. Android 解析未知格式的json数据

    1.递归一有的时候我们需要解析未知的json.或者说是动态的json.那么我们并不知道key具体是多少,或者说key不是固定的.这时候就需要解析动态key的方法. 这个方法是我在实现解析前台传入的js ...

  7. [微信小程序] 通过快速启动demo分析小程序入门关键点

    (1)小程序基础结构 下图是在开发者工具通过快速启动模式创建的小程序的目录结构 可以看到,小程序中主要包含有4中类型不同的文件 .json 后缀的 JSON 配置文件 .wxml 后缀的 WXML 模 ...

  8. Go的json解析:Marshal与Unmarshal

    https://blog.csdn.net/zxy_666/article/details/80173288 https://www.jianshu.com/p/98965b3ff638

  9. Linux下配置环境变量—— .bashrc 和 /etc/profile

    转载:https://blog.csdn.net/sun8112133/article/details/79901527 首先简单说一下什么是环境变量?环境变量简单的说就是当前环境下的参数或者变量.如 ...

  10. springboot2.x版本整合redis(单机/集群)(使用lettuce)

    在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce. 此处springboot2.x,所以使用的是Lettuce.关于jedis跟 ...