【FreeRTOS - -使用队列的好处】

一:队列的引入

  1. 裸机开发与RTOS开发比较
  • 裸机对全局变量a的访问
int a = 0;
void A_fun()
{
	a++;
}
void B_fun()
{
	a++;
}
int mian()
{
A_fun(); //a=1
B_fun(); //a=2
return 0;
}
  • RTOS对全局变量a的访问
int a = 0;
void A_fun()
{
	a++;
}
void B_fun()
{
	a++;
}
int mian()
{
xTask1_Create( A_fun); //a=1
xTask2_Create( A_fun); //a=1
return 0;
}
  • 对比实现过程
    对比

二:队列实现 - 互斥访问

  1. 使用定时器中断实现互斥访问
    中断互斥
  2. 实现过程
    在这里插入图片描述
    时间图

三:队列实现 - 休眠唤醒 - 提高CPU利用率

  1. 裸机开发
  • 实现对flag==1的判断
int flag = 0;
void A_fun()
{
	flag = 1;
}
void B_fun()
{
	if(flag == 1)
	{
	xxxxx;
	}
}

在这里插入图片描述

  1. RTOS开发
    在这里插入图片描述
  • 执行过程:
    在这里插入图片描述

四:队列的核心 - 关中断 - 环形缓冲区 - 链表

  1. 将任务插入到队列的链表中(才知道唤醒哪一个任务)
    链表保存任务
  2. 环形缓冲区(就是一个数组,首尾通过表达式连接起来。)

  • 环形buff读

  • 写
  1. 总结:
    @1:关闭中断:实现互斥量
    @2:环形缓冲区:保存数据
    @3:链表:找到要唤醒的任务

五:队列结构体以及读流程

  1. 队列结构体
  • 由队列头部+buff缓冲区组成
    @1:队列头部:由任务读链表合任务写链表组成
    @2:buff缓冲区:长度=Len * 每个队列的大小(item.size)
    结构体
  1. 读流程
    读流程
    有数据时

六:队列写流程

  1. 写流程
    写流程

七:队列超时唤醒

  1. 睡眠状态被唤醒的条件
  • 原来队列为空,当队列中被写入数据时,可以读,这个时候被唤醒。
  • 原来队列为满,当队列中被读取数据时,可以写,这个时候被唤醒。
  • 那么,当队列为满,没人读取;或者队列为空,没人写的时候,任务一直处于休眠状态该怎么唤醒???
  1. 这个时候就要用到定时计数器了
    (1)给每个进入delayList链表的任务定义一个timeout超时时间。
    (2)当定时器累加的数值等于你所设置的timeout就会被唤醒,进行判断是读还是写。
    超时唤醒
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值