您的位置 首页 汽车

ucOS学习笔记(2)——多任务是怎么完成的

ucOS是一个抢占式多任务操作系统,其核心就是人物调度机制,该机制保证了多个任务在一个MCU上并发执行。关于多任务实现我们就不得不谈一谈…

ucOS是一个抢占式多使命操作体系,其中心便是人物调度机制,该机制确保了多个使命在一个MCU上并发履行。

关于多使命完成咱们就不得不谈一谈一段程序运转的上下文。所谓程序运转的上下文便是指一段代码(一般以函数为根本单位)运转进程中需求运用到的资源,这个资源被我称之为上下文。这些资源包含当时体系的根本作业寄存器,函数运用到的零时变量,全局变量等等。当这些资源被给定后咱们不管在何时去履行一个给定的地址开端的代码都将得到完全相同的成果。下边以详细代码为例解说该进程,以下代码get_val为一个核算1到10累加和的函数,C代码如下:
unsigned char get_val(void)
{
unsigned char i = 0;
unsigned char temp = 0;
for(i = 0; i < 10; i++)
temp += i;
return temp;
}

要了解上下文信息咱们需求检查汇编代码,汇编代码如下:

get_val:
C:0x0003 E4 CLR A
C:0x0004 FF MOV R7,A
C:0x0005 FE MOV R6,A
C:0x0006 EF MOV A,R7
C:0x0007 2E ADD A,R6
C:0x0008 FE MOV R6,A
C:0x0009 0F INC R7
C:0x000A BF0AF9 CJNE R7,#0x0A,C:0006
C:0x000D AF06 MOV R7,0x06
C:0x000F 22 RET

检查汇编代码咱们发现该函数运用的体系资源仅仅为累加器A,寄存器R7,R6。因此在任何时间咱们脱离该函数,只要在从头履行函数时康复脱离时的上下文,那么函数履行结束都能够得到正确的成果。例如当履行到C:0x0008处(0008指令还没有被履行),此刻咱们由于某种原因改动了PC的值指向了代码段Q(操作体系称这一进程为使命切换),当Q代码段履行结束后再次返回到0008处履行,此刻假如康复R7,R6,和A那么咱们将得到共同的成果。

操作体系便是经过在改动PC时保存当时上下文并装载方针PC处的上下文的方法完成了多使命并发履行。当然,操作体系所进行的上下文保存就并不仅仅保存R6,R7了,它不会依据哪个详细的使命是用了哪些详细资源而保存这个使命,它会选用一个一致的方法把任何使命可能是用到的任何资源都保存起来,尽管这样浪费了体系的存储空间可是它缺坚持了使命切换的一致性和简单性。
在保存上下文时有几个需求留意的问题:
1.是否保存独占资源的上下文?比方体系当时一共有20个使命,只要使命8运用定时器2,那么在保存上下文时需求保存定时器2的相关装备么?
2.保存上下文时不会保存全局变量,由于全局变量本身便是用来传递信息用的,答应在其他当地被改动然后带给当时程序信息。
3.函数内部的零时变量不需求保存上下文,由于该变量时被存储到函数本身的栈上的。
这样体系依据某一种机制在特定时间保存当时上下文切换的方针代码履行完成了多使命,这种机制被称为使命调度算法。 ucOS经过两种途径完成使命调度:中止和使命调用等候函数。 中止又包含体系tick中止和其他使命中止。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/276000.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部