【自建消息队列】
【任务内建消息队列】
1. 声明
//自建消息队列
OS_Q OSQ_KEY;
OS_Q OSQ_DATA;
#define OSQ_KEY_NUM 1
#define OSQ_DATA_NUM 4
//任务内建消息队列
#define TASK2_Q_NUM 1 //key2,up:led灯任务
2. 创建
//创建 自建消息队列
OSQCreate((OS_Q *)&OSQ_KEY,
(CPU_CHAR *)"OSQ KEY",
(OS_MSG_QTY )OSQ_KEY_NUM, //消息队列长度
(OS_ERR *)&err);
OSQCreate((OS_Q *)&OSQ_DATA,
(CPU_CHAR *)"OSQ DATA",
(OS_MSG_QTY )OSQ_DATA_NUM,
(OS_ERR *)&err);
//任务 自建消息队列
//需要在创建任务时,指定消息队列的长度
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )"task2 task",
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(CPU_STK_SIZE)TASK2_STK_SIZE/10,
(CPU_STK_SIZE)TASK2_STK_SIZE,
(OS_MSG_QTY )TASK2_Q_NUM, //设定消息队列的长度,默认为0
(OS_TICK )2, //2个时间片,2*5ms = 10ms
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
3. post 发送消息队列
//自建消息队列 post
OSQPost((OS_Q *)&OSQ_KEY,
(void *)&key, //变量地址
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
//任务内建消息队列 post
OSTaskQPost((OS_TCB *)&Task2_TaskTCB, //任务内建信号量
(void *)&key,
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
4. pend 等待消息队列 使用
//自建 消息队列 pend
key = OSQPend((OS_Q *)&OSQ_KEY,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)&err);
//任务 内建消息队列 pend
key = OSTaskQPend((OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)&err);
应用例子:
发送1个字节变量 的消息队列
//消息队列post 发送给task2处理按键
OS_ERR err;
u8 key;
OSQPost((OS_Q *)&OSQ_KEY,
(void *)&key, //变量地址
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
//消息队列pend 等待
OS_ERR err;
OS_MSG_SIZE size;
u8 * key;
key = OSQPend((OS_Q *)&OSQ_KEY,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)&err);
发送字符串 的消息队列
//消息队列post
OS_ERR err;
char *pbuf= mymalloc(SRAMIN,10);
sprintf(pbuf,"%s cnt:%d \r\n",__FUNCTION__,cnt);
OSQPost((OS_Q *)&OSQ_DATA,
(void *)pbuf, //指针地址
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO, //先进先出
(OS_ERR *)&err);
//消息队列pend
OS_ERR err;
OS_MSG_SIZE size;
u8 *data;
data = OSQPend((OS_Q *)&OSQ_DATA,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)&err);
printf("%s\r\n",data);