第11章参考手册

上传人:ldj****22 文档编号:30997046 上传时间:2018-02-03 格式:DOC 页数:73 大小:595.50KB
返回 下载 相关 举报
第11章参考手册_第1页
第1页 / 共73页
第11章参考手册_第2页
第2页 / 共73页
第11章参考手册_第3页
第3页 / 共73页
第11章参考手册_第4页
第4页 / 共73页
第11章参考手册_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《第11章参考手册》由会员分享,可在线阅读,更多相关《第11章参考手册(73页珍藏版)》请在金锄头文库上搜索。

1、第 11 章 参考手册本章提供了 uC/OS-的用户指南。每一个用户可以调用的内核函数都按字母顺序加以说明,包括:函数的功能描述函数原型函数名称及源代码函数使用到的常量函数参数函数返回值特殊说明和注意点OSInit( ) Void OSInit(void);所属文件 调用者 开关量OS_CORE.C 启动代码 无OSinit()初始化 uC/OS-,对这个函数的调用必须在调用 OSStart()函数之前,而OSStart()函数真正开始运行多任务。注意/警告:必须先于 OSStart()函数的调用范例:void main (void)OSInit(); / 初始化 uC/OS-II .OSSt

2、art(); /启动多任务内核 void OSInit (void)#if OS_VERSION = 204OSInitHookBegin(); /Call port specific initialization code#endifOS_InitMisc(); /Initialize miscellaneous variables OS_InitRdyList(); / Initialize the Ready List OS_InitTCBList(); / Initialize the free list of OS_TCBs OS_InitEventList(); / Initial

3、ize the free list of OS_EVENTs #if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0)OS_FlagInit(); / Initialize the event flag structures#endif#if (OS_MEM_EN 0) & (OS_MAX_MEM_PART 0)OS_MemInit(); / Initialize the memory manager #endif#if (OS_Q_EN 0) & (OS_MAX_QS 0)OS_QInit(); / Initialize the m

4、essage queue structures */#endifOS_InitTaskIdle(); / Create the Idle Task #if OS_TASK_STAT_EN 0OS_InitTaskStat(); /Create the Statistic Task #endif#if OS_VERSION = 204OSInitHookEnd(); / Call port specific init. code #endif OSIntEnter( ) Void OSIntEnter(void); 所属文件 调用者 开关量OS_CORE.C 中断 无OSIntEnter()通知

5、 uC/OS-一个中断处理函数正在执行,这有助于 uC/OS-掌握中断嵌套的情况。OSIntEnter()函数通常和 OSIntExit()函数联合使用。注意/警告:在任务级不能调用该函数。如果用户使用的微处理器有存储器直接加 1 的单条指令的话,将全程变量OSIntNesting 直接加 1,可以避免调用函数所带来的额外的开销! 如果用户使用的微处理器没有这样的指令,必须先将 OSIntNesting 读入寄存器,再将寄存器加 1,然后再写回到变量 OSIatNesting 中去,就不如调用 OSIntEnter()。OSIntNesting 是共享资源。OSIntEnter()把上述三条指

6、令用开中断、关中断保护起来,以保证处理 OSIntNesting 时的排它性。直接给 OSIntNesting 加 1 比调用 OSIntEnter()快得多,可能时,直接加 1 更好。当心的是,在有些情况下,从 OSIntEnter()返回时,会把中断开了。这种情况,在调用 OSIntEnter()之前要先清中断源,否则中断将连续反复打入,用户应用程序就会崩溃!/源代码void OSIntEnter (void)if (OSRunning = TRUE)if (OSIntNesting 0void OSStatInit (void)#if OS_CRITICAL_METHOD = 3 / A

7、llocate storage for CPU status register OS_CPU_SR cpu_sr;#endif OSTimeDly(2); / Synchronize with clock tick OS_ENTER_CRITICAL();OSIdleCtr = 0L; / Clear idle counter OS_EXIT_CRITICAL();OSTimeDly(OS_TICKS_PER_SEC); / Determine MAX. idle counter value for 1 second OS_ENTER_CRITICAL();OSIdleCtrMax = OSI

8、dleCtr; / Store maximum idle counter count in 1 second OSStatRdy = TRUE;OS_EXIT_CRITICAL();#endifOSMboxAccept( )Void *OSMboxAccept(OS_EVENT *pevent);所属文件 调用者 开关量OS_MBOX.C 任务或中断 OS_MBOX_ENOSMboxAccept()函数查看指定的消息邮箱是否有需要的消息。不同于 OSMboxPend()函数,如果没有需要的消息,OSMboxAccept ()函数并不挂起任务。如果消息已经到达,该消息被传递到用户任务并且从消息邮

9、箱中清除。通常中断调用该函数,因为中断不允许挂起等待消息。参数pevent 是指向需要查看的消息邮箱的指针。当建立消息邮箱时,该指针返回到用户程序。(参考 OSMboxCreate()函数) 。返回值如果消息已经到达,返回指向该消息的指针;如果消息邮箱没有消息,返回空指针。注意/警告必须先建立消息邮箱,然后使用。范例:OS_EVENT *CommMbox;void Task (void *pdata)void *msg;pdata = pdata;for (;) msg = OSMboxAccept(CommMbox); /* 检查消息邮箱是否有消息 */if (msg != (void *)

10、0) . /* 处理消息 */. else . /*没有消息 */. .OSMboxCreate( )OS_EVENT *OSMboxCreate(void *msg);所属文件 调用者 开关量OS_MBOX.C 任务或启动代码 OS_MBOX_ENOSMboxCreate()建立并初始化一个消息邮箱。消息邮箱允许任务或中断向其他一个或几个任务发送消息。参数msg 参数用来初始化建立的消息邮箱。如果该指针不为空,建立的消息邮箱将含有消息。返回值指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,返回空指针。注意/警告必须先建立消息邮箱,然后使用。范例:OS_EVENT *C

11、ommMbox;void main(void).OSInit(); /* 初始化 uC/OS- */.CommMbox = OSMboxCreate(void *)0); /* 建立消息邮箱 */OSStart(); /* 启动多任务内核 */OSMboxPend( )Void *OSMboxPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );所属文件 调用者 开关量OS_MBOX.C 任务 OS_MBOX_ENOSMboxPend()用于任务等待消息。消息通过中断或另外的任务发送给需要的任务。消息是一个以指针定义的变量,在不同的程序中消

12、息的使用也可能不同。如果调用OSMboxPend()函数时消息邮箱已经存在需要的消息,那么该消息被返回给OSMboxPend()的调用者,消息邮箱中清除该消息。如果调用 OSMboxPend()函数时消息邮箱中没有需要的消息,OSMboxPend()函数挂起当前任务直到得到需要的消息或超出定义等待超时的时间。如果同时有多个任务等待同一个消息,uC/OS-默认最高优先级的任务取得消息并且任务恢复执行。一个由 OSTaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用 OSTaskResume()函数恢复任务的运行。参数pevent 是指向即将接受消息的消

13、息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。 (参考 OSMboxCreate()函数) 。Timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行。如果该值为零表示任务将持续的等待消息。最大的等待时间为 65,535 个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的等待超时时钟节拍。Err 是指向包含错误码的变量的指针。OSMboxPend()函数返回的错误码可能为下述几种:OS_NO_ERR :消息被正确的接受。OS_TIMEOUT :消息没有在指定的周期数内送到。OS_ERR_PEND_

14、ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但uC/OS-仍然包含了检测这种情况的功能。OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。返回值OSMboxPend()函数返回接受的消息并将 *err 置为 OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到需要的消息,OSMboxPend()函数返回空指针并且将 *err 设置为OS_TIMEOUT。注意/警告必须先建立消息邮箱,然后使用。不允许从中断调用该函数。范例:OS_EVENT *CommMbox;void CommTask(void *pdata)INT8U err;void *ms

15、g;pdata = pdata;for (;) .msg = OSMboxPend(CommMbox, 10, if (err = OS_NO_ERR) . /* 消息正确的接受 */. else . /* 在指定时间内没有接受到消息 */. .OSMboxPost( )INT8U OSMboxPost(OS_EVENT *pevent, void *msg);所属文件 调用者 开关量OS_MBOX.C 任务或中断 OS_MBOX_ENOSMboxPost()函数通过消息邮箱向任务发送消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。如果消息邮箱中已经存在消息,返回错误码说明消息邮箱已满。OSMboxPost ()函数立即返回调用者,消息也没有能够发到消息邮箱。如果有任何任务在等待消息邮箱的消息,最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号