第12章 任务间通信与同步.ppt

第12章 任务间通信与同步

使用举例 __task void AppTaskMsgPro(void) { uint8_t *pMsg; OS_RESULT xResult; const uint16_t usMaxBlockTime = 200; /* 延迟周期 */ while (1){ xResult = os_mbx_wait(mailbox, (void *)pMsg, usMaxBlockTime); switch (xResult){ case OS_R_OK: printf(无需等待,pMsg = %d\r\n, *pMsg); break; case OS_R_MBX: printf(消息邮箱空,等待时间从消息邮箱内获得数据,pMsg = %d\r\n, *pMsg); break; case OS_R_TMO: bsp_LedToggle(1); bsp_LedToggle(4); break; default: break; } } } 函数 isr_mbx_check OS_RESULT isr_mbx_check( OS_ID mailbox); /*消息邮箱的ID标识*/ 函数描述: 用来检测消息邮箱剩余空间可以存储的消息个数。建议配合isr_mbx_send 一起使用。 第 1 个参数填写消息邮箱的 ID 标识,即函数 os_mbx_declare 第一个参数。 函数返回消息邮箱剩余空间可以存储的消息个数。 注意: 1. 使用此函数前一定要调用函数 os_mbx_init 进行初始化。 2. 此函数只能在中断服务程序中调用。 使用举例 #include rtl.h /* 声明一个支持10个消息的消息邮箱 */ os_mbx_declare(mailbox, 10); static void AppObjCreate(void) { /* 创建消息邮箱 */ os_mbx_init(mailbox, sizeof(mailbox)); } void EXTI0_IRQHandler(void) { if (isr_mbx_check(mailbox) != 0) { isr_mbx_send(mailbox, msg); } } 在中断服务程序中仅发一个消息 使用举例 在中断服务程序中发多个消息 #include rtl.h os_mbx_declare(mailbox, 10); /* 声明一个支持10个消息的消息邮箱 */ static void AppObjCreate(void) { os_mbx_init(mailbox, sizeof(mailbox)); /* 创建消息邮箱 */ } void EXTI0_IRQHandler(void) { int i, free; free = isr_mbx_check(mailbox1); for (i = 0; i 16; i++){ if (free 0) { free--; isr_mbx_send(mailbox1, msg); } } } 函数 isr_mbx_send void isr_mbx_send( OS_ID mailbox, /*消息邮箱的ID标识*/ void* message_ptr); /* 消息指针,即数据的地址*/ 函数描述: 用于向消息邮箱存放数据指针,或者说数据地址。如果消息邮箱已经满了,再次调用此函数会造成消息邮箱溢出。所以调用此函数前,建议调用函数 isr_mbx_check 进行检测,检测是否还有空间可用。 第 1 个参数填写消息邮箱的 ID 标识,即函数 os_mbx_declare 第一个参数。 第 2 个参数填写消息指针,即数据的地址。 注意以下问题: 使用此函数前一定要调用函数 os_mbx_init 进行初始化。 在中断服务程序中仅发一个消息举例 #include rtl.h os_mbx_declare(mailbox, 10); /* 声明一个支持10个消息的消息邮箱 */ static void AppObjCreate(void) { os_mbx_init(mailbox, sizeof(mailbox)); /* 创建消息邮箱 */ } void EXTI0_IRQHandler(void) { if (isr_mbx_check(mailbox) != 0) { isr_mbx_send(mailbox, msg); } } 在中断服务程序中发多个消息举例 #include

文档评论(0)

1亿VIP精品文档

相关文档