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

使用情况

任务同时等待多个内核对象,μC/OSIII仅允许任务同时等待多个信号量和多个消息队列,不支持同时等待多个事件标志组或互斥信号量。

使用方法

当下列情况发生,OSPendMulti()挂起当前任务:

  • 对象变为可用;
  • 到达设定的超时时间;
  • 一个或多个任务被删除或被终止;
  • 一个或多个对象被删除了;

OS_OBJ_QTY  OSPendMulti (OS_PEND_DATA  *p_pend_data_tbl,  指向一个OS_PEND_DATA表的指针
                                                 OS_OBJ_QTY     tbl_size,                    OS_PEND_DATA表的表项数目
                                                 OS_TICK        timeout,                          指定超时值(时钟节拍数)
                                                 OS_OPT         opt,                                
                                                 OS_ERR        *p_err)                            该函数返回的错误码

struct  OS_PEND_DATA{
                                    OS_PEND_DATA        *PrevPtr;
                                    OS_PEND_DATA        *NextPtr;
                                    OS_TCB                      *TCBPtr;
                                    OS_PEND_OBJ          *PendObjPtr;
                                    OS_PEND_OBJ          *RdyObjPtr;
                                    void                             *RdyMsgPtr;
                                    OS_MSG_SIZE           RdyMsgSize;
                                    CPU_TS                      RdyTS;
                                     };

opt  OS_OPT_PEND_BLOCKING  阻塞模式  OS_OPT_PEND_NON_BLOCKING 非阻塞模式


使用实例

#define  APP_TASK_START_PRIO                               4u
#define  APP_TASK_1_PRIO                                   5u
#define  APP_TASK_2_PRIO                                   6u
#define  APP_TASK_3_PRIO                                   7u
#define  APP_TASK_4_PRIO                                   8u
#define  APP_TASK_5_PRIO                                   9u

#define  APP_TASK_START_STK_SIZE                         256u
#define  APP_TASK_1_STK_SIZE                             256u
#define  APP_TASK_2_STK_SIZE                             256u
#define  APP_TASK_3_STK_SIZE                             256u
#define  APP_TASK_4_STK_SIZE                             256u
#define  APP_TASK_5_STK_SIZE                             256u

static  OS_TCB   AppTaskStartTCB;
static  OS_TCB   AppTask1TCB;
static  OS_TCB   AppTask2TCB;
static  OS_TCB   AppTask3TCB;
static  OS_TCB   AppTask4TCB;
static  OS_TCB   AppTask5TCB;

static  OS_SEM   MYSEM1;
static  OS_SEM   MYSEM2;
static  OS_Q     MYQ1;
static  OS_Q     MYQ2;

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  CPU_STK  AppTask3Stk[APP_TASK_3_STK_SIZE];
static  CPU_STK  AppTask4Stk[APP_TASK_4_STK_SIZE];
static  CPU_STK  AppTask5Stk[APP_TASK_5_STK_SIZE];

static  void  AppTaskStart(void  *p_arg);
void AppTask1(void *p_arg);
void AppTask2(void *p_arg);
void AppTask3(void *p_arg);
void AppTask4(CPU_CHAR *p_arg);
void AppTask5(void *p_arg);

CPU_CHAR *s_M = "NWPU";
CPU_CHAR *BLOCK1 = "消息传递Task4";
CPU_CHAR *BLOCK2 = "消息传递Task5";

int  main (void)
{
    OS_ERR  err;


    OSInit(&err);                                               

	OSQCreate((OS_Q     *)&MYQ1,
    		 (CPU_CHAR *)"MYQ1",
    		 (OS_MSG_QTY)10,
    		 (OS_ERR   *)&err);
	OSQCreate((OS_Q     *)&MYQ2,
    		 (CPU_CHAR *)"MYQ2",
    		 (OS_MSG_QTY)10,
    		 (OS_ERR   *)&err);
	OSSemCreate((OS_SEM    *)&MYSEM1,
        		(CPU_CHAR  *)"MYSEM1",
        		(OS_SEM_CTR)0,
        		(OS_ERR    *)&err);
	OSSemCreate((OS_SEM    *)&MYSEM2,
        		(CPU_CHAR  *)"MYSEM2",
        		(OS_SEM_CTR)0,
        		(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);
	OSTaskCreate((OS_TCB     *)&AppTask3TCB,
				(CPU_CHAR   *)"AppTask3",
				(OS_TASK_PTR)AppTask3,
				(void       *)0,
				(OS_PRIO)APP_TASK_3_PRIO,
				(CPU_STK    *)&AppTask3Stk[0],
				(CPU_STK_SIZE)APP_TASK_3_STK_SIZE / 10u,
				(CPU_STK_SIZE)APP_TASK_3_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     *)&AppTask4TCB,
				(CPU_CHAR   *)"AppTask4",
				(OS_TASK_PTR)AppTask4,
				(CPU_CHAR   *)s_M,
				(OS_PRIO)APP_TASK_4_PRIO,
				(CPU_STK    *)&AppTask4Stk[0],
				(CPU_STK_SIZE)APP_TASK_4_STK_SIZE / 10u,
				(CPU_STK_SIZE)APP_TASK_4_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     *)&AppTask5TCB,
				(CPU_CHAR   *)"AppTask5",
				(OS_TASK_PTR)AppTask5,
				(CPU_CHAR   *)s_M,
				(OS_PRIO)APP_TASK_5_PRIO,
				(CPU_STK    *)&AppTask5Stk[0],
				(CPU_STK_SIZE)APP_TASK_5_STK_SIZE / 10u,
				(CPU_STK_SIZE)APP_TASK_5_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;
	OS_PEND_DATA MULTI_TBL[4];

	(void)p_arg;

	while (DEF_ON){
		MULTI_TBL[0].PendObjPtr = &MYSEM1;
		MULTI_TBL[1].PendObjPtr = &MYSEM2;
		MULTI_TBL[2].PendObjPtr = &MYQ1;
		MULTI_TBL[3].PendObjPtr = &MYQ2;
		OSPendMulti((OS_PEND_DATA  *)&MULTI_TBL[0],
					 (OS_OBJ_QTY)4,
					 (OS_TICK)0,
					 (OS_OPT)OS_OPT_PEND_BLOCKING,
					 (OS_ERR        *)&err);
		APP_TRACE_DBG(("Task1 is running...\n\r"));
	}
}

void AppTask2(void *p_arg)
{
	OS_ERR  err;

	(void)p_arg;

	while (DEF_ON){
		APP_TRACE_DBG(("Task2 is running...\n\r"));
		OSSemPost((OS_SEM  *)&MYSEM1,
				 (OS_OPT)OS_OPT_POST_1,
				 (OS_ERR  *)&err);
		OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
	}
}

void AppTask3(void *p_arg)
{
	OS_ERR err;
    (void)p_arg;
	while (DEF_ON){
		APP_TRACE_DBG(("Time:%ld\n\r", OSTimeGet(&err)));
		OSSemPost((OS_SEM  *)&MYSEM2,
				(OS_OPT)OS_OPT_POST_1,
				(OS_ERR  *)&err);
		OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
	}
}

void AppTask4(CPU_CHAR *p_arg)
{
	OS_ERR err;

	while (DEF_ON){
		APP_TRACE_DBG(("%s\n\r", p_arg));
		OSQPost((OS_Q      *)&MYQ1,
				(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 AppTask5(void *p_arg)
{
	OS_ERR  err;

	(void)p_arg;

	while (DEF_ON){
		APP_TRACE_DBG(("Task5 is running...\n\r"));
		OSQPost((OS_Q      *)&MYQ2,
				(void      *)BLOCK2,
				(OS_MSG_SIZE)sizeof(BLOCK2),
				(OS_OPT)OS_OPT_POST_FIFO,
				(OS_ERR    *)&err);
		OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
	}
}

实验结果


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值