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

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


四、进群讨论分享!

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值