FreeRTOS - -使用队列的好处
FreeRTOS - -使用队列的好处
一:队列的引入
- 裸机开发与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;
}
- 对比实现过程
二:队列实现 - 互斥访问
- 使用定时器中断实现互斥访问
- 实现过程
三:队列实现 - 休眠唤醒 - 提高CPU利用率
- 裸机开发
- 实现对flag==1的判断
int flag = 0;
void A_fun()
{
flag = 1;
}
void B_fun()
{
if(flag == 1)
{
xxxxx;
}
}
- RTOS开发
- 执行过程:
四:队列的核心 - 关中断 - 环形缓冲区 - 链表
- 将任务插入到队列的链表中(才知道唤醒哪一个任务)
- 环形缓冲区(就是一个数组,首尾通过表达式连接起来。)
- 读
- 写
- 总结:
@1:关闭中断:实现互斥量
@2:环形缓冲区:保存数据
@3:链表:找到要唤醒的任务
五:队列结构体以及读流程
- 队列结构体
- 由队列头部+buff缓冲区组成
@1:队列头部:由任务读链表合任务写链表组成
@2:buff缓冲区:长度=Len * 每个队列的大小(item.size)
- 读流程
六:队列写流程
- 写流程
七:队列超时唤醒
- 睡眠状态被唤醒的条件
- 原来队列为空,当队列中被写入数据时,可以读,这个时候被唤醒。
- 原来队列为满,当队列中被读取数据时,可以写,这个时候被唤醒。
- 那么,当队列为满,没人读取;或者队列为空,没人写的时候,任务一直处于休眠状态该怎么唤醒???
- 这个时候就要用到定时计数器了
(1)给每个进入delayList链表的任务定义一个timeout超时时间。
(2)当定时器累加的数值等于你所设置的timeout就会被唤醒,进行判断是读还是写。