FreeRTOS--队列

2023-05-16

在讲队列前,先思考一下这个问题:
下面这个程序,如果用RTOS实现会出问题吗?

c:
int a = 0;
void fun_a(){
 a++;
}
void fun_b(){
 a++;
}
int main(){
	while(1){
	fun_a();
	fun_b();
	}

}
RTOS:
int a = 0;
void fun_a(){
 a++;
}
void fun_b(){
 a++;
}
int main()
{
	creat_Task(fun_a);
	creat_Task(fun_b);

}

对RTOS代码分析:
我们的期望是运行一次fun_a后a++运行1次,运行1次fun_b后a++运行1次,a = 2
fun_a和fun_b的a++:
1)读a: R0寄存器,读RAM的a的地址,得到a的值
2)修改:R0 自加 1
3)写a:R0寄存器,写RAM的a的地址,修改a的值
接下来模拟一下 RTOS运行
t0:
fun_a:
1)R0寄存器,读RAM的a的地址,得到a的值,R0 = 0,
2)此时到下一个tick,保存现场R0 = 0.
t1:
fun_b:
1)读a: R0寄存器,读RAM的a的地址,得到a的值,R0 = 0;
2)修改:R0 自加 1,R0 += 1,R0 = 1;
3)写a:R0寄存器,写RAM的a的地址,修改a的值;a = 1
t2:
fun_a:
1)恢复现场 R0 = 0
2)修改:R0 自加 1 R0 += 1,R0 = 1;
3)写a:R0寄存器,写RAM的a的地址,修改a的值;a = 1

由上面可知,不符合我们的期望,运行结果为 a = 1
根本问题在于,多个任务一起修改没有互斥机制保护数据。

队列提供了解决的方法,使用QueueSend可以将任务的tick中断关闭,实现裸机运行,修改完数据后再打开中断

接下来再举个栗子

void fun_a(){
 while(1){
 ...
 	达成某条件后
	flag = 1;
 ...
	}
}
void fun_b(){
 ...
	if(flag = 1){
	}
 ...
}

如果运行100w次就要判断100w次太过于浪费CPU

void fun_a(){
 while(1){
 ...
 	达成某条件后
	写队列:{
	1)写Data
	2)唤醒Queue.list里的任务,并将DelayList里的任务放进ReadyList

}
 ...
	}
}
void fun_b(){
 ...
	读队列:{
	1)有Data,返回做事
	2)无Data,休眠:
				  a.将该任务放进DelayList链表
				  b.将该任务插入Queue.List队列
	}
	
 ...
}

在这里插入图片描述
fun_a可以全速运行
fun_b可以不浪费CPU资源

通过链表队列实现唤醒休眠

环形缓冲区

在这里插入图片描述
在这里插入图片描述
这里很简单,就直接贴一下韦老师的图了

读队列

a.关中断
b.
有数据:
1)copy数据
2)唤醒Queue.list里的任务,移除Queue.list第一个任务
3)将DelayList里的任务放进ReadyList
无数据:
1.返回ERR
2.休眠:
1)将该任务放进DelayList链表
2)将该任务插入Queue.List队列

写队列

a.关中断
b.
有空间:
1)写数据
2)唤醒Queue.list里的任务,移除Queue.list第一个任务
3)将DelayList里的任务放进ReadyList
无空间:
1.返回ERR
2.休眠:
1)将该任务放进DelayList链表
2)将该任务插入Queue.List队列

超时唤醒

任务休眠,对于休眠的任务,每次tick中断都会累加计数,然后对DelayList的任务检查是否超时,超时则会移到ReadyList

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS--队列 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • FreeRTOS系列

    1 RTOS简介 RTOS全称为 Real Time Operation System 即实时操作系统 RTOS强调的是实时性 又分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 不允许超时 而软实时里对处理过程超时的要求则没有很严
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR

随机推荐