目录
1.消息队列的理解和创建
(1)理解:消息队列本质上是一种任务之间的数据传输的桥梁,利用消息队列可以在不同的任务当中传递数据。
(2)消息队列的创建,参考ucosiii的api手册
例子和参数解释:
OS_Q MyMsgQ; //这个需要自己定义
OSQCreate((OS_Q *)&MyMsgQ, //你上面定义啥,就传啥的地址呗
(CPU_CHAR *)"MyMsgQ", //这个是你的消息队列的名字 字符串类型
(OS_MSG_QTY)1000, //相当于你单次传输最大的限制,多了会报错
(OS_ERR *)&err); //错误指针
2.消息队列的作用
实质上就是作为任务之间做通讯(传数据)用的,这里要跟信号量和互斥信号量分开,信号量和互斥信号量是控制任务执行的顺序,任务的同步用的。
3.例子演示
//创建过程已经略过 这里展示两个任务利用消息队列通讯过程
//任务1发送消息
void Task_1(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while(1)
{
if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)
{
OSQPost((OS_Q *)&MyMsgQ,
(void *)"I love you, Rick", //要传递的数据
(OS_MSG_SIZE)sizeof("I love you, Rick"), //要传递数据的长度
(OS_OPT )OS_OPT_POST_FIFO | OS_OPT_POST_ALL, //这个可以参考一下手册,一般有几个组合方式,这个是‘先进先出’‘传递给所有消息队列’
(OS_ERR *)&err); //这个不解释了,太多次了
printf("Task1 send message to queue.\n");
}
OSTimeDlyHMSM(0, 0, 0, 20, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
//任务2接收消息
void Task_2(void *p_arg)
{
OS_ERR err;
char *pMsg; //用这个接收消息
OS_MSG_SIZE msg_size; //这个接收消息的长度
(void)p_arg;
while(1)
{
pMsg = OSQPend((OS_Q *)&MyMsgQ, //填同一个消息队列
(OS_TICK )0, //这个和信号量有点相似,0表示一直等待,
(OS_OPT )OS_OPT_PEND_BLOCKING,//0通常就和这个配套使用,阻塞式等待
(OS_MSG_SIZE *)&msg_size,//这个是输出数据的地方,把自己定义的接收数据长度的变量地址放这里
(CPU_TS *)0, //0表示不需要时间戳
(OS_ERR *)&err); //错误指针
if(err == OS_ERR_NONE)
printf("Task2 from MsgQ: %s, size:%d\n", pMsg, msg_size);
}
}
这里是用任务1传递字符串给任务2,
注意发送方用OSQPost()
接收方用OSQPend()
例子中用按键触发来做消息队列的发送,利用串口打印判断。