2、嵌入式学习之uCOS-II基础入门

IT教程 4年前 (2020) https://www.55wd.com

ucosii

内核(Kernel)

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们

内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。

单片机一般不能运行实时内核,因为单片机的RAM很有限。通过提供必不可缺少 的系统服务,诸如信号量管理,邮箱、消息队列、延时等,实时内核使得CPU的利用更为有效。一旦读者用实时内核做过系统设计,将决不再想返回到前后台系统。

 

调度(Scheduler)

调度(Scheduler),英文还有一词叫dispatcher,也是调度的意思。这是内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。然而,究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是不可剥夺型的还是可剥夺型内核。

不可剥夺型内核(Non-Preemptive Kernel)

不可剥夺型内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。

不可剥夺型内核的一个优点响应中断快。在讨论中断响应时会进一步涉及这个问题。在任务级,不可剥夺型内核允许使用不可重入函数。函数的可重入性以后会讨论。每个任务都可以调用非可重入性函数,而不必担心其它任务可能正在使用该函数,从而造成数据的破坏。因为每个任务要运行到完成时才释放CPU的控制权。当然该不可重入型函数本身不得有放弃CPU控制权的企图。

使用不可剥夺型内核时,任务级响应时间比前后台系统快得多。此时的任务级响应时间取决于最长的任务执行时间。

不可剥夺型内核的另一个优点是,几乎不需要使用信号量保护共享数据。运行着的任务占有CPU,而不必担心被别的任务抢占。但这也不是绝对的,在某种情况下,信号量还是用得着的。处理共享I/O设备时仍需要使用互斥型信号量。例如,在打印机的使用上,仍需要满足互斥条件。图2.1示意不可剥夺型内核的运行情况,任务在运行过程之中,[L2.1(1)]中断来了,如果此时中断是开着的,CPU由中断向量[F2.1(2)]进入中断服务子程序,中断服务子程序做事件处理[F2.1(3)],使一个有更高级的任务进入就绪态。中断服务完成以后,中断返回指令[F2.1(4)], 使CPU回到原来被中断的任务,接着执行该任务的代码[F2.1(5)]直到该任务完成,调用一个内核服务函数以释放CPU控制权,由内核将控制权交给那个优先级更高的、并已进入就绪态的任务[F2.1(6)],这个优先级更高的任务才开始处理中断服务程序标识的事件[F2.1(7)]。    

2、嵌入式学习之uCOS-II基础入门

                                                图2.1不可剥夺型内核

不可剥夺型内核的最大缺陷在于其响应时间。高优先级的任务已经进入就绪态,但还不能运行,要等,也许要等很长时间,直到当前运行着的任务释放CPU。与前后系统一样,

不可剥夺型内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU。

总之,不可剥夺型内核允许每个任务运行,直到该任务自愿放弃CPU的控制权。中断可以打入运行着的任务。中断服务完成以后将CPU控制权还给被中断了的任务。任务级响应时间要大大好于前后系统,但仍是不可知的,商业软件几乎没有不可剥夺型内核。

 

可剥夺型内核

系统响应时间很重要时,要使用可剥夺型内核。因此,μC/OS-Ⅱ以及绝大多数商业上销售的实时内核都是可剥夺型内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。如图2.2所示。

2、嵌入式学习之uCOS-II基础入门

                                  图2.2可剥夺型内核

使用可剥夺型内核,最高优先级的任务什么时候可以执行,可以得到CPU的控制权是可知的。使用可剥夺型内核使得任务级响应时间得以最优化

使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。综上所述,可剥夺型内核总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占CPU,到中断服务完成时,内核让此时优先级最高的任务运行(不一定是那个被中断了的任务)。任务级系统响应时间得到了最优化,且是可知的。μC/OS-Ⅱ属于可剥夺型内核。

 可重入性(Reentrancy)

  可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以保护。程序2.11是一个可重入型函数的例子。

//程序清单2.11可重入型函数
void strcpy(char *dest, char *src)
{
    while (*dest++ = *src++) 
    {
        ;
    }

    *dest = NUL;
}

函数Strcpy()做字符串复制。因为参数是存在堆栈中的,故函数Strcpy()可以被多个任务调用,而不必担心各任务调用函数期间会互相破坏对方的指针。    不可重入型函数的例子如程序2.12所示。Swap()是一个简单函数,它使函数的两个形式变量的值互换。为便于讨论,假定使用的是可剥夺型内核,中断是开着的,Temp定义为整数全程变量。


 //程序清单 2.12    不可重入型函数

int Temp;

void swap(int *x, int *y)
{
    Temp = *x;

    *x   = *y;

    *y   = Temp;
}

  程序员打算让Swap() 函数可以为任何任务所调用,如果一个低优先级的任务正在执行Swap()函数,而此时中断发生了,于是可能发生的事情如图2.6所示。[F2.3(1)]表示中断发生时Temp已被赋值1,中断服务子程序使更优先级的任务就绪,当中断完成时[F2.3(2)],内核(假定使用的是μC/OS-Ⅱ)使高优先级的那个任务得以运行[F2.3(3)],高优先级的任务调用Swap()函数是Temp赋值为3。这对该任务本身来说,实现两个变量的交换是没有问题的,交换后Z的值是4,X的值是3。然后高优先级的任务通过调用内核服务函数中的延迟一个时钟节拍[F2.3(4)],释放了CPU的使用权,低优先级任务得以继续运行[F2.3(5)].注意,此时Temp的值仍为3!在低优先级任务接着运行时,Y的值被错误地赋为3,而不是正确值1。

2、嵌入式学习之uCOS-II基础入门

                                   图2.3不可重入性函数

请注意,这只是一个简单的例子,如何能使代码具有可重入性一看就明白。然而有些情况下,问题并非那么易解。应用程序中的不可重入函数引起的错误很可能在测试时发现不了,直到产品到了现场问题才出现。如果在多任务上您还是把新手,使用不可重入型函数时,千万要当心。

使用以下技术之一即可使Swap()函数具有可重入性:

l  把Temp定义为局部变量

l  调用Swap()函数之前关中断,调动后再开中断

l  用信号量禁止该函数在使用过程中被再次调用

如果中断发生在Swap()函数调用之前或调用之后,两个任务中的X,Y值都会是正确的。

刘媛媛学习方法论

有目的的学习,目的不能模糊,学习范围不能太大,会致使学习深度不够,如何提高效率: 1、有目的的学习学习容量,解决问题的数量有限,所以学习

干货|机器学习超全总结!

本篇文章非常全面地给大家总结了有关机器学习的相关知识,满满的干货,请查收!时光飞逝,学习机器学习已四年有余,深感机器学习之博大精深

《史蒂夫乔布斯传》学习笔记

乔布斯是一个伟大的天才,就像他自己的喜好一样,位于技术与艺术的交叉口。他性格偏执、狂妄、专注、完美主义、极简主义、富有创新激

深度学习之稀疏编码算法

网上学平面设计哪家好?有什么学习的网站?

现在随着科技的发展,一些电商平台或公司展现出来的海报都越来越高端、大气、上档次。而这些做平面设计的朋友工资也是在不断往上涨

文章回顾

大家看了本文2、嵌入式学习之uCOS-II基础入门的精彩教程资源内容,是不是对2、嵌入式学习之uCOS-II基础入门了解更多,真心希望2、嵌入式学习之uCOS-II基础入门能帮助到你, 小编会一直给你带来更多教程资源文章信息。

版权声明: 发表于 2020-07-12 5:48:28。

本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。

豌豆资源网专注分享全网综合资源网站大全,致力于超实用的内容资源搜索。

转载请注明:
本文标题:2、嵌入式学习之uCOS-II基础入门
本文地址:https://www.55wd.com/s107745/