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类型。