W800/W801学习记录FreeRTOS操作系统部分(二):队列管理
文章目录
前言
本章将对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); //创建队列}
运行结果如下:
四、进群讨论分享!
如果你喜欢我的文章,欢迎关注下方公众号,在公众号内回复“交流群”,进群一起讨论分享!