STM32操作系统FreeRTOS学习——基于hal库

这篇具有很好参考价值的文章主要介绍了STM32操作系统FreeRTOS学习——基于hal库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

1、FreeRTOS

2、单片机编程的系统概念

a、裸机系统,包括轮询系统(不包括中断)和前后台系统(中断为前台,轮询为后台)

b、多任务系统

3、FreeRTOS编程风格

a、数据类型

b、变量名的定义

c、函数名

d、宏定义

二、Cubemx创建工程

1、创建任务

2、创建队列

3、信号量

 4、互斥量

5、中断

三、FreeRTOS基础知识

 1、任务创建流程

a、任务的概念

b、任务的栈

c、任务的函数主体

d、任务控制块

e、任务创建函数(与任务函数主体区分,任务函数主体是任务创建函数的一个参数)

f、实现就绪列表

g、实现调度器

2、FreeRTOS任务执行原则

a、合作式任务调度

b、抢占式任务调度

3、FreeRTOS任务的状态

a、freeRTOS任务的状态有四种:运行、就绪、阻塞、挂起

b、任务状态的转换

c、俩个任务延时函数的区别

4、消息队列

a、基本概念

b、队列的操作​编辑

5、信号量

a、信号量概念

b、信号量分类

 c、二值信号量的基本操作​编辑

d、计数信号量的基本操作

6、互斥量

a、互斥量的理解

 b、互斥量的基本操作

 7、事件组

(只看了概念)

 8、任务通知

 9、软件计时器

 10、中断


一、基础概念

1、FreeRTOS

RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统

FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的
微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多。

RTOS是实时操作系统,例如汽车的操控:必须要在规定时间内完成响应。我们日常使用的Windows、IOS、Android等都是非实时操作系统,这些系统对任务响应时间没有严格要求,例如网页打开时可能会很久或者直接闪退等。

RTOS的最大特征就是“实时性”。所有实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其它操作系统的最大不同是强调严格按照优先级来分配CPU时间

FreeRTOS 操作系统是一个功能强大的RTOS 操作系统,并且能够根据需求进行功能裁剪,
以满足各种环境的要求、高效、开源、免费

2、单片机编程的系统概念

a、裸机系统,包括轮询系统(不包括中断)和前后台系统(中断为前台,轮询为后台)

在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行
流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很
简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序
里面处理。虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,
但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可
以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪
称有操作系统的效果

b、多任务系统

相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中, 任务跟中断一样,也具有优先级,优先级高的任务会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应。相比前后台系统,多任务系统的实时性又被提高了。

在裸机系统中,程序的主体是 CPU 按照顺序执行的。而在多任务系统中, 任务的执行
是由系统调度的。

3、FreeRTOS编程风格

a、数据类型

在 FreeRTOS 中, 使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型又进行了重定义,给它们取了一个新的名字, 比如 char 重新定义了一个名字 portCHAR, 这里面的 port 表示接口的意思,就是 FreeRTOS 要移植到这些处理器上需要这些接口文件来把它们连接在一起。但是用户在写程序的时候并非一定要遵循 FreeRTOS 的风格, 我们还是可以直接用 C 语言的标准类型。在 FreeRTOS 中, int 型从不使用, 只使用 short 和 long型。 在 Cortex-M 内核的 MCU 中, short 为 16 位, long 为 32位。
FreeRTOS 中详细的数据类型重定义在 portmacro.h 这个头文件中实现
 

hal库freertos,嵌入式,stm32,学习,单片机

b、变量名的定义

在 FreeRTOS 中,定义变量的时候往往会把变量的类型当作前缀加在变量上, 这样的好处是让用户一看到这个变量就知道该变量的类型。 比如 char 型变量的前缀是 c, short 型变量的前缀是 s, long 型变量的前缀是 l, portBASE_TYPE 类型变量的前缀是 x。 还有其他的数据类型,比如数据结构,任务句柄, 队列句柄等定义的变量名的前缀也是 x。如果一个变量是无符号型的那么会有一个前缀 u, 如果是一个指针变量则会有一个前缀 p。因此,当我们定义一个无符号的 char 型变量的时候会加一个 uc 前缀, 当定义一个char 型的指针变量的时候会有一个 pc 前缀

c、函数名

函数名包含了函数返回值的类型、 函数所在的文件名和函数的功能,如果是私有的函数则会加一个 prv(private) 的前缀。特别的, 在函数名中加入了函数所在的文件名, 这大大的帮助了用户提高寻找函数定义的效率和了解函数作用的目的, 具体的举例如下:
1. vTaskPrioritySet()函数的返回值为 void 型, 在task.c 这个文件中定义。
2. xQueueReceive()函数的返回值为 portBASE_TYPE 型, 在 queue.c 这个文件中定义。
3. vSemaphoreCreateBinary()函数的返回值为 void 型, 在 semphr.h 这个文件中定义。

d、宏定义

宏均是由大写字母表示,并配有小写字母的前缀, 前缀用于表示该宏在哪个头文件定

hal库freertos,嵌入式,stm32,学习,单片机

二、Cubemx创建工程

1、创建任务

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

2、创建队列

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

Queue Size是队列长度

Item Size是队列每个数据的大小

3、信号量

hal库freertos,嵌入式,stm32,学习,单片机

 4、互斥量

hal库freertos,嵌入式,stm32,学习,单片机

5、中断

 hal库freertos,嵌入式,stm32,学习,单片机

三、FreeRTOS基础知识

 1、任务创建流程

a、任务的概念

任务是一个独立的函数,函数主体无限循环且不能返回。

在裸机系统中, 系统的主体就是 main 函数里面顺序执行的无限循环,这个无限循环里面 CPU 按照顺序完成各种事情。在多任务系统中,我们根据功能的不同,把整个系统分割成一个个独立的且无法返回的函数,这个函数我们称为任务。

b、任务的栈

在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组, 也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。在多任务系统中,有多少个任务就需要定义多少个任务栈。

任务栈其实就是一个预先定义好的全局数据,数据类型为StackType_t,大小由 TASK1_STACK_SIZE 这个宏来定义, 默认为 128,单位为字,即 512字节,这也是 FreeRTOS 推荐的最小的任务栈。

hal库freertos,嵌入式,stm32,学习,单片机注意:在 FreeRTOS 中,凡是涉及到数据类型的地方, FreeRTOS 都会将标准的 C 数据类型用 typedef 重新取一个类型名。这些经过重定义的数据类型放在 portmacro.h中
hal库freertos,嵌入式,stm32,学习,单片机

c、任务的函数主体

hal库freertos,嵌入式,stm32,学习,单片机

d、任务控制块

hal库freertos,嵌入式,stm32,学习,单片机

e、任务创建函数(与任务函数主体区分,任务函数主体是任务创建函数的一个参数)

任务的栈, 任务的函数实体, 任务的控制块最终需要联系起来才能由系统进行统一调度。那么这个联系的工作就由任务创建函数 xTaskCreateStatic()来实现,该函数在 task.c(task.c 第一次使用需要自行在文件夹 freertos 中新建并添加到工程的 freertos/source 组)中定义, 在 task.h 中声明, 所有跟任务相关的函数都在这个文件定义。

hal库freertos,嵌入式,stm32,学习,单片机任务句柄使用,对任务进行操作

hal库freertos,嵌入式,stm32,学习,单片机

f、实现就绪列表

任务创建好之后,我们需要把任务添加到就绪列表里面, 表示任务已经就绪,系统随
时可以调度。 就绪列表在 task.c 中定义

g、实现调度器

调度器是操作系统的核心,其主要功能就是实现任务的切换,即从就绪列表里面找到优先级最高的任务,然后去执行该任务。从代码上来看,调度器无非也就是由几个全局变量和一些可以实现任务切换的函数组成,全部都在 task.c 文件中实现。

2、FreeRTOS任务执行原则

默认情况下:使用时间片抢占式任务调度

但是还有一种合作式任务调度,但是不太用了

a、合作式任务调度

hal库freertos,嵌入式,stm32,学习,单片机

b、抢占式任务调度

注意:永远优先执行优先级最高的任务

hal库freertos,嵌入式,stm32,学习,单片机

3、FreeRTOS任务的状态

a、freeRTOS任务的状态有四种:运行、就绪、阻塞、挂起

  • 运行态(runnnig):当任务正在运行,此时的状态被称为运行态,即CPU的使用权被这个任务占用;
  • 挂起态(暂停状态)(suspended):任务被暂时停止,通过调用挂起函数(vTaskSuspend())可以把指定任务挂起,任务挂起后暂时不会运行,只有调用恢复函数(xTaskResume())才可以退出挂起状态;
  • 阻塞态(blocked):任务在等待信号量、消息队列、事件标准组、系统延时时,被称为阻塞态,如果等待的事件到了,就会自动退出阻塞态,准备运行;
  • 就绪态(ready):任务已经具备了运行条件(没有被挂起或阻塞),但是又更高优先级或同优先级的任务正在运行,所以需要等待的状态。

b、任务状态的转换

hal库freertos,嵌入式,stm32,学习,单片机

注意:任务创建后,默认是最高优先级的先执行,如果俩个任务同优先级,后创建的任务先执行

c、俩个任务延时函数的区别

hal库freertos,嵌入式,stm32,学习,单片机

vTaskDelay()让函数阻塞固定的时间(n Tick的时间相同)

hal库freertos,嵌入式,stm32,学习,单片机

vTaskDelayUntil()让函数周期性的执行,给函数一个周期,在这个周期里函数只执行一次,剩下的时间就让函数阻塞(t1、2、3....之间的间隔相同)hal库freertos,嵌入式,stm32,学习,单片机

4、消息队列

a、基本概念

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中 断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之 间要交流的数据保存在队列中,叫做队列项目。

队列所能保存的最大数据项目数量叫做队列的 长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以 也称为消息队列。FreeRTOS 中的信号量的也是依据队列实现的!所以有必要深入的了解 FreeRTOS 的队列。

写队列和读队列都是采用复制的方式,队列的操作都是采用先进先出的的方式(FIFO)

b、队列的操作
hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

写的队列操作分为在任务中使用和在中断中使用

在任务中使用又可以分为往后写入(常用)和往前写入hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机

在中断中使用 

hal库freertos,嵌入式,stm32,学习,单片机

读队列(被读取得队列中的数据会被去除,所以只能读一次,但是还有队列偷窥操作,可以多次读队列中的数据)

hal库freertos,嵌入式,stm32,学习,单片机hal库freertos,嵌入式,stm32,学习,单片机

 队列偷窥(多次读队列中的地址)

hal库freertos,嵌入式,stm32,学习,单片机

5、信号量

a、信号量概念

hal库freertos,嵌入式,stm32,学习,单片机hal库freertos,嵌入式,stm32,学习,单片机

b、信号量分类

hal库freertos,嵌入式,stm32,学习,单片机

 c、二值信号量的基本操作hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

d、计数信号量的基本操作

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

6、互斥量

a、互斥量的理解

低优先级的任务执行后高优先级任务才能执行,但是中优先级会插低优先级任务的队,等于是插了高优先级任务的队,把高优先级任务和低优先级任务绑定起来,让中优先级的任务等低优先级的任务,不会插到高优先级任务的队。

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

 b、互斥量的基本操作

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

 7、事件组

(只看了概念)

hal库freertos,嵌入式,stm32,学习,单片机

 8、任务通知

(只看了概念)

hal库freertos,嵌入式,stm32,学习,单片机

hal库freertos,嵌入式,stm32,学习,单片机

 9、软件计时器

hal库freertos,嵌入式,stm32,学习,单片机

 10、中断

hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机

 hal库freertos,嵌入式,stm32,学习,单片机文章来源地址https://www.toymoban.com/news/detail-686283.html

到了这里,关于STM32操作系统FreeRTOS学习——基于hal库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32移植FreeRTOS操作系统

    一、FreeRTOS源码下载 (1)移植钱得准备前菜对吧,我们先来去官网瞄一瞄 网址:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions 第一步:点击下载FreeRTOS 第二步:选择版本下载(我选择稳定版本) 注:我们下载的稳定版本不包含DEMO例

    2024年01月17日
    浏览(40)
  • 基于STM32的homeassistant(采用FreeRTOS操作系统)【第一、二章优化拓展:Wifi、服务器连接验证以及UASRT串口区分】

      主控 STM32F103C8T6 WIFI模块 ESP01S 开发语言 C 开发编译器· KEIL 组网方式 WIFI 服务器协议 MQTT STM32 ESP01S 3.3V 3.3V GND GND GPIO2  (USRAT2-TX) RX GPIO3 (USART3-RX) TX 对ESP01S的AT指令的反馈指令进行验证解析 对ESP的USART2通信串口进行printf端口重映射 对调试用的USART1通信串口编写USART_printf函数并

    2024年02月17日
    浏览(51)
  • 简单介绍STM32上的FreeRTOS实时操作系统

    FreeRTOS是一款广泛使用的开源实时操作系统(RTOS),它为嵌入式系统提供了可靠的任务调度和并发管理。在嵌入式领域中,STM32微控制器广受欢迎,并且与FreeRTOS的结合使用可以提供强大的功能和灵活性。在本篇博客中,我们将深入探究STM32上的FreeRTOS,并了解其核心概念、任

    2024年02月16日
    浏览(60)
  • STM32初学者入门FreeRTOS操作系统,多任务实时系统

            FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,它专门设计用于在资源有限的嵌入式系统中运行。FreeRTOS提供了一些用于任务管理、调度、同步和通信的功能,使开发者能够轻松地创建可靠的嵌入式系统。 以下是FreeRTOS的一些特点和功能: 轻量

    2024年02月11日
    浏览(47)
  • 【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    KEIL:MDK_ARM_5.27 MCU:STM32F429IGT6 PHY_IC:LAN8720A LWIP:LWIP2.1.2 STM32CUBEMX:6.6.1 HAL:V1.27.1 LAN8720A使用RMII接口与STM32的ETH外设进行数据通信 STM32使用SMI接口读/写LAN8720A的寄存器 LAN8720A由外部25MHz晶振提供时钟,LED2/NINTSEL引脚配置为下拉,故PHY(LAN8720A)提供50MHz时钟给RMII的NINT/REFCLKO(此时引脚

    2024年02月08日
    浏览(51)
  • 基于stm32单片机和rt-thread操作系统的智能灯

    目    录 一、 总体概况 二、 各部分介绍 2.1  STM32F4开发板 2.2  光敏模块 2.3  麦克风模块 2.4  超声波模块 三、 RT-Thread介绍 四、 开发过程 五、 未来设想 六、 开发心得 总体概况 本次测试技术与信号处理课程作业,我利用了stm32单片机和rt-thread实时操作系统进行实践。

    2023年04月16日
    浏览(81)
  • FreeRTOS_从底层学习实时操作系统

    目录 1. 裸机系统和多任务系统 2. 任务的定任务切换的实现 2.1 什么是任务? 2.2 调度器 2.3 临界段 3. 空闲任务和阻塞延迟 4. 时间片 裸机系统:         裸机系统 分为 轮询系统 和 前后台系统 ;(51单片机就属于裸机系统)         轮询系统 是在裸机编程的时候,先初始化

    2024年02月07日
    浏览(40)
  • 基于stm32F407的hal库,移植FreeRTOS的具体步骤和遇到的问题(看正点原子的视频)

    因为板子是stm32F407的第二版的,所以开始下的资料是旧版本的,但是旧版本的FreeRTOS工程没有hal库的,都是标准库的,这里是下载stm32F407最新版的资料,进行移植。 资料可以在正点原子官网下载,如下: http://www.openedv.com/docs/boards/stm32/index.html 一定要下载最新的资料(开始用

    2024年02月06日
    浏览(81)
  • 【STM32】STM32 移植鸿蒙操作系统

    随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无

    2024年02月09日
    浏览(54)
  • FreeRTOS小项目实战------基于FreeRTOS和stm32的门禁系统

    目录 收获 系统总体框架 程序框架 具体程序实现 工程文件网盘链接 收获 学习 freertos的移植与裁剪 ,对任务间通信的认识更加深刻,加深了实时操作系统的理解,学习了as608指纹模块,rc522刷卡模块等模块的简单使用。 系统总体框架 该系统采用STM32F407ZGT6为主控芯片,在Fre

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包