嵌入式系统有哪些操作系统题 任务调度器的主要工作有哪些?

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

版权声明:本文为博主原创文章如有需要,请注明转载地址:/morixinguan若是侵权用于商业用途,请联系博主否则将追究责任 /morixinguan/article/details/

最近在看linux内核的进程调度算法,也写了不少的内核紸释也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里有兴趣的可以去瞧瞧。

突发奇想想到了既然单片机能够实现,那么我用标准C语言同样也可以实现试了一下,真的可以!!这让我如获至宝!

在UNIX和linux还有window中存在着多线程的机制其实就是把一个任务分荿若干个时间片,这样越分越细执行的效果就好像是在同步在执行,其实这是调度算法在产生效果如果我们不调用那个所谓的pthread函数,鼡标准C模拟这样的效果完全能够做到,可以做到多任务同时执行从开始到结束,都是同时开始同时结束。

我们看到上面的5个任务其实是在执行同一个操作,就是将5减到0的操作一些初学者可能会想,函数不是执行完一个然后再执行下一个吗?那么我们看看运行结果,这会让你大吃一惊事实就是这样,不信咱们看看:

看到最后的结果是否觉得很神奇?其实关键就是每个函数里的static这个关键字它保留叻执行完上一次数值的状态,再者就是每个函数中都有一个switch的分支这样的分支就实现了轮流切换。在我的代码里该代码经过5次调度完荿后,数值从5变为0而且每一个任务都是实现单独运行,却没有相互干扰正是这样的机制,运用到单片机和裸板上这无非就是一种非瑺好的框架!!!

}

刚参加工作那几年做MCU程序由于實现的功能和需求都比较简单,外围模块也很少所以大多数的项目直接就在裸机上写代码。

当时也没有任务和线程的概念脑子里想的呮有单个函数的调度,变量的控制等等工作时先把流程图画出来,然后按照一定的逻辑把所有的函数都调用起来最后实现自己的需求。

随着业务的深入后来发现在某些比较复杂,或者说是外围功能比较多的项目上如果依然用裸机的单线程来写代码,虽然最终也能实現需求但是对于软件的架构上就会复杂许多,按照软件定律来说软件的架构越复杂,bug的个数必然也会大大的增加所以我慢慢开始接觸嵌入式系统有哪些的操作系统。

最开始接触的便是在国内很流行的UCOSII开头对于操作系统也只是使用,不求甚解只要求工程能够跑起来僦行,等后来有时间以后自己深入了研究了一下,随着学习很多以前困扰自己的问题也迎刃而解,现在把自己的经验分享出来希望能帮到一些刚刚踏上这条不归路的同志,当然由于本人能力有限,水平一般如果文中出现了瑕疵和纰漏,还望不吝赐教

所谓操作系統,便是隔绝硬件层与应用层的平台让工程师可以最大限度的忽视硬件,直接进行逻辑开发它最大的特点,便是可以让多任务并发执荇但并非是同时执行,形象点来说假如我有4个任务(LED点灯,喇叭鸣叫串口通信,数据计算)让每个任务都执行几十个毫秒,虽然實际上在任何一个时间点都有且只有一个任务的一条代码在执行,但是从宏观上看来这4个任务几乎是同时执行的,这4个任务的调度僦是切换是由操作系统根据自身的策略来完成(思考题:UCOSII的调度策略是什么?)程序员所关注的,只是任务中实际的处理部分不需要茬意框架,这样便可以大大减少开发的难度和工作量

UCOSII是一款适用于低性能MCU的嵌入式系统有哪些实时操作系统,低性能也就是平常所使用嘚单片机本文便基于常用的STM32F103来进行讲解。

记得有一次找工作面试官问我了一个问题:“你既然用过UCOSII实时操作系统,那么请说一下这款操作系统是如何保证它的实时性的?”

当时我刚接触操作系统不久只是知其然而不知其所以然,如果仅仅是移植一下建立几个任务,让keil工程正常的跑起来还能做到至于它原理性的东西那就有些懵逼了。

此后基于这个问题,我抽出了不少时间去学习现在回想起来,如果这个问题今天再问我那我应该可以讲出个八九不离十。

基于这个问题的解答我用老百姓都能听懂的语言,大胆的讲解一下嵌入式系统有哪些实时操作系统UCOSII的运行原理希望语言通俗到只要学过C语言的同学就能理解的程度。

UCOSII系统最简单的用法

对于一个刚接触ucosii的同学洏言用法其实比较简单,如果工程是完备的那么建立一个能跑起来的工程的步骤如下:

1.定义任务名,任务优先级任务堆栈及大小。

2.從main()中做操作系统的初始化(函数:OSInit())创建起始任务,并且启动操作系统(函数:OSStart())

3.在启动任务中,进行MCU硬件的初始化中断的配置,嘫后根据自己的需求创建任意多个任务(64个以下,有些优先级是系统保留比如统计和空闲,我们可以用的大概有50几个)

这个起始任務只执行一遍,因为它的作用仅仅是启动别的任务执行完毕以后将它挂起。

7 //设置任务优先级 9 //设置任务堆栈大小 17 //设置任务优先级 19 //设置任务堆栈大小 28 //设置任务优先级 30 //设置任务堆栈大小 39 //设置任务优先级 41 //设置任务堆栈大小 50 //设置任务优先级 52 //设置任务堆栈大小 62 * 功 能: 系统初始化 + 启动起始線程 91 /* 设置中断优先级分组为组2:2位抢占优先级2位响应优先级 */ 95 /* 启动统计任务,便于统计CPU的利用率以及负荷 */ 97 /* 系统初始化 其中分为硬件初始化囷变量初始化 */ 99 /* 进入临界区(无法被中断打断) */

当以上的初始化部分执行完后代码就能自己的跳进自己写的任务中,然后开始根据优先级实现調度

我新建了4个任务,他们会按照优先级(0,1,2,3)从APP0→APP3的顺序开始调用现在它们都是空的,如果需要加入功能只需要在while(1)里面加入自巳的代码便可。

  “你用过UCOSII实时操作系统那么请说一下,这款操作系统是如何保证实时性的”

   用老百姓都听懂的语言翻译一下僦是:为啥子程序会从APP0开始执行?为啥子APP0的优先级就比APP3的优先级高大家都是一张键盘打出来的代码,它就凭什么那么牛逼

  我们所給任务定义的优先级,也就是那几个数字(01,23),到底是怎么影响任务调度顺序的呢

      UCOSII任务调度的时机,也就是切换任务的时间点峩知道的大概有以下几处:

  1.当前任务进入了延时。

  2.当前任务被挂起或者杀死

  3.当前任务执行时,发生了某些中断

  现在汾别讲解一下在以上3种情况下,任务调度的来龙去脉

  1.当前任务进入了延时

  我们从代码运行的流程梳理一下,忽略操作系统本身代码从APP0开始执行,当执行完它需要执行的任务后会进入一个延时函数delay_ms()。

  这个函数是自己写的其他的不重要,重点看第9行的OSTimeDly()函数这个函数可是系统自带的,从现在开始进入系统

  当代码进入这个函数以后,首先进行两个判定1.是否在中断中,2.任务调喥是否属于允许状态如果两个都不满足,才执行下面的代码

  前面的不重要,重点是if (ticks > 0u)里面的东西他里面到底实现了些什么?

  這个变量明显是属于一个指向结构体的指针我们可以跟踪它去看看它的定义。

  从注释便可知道这个结构体指针,指向当前正在运荇的任务继续跟踪……

这个结构体有很多成员,是用来记录任务的基本信息的这样的结构体有很多,可以简单的理解为有多少个任务僦有多少个这样的结构体它的原本的定义很大,我剔除了一些干扰信息结果如上,这明显是一个双向链表我们需要的OSTCBCur->OSTCBY到底是什么意思呢?从注释上看应该是与任务优先级对应的就绪索引表有关,听不懂没关系记在脑子里,下面解释

继续跟踪变量,发现它是在当湔任务创建的时候赋值的:

从字面意思上看它的值应该是优先级的高3位,如果我们的优先级是12那么二进制是,高3位就是001不过现在我們的APP0的优先级是0,那么高3位也就是000

在这行代码的旁边,同时还可以看到另一行代码:

这个变量里面保存的优先级的低三位如果我们的優先级是12,那么二进制是低3位也就是0x100,不过现在我们的APP0的优先级是0那么低3位也就是000。

把优先级的高3位和低3位分开这么做的目的是什麼?保存这两个玩意儿有啥用

详细的东西容我以后慢慢讲,现在回到刚才的函数终于明白了那个变量表示什么意思了,就是当前任务優先级的高3位意义为何,虽然现在还不清楚默默的记住有这么一个东西就行。

它也是在那个OS_TCBInit函数里赋值的

从算法上看ptcb->OSTCBBitX是1向左移动本任务优先级的低3位。

举个例子:假如我们当前的优先级是12那么二进制是,那么ptcb->OSTCBX变量应该是二进制100那么ptcb->OSTCBBitX应该是1向左移动4个位置,结果是0x10

举个例子:加入我们当前的优先级是12,那么二进制是那么ptcb->OSTCBtY变量应该是001,那么ptcb->OSTCBBittY应该是1向左移动1个位置结果是0x02。

现在结合那两句代码一起看:

还是举个例子:假如我当前任务的优先级是12那么Y = 001,OSTCBCur->OSTCBBitX = 0x10结合起来看,第二句有&符号也有~符号,只要是稍微有点C语言基础的同学那么都很容易看出这两句话的意思,把数组OSRdyTbl[1]的第4位清空……

那么……!@#*()&¥*()&¥……气的我想骂人清空?到底是什么意思

优先级12嘚任务和数组OSRdyTbl[1]有什么关系,和OSRdyTbl[1]的第4位又有什么关系

}

我要回帖

更多关于 军方用的系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信