找回密码
 注册
搜索
查看: 821|回复: 0

[讨论] ucos学习简要总结

[复制链接]
发表于 2009-1-2 09:24:13 | 显示全部楼层 |阅读模式
ucos学习简要总结
ucos是占先式的实时内核。编写应用程序过程中要注意函数的重入性,解决重入性问题可以通过1:将全局变量,资源定义为局部 变量资源;2:使用不可以重入性函数之前关闭中断,调动后再开中断;3:用信号量禁止该函数再使用过程中被再次调用。
       与共享资源打交道时,使之满足互斥条件的一般方法有:关中断;使用测试并置位指令;禁止任务切换;利用信号量。
      任务间通信可以通过全局变量,或发消息。ucos提供消息邮箱和消息队列的服务。1:消息邮箱是用一个指针型变量,通过内核服务,一个任务或一个中断服务程序可以把一则消息(即是一个指针)放到邮箱里去,同样一个或多个任务可以通过内核服务接收这则消息。发送消息的任务和接收消息的任务约定,该指针指向的内容就是那则消息。每个邮箱有相应的正在等待消息的任务列表,要等到消息的任务会因为邮箱为空而被挂起,且被记录到等待消息的任务表中。2:消息队列实际上是邮箱阵列。传递消息依旧是传递指针指向的内容。先进入队列的消息先给任务。也就是fifo,其实ucos也允许lifo。另外等待消息的任务可以设置超时,如果在限定时间内,任务没有收到消息,该任务进入就绪,同时返回出错代码。如果没有设置超时就会一直等待下去,直至消息到来。
      ucos任务优先级,在os_cfg.h有os_lowest_prio的定义,优先级号越低,优先级越高。
     任务控制块OS_TCB,一旦任务建立了,OS_TCB将被赋值,它是一块数据结构,当任务的cpu使用权力被剥夺,ucos用OS_TCB保存该任务的状态,当任务重新得到cpu使用权力,任务快能够确保任务从被中断的那一点丝毫不差的执行下去。
事件控制块ECB是个相当重要的数据结构!任务或中断服务子程序ISR是通过ECB向另外的任务发送信号的。ECB可以是一个信号量,消息邮箱,消息队列等等。ECB数据结构有5个分量。.OSEventType表示事件类型,.OSEnentPtr个人认为是一个ECB与外界联系的指针。.OSEventCnt当事件是信号量或者mutex时是个计数器。.OSEnentGrp和.OSEnentTbl[]用途类似与就绪表OSTCBGrp和OSTCBTbl[],不同有2点:⒈ECB的是数据结构中的2个分量,而就绪表的是2个变量。⒉前者表示等待该信号量的任务列表,后者表示哪些任务处于就绪态。ECB总数是有信号量,mutex,邮箱,消息队列总数决定的。在调用OSInit时,所有的ECB被链成一个单向的链表——空余事件控制块链表。例如:每次建立一个信号量,就从该链表中取出一个ECB,并初始化,删除信号量,要将ECB放入空闲链表中。当一个任务要等待某时间发生,该任务就被放入ECB的等待任务列表。该任务的TCB分量.OSTCBEventPtr指向这个事件控制块ECB。这样就建立了TCB与ECB之间的联系,说明该任务是等待该时间的一个任务。在得到信号量以后(包括等待超时)需要将TCB与ECB之间的联系段开,说明任务不再是等待该事件的任务。OS_EventTaskWait()建立TCB与ECB之间的联系。OSEventTO()段开联系。
一:信号量操作主要涉及函数OSSemCreate();OSSemPend();OSSemPost();OSSemAccept()和OSSemQuery();OSSemDel()。
二:邮箱操作主要涉及函数OSMboxCreate();OSMboxPend();OSMboxPost();OSMboxAccept();OSMboxQuery();OSMboxDel();
消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。通常该指针指向一个包含了“消息”的特定数据结构。
  应用程序可以使用多少个邮箱,其最大数目是由OS_CFG.H文件中的配置常数OS_MAX_EVENTS设定。
任务或者中断服务子程序都可以调用函数OSMboxPost(),OSMboxPostOpt() ,而只有任务可以调用OSMboxDel()
OSMboxPend(), OSMboxQuery()。
void *OSMboxAccept (OS_EVENT *pevent)无等待的从邮箱中得到一则消息。
OS_EVENT *OSMboxCreate (void *msg)建立一个邮箱。
  msg:用来初始化建立的消息邮箱,如果该指针不为空,则建立的消息邮箱将含有消息。
  返回值:指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,则返回空指针。
OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
  删除一个邮箱。当将OS_CFG.H文件中的OS_MBOX_DEL_EN设为1时,该函数才会被编译。使用该函数时要注意,多个任务可能试图操作已经删除的邮箱。在删除邮箱之前,必须首先删除可能操作该邮箱的所有任务。
  pevent:指向邮箱的指针。该指针是在邮箱建立时返回给用户应用程序的指针。
  opt:该先项定义邮箱的删除条件,可以选择只能在已经没有任何在等待该邮箱的消息时,才能删除邮箱
(OS_DEL_NO_PEND);或者不管有没有任务在等待邮箱的消息,立即删除邮箱(OS_DEL_ALWAYS),在这种情况 下,所有等待邮箱消息的任务都会立即进入就绪态。
       err:指向出错代码的指针。返回的出错代码可以是以下几种情况之一。
  OS_NO_ERR 调用成功,邮箱已经被删除。
  OS_ERR_DEL_ISR 试图在中断服务子程序中删除邮箱。
  OS_ERR_INVALID_OPT 无效的opt参数,用户没有将opt定义为上述两种情况之一。
  OS_ERR_EVENT_TYPE pevent不是指向邮箱的指针。
  OS_ERR_PEVENT_NULL 已经没有OS_EVENT数据结构可以使用。
返回值:返回NULL表示邮箱已被删除;返回pevent表示邮箱没有删。
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)等待邮箱中的消息。
pevent:指向即将接收消息的消息邮箱的指针。
timeout:允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行。如果该值为0表示任务将持续等待消息。
err:指向包含错误码的变量的指针。该函数返回的错误码可能为下述几种情况
  OS_NO_ERR 消息被正确地接收。
  OS_TIMEOUT 消息没有在指定的等待时间内送到。
  OS_ERR_EVENT_TYPE pevent不是指向消息邮箱的指针。
  OS_ERR_PEND_ISR 从中断调用该函数。
  OS_ERR_PEVENT_NULL pevent是空指针。
  返回值:该函数返回接收的消息并将*err置为OS_NO_ERR.
INT8U OSMboxPost (OS_EVENT *pevent, void *msg)向邮箱发送一则消息。
    pevent:指向即将接收消息的消息邮箱的指针。
     msg:即将实际发送给任务的的消息。消息是一个以指针表示的苛种数据类型的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针,国灰这意味着消息邮箱为空。
返回值:该函数的返回值为下述之一:
   OS_NO_ERR 消息成功地放到消息邮箱中。
   OS_MBOX_FULL 消息邮箱已经包含了其他消息,已满。
   OS_ERR_EVENT_TYPE pevent不是指向消息邮箱的指针。
   OS_ERR_PEVENT_NULL pevent是空指针。
   OS_ERR_POST_NULL_PTR 用户试图发出空指针。根据规则,在这里不支持空指针。
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)向邮箱发送一则消息。该函数可以向等待邮箱的所有任务发送消息(广播)。
  pevent:指向即将接收消息的消息邮箱的指针。
  msg:即将实际发送给任务的消息。消息是一个以指针表示的某种数据类型的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针,因为这意味着消息邮箱为空。
  opt:定义消息只发给等待邮箱消息的任务中优先级最高的任务(将opt置为OS_POST_OPT_NONE),或者让所有等待 邮箱消息的任务都得到消息(将opt置为OS_POST_OPT_BROADCAST)。
  返回值:
   err 指向包含错误码的变量指针,返回的错误码可能为下述几种之一:
        OS_NO_ERR 消息成功地放到消息邮箱中。
   OS_MBOX_FULL 消息邮箱已经包含了其他消息,已满。
   OS_ERR_EVENT_TYPE pevent不是指向消息邮箱的指针。
   OS_ERR_PEVENT_NULL pevent是空指针。
   OS_ERR_POST_NULL_PTR 用户试图发出空指针。根据规则,在这里不支持空指针。  
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)查询一个邮箱的状态。
  pevent:指向即将接收消息的消息邮箱的指针。
  pdata:指向OS_MBOX_DATA数据结构的指针,该数据结构包含下述成员。
  void *OSMsg;    /*消息邮箱中消息的复制*/
     INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /*消息邮箱等待队列的复制*/
 INT8U OSEventGrp
返回值:该函数返回值为下述之一:
 OS_NO_ERR     调用成功
 OS_ERR_EVENT_NULL pevent是空指针
 OS_ERR_EVENT_TYPE pevent不是指向消息邮箱的指针
三:队列操作主要涉及函数
OSQCreate()该函数需要一个指针数组来容纳指向各个消息的指针,该指针数组必须声明为void类型。
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-5 00:17 , Processed in 0.042653 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表