您的位置 首页 新能源

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

任何一个操作系统都会提供大量的API供程序员使用,uC/OS-II也不例外。由于uC/OS-II面向的是嵌入式开发,并不要求大而全,所以内核提供的API也就大多和

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

1. 使命类

2. 同步和音讯类

3. 时刻类

4. 临界区

1. 使命类

1) 函数

OSTaskCreate函数

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

OSTaskSuspend函数

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

OSTaskResume函数

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

2)使命状况

睡觉态:

使命驻留在ROM或RAM中可是还没有交给uC/OS-II来办理。

安排妥当态:

使命一旦树立就当即进入安排妥当态,预备运转。使命的树立能够是多使命运转之前,也能够是多使命运转中。使命中也能够树立另一个使命,假如被树立的使命的优先级高于树立它的使命,它立刻进入运转态。

运转态:

多使命树立后,能够调用OSStart()开端运转多使命,该函数只能在启动时调用一次。CPU只需一个,任何时刻只需一个使命处于运转态(把握CPU的运用权)。uC/OS-II是依据优先级调度的,所以要一个使命处于运转态,那么就需求一切优先级高于该使命的使命处于等候状况或许这些高优先级使命被删除了。

等候态:

一种状况是为了防止高优先级的使命称雄CPU,那么就需求周期性的把这个使命挂起让其他较低的优先级的使命有机会被履行。能够经过调用OSTimeDly()和OSTimeDlyHMSM()来将使命本身推迟一段时刻。

其他一种状况是当运转着的使命需求等候某一个事情的产生的时分,那么此刻它占着CPU什么也不干太糟蹋,趁着等候的时刻让其他低优先级的使命运转运转就十分不错了。那么这个高优先级的使命能够依据自己详细的需求调用以下函数是自己处于等候状况:OSFlagPend()、OSSemPend()、OSMutexPend()、OSMboxPend()或OSQPend()。总结一下,都是一些Pend函数。

中止服务态:

正在运转的使命被中止打断的状况。这儿需求留意的是,当中止回来后不必定就回来到被打断的使命,由于在uC/OS-II中一直都是以使命的优先级来断定哪个使命该履行。

2. 同步和音讯类

1)信号量

μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等候该信号量的使命组成的等候使命表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II才干支撑信号量。

树立一个信号量, OSSemCreate(INT16U cnt )

等候一个信号量, OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err )

发送一个信号量, OSSemPost(OS_EVENT *pevent )

无等候地恳求一个信号量, OSSemAccept(OS_EVENT *pevent )

查询一个信号量的当时状况, OSSemQuery()

邮箱

邮箱是μC/OS-II中另一种通讯机制,它能够使一个使命或许中止服务子程序向另一个使命发送一个指针型的变量。该指针指向一个包含了特定“音讯”的数据结构。为了在μC/OS-II中运用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。

树立一个邮箱,OSMboxCreate()

等候一个邮箱中的音讯,OSMboxPend()

发送一个音讯到邮箱中,OSMboxPost()

无等候地从邮箱中得到一个音讯, OSMboxAccept()

查询一个邮箱的状况, OSMboxQuery()

假如用户只需求二值信号量和邮箱,这样做能够节约代码空间。这时能够将OS_SEM_EN设置为0,只运用邮箱就能够了。

3)音讯行列

音讯行列实际上是邮箱的调集

树立一个音讯行列 OS_EVENT *OSQCreate (void **start, INT16U size)

等候一个音讯行列中的音讯,OSQPend()

向音讯行列发送一个音讯(FIFO),OSQPost()

向音讯行列发送一个音讯(后进先出LIFO),OSQPostFront()

无等候地从一个音讯行列中获得音讯, OSQAccept()

查询一个音讯行列的状况,OSQQuery()

3. 时刻类

OSTimeDly函数

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

4. 中止类

OS_ENTER_CRITICAL宏

很多人都认为它是个函数,其实不然,仔细分析一下OS_CPU.H文件,它和下面立刻要谈到的OS_EXIT_CRITICAL都是宏。他们都是触及特定CPU的完成。一般都被替换为一条或许几条嵌入式汇编代码。由于体系期望向上层程序员躲藏内部完成,故而一般都声称履行此条指令后体系进入临界区。其实,它便是关个中止罢了。这样,只需使命不自动抛弃CPU运用权,其他使命就没有占用CPU的机会了,相对这个使命而言,它便是独占了。所以说进入临界区了。这个宏能少用仍是少用,由于它会损坏体系的一些服务,尤其是时刻服务。并使体系对外界呼应功能下降。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部