FreeRTOS-基本介绍和移植STM32

2024-09-09 05:12

本文主要是介绍FreeRTOS-基本介绍和移植STM32,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FreeRTOS-基本介绍和STM32移植

  • 一、裸机开发和操作系统开发介绍
  • 二、任务调度和任务状态介绍
    • 2.1 任务调度
      • 2.1.1 抢占式调度
      • 2.1.2 时间片调度
    • 2.2 任务状态
  • 三、FreeRTOS源码和移植STM32
    • 3.1 FreeRTOS源码
    • 3.2 FreeRTOS移植STM32
      • 3.2.1 代码移植
      • 3.2.2 时钟中断配置

一、裸机开发和操作系统开发介绍

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

二、任务调度和任务状态介绍

2.1 任务调度

  • 任务调度器就是决定在某一个时刻调用哪一个任务,切换速度很快,造成在同一时刻有多个任务在运行的错觉
  • 抢占式调度:针对优先级不同的任务,优先级高的可以抢占低优先级的任务
  • 时间片调度:针对优先级相同的任务,在每一次系统时钟节拍到的时候切换任务
  • 协程式调度:当前正在执行任务一直在执行,同时高优先级的任务不会抢占低优先级任务(不常用)

2.1.1 抢占式调度

  • 运行条件:三个任务Task1、Task2和Task3,在FreeRTOS中任务设置的数值越大优先级越高

  高优先级任务,优先执行。高优先级任务不停止,低优先级任务无法执行。被抢占的任务会进入就绪态

在这里插入图片描述

2.1.2 时间片调度

  • 同优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期

  同等优先级任务,轮流执行,时间片流转。一个时间片大小,取决为滴答定时器中断周期。注意没有用完的时间片不会再使用(阻塞-直接切换到下一个任务),下次任务Task3得到执行还是按照一个时间片的时钟节拍运行

在这里插入图片描述

2.2 任务状态

  • FreeRTOS中任务共存在4种状态:运行态就绪态阻塞态挂起态

  • 运行态正在执行的任务,该任务就处于运行态,注意在STM32种,同一时间仅一个任务处于运行态

  • 就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态

  • 阻塞态:如果一个任务因延时或者等待外部事件发生,那么这个任务就处于阻塞态

  • 挂起态:类似暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态

  • 下图为四种任务状态间的转换图

  • 仅就绪态可以转变为运行态。其他状态想运行,必须先转变为就绪态

在这里插入图片描述

  • 四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表(链表)
  • 就绪列表:pxReadyTaskList[x],其中x代表任务优先级数值0-31
  • 阻塞列表:pxDelayTaskList
  • 挂起列表:xSuspendedTaskList

  调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。如果优先级一致,那么相同优先级的任务会连接在同一个就绪列表上,按照时间片轮流执行

三、FreeRTOS源码和移植STM32

3.1 FreeRTOS源码

  • 从官网下载FreeRTOS源码,文件夹内容如下所示

在这里插入图片描述

  • 打开内核文件夹

在这里插入图片描述

  • 打开FreeRTOS源码文件夹

在这里插入图片描述

  • FreeRTOS操作系统归根结底是一个软件层面的东西,FreeRTOS是如何跟硬件联系在一起,portable文件夹里的东西就是接口文件,使用Keil-MDK开发,需要使用KeilRVDSMemMang文件夹部分内容

在这里插入图片描述

3.2 FreeRTOS移植STM32

3.2.1 代码移植

  • 以STM32F103C8T6单片机为例移植FreeRTOS,移植步骤如下

  • 将STM32工程文件全部复制到FreeRTOS目录下,并新建FreeRTOS文件夹存放源码

在这里插入图片描述

  • 将FreeRTOS源码文件夹复制到移植模板内

在这里插入图片描述在这里插入图片描述

  • 删除源码中多余的文件保留接口3个文件夹

在这里插入图片描述

  • 在FreeRTOS文件夹内新建FreeRTOS_coreFreeRTOS_port文件夹,分别用于存放FreeRTOS内核文件接口文件(不同的平台文件不一样)

在这里插入图片描述

  • 如下文件添加到FreeRTOS_core内核文件夹中,包括.c和所有.h文件

在这里插入图片描述在这里插入图片描述

  • 如下文件添加到FreeRTOS_port接口文件夹中
  • STM32F103系列单片机为M3内核

在这里插入图片描述在这里插入图片描述

  • 在Keil里面包含头文件所在路径
  • 将官方demo里面的FreeRTOSConfig.h添加到FreeRTOS_core内核文件夹中
  • FreeRTOSConfig.h作用:对FreeRTOS进行功能配置和裁剪(config),以及API函数(INCLUDE)的使能,其他配置项(PendSV、SVC宏定义)

在这里插入图片描述

  • 最后保留FreeRTOS_coreFreeRTOS_port文件夹即可

在这里插入图片描述

3.2.2 时钟中断配置

  • SysTick是FreeRTOS的心跳时钟,驱动FreeRTOS运行,在SysTick时钟的节拍下进入中断函数,每次中断都会引发任务调度
  • 在stm32f10x_it.c里的SysTick_Handler()中断里添加函数内容,并加上头文件
void SysTick_Handler(void)
{if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)xPortSysTickHandler();
}

在这里插入图片描述在这里插入图片描述

  • 在FreeRTOSConfig.h里添加函数宏定义,使用官方的中断函数,
  • 注释掉stm32f10x_it.c里的PendSV_Handler()函数和SVC_Handler()函数,避免重定义
#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler

在这里插入图片描述

  • 如果遇到xTaskGetSchedulerState()函数未定义其他可选函数未编译的情况下,需要改其宏定义为1,或者在FreeRTOSConfig.h里添加宏定义为1

在这里插入图片描述
在这里插入图片描述

  • xTaskGetSchedulerState()函数是一个可选函数,当宏定义为1时可以编译

在这里插入图片描述

这篇关于FreeRTOS-基本介绍和移植STM32的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150254

相关文章

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I