> 文档中心 > W800/W801学习记录FreeRTOS操作系统部分(二):队列管理

W800/W801学习记录FreeRTOS操作系统部分(二):队列管理

文章目录

  • 前言
  • 一、队列是什么?
  • 二、队列相关函数
    • 1.队列创建和删除函数
    • 2.发送与接收函数
    • 3.其它函数
  • 三、演示
  • 四、进群讨论分享!

前言

本章将对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);    //创建队列}

运行结果如下:
在这里插入图片描述


四、进群讨论分享!

如果你喜欢我的文章,欢迎关注下方公众号,在公众号内回复“交流群”,进群一起讨论分享!
在这里插入图片描述