<meta name="keywords" content="庄家克星时时彩,uCOS-II,低级法式模范模范员指南" />
检查: 5434|回复: 0
打印 上一主题 下一主题

uCOS-II 低级法式模范模范员指南,明确一下! [复制链接]

手艺小白 (离线)
积分
3539
帖子
559
跳转到指定楼层
楼主
揭晓于 2018-9-3 10:53:57 |只看该作者 |倒序浏览
要害词: uCOS-II , 低级法式模范模范员指南
(一) 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的源码剖析,那样的文章太多了,本文盘算从完成原理的角度探讨这个效果。


首先我们来看看为甚么多义务机制可以完成?着实在单一CPU的情形下,是不存在真实的多义务机制的,存在的只需不合的义务轮替应用CPU,以是本质上照样单义务的。但由于CPU推行速率异常快,加上义务切换很是频仍而且切换的很快,以是我们感应似乎有许多义务同时在运转一样。这就是所谓的多义务机制。


由下面的形貌,不难发现,要完成多义务机制,那么目的CPU必须具有一种在运转期更改PC的蹊径,否则没法做到切换。不幸的使,直接设置PC指针,现在还没有哪个CPU支持这样的指令。然则浅易CPU都允许经由历程类似JMP,CALL这样的指令来直接的修改PC。我们的多义务机制的完成也正是基于这个终点。现实上,我们应用CALL指令或许软中止指令来修改PC,主若是软中止。但在一些CPU上,着实不存在软中止这样的看法,以是,我们在那些CPU上,应用几条PUSH指令加上一条CALL指令来模拟一次软中止的发生。


追念一下你在微机原理课程上学过的知识,当发生中止的时间,CPU生涯以后的PC和状态存放器的值到客栈里,然后将PC设置为中止服务法式模范模范的出口地址,再上去一个机械周期,便可以去推行中止服务法式模范模范了。推行终了以后,浅易都是推行一条RETI指令,这条指令会把以后客栈里的值弹出恢复到状态存放器和PC里。这样,系统就会回到中止之前的地方一连推行了。那么设想一下?假定再中止的时间,人为的更改了客栈里的值,那会发生甚么?或许经由历程更改以后客栈指针的值,又会发生甚么呢?假定更改是随便的,那么效果是没法预感的弱点。由于我们没法一定机械下一条会推行些甚么指令,然则假定更改是妄图好的,凭证一定规则的话,那么我们便可以完成多义务机制。现实上,这就是现在简直一切的OS的焦点部门。不外他们的完成不像这样质朴而已。


下面,我们来看看uC/OS-II再这方面是如那里置赏罚赏罚的。再uC/OS-II里,每个义务都有一个义务控制块(Task Control Block),这是一个较量严重年夜的数据结构。在义务控制快的偏移为0的地方,存储着一个指针,它纪录了所属义务的公用客栈地址。现实上,再uC/OS-II内,每个义务都有自己的公用客栈,相互之间不克不及侵占。这点请求法式模范模范员再他们的法式模范模范中保证。浅易的做法是把他们诠释成静态数组。而且要诠释成OS_STK类型。当义务有了自己的客栈,那么便可以将每个义务客栈再那里纪录到前面谈到的义务控制快偏移为0的地方。以后每当发生义务切换,系同一定会先进入一其中止,这浅易是经由历程软中止或许时钟中止完成。然后系统会先把以后义务的客栈地址生涯起来,仅接着恢复要切换的义务的客栈地址。由于哪个义务的客栈里一定也存的是地址(还记得我们前面说过的,每当发生义务切换,系同一定会先进入一其中止,而一旦中止CPU就会把地址压入客栈),这样,就到达了修改PC为下一个义务的地址的目的。


以上就是uC/OS-II的多义务虚现机制,我们在这里年夜费文字群情这个效果,是欲望我们的法式模范模范员们可以善加应用这个机制,写出更结实,更富有用力的代码来。
收费试听C语言电子PCBSTM32LinuxFPGA、Python等。想学习的你和我联系预定便可以收费听课了宋工Q3/5/2/4/6/5/9/0/8/8   Tel/WX:1/7/3/1/7/9/5/1/9/0/8




您须要登录后才可以揭晓议论 登录 | 急速注册

关于我们  -  服务条目  -  应用指南  -  站点舆图  -  友谊链接  -  联系我们
庄家克星时时彩-时时彩qq群-时时彩平台推荐 © 版权一切   | 京公网安备110108881021702
回顶部