FreeRTOS基本介绍、列表、移植、值得注意的点

FreeRTOS简介与移植到STM32F103 直接对硬件资源进行编程,将所有的功能函数都放在主循环中,同一时间内只能运行单一任务。裸机系统又称:前台系统即中断服务函数,后台系统即运行的主循环。 阅读详情

1、FreeRTOS:

(1)调度策略使用了抢占式调度和时间片调度的结合,不同级别间的任务抢占式调度,同级别任务采用时间片调度。采用了动态内存申请。

(2)任务优先级:数字越高,任务优先级越高。STM32中最大为32-1

(3)时间片的长度,依据滴答定时器的设定。滴答定时器为最高优先级

(4)任务切换:高优先级会延时释放CPU控制权

电机控制任务balance:100Hz频率运行,优先级为4(vTaskDelayUntil()函数)

OLED显示任务show: 1Hz频率运行,优先级为3(vTaskDelayUntil()函数)

消息帧任务modbus:优先级为0,没有更高优先级任务抢占时会一直运行

 (但这样相当于一直占用空闲CPU的资源,设置为更高优先级可能会更好)

vTaskDelayUntil()函数:FreeRTOS中任务延时函数之一,让任务按照指定周期性方式运行。会使任务挂起,直至指定时间到达为止。时间为:上次此任务运行的时间+周期频率。

(5)任务堆栈:任务切换时,存储任务数据的内存区域。设置为了512

(6)滴答定时器

时间节拍频率设置为1000,周期1ms

初始化于delay_init(u8 SYSCLK)函数,SYSCLK=168

reload是滴答定时器的计数值。

reload = SYSCLK*100000/configTICK_RATE_HZ = 168*1000000/1000 = 168*1000

所以单次时间:reload/168M = 1ms

(7)开始任务start_task:用于创建其他任务

(8)临界区:相当于关中断,关闭所有优先级的中断

创建完start_task任务后退出临界区

(9)任务调度器的挂起:未关闭中断,只是停止任务的切换,不会被其他任务打断

仅仅防止了任务间的资源争夺

vTaskSuspend()、vTaskResume()挂起单个任务

(10)FreeRTOS的中断管理:

通常只能管理5~15优先级的,通过portDISABLE_INTERRUPTS(),优先级分组默认为4,

设置FreeRTOS可管理的最高优先级,优先级高于5的都无法管理

(11)中断优先级分组

STM32用了中断优先级配置寄存器的高4位[7:4]来配置,最大16级优先级,5种分配方式

FreeRTOS中默认是用优先级分组4,不使用子优先级,方便抢占优先级判断。

2、FreeRTOS列表:双向环形链表

(1)列表

就绪列表:每个优先级都有一个列表,有标志位,当该优先级列表中有任务时置1,共32个

阻塞列表:因等待事件而被阻塞的任务

(2)列表结构体

uxNumberOfItems:列表中的列表项数量

*pxIndex:用于遍历列表项的指针

xListEnd:列表末尾项,就是一个列表项,方便对列表操作

(3)列表项结构体

xItemValue:列表项的值,用于确定插入列表时的位置

*pxNext:下一个列表项

*pxPrevious:上一个列表项

*pvOwner:列表项的拥有者,即任务

*pxContainer:列表项所在列表

(4)列表和列表项的初始化

最开始只需要给定一个该结构体类型的指针即可,函数中自动完成创建

(5)列表项的插入:两种方式

              vListInsert( ):根据列表项值插入

              vListInsertEnd( ):插入到pxIndex所指向列表项的前面

指定要插入的列表和列表项

3、FreeRTOS移植

移植步骤:

(1)添加FreeRTOS源码

include:FreeRTOS头文件,FreeRTOS.h、task.h、timers.h等

portable:FreeRTOS的移植文件。只保留Keil、RVDS、MemMang这三个。

              Keil:指向RVDS文件夹

              RVDS:不同内核芯片的移植文件

              MemMang:内存管理文件

croutine.c:协程相关文件

event_groups.c:时间相关文件

list.c:列表相关文件

queue.c:队列相关文件

stream_buffer.c:流式缓冲区相关文件

tasks.c:任务相关文件

timers.c:软件定时器相关文件

(2)添加FreeRTOSConfig.h:

FreeRTOS操作系统的配置文件。FreeRTOS操作系统是可裁剪的,可以根据需求裁剪掉不需要用到的FreeRTOS功能,以此来节约MCU中内存资源。

三种获取途径:1、自行编写,根据需求裁剪 2、官方提供的演示工程 3、正点原子工程

(3)修改SYSTEM文件:

sys.h:定义系统文件夹是否支持FreeRTOS,宏SYSTEM_SUPPORT_OS改为1

usart.c:添加FreeRTOS头文件,删掉原先UCOS部分的代码(正点写的)

delay.c:对滴答定时器SysTick设定

1、SysTick_Handler():中断服务函数中添加xPortSysTickHandler();

2、delay_init():初始化SysTick重装载值等,设定FreeRTOS心跳节拍

7、FreeRTOS消息队列

(1)消息队列

是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)

(2)队列的读写

对队列读写时都会进入临界区(关中断)防止多任务冲突。

(任务切换依靠PendSV,是最低优先级,可以停止任务切换)

写队列xQueueSend(),读队列xQueueReceive()。函数中包含了临界区的使用。

(3)队列数据传输方式

可以传递数据和指针(大数据时)

(4)阻塞时间设置

0:直接返回不等待

0~port_MAX_DELAY:若在阻塞时间内无法入队,超时后直接返回不再等待

Port_MAX_DELAY:死等,直到可以入队为止。出队阻塞与入队阻塞类似。

(5)队列操作基本过程:
a、创建队列

b、往队列写入消息

c、从队列读取消息。若无数据,则阻塞

(6)队列结构体

存储区域起始地址pcHead:首个队列项

下一个写入位置pcWriteTo:下个队列项位置

等待发送列表xTasksWaitingToSend、等待接收列表xTasksWaitingToReceive

非空闲队列项目数量uxMessagesWaiting

队列长度uxLength

队列项目大小:单个队列项大小uxItemSize

上锁计数器cRxLock:cRxLock上锁的时候,是无法操作等待发送列表xTaskWaitingToSend和等待接收列表的xTaskWaitingToReceive,

(7)创建过程

a、定义队列句柄,创建队列

        

        

        

         第一个参数为队列中包含的最大项目数,第二个参数为每个项目所需的字节数。

b、不同按键值,入不同队

        

        

c、读取小数据队列

        

        

d、读取大数据队列

        

        

FreeRTOS值得注意的点

1、中断可以打断任意任务(不管优先级有多高)

2、任务可以同等优先级(软件上数量没有限制,使用时间片调度(应该要先设置为时间片调度)策略分配时间片)

3、如果高优先级任务一直在运行会怎么样?会一直运行,使得低优先级任务无法运行。(除非高优先级任务进入阻塞状态,释放CPU控制权)

4、优先级软件上没有限制,STM32硬件上限制为0~31;

5、优先级的高低与中断相反,数字越大,优先级越高。

6、FreeRTOS中,时间片调度时,每次每个任务只能使用一个时间片,若要增加运行时间,只能是设置SysTick中断周期(一个时间片就等于SysTick(滴答定时器)中断周期)。但ucos中可以设置每次运行2个、3个时间片。。。

7、

优先级策略调度与FreeRTOS中的调度器所使用的调度算法(例如时间片轮转、抢占式调度算法)之间有密切的关系,因为优先级策略决定了任务在调度器中执行的顺序和方式。

8、FreeRTOS为了方便管理,采用组4中断优先级分组,就不必区分子优先级,只用管抢占优先级。

9、中断服务函数若要调用FreeRTOS的API函数,中断服务函数的优先级需要在FreeRTOS的管理范围内,如5~15;他同时若在中断服务中调用,必须带有“FromISR”后缀的函数

10、FreeRTOS中断管理由BASEPRI寄存器实现:BASEPRI:屏蔽优先级低于某一个阈值的中断,设置为0时,则不关闭任何中断。(FreeRTOS可管理的最大优先级(中断的))

11、通过portDISABLE_INTERRUPTS()可以关闭比BASEPRI设置的优先级高的中断(禁止所有中断),比如: BASEPRI设置为0x50,代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行。portENABLE_INTERRUPTS()打开中断。

12、SVC中断只会在启动第一次任务时,调用一次,以后都不调用,后面的任务切换都是在PenSV中断实现的

13、任务切换的过程在PendSV中断服务函数内完成

14、往任务堆栈内写入的位置,其实就是一块块内存,不是寄存器,出栈的时候就出栈到对应的寄存器里面

15、任务堆栈是由高地址向下,向低地址生长的

16、系统延时函数vTaskDelay(10)会释放当前任务的CPU的使用权给其他任务,引起任务调度,把当前运行的任务挂载到阻塞列表。

用自己写的延时函数delay_ms(10)会死等,不会引发任务调度

17、堆栈大小的设置:用于存放任务切换时,需要保存的资源。

18、在调度任务中,不同优先级任务,按优先级别高低顺序来执行,即抢占式任务调度策略,高优先级需要通过延时函数vTaskDelay(10);释放自身CPU使用权,低优先级任务才能运行,同时同一优先级任务按时间片调度策略运行,每个任务只运行很短的时间1ms,最后若是两个任务相同,相当于同时完成。

19、扫描检测按键时,需要保持按下状态才能被检测到,vTaskDelay(10)时,由于时间短,按下几乎都能成功检测。但当vTaskDelay(1000),几乎需要长按1s以上才能保证每次都被检测到

FreeRTOS入门笔记——FreeRTOS介绍 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 阅读详情

相关推荐

FreeRTOS操作系统介绍

第3章 FreeRTOS(读作"free-arr-toss")是一个嵌入式系统使用的开源实时操作系统。FreeRTOS被设计为“小巧,简单,和易用”,能支持许多不同硬件架构以及交叉编译器。 FreeRTOS自2002年Richard Barry开始开发以来,一直都在积极开发中。至于我,我不是FreeRTOS的开发人员或贡献者,我只不过是一个最终用户和爱好者。因此,这章...

有趣的人生 一半是山川湖海 一半是初心情怀 6296

FreeRTOS(教程非常详细)

FreeRTOS基于STM32实时操作系统教程(非常详细)

qq_61672347的博客 50万+

FreeRTOS基础(一):FreeRTOS入门

裸机:直接对硬件资源的编程,所有功能函数放在主循环中,同⼀时间只能单⼀任务运行。裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。RTOS是指一类系统,如 FreeRTOS,uC/OS,RTX,RT-Thread 等,都是 RTOS 类操作系统。FreeRTOS 是一个免费的嵌入式实时操作系统,其开源、轻量级、可移植的特点使其成为许多嵌入式开发者的首选。在近几年的使用排名上位居前列。

weixin_47040031的博客 2万+

一、FreeRTOS之FreeRTOS简介

一、什么是FreeRTOS?Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作系统。注意:RTOS不是指某一个确定的系统,而是指一类操作系统。比如:uc/OS,FreeRTOS,RTX,RT-Thread等这些都是RTOS类操作系统。操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行的哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个

王同学 2万+

STM32F103C8T6移植FreeRTOS

记录一下自己在学习FreeRTOS过程中的一些学习笔记,会是一个系列。同时每一份笔记都会附录已经验证完成的源码。这份笔记主要是在STM32F103C8T6平台上的FreeRTOS移植,希望大家喜欢。

moon2shine的博客 3447

FreeRTOS的裁剪与移植

RTOS,GPOS,移植

2301_80899620的博客 2145

FreeRTOS-基本介绍和移植STM32

裸机:前后台系统,前台系统指的是中断服务函数,后台系统指的是大循环,即应用程序特点实时性差、delay(浪费资源)、结构臃肿(实现功能都放在无限循环)FreeRTOS开发:实时操作系统,强调的是实时性特点分而治之(实现功能划分为多个任务)、延时函数(不会空等待,会让出CPU的使用权给其他任务,即任务调度)、抢占式(高优先级任务抢占低优先级)、任务堆栈(每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息)任务调度器就是决定在某一个时刻调用哪一个任务,切换速度很快,造成在。

m0_51319492的博客 2234

FreeRTOS移植(micronblaze)

1. 实验目的 把FreeRTOS操作系统移植到Xilinx microblaze板子上,运行一个最基本的Task 2. FreeRTOS源码下载 Freertos官网:http://www.freertos.org/ Freertos官网右边栏,点击下载,即为最新版。 下载双击exe,解压后下图中就是源码了, 3. FreeRTOS目录架构 ├─FreeRT...

小白变大白之路 1955

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统,移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本,我在移植之前就已经构建好了一个裸机工程源码了,而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己的裸机测试代码是没有问题的,我一开始没有确认裸机代码,然后移植的时候出现了bug,以为是移植FreeRTOS的原因,然后一直找移植过程中是不是出了问题,最后才发现原来是自己裸机测试代码本身的问题。 2. 源码获取 获取源码可以直接到FreeRTOS的官

luobeihai的博客 5256

FreeRTOS的移植

本文以STM32F407标准库为例,讲解如何移植FreeRTOS,编译环境为MDK,FreeRTOS版本是FreeRTOSv9.0.0

嵌入式分享 5706

论文理解【LLM-OR】—— 【PaMOP】Guiding Large Language Models in Modeling Optimization Problem

针对 LLM 求解运筹优化任务,PaMOP 通过约束划分树分离子问题,实现复杂优化问题的分块建模,并结合求解器反馈与反向翻译一致性检查迭代纠错,降低子任务复杂度,提升可执行率与建模准确性。

佚失的诗篇 1007

FreeRTOS V10.2.1移植到STM32F10x

文章目录一、实时操作系统二、FreeRTOS三、移植FreeRTOS的准备工作(一)、FreeRTOS源码文件作用介绍1、include文件夹(1)、include/croutine.h(2)、include/deprecated_definitions.h(3)、include/event_groups.h(4)、include/FreeRTOS.h(5)、include/list.h(6)、i...

oyzy_Sean的篝火 4416

机器人强化学习入门学习笔记

如果你追求高精度动力学仿真、用于强化学习或机器人研究,MuJoCo 是一个非常优秀的选择。如果需要快速实验、使用真实机器人模型,PyBullet 或 Gazebo可能更合适;如果你追求大规模并行训练,Isaac Gym 或 BraX会更高效。legged gym底层是​编辑isaacgym,基于gpu训练可以多环境并行训练,收敛到一个稳定行走的策略快。本视频MuJoCo基于cpu训练很慢。

xiaomu_347的博客 1470

移植FreeRTOS

它不属于内核源码的文件,不过在示例中有。\3. 将FreeRTOS目录下Source之外的文件全部删除,并进入Source目录,保留include、portable与.c文件,其余文件删除。其中在****portable****目录包含了内存管理与多种开发工具下的多种硬件平台的接口,移植时也需要重点关注。对于移植FreeRTOS重点需要关注的是****Source****目录,其它功能根据实际需求来选择。添加完成后,编译将会发现编译错误,提示打不开****FreeRTOSConfig.h****文件。

qq_71306973的博客 1791

PX4实战指南:通过遥控器通道直连实现舵机PWM控制

本文详细介绍了如何通过PX4飞控实现遥控器通道直连控制舵机PWM输出的完整流程。从硬件准备、遥控器配对到PX4参数配置和硬件连接,提供了实战技巧和常见问题解决方案,帮助无人机爱好者快速掌握舵机控制技术。重点讲解了AUX Passthrough模式设置和PWM参数调整等关键步骤。

weixin_29195217的博客 154

超声信号处理——硬件电路中的混频应用

本文介绍了超声多普勒系统的信号处理原理。系统通过波形振荡器产生高频信号,经换能器转换为超声波发射,接收反射信号后与原始信号混频,利用三角函数的积化和差特性产生包含多普勒频移的低频差频信号和高频和频信号。通过低通滤波器滤除高频成分后,即可获得纯净的多普勒信号。这种处理方法将MHz级高频信号转换为可听低频信号,降低了系统复杂度与成本。数学推导表明,差频信号频率正好

fcxgfdjy的博客 1124

3.FreeRTOS系统源码移植

FreeRTOS系统源码移植

zywcxz的博客 2163

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 624

GD32F407 移植FreeRTOS+Lwip

GD32F407移植freeRTOS和lwip

西澳峰的博客 6922

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

98DX3236内核编译过程小结

0.条件(1)Marvell技术支持提供的压缩文件:GNU EABI:arm-mv5sft-linux-gnueabi_SW3.2.tar.bz2.tar.bz2armebv7-marvell-linux-gnueabi-softfp_i686_201201.tar.bz2CPSS代码:Cpss-PP-DxCh-4.2_012.zipLinux内核文件:lsp-4.2_012.zipLSP-Uni...

snaking616 1804

STM32 FreeRTOS移植

名称描述FreeRTOSFreeRTOS内核FreeRTOS组件,一般我们会选择使用第三方的组件tools工具FreeRTOS的GitHub仓库链接快速入门指南官方文档链接升级到指定FreeRTOS版本官方文档链接FreeRTOS历史更新记录其他其他。

嵌入式心学修行者,以代码为器,以良知为核。探索嵌入式开发中的“知行合一”,在编译、调试、部署中事上磨练致心中之光,铸可靠之器。 1697

【python】懂车帝字体反爬逐层解密案例(附完整代码)

懂车帝字体反爬解密,完整代码分享

景天科技苑 2万+

(二)移植FreeRTOS到STM32中

(7)将FreeRTOS源码目录下的FreeRTOS/Source/portable文件夹下的MemMang和RVDS文件夹复制到STM32项目的freertos/port文件夹下,其中MemMang文件夹下是不同的内存管理文件,一般选择heap_4.c文件,RVDS/ARM_CM3文件夹下存放的是单片机m3内核,不同单片机根据不同内核进行选择。(5)将FreeRTOS源码目录下的FreeRTOS/Source/include文件夹下的.h头文件全部复制到STM32项目的freertos/inc文件夹下。

KINO32的博客 2083

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【FreeRTOS】FreeRTOS 源码学习笔记(1) 文件结构 + stm32f103c8t6移植步骤

0. 引言 之前freeRTOS用过几次,但是项目赶工的急,一直没有认真的去里面看过,最近正好有空,准备到里面看下源码实现,毕竟核心文件就这么几个,认真看一下流程,对操作系统的雏形也就有一个认识了。而且一些常用的功能,队列,内存管理,信号量之类的,都有,基本上彻底弄懂一个,对以后理解别的也有帮助。 1. FreeRTOS介绍 FreeRTOS其实不用再多介绍了,现在太火了,主要是免费,感觉很多厂家...

YoYo的桃子树 2994

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

一文了解 | FreeRTOS移植到stm32流程

1、RTOS 简介实时操作系统(RTOS)是一种专为实时应用程序设计的操作系统,它能够确保任务在特定的时间约束内完成,并提供可预测的响应时间。RTOS 通常用于嵌入式系统,其中任务的时间敏感性非常重要。实时操作系统分为硬实时和软实时两种类型,硬实时要求任务必须在规定的时间内完成,而软实时则允许偶尔的任务延迟。通过上述步骤之后,便可以使用实时操作系统(FreeRTOS)实现多任务运行,下面代码适用于实现LED灯循环执行的两个任务,可以将程序烧录到开发板查看效果。

一伦明悦的博客 1932

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Linux多进程、线程间通信:共享内存、信号量、管道、互斥锁
下一篇: Linux驱动进化:传统模型、设备总线驱动模型、设备树
ZHU~.
博客等级 码龄7年 193粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值