uc/OS-II读书笔记二

来源:互联网 发布:python 文本挖掘技术 编辑:程序博客网 时间:2024/06/07 08:00

第五章小结

  嵌入式系统中的各个任务是为同一个大的任务服务的子任务,它们不可避免地要共同使用一些共享资源,并且在处理一些需要多个任务共同协作来完成的工作时,还需要相互的支持和限制,因此,对于一个完善的多任务操作系统来说,系统必须具有完备的同步和通信机制。

  在各任务之间必须建立一些制约关系。其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系。直接制约关系源于任务之间的合作。间接制约关系源于对资源的共享。

  事件:uc/OS-II使用信号量、邮箱(消息邮箱)和消息队列这些中间环节来实现任务之间的通信,为了方便起见,这些中间环节都统一被称作“事件”。uc/OS-II把任务发送事件,请求事件以及其他事件的操作都定义成为全局函数,以供应用程序的所有任务来调用。

  在多任务操作系统中,常常需要在任务与任务之间通过传递一个数据(这种数据叫做“消息”)的方式进行通信,为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区,如果把这个缓冲区叫做消息缓冲区,那么在任务间传递数据(消息)的一个最简单的方法就是传递消息缓冲区的指针。因此,用来传递消息缓冲区的数据结构就叫做消息邮箱。

  应用程序中的任务通过指针pevent来访问事件控制块。

  成员OSEventTCnt为信号量的计数器。

  成员OSEventPtr主要用来存放邮箱或消息队列的指针。

  成员OSEventTblOS__EVENT__TBL_SIZE】为等待任务表。

  成员OSEventGrp表示任务等待表中的各任务组是否存在等待任务。

  消息队列,使用消息队列可在任务之间传递多条信息。消息队列由三部分组成:事件控制块,消息队列和消息。

  uc/OS-II中,信号量是一个表明一个共享资源被使用情况的标志,该标志实质上是一个计数器。如果计数器的初值大于1,则叫做信号量;如果计数器的值只能为10两个初值,则叫做信号。

  能防止出现优先级反转现象的信号叫做互斥型信号量。

  消息邮箱是能在任务之间传递消息指针的数据结构。

  消息队列是能在任务之间传递一组消息指针的数据结构。

  信号量,消息邮箱和消息队列都叫做“事件”,每个事件都有一个用来记录等待事件的任务的表——等待任务表,而任务的等待时限则记录在OSTCBDLy中。

  uc/OS-II统一用事件控制块来描述各种事件。

                                      第六章小结

  从总体上来看,uc/OS-II把信号量集的功能分成了两部分:标志组和等待任务链表。标志组存放了信号量集的所有信号,而等待任务链表中的每个节点都对应着一个叫做OS_FLAG_NODE的结构。

  OS_FLAG_NODE的结构实质上就是等待任务控制块,也就是说uc/OS-II信号量集是由一个标志组和多个等待任务控制块组成。

  等待任务,所谓等待任务,就是那些向信号量集发出了请求操作的任务。

  从函数的源代码中可知,创建信号量集的函数主要做了两项工作:一是从空标志组链表中取下一个标志组,同时给成员OSFLAGTypeOSFlagFlags赋初值;二是令指向等待任务链表的指针OSFlagWaitList为空指针

  信号量集实现了多个信号量的组合功能,它是一个多输入多输出系统,使一个任务可以与多个任务进行同步。

  信号量集的多个信号量输入值由标志组来存放,等待任务控制块对标志组中输入信号进行过滤并实施逻辑运算,其结果就是等待任务所请求的信号量值。

  每个信号量集都有一个等待任务链表,链表的每一个节点都通过任务控制块关联着一个任务。

 第七章小结

  uc/OS-II对内存进行两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存块。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况则由内存控制块来记录。

  uc/OS-II用于动态内存管理的函数有:创建动态内存分配函数OSMemCreate()、请求获得内存块函数OSMenCreate()、释放内存块函数OSMemPut()和查询动态内存分区状态函数OSMemQuery()等函数。

  通过定义一个二维数组在内存中划分一个内存分区,其中的所有内存块大小应该相等。

  系统通过与内存分区相关联的内存控制块来对内存分区进行管理。

  划分与创建内存分区根据需要由应用程序负责,而系统只提供了可供任务调用的相关函数。

   uc/OS-II中,在使用和释放动态内存的安全性方面,要由应用程序全权负责。

                              第八章小结

   在多任务操作系统环境中,应用程序的各个任务是并发运行的,所以会经常出现多个任务“同时”调用同一函数的情况。这里之所以在“同时”这个词上使用了引号,是因为这个词“同时”和我们所说的不是同一个概念。这里所说的“同时”实质上是指多个任务在同一时间段内交叉调用同一函数的情况,这是并发系统的一个共同特点。

  通过前面的学习已经知道, uc/OS-II要通过硬件中断来实现系统时钟,并在时钟中断服务程序中处理与时间相关的问题,因此,用户所选用的处理器必须具有响应中断的能力,并同时应该具有开中断与关中断指令。

  几点注意事项:本来原则上在对 uc/OS-II进行移植时,并不需要修改与处理器无关的代码、但因为在默认情况下KEIL编译器生成的代码不可重入,如果要生成可重入代码,则必须在函数声明后面显式地使用关键字reentrant

  另外,由于 uc/OS-II使用的pdatadata等参数都参与KEIL的关键字相同,所以还要把uc/OS-II的这些数据改成ppdataddata等。

  多任务操作系统时,系统所提供的函数应该能允许同时被多个任务所调用而不会通过函数中变量的耦合引起任务之间的相互干扰。这样的函数叫可重入函数。

  应该使用硬件定时器作为时钟中断源。这个定时器可以是与微处理器集成在一个芯片上,也可以是分立的。定时中断的频率以10~100Hz为宜。

  不用的处理器支持堆栈的增长方向也不同,因此在对 uc/OS-II进行移植时、一定要正确地定义堆栈的格式。


  

  

0 0