您的位置:首页 > 其它

μC/OSIII——任务同步和通信(一)

2014-10-15 17:01 176 查看
使用情况

任务间通常涉及发送和接收,但是发送速度和接收速度要匹配,不然就出问题了,为了解决这个问题在通信的同时加上流量控制(同步)

使用方法

用一个信号量和消息队列,模型如下:

通信发送:

等待接收完成信号;

发送消息;

通信接收:

等待发送消息;

发送接收完成信号;

使用实例

#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 os 实例