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. Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)

    『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率. 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是我们熟知的『高内聚,低耦合』原则. 组件化 ...

  2. 海外VPS

    缘由 国内从ISP拿到的只能是内网IP,当然如今IPv4地址紧张导致的也能够理解,使用免费DDNS能够同样也能将内网通过端口映射将服务发布外网.但是千万不要小瞧了ISP的觉醒,通过限制上行带宽(ADS ...

  3. 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

  4. Linux服务器CPU使用率较低但负载较高

    CPU使用率较低但负载较高 问题描述 Linux 系统没有业务程序运行,通过 top 观察,类似如下图所示,CPU 很空闲,但是 load average 却非常高,如下图所示. 处理办法 load ...

  5. 减少网站跳转时间,增强网站数据安全——HSTS 详解

    近年来随着 Google.Apple.百度等公司不断推动 HTTPS 普及,全网 HTTPS 已是大势所趋.目前多数网站都已经支持 HTTPS 访问,但是在由 HTTP 转向 HTTPS 路程中,不少 ...

  6. jQuery雷达扫描切换幻灯片代码

    基于jQuery雷达扫描切换幻灯片代码.这是一款切换效果类似雷达扫描,支持鼠标滚轮滚动切换.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=" ...

  7. HTML 09 web 内容与攻击技术

    Servlet 改进 CGI 之前提及的 CGI, 由于每次接到请求, 程序都要跟着启动一次, 因此一旦访问量过大, web 服务器要承担低昂当大的负载, 而 servlet 运行在与 web 服务器 ...

  8. Spark基础

    1 读取本地文件 ./spark-shell scala> val textFile=sc.textFile("file:///home/hadoop/wordfile1.txt&qu ...

  9. Git命令行大全

    git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git ...

  10. java相对路径、绝对路径及类路径

    import java.io.File; import java.net.URL; /** * java相对路径.绝对路径及类路径的测试 */ public class Test { /** * 测试 ...