uCOS-II系统应用开发_第1页
uCOS-II系统应用开发_第2页
uCOS-II系统应用开发_第3页
uCOS-II系统应用开发_第4页
uCOS-II系统应用开发_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、uC/OS-II 系统应用开发uC/OS-II 是一个简洁、易用的基于优先级的嵌入式抢占式多任务实时内核。尽 管它非常简单, 但是它的确在很大程度上解放了我的嵌入式开发工作。 既然是 个操作系统内核, 那么一旦使用它, 就会涉及到如何基于操作系统设计应用软件 的问题。以下便是我以前、现在、乃至以后的 uC/OS-II 开发经验的部分总结:1 、 uC/OS-II 的任务框架void task_xxx(void *pArg)/* 该任务的初始化工作 */* 进入该任务的死循环 */while(1)/* 等待事件,并完成你需要的任务 */每个用户的任务都必须符合事件驱动的编程模型,即 uC/OS-

2、II 的应用程序都必 须符合“事件驱动的编程模型”。 一个任务首先等待一个事件的发生, 事件可以 是中断服务程序发出的, 也可以是其它任务发出的, 又可以是任务自身等待延时 产生的。 当一个事件发生了, 任务再作相应处理, 处理结束后又开始等待下一个 事件的发生。 如此周而复始的任务处理模型就是“事件驱动的编程模型”。 事件 驱动模型也涵盖了中断驱动模型, uC/OS-II 事件归根结底来自三个方面: (1) 中 断服务程序发送的事件 (2) 系统定时器所引起的 (3) 其它任务发送的事件。其中 “中断服务程序发送的事件”就是指每当有硬件中断发生, 那么中断服务程序就 会以事件的形式告诉任务,

3、而等待该事件的最高优先级任务就会马上得以运行; “系统定时器所引起的”事件其实也是硬件中断导致的,那就是系统定时器中 断。而“其它任务发送的事件”则是由任务代码自身决定的, 这是完全的“软事 件”。不管“软事件”还是“硬事件”,反正引起 uC/OS-II 任务切换的原因就 是“事件”,所以用户编写应用代码的时候一定要体现出“事件驱动的编程模 型”。2 、 uC/OS-II 的任务优先级分配uC/OS-II 的任务优先级分配需要按照不同的系统设计具体分析。比如,对实时 性要求越高的任务,则优先级要越高。互斥对象 (Mutex) 的优先级必须高于一切 使用该互斥对象的任务的优先级。3 、 uC/O

4、S-II 的软件层次 从上图可以看出, uC/OS-II 会直接操纵硬件,比如:任务切换代码必然要保存 和恢复CPU及协处理器的寄存器;uC/OS-ll的内核时基时钟就需要硬件定时器 的中断。BSP就是“板极支持包”,它包括基于 uC/OS-ll而开发的事件驱动模型、支持 多任务的驱动程序集合。这些驱动程序直接控制各个硬件模块并利用 uC/OS-ll 的系统函数来实现多任务功能,它们应该尽量避免应用程序直接操纵硬件和 uC/OS-ll内核。BSP还应该为应用程序提供标准、统一的 API,以达到软件层次 分明、应用软件代码可复用的目的。应用程序就是用户为具体应用需要而开发的软件,它必须符合 uC

5、/OS-ll 的编程 模型,即“事件驱动的编程模型”。 应用程序还应该尽量避免直接控制硬件和直 接调用 uC/OS-ll 系统函数及变量, 一个完善的 uC/OS-ll 系统是不需要应用程序 来针对具体硬件而设计的。也就是说, uC/OS-ll 必须拥有完备的设备驱动程序, 必须提供完备、标准的 APl。4 、 uC/OS-ll 中使用互斥信号对象应该注意互斥对象(Mutual Exclusion Semaphore) 简称 Mutex,是 uC/OS-ll 的内核对象 之一,用于管理那些需要独占访问的资源,并使其适应多任务环境。创建每一个Mutex,都需要指定一个空闲的优先级号,这个优先级号

6、的优先级必 须比所有可能使用此Mutex的任务的优先级都高!uC/OS-ll的Mutex实现原理大致如下:当一个低优先级的任务 A申请并得到了 Mutex,那么它就获得该资源访问权。如 果此后有一个高优先级的任务 B开始运行(此时任务A已经被剥夺),而且也要求 得到Mutex,系统就会把任务A的优先级提高到Mutex所指定的优先级。由于此 优先级高于任何可能使用此 Mutex的任务的优先级,所以任务A会马上获得CPU 控制权。一直到任务A释放Mutex,任务A才回到它原有的优先级,这时任务 B 就可以拥有该Mutex 了。应该注意的是:当任务A得到Mutex后,就不要再等待其它内核对象(诸如:

7、信 号量、邮箱、队列、事件标志等等 ) 了,而应该尽量快速的完成工作, 释放 Mutex。 否则,这样的Mutex就失去了作用,而且效果比直接使用信号量 (Sem)更糟糕!虽然普通的信号量(Sem)也可以用于互斥访问某独占资源,但是它可能引起“优 先级反转”的问题。假设上面的例子使用的是 Sem当任务A得到Sem后,然后 任务B也要使用Sem于是任务A和任务B都被剥夺CPU空制权,而任务C(假设 任务C的优先级比A高,但比B低)就绪的话将获得CPU空制权。任务C的优先 级比B低,却优先得到了 CPU而如果任务A是优先级最低的任务,那么它就要 等到所有比它优先级高的任务都挂起之后才会拥有CPU那

8、么任务B(优先级最高的任务)跟着它一起倒霉!这就是优先级反转问题,这是违背“基于优先级的抢 占式多任务实时操作系统”原则的!综上所述,uC/OS-ll中多个任务访问独占资源时,最好使用 Mutex,但是Mutex 是比较消耗CPU时间和内存的。如果某高优先级的任务要使用独占资源, 但是不 在乎久等的情况下,就可以使用 Sem因为Sem是最高效最省内存的内核对象。、uC/OS-ll应用程序调用 OSSchedLock()和OSSchedUnlock()函数应该注意uC/OS-ll的OSSchedLock()和OSSchedUnlock()函数允许应用程序锁定当前任务 不被其它任务抢占。使用时应当

9、注意的是:当你调用了OSSchedLock ()之后,而在调用OSSchedUnlock()之前,千万不要再调用诸如 OSFIagPend()、OSMboxPend(、OSMutexPend() OSQPend() OSSemPend之类的事件等待函数! 而且应当确保 OSSchedLock()和OSSchedUnlock()函数成对出现,特别是在有些 分支条件语句中,要考虑各种分支情况,不要有遗漏!需要一并提醒用户的是:当您调用开关中断函数 OS_ENTER_CRITICAL和 OS_EXIT_CRITICAL(时也要确保成对出现,否则系统将可能崩溃!不过,在OS_ENTER_CRITICA

10、L和 OS_EXIT_CRITICAL(函数之间调用 OSFlagPend()、 OSMboxPend() OSMutexPend() OSQPend() OSSemPend之类的事件等待函数 是允许的。6 、 uC/OS-II 驱动程序编写规范首先应该阐明的是, 我们这里讨论的是“驱动程序”, 而不是“中断服务程 序”,这两个词语往往被用户混淆。 (1) 中断服务程序指那种硬件中断一旦发生, 就会立即被硬件中断控制器调用的一小段程序, 它的操作追求简单明了, 越快速 越精简就越好。 (2) 驱动程序是指封装了某种硬件操作细节的函数集,它提供给 应用程序的是统一、标准、清晰、易用的 API。对

11、于中断服务程序的编写, 往往与驱动程序的设计相关联。 比如驱动程序提供异 步操作的功能, 那么就需要中断服务程序为它准备缓冲区和一个结构体, 并且中 断服务程序会依照这个结构体的成员参数自动完成所要求的操作。又如,串口 (UART)中断服务程序的设计有两种:基于数据包传输和基于单字节传输, 前者适 用于以数据包为单位的通信程序,而后者适用于如超级终端这样的应用程序。如果在一个系统中, 要求使用同一个硬件设备完成几种不同的操作方式, 就需要 设计一个通用的驱动程序, 而该驱动程序可以根据需要安装各种针对性很强的中 断服务程序。在设计驱动程序时, 特别需要注意的是, 某些外设的操作往往以一个连续而

12、严格 的时序作为原子操作,比如用I/O端口来访问DS1302 24C01、LM75A等等。在 这类设备的操作过程中, 不允许有其它任务来控制对应的 I/O 端口,否则会引起 数据错误甚至器件损坏。所以,这种设备的驱动程序都应该仔细设计“原子操 作”,把必须连贯操作的时序控制代码用互斥对象封装成一个“原子操作”, 以 适应多任务环境。 其实,大部分设备都是这样, 需要确定“原子操作”, 如 LCD、 RTL8019AS、Flash 等等也是如此。关于驱动程序的设计,还有很多很多的文章可作,需要具体问题具体分析。7 、32位嵌入式系统的字节对齐问题32位嵌入式系统的软件开发过程中,字节对齐问题是相

13、当重要的。我们现在就拿ARM处理器和ADS1.2开发环境作为例子说明字节对齐的概念。在此之前,我先声明几个基本的概念:(1) 、对象:在C语言中使用结构体类型、共同体类型、或内部基本类型所定义 的变量或常量, 就称为对象。 对象占据了一块实际的存储器空间, 这块空间有固 定的起始地址和字节数。(2) 、引用:使用对象有两种方法:“对象名”和“引用”。当你在源代码中定 义一个对象时, 编译器就会为它分配一块存储器, 此时你就可以使用“对象名” 来操作该对象。 但是对于程序运行时动态分配的某一块存储器空间 (对象) ,你 就没法使用“对象名”了, 而只能使用“引用”, 所以,“引用”就是指向特定

14、类型的对象的指针。好了,我们转入正题。在 32 位嵌入式系统中,单字节对象是 1 字节对齐的;双字节对象是 2字节对齐 的;四字节对象是 4字节对齐的; 其它结构体或共同体对象是 8字节对齐的。 也 就是说, 当你定义一个单字节对象时, 该对象的起始地址可以是任何整数; 当你 定义一个双字节对象时, 该对象的起始地址必定是 2 的倍数的整数; 当你定义一 个四字节对象时, 该对象的起始地址必定是 4 的倍数的整数; 当你定义一个结构 体或共同体对象时, 该对象的起始地址必定是 8 的倍数的整数。 以上说的对象包 括“结构体或共同体对象的成员对象”。字节对齐的故障只能出现在“引用”的使用过程中。 当你使用“对象名”来操作 对象时,根本不用担心字节对齐问题。在 ADS环境下,有“ ALIGh” 、“_align(x) ” 、“_packed” 关键字用于字 节对齐处理。ALIGN用于汇编语言,_al

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论