博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CM3任务切换详解
阅读量:7009 次
发布时间:2019-06-28

本文共 1311 字,大约阅读时间需要 4 分钟。

hot3.png

    任务切换,又称上下文切换(context switch)是实现操作系统的基础。

    基于CM3实现任务切换必须要有以下2点概念认识

  • PendSV

        PendSV叫做可悬起系统调用,与之相对的叫做系统服务调用(SVC)。

        两者的区别是SVC异常必须在执行SVC指令后立即得到响应,如果因为优先级或者其他原因无法立即响应,就会上访成硬fault。而PendSV则可以像普通中断一样被悬起(pending),从而等待其他优先级更高的中断被响应完毕后执行。

        在实现任务切换的操作系统中,往往会把PendSV的中断优先级设为最低。这样在进行任务切换时,只需要将PendSV悬起寄存器置位即可。PendSV的中断处理子程序会在所有高优先级中断响应完后开始进行任务切换。

        在ucos中任务切换代码十分简单:

OSCtxSw	LDR		R0,	=NVIC_INT_CTRL	LDR		R1,	=NVIC_PENDSVSET  //trigger PendSV	STR		R1,	[R0]	BX		LR

        相对应的PendSV处理函数:

OS_PendSV_Handler	CPSID	I        /* 寄存器保存和恢复 */    Save & Restore registers	CPSIE	I	BX		LR
  • 堆栈操作

        任务切换的本质是实现寄存器的保存和恢复。在CM3中通过堆栈操作能快速的进行任务切换,为OS节约下不小的开销。

        1. 中断入栈

            当CM3开始响应一个中断时,会硬件自动把xPSR、PC、LR、R12、R3 - R0压入堆栈中

        2. 手动入栈

            除了自动入栈的寄存器外,在任务切换中断子程序(PendSV ISR)中,我们还需要手动把R4 - R11压入堆栈中,从而实现完整现场保护。

旧SP(N - 0)    原先已压栈的内容(N - 4)        xPSR(N - 8)        PC(N - 12)       LR(N - 16)       R12(N - 20)       R3(N - 24)       R2(N - 28)       R1(N - 32)       R0--------------------------- 手动入栈(N - 36)       R11(N - 40)       R10(N - 44)       R9(N - 48)       R8(N - 52)       R7(N - 56)       R6(N - 60)       R5(N - 64)       R4 ---> 新SP

        在ucos可以看到响应的实现

OS_PendSV_Handler:    ..........        //save    SUBS	R0,	R0, #0x20		;8 registers	STM		R0,	{R4-R11}    ..........    //restore	LDM		R0,	{R4-R11}	ADDS	R0,	R0,	#0x20

 

转载于:https://my.oschina.net/u/2007478/blog/1506507

你可能感兴趣的文章
Java 多线程
查看>>
InstallCert.java
查看>>
在Debian 7上配置Nginx + php-FPM + apc + MariaDB(翻译)
查看>>
解决Maven多模块项目,MavenWeb项目依赖的项目,修改无法立即生效问题
查看>>
XMPP协议实现原理介绍
查看>>
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor...
查看>>
Java 一个特殊的类 ServiceLoader<S> 详解
查看>>
盒子模型中的div居中
查看>>
让你打开眼界的生活小创意!
查看>>
常用apt命令
查看>>
CSS实现3D旋转
查看>>
golang服务端, 游戏公测时遇到的socket写超时的问题, 也是游戏框架的设计问题
查看>>
oracle 定时器
查看>>
mysqld_multi 多实例启动mysql
查看>>
配置linux下的vimrc
查看>>
glusterfs Self-Heal and Re-Balance Operations
查看>>
Python文件夹与文件的操作
查看>>
Apache 启动遇到问题解决
查看>>
final和static
查看>>
win7 64位 下USB转COM驱动安装方法
查看>>