您的位置 首页 新能源

uC/OS-II 初级程序员攻略

(一) uC/OS-II 简介uC/OS-II是一种基于优先级的可抢先的硬实时内核。自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的

(一) uC/OS-II 简介

uC/OS-II是一种依据优先级的可抢先的硬实时内核。自从92年发布以来,在世界各地都取得了广泛的运用,它是一种专门为嵌入式设备设计的内核,现在现已被移植到40多种不同结构的CPU上,运转在从8位到64位的各种体系之上。特别值得一提的是,该体系自从2.51版别之后,就经过了美国FAA认证,能够运转在比如航天器等对安全要求极为严苛的体系之上。鉴于uC/OS-II能够免费取得代码,关于嵌入式RTOS而言,挑选uC/OS无疑是最经济的挑选。

(二) uC/OS-II 运用程序根本结构

运用uC/OS-II,天然要为它开发运用程序,下面论说依据uC/OS-II的运用程序的根本结构以及留意事项。

每一个uC/OS-II运用至少要有一个使命。而每一个使命有必要被写成无限循环的方式。以下是引荐的结构:

void task ( void* pdata )

{

INT8U err;

InitTimer(); // 可选

For( ;; )

{

// 你的运用程序代码

…….

……..

OSTimeDly(1); // 可选

}

}

以上便是根本结构,至于为什么要写成无限循环的方式呢?那是因为体系会为每一个使命保存一个仓库空间,由体系在使命切换的时分换康复上下文,并履行一条reti 指令回来。假如答应使命履行到最终一个花括号(那一般都意味着一条ret指令)的话,很可能会损坏体系仓库空间从而使运用程序的履行不确定。换句话说,便是“跑飞”了。所以,每一个使命有必要被写成无限循环的方式。程序员必定要信任,自己的使命是会抛弃CPU运用权的,而不管是体系强制(经过ISR)仍是自动抛弃(经过调用OS API)。

现在来议论上面程序中的InitTimer()函数,这个函数应该由体系供给,程序员有义务在优先级最高的使命内调用它并且不能在for循环内调用。留意,这个函数是和所运用的CPU相关的,每种体系都有自己的Timer初始化程序。在uC/OS-II的协助手册内,作者特别着重绝对不能在OSInit()或许OSStart()内调用Timer初始化程序,那会损坏体系的可移植性一起带来功用上的丢失。所以,一个折中的方法便是象上面这样,在优先级最高的程序内调用,这样能够确保当OSStart()调用体系内部函数OSStartHighRdy()开端多使命后,首要履行的便是Timer初始化程序。或许专门开一个优先级最高的使命,只做一件工作,那便是履行Timer初始化,之后经过调用OSTaskSuspend()将自己挂起来,永久不再履行。不过这样会糟蹋一个TCB空间。关于那些RAM吃紧的体系来说,仍是不用为好。

(三) 一些重要的uC/OS-II API介绍

任何一个操作体系都会供给很多的API供程序员运用,uC/OS-II也不破例。因为uC/OS-II面向的是嵌入式开发,并不要求大而全,所以内核供给的API也就大多和多使命休戚相关。首要的有以下几类:

1)使命类

2)音讯类

3)同步类

4)时刻类

5)临界区与事情类

我个人认为关于初级程序员而言,使命类和时刻类是有必要要首要把握的两种类型的API。下面我就来介绍比较重要的:

1) OSTaskCreate函数

这个函数应该至少再main函数内调用一次,在OSInit函数调用之后调用。效果便是创立一个使命。现在有四个参数,别离是使命的进口地址,使命的参数,使命仓库的首地址和使命的优先级。调用本函数后,体系会首要从TCB闲暇列表内请求一个空的TCB指针,然后将会依据用户给出参数初始化使命仓库,并在内部的使命安排妥当表内符号该使命为安排妥当状况。最终回来,这样一个使命就创立成功了。

2) OSTaskSuspend函数

这个函数很简单,一看姓名就该理解它的效果,它能够将指定的使命挂起。假如挂起的是当前使命的话,那么还会引发体系履行使命切换先导函数OSShed来进行一次使命切换。这个函数只需一个参数,那便是指定使命的优先级。那为什么是优先级呢?事实上在体系内部,优先级除了表明一个使命履行的先后次第外,还起着别离每一个使命的效果,换句话说,优先级也便是使命的ID。所以uC/OS-II不答应呈现相同优先级的使命。

3) OSTaskResume函数

这个函数和上面的函数正好相反,它用于将指定的现已挂起的函数康复成安排妥当状况。假如康复使命的优先级高于当前使命,那么还为引发一次使命切换。其参数相似OSTaskSuspend函数,为指定使命的优先级。需求特别阐明是,本函数并不要求和OSTaskSuspend函数成对运用。

4) OS_ENTER_CRITICAL宏

很多人都认为它是个函数,其实不然,仔细剖析一下OS_CPU.H文件,它和下面立刻要谈到的OS_EXIT_CRITICAL都是宏。他们都是触及特定CPU的完结。一般都被替换为一条或许几条嵌入式汇编代码。因为体系期望向上层程序员躲藏内部完结,故而一般都声称履行此条指令后体系进入临界区。其实,它便是关个中止罢了。这样,只需使命不自动抛弃CPU运用权,

其他使命就没有占用CPU的机会了,相对这个使命而言,它便是独占了。所以说进入临界区了。这个宏能少用仍是少用,因为它会损坏体系的一些服务,特别是时刻服务。并使体系对外界呼应功用下降。

5) OS_EXIT_CRITICAL宏

这个是和上面介绍的宏配套运用另一个宏,它在体系手册里的阐明是退出临界区。其实它便是重新开中止。需求留意的是,它有必要和上面的宏成对呈现,否则会带来意想不到的结果。最坏的情况下,体系会溃散。咱们引荐程序员们尽量少运用这两个宏调用,因为他们确实会损坏体系的多使命功用。

6) OSTimeDly函数

这应该程序员们调用最多的一个函数了,这个函数完结功用很简单,便是先挂起当起当前使命,然后进行使命切换,在指定的时刻到来之后,将当前使命康复为安排妥当状况,可是并不必定运转,假如康复后是优先级最高安排妥当使命的话,那么运转之。简单点说,便是能够使命延时必定时刻后再次履行它,或许说,暂时抛弃CPU的运用权。一个使命能够不显式的调用这些能够导致抛弃CPU运用权的API,但那样多使命功用会大大下降,因为此刻只是依托时钟机制在进行使命切换。一个好的使命应该在完结一些操作自动抛弃运用权,好东西要咱们共享嘛!

(四) uC/OS-II 多使命完结机制剖析

前面现已说过,uC/OS-II是一种依据优先级的可抢先的多使命内核。那么,它的多使命机制究竟怎么完结的呢?了解这些原理,能够协助咱们写出愈加强健的代码来。因为咱们面向的初级程序员,本文不计划写成又一篇uC/OS-II的源码剖析,那样的文章太多了,本文计划从完结原理的视点讨论这个问题。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部