μC/OS-Ⅱ学习笔记(3)

http://tiandongying.blog.163.com/blog/static/163612821201081623225765/

读《uCOSⅡ中文教程.pdf》笔记

1、建立任务。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。

2、建立任务。INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)。OSTaskCreate()需要四个参数:task 是任务代码的指针,pdata 是当任务开始执行时传递给任务的参数的指针,ptos是分配给任务的堆栈的栈顶指针,prio 是分配给任务的优先级。返回值是错误代码,没有用。

3、OSTaskCreateExt()函数来建立任务会更加灵活,需要九个参数。

4、OSTaskStkChk()堆栈检验。

5、OSTaskDel()删除任务。

6、OSTaskDelReq()请求删除任务。

7、OSTaskChangePrio()改变任务的优先级。

8、OSTaskSuspend()挂起任务。

9、OSTaskResume()恢复任务。

10、OSTaskQuery()获得有关任务的信息。

11、void OSTimeDly (INT16U ticks)任务延时函数,参数是时钟节拍个数。应用时先测试一下,进行确认。

12、INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli),参数分别是小时、分、秒、毫秒。

13、INT8U OSTimeDlyResume (INT8U prio)让处在延时期的任务结束延时。

14、OSTimeGet()和OSTimeSet()系统时间。4,294,967,295 个节拍执行完一遍的时候从0 开始计数。

15、只有任务可以等待事件发生,中断服务子程序是不能这样做的。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,任务可以等待它,也可以给它发送消息。

16、初始化一个事件控制块,OSEventWaitListInit()。

17、使一个任务进入就绪态,OSEventTaskRdy()。

18、使一个任务进入等待某事件发生状态 ,OSEventTaskWait()。

19、由于等待超时而将任务置为就绪态, OSEventTO()。

20、如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用来表示允许任务访问n 个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。

21、OSSemPost()函数可以由任务或者中断服务子程序调用,而OSSemPend()和OSSemQuery()函数只能有任务程序调用。

22、OS_EVENT *OSSemCreate (INT16U cnt)返回给调用函数一个指向事件控制块的指针。创建信号量。

23、等待一个信号量, void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。让某个任务挂起。

24、发送一个信号量, INT8U OSSemPost (OS_EVENT *pevent)。让优先级最高的等待该信号量的任务进入就绪状态。如是在中断中使用,则要在中断程序执行完毕后才进行任务切换。

25、中断服务子程序要请求信号量时,只能用OSSemAccept(),而不能用OSSemPend(),因为中断服务子程序是不允许等待的。INT16U OSSemAccept (OS_EVENT *pevent)。如果该信号量暂时无效,让该任务简单地返回,而不是进入睡眠等待状态。

26、查询一个信号量的当前状态, OSSemQuery()。包含信号量计数值.OSCnt 和等待任务列表.OSEventTbl[]、.OSEventGrp。

27、邮箱可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。一般情况下,这个初始值是NULL,但也可以初始化一个邮箱,使其在最开始就包含一条消息。如果使用邮箱的目的是用来通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有发生。如果用户用邮箱来共享某些资源,那么就要初始化该邮箱为一个非NULL 的指针。在这种情况下,邮箱被当成一个二值信号量使用。

28、任务或者中断服务子程序可以调用函数OSMboxPost(),但是只有任务可以调用函数OSMboxPend()和OSMboxQuery()。

29、OS_EVENT *OSMboxCreate (void *msg)返回给调用函数一个指向事件控制块的指针。创建邮箱。

30、等待一个邮箱中的消息,OSMboxPend()。void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。挂起。

31、发送一个消息到邮箱中,OSMboxPost()。让优先级最高的等待该邮箱量的任务进入就绪状态。如是在中断中使用,则要在中断程序执行完毕后才进行任务切换。INT8U OSMboxPost (OS_EVENT *pevent, void *msg)。

32、无等待地从邮箱中得到一个消息, OSMboxAccept()。中断可以使用。同时可用于邮箱的清空。

33、查询一个邮箱的状态, OSMboxQuery()。

34、用邮箱作二值信号量,如果用户只需要二值信号量和邮箱,这样做可以节省代码空间。这时可以将OS_SEM_EN 设置为0,只使用邮箱就可以了。用邮箱实现延时,而不使用 OSTimeDly()。

35、消息队列是一个由指针组成的循环缓冲区。

36、建立消息队列OS_EVENT *OSQCreate (void **start, INT16U size)。

37、等待一个消息队列中的消息,void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)。

38、向消息队列发送一个消息(FIFO),INT8U OSQPost (OS_EVENT *pevent, void *msg)。

39、向消息队列发送一个消息(后进先出 LIFO),INT8U OSQPostFront (OS_EVENT *pevent, void *msg)。

40、无等待地从一个消息队列中取得消息,void *OSQAccept (OS_EVENT *pevent)。

41、清空一个消息队列, OSQFlush()。

42、查询一个消息队列的状态,INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)。

43、使用消息队列读取模拟量的值。使用一个消息队列作为计数信号量。

44、此外还有内存管理,移植相关内容,待整理。

 

你可能感兴趣的:(ucosii)