您的位置 首页 嵌入式

μC/OS―III为缩短中止封闭时刻作出的改善

μC/OS―III为缩短中断关闭时间作出的改进,摘要:本文介绍了实时内核的中断机制,研究了mu;C/OS—III为缩短中断关闭时间做出的改进。通过对比mu;C/OS—II以及m

摘要:本文介绍了实时内核的中止机制,研讨了μC/OS—III为缩短中止封闭时刻做出的改善。经过比照μC/OS—II以及μC/OS—III的中止办理方法,剖析μC/OS—III在哪些方面作出了改善。这些改善使得μC/OS—III的实时功用得到明显提高,使得μC/OS—III的中止封闭时刻大大缩短。
关键词:μC/OS—III;实时内核临界区中止办理

导言
μC/OS—III是一款全新的实时内核,源于世界上盛行的实时内核μC/OS—II。较μC/OS—II,μC/OS—III做了许多改善。其间,很重要的一点便是为了缩短中止封闭时刻作出的改善。本文将深入剖析为什么这些改善能够使得μC/OS—III的实时功用得到提高。

1 中止简介
所谓中止,其实便是一种硬件机制,用于告诉CPU有一个异步事情发生了。因为μC/OS—III是面向以ARMCortex为代表的高端32位CPU的,因而,本文将以ARMCortex—M3为例来介绍一般CPU对中止的处理。
如图1所示,中止操控器NVIC和ARM Cortex—M3CPU严密协作完结中止的处理。中止操控器NVIC担任接纳一切的中止请求。NVIC会把当时优先级最高的中止请求的服务地址传递给CPU。Cortex—M3 CPU在承认中止后,会主动将R0~R2、R12~R15入栈保存,并跳转履行中止服务程序。中止服务程序履行完后,R0~R2、R12~R15会主动出栈。

a.JPG

经过对中止的处理,CPU能够在外部事情发生的时分马上进行处理,然后满意体系的实时性要求。在一些特别情况下,CPU需求经过特别的指令来关中止。可是,需求引起特别注意的是,关中止会添加中止推迟时刻,或许导致后续的中止请求丢掉。嵌入式体系中止源许多,对实时性要求高,中止封闭的时刻越短越好,中止处理程序运转时刻越短越好。中止封闭时刻的长短是实时内核最重要的一个目标。

2 μC/OS-Ⅲ作出的改善
在μC/OS—III中,假如一个中止对应的事情不需求使命知道,不需求给使命发送信号或许音讯,引荐用户把这个中止写成无需内核参加的中止;假如这个中止需求给使命发送信号或许音讯,用户能够挑选直接发布或许推迟发布这两种发布形式中的一种。
2. 1 无需内核参加的中止
在许多情况下,中止需求做的处理十分简略,比方一些I/O中止,并不需求内核知道。这种情况下典型的无需内核参加的中止服务程序暗示代码如下:
保存中止服务程序用到的寄存器;
铲除中止请求;
不要翻开中止;(1)
调用中止处理程序;
康复保存的寄存器;
中止回来;
在无需内核参加的中止服务程序中(1)处不要开中止,因为开中止后,其他中止或许嵌套,也或许调用μC/OS—III的内核函数,导致调度回到高优先级使命持续履行。而内核并不知道有这个中止,所以这个中止的完结时刻将会变得特别长。
笔者主张,I/O中止处理程序最好运用这种方法。别的,在ARM Cortex—M3中,因为R0~R2是主动入栈和出栈的,简略的I/O处理中止尽量只运用R0~R2,这样能够省掉中止服务程序中保存和康复寄存器的过程,缩短了中止服务程序的运转时刻。
2.2 需求内核参加的中止
一个中止对应的事情正好是一个使命正在等候的事情,这意味着这个中止需求向对应的使命发送信号或许音讯。μC/OS—III由中止向使命发送信号或许音讯有两种形式。这两种形式别离为直接发布(Direct Post)和推迟发布(Deferred Post)形式。所谓直接发布,是指在中止服务函数中调用各种post函数时,会当即完结post操作;而推迟发布,是指在中止服务函数中调用各种post函数时,不会当即完结post操作,该操作会被缓存起来。
在剖析μC/OS—III的这两种发布形式之前,先看看μC/OS—III中典型的需求内核参加的中止服务程序的结构。需求内核参加的中止服务程序暗示性代码如下:
封闭中止;
保存悉数CPU寄存器;
OSIntNestingCtr直接加1;
if(OSIntNestingCtr==1){
OSTCBCurPtr->StkPtr=当时使命的仓库指针;
}
清中止源;
重新开中止;
履行用户中止处理程序; (1)
调用OSIntExit(); (2)
康复一切CPU寄存器;
履行中止回来指令;
2.2.1 直接发布
μC/OS—II中运用的是直接发布形式,μC/OS—III中保留了这个形式。
图2为直接发布形式的暗示图,当一个外设发生中止,并向CPU宣布中止请求,然后CPU履行中止服务程序。这个需求内核参加的中止服务程序在暗示性代码标志(1)这个过程中,将会调用OSSemPost()、OSTaskSemPost()、OSFlagPost()、OSQPost()和OSTaskQPost()这5个发布函数其间的一个给使命发音讯或信号,而且这些post操作会被当即履行,使得正在等候这个中止发生的使命进入安排妥当状况。

d.JPG

在需求内核参加的中止服务程序暗示性代码标志(2)中,调用OSIntExit(),OSIntExit()中会调用OSIntCtxSw()进行使命调度。然后体系将履行更高优先级的使命或许之前被中止的使命。
在直接发布形式下,中止服务程序会直接履行post操作。而这些post操作会拜访μC/OS—III中的许多临界段代码,因而μC/OS—III有必要经过关中止来维护体系中会被上述post操作所拜访到的临界段代码,这样无疑会添加中止封闭的时刻。中止封闭时刻的添加会导致实时内核的实时功用下降。
2.2.2 推迟发布
在具体研讨推迟发布形式之前,有必要先了解μC/OS—III中两个新的概念。
(1)中止行列
中止行列类似于一个仓库,它专门用来保存发布函数调用操作以及与这个调用相关的参数。
(2)中止行列处理使命
中止行列处理使命是μC/OS—III中一个新的内部使命,它具有最高的优先级(优先级0)。这个使命专门用来处理中止行列。
图3为推迟发布形式的暗示图,一个外设发生中止,并向CPU宣布中止请求,然后CPU履行中止服务程序。

e.JPG

与直接发布形式不同的是,这个中止服务程序调用发布函数给使命发布音讯或信号时,体系不会当即履行这些post操作,而是将这些post函数的调用以及相应的参数写入中止行列中,而且使中止行列处理使命进入安排妥当态。
举例说明,μC/OS—III中,中止服务程序给使命发送信号量时,调用OSSemPost()函数。在OSSemPost()函数中,体系先判别是什么发布形式。假如是推迟发布形式,则调用OS_IntQPost(),OS_IntQPost()用来将OSSemPost()函数的调用和相应的参数写入中止行列并使得中止处理使命进入安排妥当态;假如是直接发布形式,则调用OS_SemPost(),这个函数用来履行信号量的post操作。OSSemPost()函数的部分源码如下:
f.JPG
然后,中止服务程序履行OSIntExit(),OSIntExit()中调用OSIntCtxSw()履行使命调度。因为中止行列处理使命优先级最高,μC/OS—III将履行中止行列处理使命。该使命从中止行列中提取出发布函数调用信息,此刻仍需求封闭中止,以避免中止服务程序一起对中止行列进行拜访。中止行列处理使命提取出发布函数调用的信息后重新开中止,而且确定使命调度器,然后进行发布函数调用,相当于发布函数调用一直在使命级代码中进行。
这个中止行列处理使命将中止行列一一处理完后,将本身挂起,并重新发动使命调度来运转当时处于最高优先级的安排妥当使命。
因为推迟发布形式下,μC/OS—III的中止服务程序不会直接进行post操作。所以μC/OS—III中那些能够被post操作所拜访的临界段代码不需求进行封闭中止的操作,只需求制止使命调度就行。这将使得体系关中止时刻大大缩短。
推迟发布形式下,用最高优先级的中止行列处理使命来处理需求做使命调度的中止,在维护了临界段代码的一起,又坚持了中止的快速呼应和处理。中止服务程序不需求进行post操作,然后缩短了中止服务程序的时刻。
2.2.3 形式挑选
直接发布形式和推迟发布形式最主要的差异在于中止封闭时刻。推迟发布形式很大程度上缩短了中止封闭时刻和中止程序的运转时刻,可是却添加了使命的延时。
运用中假如存在要求呼应十分敏捷的中止源,用户应该挑选推迟发布形式,因为用直接发布形式很有或许无法处理。
别的,因为μC/OS—III中,相同优先级下的多使命、事情标志组、等候多个内核目标、调用播送方法发布这4个特性都会导致临界段代码变长。假如运用顶用到了这些特性,应该运用推迟发布形式。
假如运用中不存在要求呼应十分敏捷的中止源,也没有用到以上几种特性,用户能够运用直接发布形式,即μC/OS—II形式,不然仍是主张用户尽量运用推迟发布形式。
挑选μC/OS—III的发布形式十分简略,只需求在OS_cfg.h中设置OS_CFG_ISR_POST_DEFERRED_EN的值即可,对运用程序和中止服务程序,代码不需求做任何改动:置0,为直接发布形式;置1,为推迟发布形式。
2.2.4 试验成果比较
笔者在PK10N512VLL100上移植了μC/OS—III,这是Freescale公司的一款依据ARM Cortex—M4核的微操控器。经过一些简略的小试验来剖析直接发布形式以及推迟发布形式下,中止封闭时刻的比照。试验中经过发动体系的计算使命stat_task,然后读取体系的全局变量OS Int DisTimeMax来获取体系的最大中止封闭时刻。
整个试验用操控LED的闪耀使命来完成4种不同的试验条件。第1种,只要一个初始化使命,用来初始化硬件和操控LED的闪耀;第2种,有一个初始化使命(初始化硬件)和两个优先级相同的用户使命(别离操控两个不同的LED周期闪耀);第3种,有一个初始化使命(初始化硬件)和4个优先级相同的用户使命(别离操控4个不同的LED周期闪耀),而且没用到播送音讯的功用,第4种,有一个初始化使命(初始化硬件)和4个优先级相同的用户使命(别离操控4个不同的LED周期闪耀),而且试验顶用到了播送音讯的功用(初始化使命向4个优先级相同的用户使命播送音讯)。
表1是试验成果,表中的最大中止封闭时刻的单位为体系的时钟周期数,试验中体系的时钟为100 MHz。

g.JPG

从以上试验成果能够看出,4种试验条件下,推迟发布形式的最大中止封闭时刻根本坚持稳定。而直接发布形式下,体系的使命越多,功用越杂乱,最大中止封闭时刻也越来越长。而且,在相同条件下,直接发布形式的最大中止封闭时刻比推迟发布形式大许多。

结语
相对于μC/OS—II,μC/OS—III在缩短中止封闭时刻方面作出了杰出的改善。首要,用户能够依据中止的类型运用无需内核参加的中止服务程序和需求内核参加的中止服务程序,尽最大或许削减中止程序的运转时刻。别的,新增了由中止给使命发送信号或音讯的推迟发布形式。该形式有效地缩短了中止封闭的时刻和中止程序的运转时刻,提高了体系的实时性。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部