前言
本章将对W80X SDK中的FreeRTOS队列函数API进行讲解,最后进行了简单的演示。
一、队列是什么?
简单来说,队列就是不同任务之间进行数据传递的载体,和栈不同的队列是先进先出(类似于FIFO),而栈是后进先出。队列类似一个全局变量,不同任务之间共享数据值。那为什么不直接用全局变量来传递呢?当多个任务共享一个全局变量的时候,如果没有保护机制,那么在传递过程中就会很容易出现差错。FreeRTOS的队列运行机制如下图:
二、队列相关函数
W80X SDK中的函数和原始FreeRTOS中函数不同,SDK中的函数对原始FreeRTOS函数进行调用封装。
1.队列创建和删除函数
//队列创建函数
tls_os_status_t tls_os_queue_create(tls_os_queue_t **queue, u32 queue_size);
//tls_os_queue_t **queue :队列句柄的指针
//u32 queue_size : 队列长度
//队列中的元素大小为sizeof(void *),即4个字节大小
//队列删除函数
tls_os_status_t tls_os_queue_delete(tls_os_queue_t *queue);
//tls_os_queue_t *queue :队列函数句柄
2.发送与接收函数
//队列发送函数
tls_os_status_t tls_os_queue_send(tls_os_queue_t *queue, //队列句柄
void *msg, //消息指针
u32 msg_size); //消息长度
//队列接收函数(接收后删除队列中的元素)
tls_os_status_t tls_os_queue_receive(tls_os_queue_t *queue, //队列句柄
void **msg, //数据缓存指针,读取到的数据储存到这里
u32 msg_size, //无效参数,在调用FreeRTOS函数中没有用到
u32 wait_time);
//等待时间:(1)0:不等待,如队列无数据即返回,运行剩下的程序;
// (2)0~portMAX_DELAY:如队列中无数据,进入阻塞态wait_time个时间片,阻塞态结束后
// 再次读取。无论读不读到数据都返回;
//(3)portMAX_DELAY:直到队列有数据为止
3.其它函数
//判断队列是否为空,返回值 0:不为空 1:空
u8 tls_os_queue_is_empty(tls_os_queue_t *queue);
//移除队列中的元素,过程是将队列中元素取出,删除后再写入。比较少用
tls_os_status_t tls_os_queue_remove(tls_os_queue_t *queue, void* msg, u32 msg_size);
三、演示
#include "wm_include.h"
#define MY_TEST_TASK_SIZE 1024
static OS_STK MyTaskStk1[MY_TEST_TASK_SIZE]; //创建堆栈区
static OS_STK MyTaskStk2[MY_TEST_TASK_SIZE];
tls_os_queue_t *my_queue = NULL; //队列句柄
void sendTask(void *pvParam)
{
u32 i=0;
while(1)
{
tls_os_queue_send(my_queue,i,1);
i++;
tls_os_time_delay(1000);
}
} //发送函数
void recTask(void *pvParam)
{
u32 *my_msg = 0;
while(1)
{
if(tls_os_queue_is_empty(my_queue) == 0) //判断队列是否为空
{
tls_os_queue_receive(my_queue,&my_msg,0,0);
printf("\n receive : %d \n",my_msg);
}
tls_os_time_delay(1000);
}
} //接收函数
void UserMain(void)
{
printf("\n user main \n");
tls_os_task_create(NULL,"sendTask",sendTask,NULL,MyTaskStk1, MY_TEST_TASK_SIZE * sizeof(u32),1,0);
tls_os_task_create(NULL,"recTask",recTask,NULL,MyTaskStk2, MY_TEST_TASK_SIZE * sizeof(u32),2,0); //创建任务
tls_os_queue_create(&my_queue,5); //创建队列
}
运行结果如下:
四、进群讨论分享!
如果你喜欢我的文章,欢迎关注下方公众号,在公众号内回复“交流群”,进群一起讨论分享!