【吉祥博【官网】 manaura.com】探秘天下未解之谜 分享全球奇闻趣事

手机版 - 繁体中文 - 今天是

ucos-Ⅱ初级程序员指南-吉祥博官网

发布时间:2020-10-11 11:37:02来源:吉祥博【官网】编辑:吉祥博【官网】阅读: 当前位置:首页 > 历史真相 > 手机阅读

吉祥博|本文面向首次认识uC/OS-II的程序员,为他们讲解一下这个系统的一些基本特征和编程上的注意事项,并讲解几个有一点理解的API。本文作者早已顺利的将uC/OS-II重制到几种有所不同CPU之上。

还包括EPSONS1C33和SunplusunSP?等,累积了非常丰富的经验,现在不愿和朋友们共享这些经历。期望本文的资料对于期望用于这个系统来研发的朋友有所协助,作者乐意与您共享任何您顺利的喜乐。

(一)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应用于最少要有一个任务。

而每一个任务必需被写无限循环的形式。以下是引荐的结构:voidtask(void*pdata){INT8Uerr;InitTimer();//附加For(;;){//你的应用于程序代码...OSTimeDly(1);//可选}}以上就是基本结构,至于为什么要写无限循环的形式呢?那是因为系统不会为每一个任务保有一个堆栈空间,由系统在任务转换的时候换完全恢复上下文,并继续执行一条reti指令回到。如果容许任务继续执行到最后一个花上括号(那一般都意味著一条ret指令)的话,很可能会毁坏系统堆栈空间从而使应用程序的继续执行不确认。

换句话说,就是跑完飞来了。所以,每一个任务必需被写无限循环的形式。程序员一定要坚信,自己的任务是不会退出CPU使用权的,而不管是系统强迫(通过ISR)还是主动退出(通过调用OSAPI)。现在来谈论上面程序中的InitTimer()函数,这个函数应当由系统获取,程序员有义务在优先级最低的任务内调用它而且无法在for循环内调用。

留意,这个函数是和所用于的CPU涉及的,每种系统都有自己的Timer初始化程序。在uC/OS-II的协助手册内,作者特地特别强调意味著无法在OSInit()或者OSStart()内调用Timer初始化程序,那不会毁坏系统的可移植性同时带给性能上的损失。

吉祥博

所以,一个折衷的办法就是象上面这样,在优先级最低的程序内调用,这样可以确保当OSStart()调用系统内部函数OSStartHighRdy()开始多任务后,首先继续执行的就是Timer初始化程序。或者专门进一个优先级最低的任务,只做到一件事情,那就是继续执行Timer初始化,之后通过调用OSTaskSuspend()将自己悬挂一起,总有一天仍然继续执行。不过这样不会浪费一个TCB空间。

对于那些RAM严重不足的系统来说,还是不必为好。三)一些最重要的uC/OS-IIAPI讲解任何一个操作系统都会获取大量的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里,每个任务都有一个任务掌控块(TaskControlBlock),这是一个比较复杂的数据结构。在任务掌控慢的位移为0的地方,存储着一个指针,它记录了所属任务的专用堆栈地址。事实上,再行uC/OS-II内,每个任务都有自己的专用堆栈,彼此之间无法侵害。

这点拒绝程序员再行他们的程序中确保。一般的作法是把他们重申成静态数组。而且要重申成OS_STK类型。当任务有了自己的堆栈,那么就可以将每一个任务堆栈再行那里记录到前面谈及的任务掌控慢位移为0的地方。

以后每当再次发生任务转换,系统必定不会再行转入一个中断,这一般是通过软中断或者时钟中断构建。然后系统不会再行把当前任务的堆栈地址保存起来,仅有接着完全恢复要转换的任务的堆栈地址。由于哪个任务的堆栈里一定也遗的是地址(还忘记我们前面说道过的,每当再次发生任务转换,系统必定不会再行转入一个中断,而一旦中断CPU就不会把地址压入堆栈),这样,就超过了改动PC为下一个任务的地址的目的。

以上就是uC/OS-II的多任务构建机制,我们在这里大费笔墨谈论这个问题,是期望我们的程序员们可以善加利用这个机制,写更加强壮,更加富裕效率的代码来。|吉祥博。

本文来源:吉祥博-www.manaura.com

标签:吉祥博 吉祥博官网

历史真相排行

历史真相精选

历史真相推荐