μC/OSIII——任务同步和通信(一)
2014-10-15 17:01
176 查看
使用情况
任务间通常涉及发送和接收,但是发送速度和接收速度要匹配,不然就出问题了,为了解决这个问题在通信的同时加上流量控制(同步)
使用方法
用一个信号量和消息队列,模型如下:
通信发送:
等待接收完成信号;
发送消息;
通信接收:
等待发送消息;
发送接收完成信号;
使用实例
实验结果
信号量初始值为1
![](https://img-blog.csdn.net/20141015165745448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTQyNTE1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
信号量初始值为0
![](https://img-blog.csdn.net/20141015170037547?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTQyNTE1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
锁死状态
任务间通常涉及发送和接收,但是发送速度和接收速度要匹配,不然就出问题了,为了解决这个问题在通信的同时加上流量控制(同步)
使用方法
用一个信号量和消息队列,模型如下:
通信发送:
等待接收完成信号;
发送消息;
通信接收:
等待发送消息;
发送接收完成信号;
使用实例
#define APP_TASK_START_PRIO 4u #define APP_TASK_1_PRIO 6u #define APP_TASK_2_PRIO 5u #define APP_TASK_START_STK_SIZE 256u #define APP_TASK_1_STK_SIZE 256u #define APP_TASK_2_STK_SIZE 256u static OS_TCB AppTaskStartTCB; static OS_TCB AppTask1TCB; static OS_TCB AppTask2TCB; static OS_Q MY_Q; static OS_SEM MY_SEM; static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; static CPU_STK AppTask1Stk[APP_TASK_1_STK_SIZE]; static CPU_STK AppTask2Stk[APP_TASK_2_STK_SIZE]; static void AppTaskStart(void *p_arg); void AppTask1(void *p_arg); void AppTask2(void *p_arg); void *BLOCK1 = "Task1 is comunicating with Task2"; void *BLOCK2; int main (void) { OS_ERR err; OSInit(&err); OSQCreate((OS_Q *)&MY_Q, (CPU_CHAR *)"MY_Q", (OS_MSG_QTY)10, (OS_ERR *)&err); OSSemCreate((OS_SEM *)&MY_SEM, (CPU_CHAR *)"MY_SEM", (OS_SEM_CTR )1, //信号量初始值为1 (OS_ERR *)&err); OSTaskCreate((OS_TCB *)&AppTaskStartTCB, (CPU_CHAR *)"App Task Start", (OS_TASK_PTR ) AppTaskStart, (void *) 0, (OS_PRIO ) APP_TASK_START_PRIO, (CPU_STK *)&AppTaskStartStk[0], (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10u, (CPU_STK_SIZE) APP_TASK_START_STK_SIZE, (OS_MSG_QTY ) 0u, (OS_TICK ) 0u, (void *) 0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSStart(&err); } static void AppTaskStart (void *p_arg) { OS_ERR err; (void)p_arg; CPU_Init(); OSTaskCreate((OS_TCB *)&AppTask1TCB, (CPU_CHAR *)"AppTask1", (OS_TASK_PTR)AppTask1, (void *)0, (OS_PRIO)APP_TASK_1_PRIO, (CPU_STK *)&AppTask1Stk[0], (CPU_STK_SIZE)APP_TASK_1_STK_SIZE / 10u, (CPU_STK_SIZE)APP_TASK_1_STK_SIZE, (OS_MSG_QTY)0u, (OS_TICK)0u, (void *)0, (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSTaskCreate((OS_TCB *)&AppTask2TCB, (CPU_CHAR *)"AppTask2", (OS_TASK_PTR)AppTask2, (void *)0, (OS_PRIO)APP_TASK_2_PRIO, (CPU_STK *)&AppTask2Stk[0], (CPU_STK_SIZE)APP_TASK_2_STK_SIZE / 10u, (CPU_STK_SIZE)APP_TASK_2_STK_SIZE, (OS_MSG_QTY)0u, (OS_TICK)0u, (void *)0, (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); } void AppTask1(void *p_arg) { OS_ERR err; CPU_TS ts; (void)p_arg; while (DEF_ON){ OSSemPend((OS_SEM *)&MY_SEM, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (CPU_TS *)&ts, (OS_ERR *)&err); APP_TRACE_DBG(("Task1 is running...\n\r")); OSQPost((OS_Q *)&MY_Q, (void *)BLOCK1, (OS_MSG_SIZE)sizeof(BLOCK1), (OS_OPT )OS_OPT_POST_FIFO, (OS_ERR *)&err); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); } } void AppTask2(void *p_arg) { OS_ERR err; OS_MSG_SIZE size; CPU_TS ts; (void)p_arg; while (DEF_ON){ BLOCK2=OSQPend((OS_Q *)&MY_Q, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE*)&size, (CPU_TS )&ts, (OS_ERR *)&err); APP_TRACE_DBG(("Task2 is running...\n\r")); APP_TRACE_DBG(("%s...\n\r",BLOCK2)); OSSemPost((OS_SEM *)&MY_SEM, (OS_OPT )OS_OPT_POST_1, (OS_ERR *)&err); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); } }
实验结果
信号量初始值为1
信号量初始值为0
锁死状态
相关文章推荐
- μC/OSIII——任务同步和通信(二)
- μC/OSIII——任务同步和通信(一)
- μC/OSIII——任务同步和通信(二)
- uC/OS-II的任务同步与通信
- [uC/OS-II原理及应用]任务的同步与通信
- 嵌入式实时操作系统μC/OS-||原理及应用学习4----任务的同步与通信
- uC/OS-III之任务同步
- μC/OSIII——任务同步(事件标志组)
- 【iCore3 双核心板_ uC/OS-III】例程七:信号量——任务同步
- uC/OS-II的任务同步与通信
- μC/OSIII——任务同步(事件标志组)
- μC/OSIII——任务通信(消息传递)
- μC/OSIII——任务通信(消息传递)
- uc/os-iii学习笔记-任务就绪表
- 任务的通信和同步中利用旗语解决冲突
- uC/OS-III之任务切换学习总结
- UCOSii(四)——任务的通信与同步
- uC/OS-II内核架构解析(5)---uC/OS-II通信与同步
- 任务的同步与通信_读书笔记_5
- uc/os-III任务管理总结