freeRTOS系列教程之【第一章】FreeRTOS概述与体验

2023-05-16

文章目录

  • 教程目录
  • 1.1 FreeRTOS目录结构
  • 1.1 FreeRTOS目录结构
  • 1.2 核心文件
  • 1.3 移植时涉及的文件
  • 1.4 头文件相关
    • 1.4.1 头文件目录
    • 1.4.2 头文件
  • 1.5 内存管理
  • 1.6 Demo
  • 1.7 数据类型和编程规范
    • 1.7.1 数据类型
    • 1.7.2 变量名
    • 1.7.3 函数名
    • 1.7.4 宏的名
  • 1.8 安装Keil
    • 1.8.1 下载Keil
    • 1.8.2 安装Keil
    • 1.8.3 安装Pack
  • 1.9 使用模拟器运行第1个程序
  • 1.10 使用逻辑分析仪

需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/

教程目录

本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的 目录列表,目录列表页面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

1.1 FreeRTOS目录结构

以Keil工具下STM32F103芯片为例,它的FreeRTOS的目录如下:

1.1 FreeRTOS目录结构

以Keil工具下STM32F103芯片为例,它的FreeRTOS的目录如下:

在这里插入图片描述

主要涉及2个目录:

  • Demo
    • Demo目录下是工程文件,以"芯片和编译器"组合成一个名字
    • 比如:CORTEX_STM32F103_Keil
  • Source
    • 根目录下是核心文件,这些文件是通用的
    • portable目录下是移植时需要实现的文件
      • 目录名为:[compiler]/[architecture]
      • 比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS工具上的移植文件

1.2 核心文件

FreeRTOS的最核心文件只有2个:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/list.c

其他文件的作用也一起列表如下:

FreeRTOS/Source/下的文件作用
tasks.c必需,任务操作
list.c必须,列表
queue.c基本必需,提供队列操作、信号量(semaphore)操作
timer.c可选,software timer
event_groups.c可选,提供event group功能
croutine.c可选,过时了

1.3 移植时涉及的文件

移植FreeRTOS时涉及的文件放在FreeRTOS/Source/portable/[compiler]/[architecture]目录下,

比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。

里面有2个文件:

  • port.c
  • portmacro.h

1.4 头文件相关

1.4.1 头文件目录

FreeRTOS需要3个头文件目录:

  • FreeRTOS本身的头文件:FreeRTOS/Source/include
  • 移植时用到的头文件:FreeRTOS/Source/portable/[compiler]/[architecture]
  • 含有配置文件FreeRTOSConfig.h的目录

1.4.2 头文件

列表如下:

头文件作用
FreeRTOSConfig.hFreeRTOS的配置文件,比如选择调度算法:configUSE_PREEMPTION
每个demo都必定含有FreeRTOSConfig.h
建议去修改demo中的FreeRTOSConfig.h,而不是从头写一个
FreeRTOS.h使用FreeRTOS API函数时,必须包含此文件。
在FreeRTOS.h之后,再去包含其他头文件,比如:
task.h、queue.h、semphr.h、event_group.h

1.5 内存管理

文件在FreeRTOS/Source/portable/MemMang下,它也是放在portable目录下,表示你可以提供自己的函数。

源码中默认提供了5个文件,对应内存管理的5种方法。

参考文章:FreeRTOS说明书吐血整理【适合新手+入门】

后续章节会详细讲解。

文件优点缺点
heap_1.c分配简单,时间确定只分配、不回收
heap_2.c动态分配、最佳匹配碎片、时间不定
heap_3.c调用标准库函数速度慢、时间不定
heap_4.c相邻空闲内存可合并可解决碎片问题、时间不定
heap_5.c在heap_4基础上支持分隔的内存块可解决碎片问题、时间不定

1.6 Demo

Demo目录下是预先配置好的、没有编译错误的工程。目的是让你可以基于它进行修改,以适配你的单板。

这些Demo还可以继续精简:

  • Demo/Common中的文件可以完全删除
  • main函数中只需要保留2个函数:
    • prvSetupHardware()
    • vTaskStartScheduler()
    • 如下图所示

在这里插入图片描述

1.7 数据类型和编程规范

1.7.1 数据类型

每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型:

  • TickType_t:
    • FreeRTOS配置了一个周期性的时钟中断:Tick Interrupt
    • 每发生一次中断,中断次数累加,这被称为tick count
    • tick count这个变量的类型就是TickType_t
    • TickType_t可以是16位的,也可以是32位的
    • FreeRTOSConfig.h中定义configUSE_16_BIT_TICKS时,TickType_t就是uint16_t
    • 否则TickType_t就是uint32_t
    • 对于32位架构,建议把TickType_t配置为uint32_t
  • BaseType_t:
    • 这是该架构最高效的数据类型
    • 32位架构中,它就是uint32_t
    • 16位架构中,它就是uint16_t
    • 8位架构中,它就是uint8_t
    • BaseType_t通常用作简单的返回值的类型,还有逻辑值,比如pdTRUE/pdFALSE

1.7.2 变量名

变量名有前缀:

变量名前缀含义
cchar
sint16_t,short
lint32_t,long
xBaseType_t,
其他非标准的类型:结构体、task handle、queue handle等
uunsigned
p指针
ucuint8_t,unsigned char
pcchar指针

1.7.3 函数名

函数名的前缀有2部分:返回值类型、在哪个文件定义。

函数名前缀含义
vTaskPrioritySet返回值类型:void
在task.c中定义
xQueueReceive返回值类型:BaseType_t
在queue.c中定义
pvTimerGetTimerID返回值类型:pointer to void
在tmer.c中定义

1.7.4 宏的名

宏的名字是大小,可以添加小写的前缀。前缀是用来表示:宏在哪个文件中定义。

宏的前缀含义:在哪个文件里定义
port (比如portMAX_DELAY)portable.h或portmacro.h
task (比如taskENTER_CRITICAL())task.h
pd (比如pdTRUE)projdefs.h
config (比如configUSE_PREEMPTION)FreeRTOSConfig.h
err (比如errQUEUE_FULL)projdefs.h

通用的宏定义如下:

pdTRUE1
pdFALSE0
pdPASS1
pdFAIL0

1.8 安装Keil

本教程的所有程序,都是使用Keil开发,运行在Keil的模拟器上。

1.8.1 下载Keil

Keil-MDK(Keil ARM Microcontroller Development Kit)前生是德国Keil公司,后被ARM收购,是ARM官方的集成开发环境。

打开Keil官网(https://www.keil.com/download/product/),点击“MDK-Arm”进行下载。

在这里插入图片描述

随后进入个人信息完善页面,按提示填写所有的信息,如下图所示,填写完后,点击“Submit”提交。

在这里插入图片描述

随后进入下载页面,点击“MDK532.EXE”即可下载。

在这里插入图片描述

1.8.2 安装Keil

下载完后,点击运行该文件,进入安装界面,选择“Next >>”。

在这里插入图片描述

接着进入用户协议界面,勾选同意协议,点击“Next >>”。

在这里插入图片描述

然后设置安装路径,如下图所示:

  • 第一个“Core”是软件的安装路径,

  • 第二个“Pack”是芯片的硬件支持包的安装路径,

保持默认路径或者设置为如下图所示一样的即可。

如果是自定义设置,建议为全英文路径,不建议为包含有中文的路径

选择好之后点击“Next >>”。

在这里插入图片描述

随后需要设置个人信息,随便填写即可,如下图所示。

在这里插入图片描述
之后便进入安装进度界面,等待安装完成。

安装过程中,回弹出驱动安装界面,勾选“始终信任来自‘ARM Ltd’的软件”,然后点击“安装”,如下图。

在这里插入图片描述
之后会自动进入“Pack Installer”界面,这里会检查安装的编译器、CMSIS等是否是最新的,由于我们安装的是官网提供的最新的MDK,所以这里一般情况下都是不需要更新的。

1.8.3 安装Pack

一个Keil的开发环境,除了Keil软件,还需要安装对应的Pack。

比如这里目标机的MCU是STM32F103ZET6,就需要下载该系列的的Pack,如果是STM32F4系列,就需要下其它系列Pack。

使用“Pack Installer”可以方便的对Pack安装和管理。

在左上角搜索框输入“STM32F103”,展开搜索结果,可以看到STM32F103ZE,点击右边的简介链接即可跳转到Pack下载页面。

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

下载完成得到“Keil.STM32F1xx_DFP.2.3.0.pack”。

直接双击该文件,随后弹出如下图所示界面,点击“Next”进行安装。

在这里插入图片描述

至此,Keil和Pack就安装完成了。

1.9 使用模拟器运行第1个程序

先获取配套示例代码。

双击"FreeRTOS_01_create_task\FreeRTOS\Demo\CORTEX_STM32F103_Keil\RTOSDemo.uvprojx"打开第一个示例。

打开之后,首先要编译工程,才能使用模拟器运行,点击"Build"图标进行编译,如下图所示:
在这里插入图片描述

编译完成后,点击"Debug"按钮进行仿真,如下图所示:
在这里插入图片描述

第一个程序里面创建了两个任务,两个任务一直打印各自的信息。

这里需要打开串口显示模拟窗口,显示任务的打印内容。

点击左上角菜单的“View”,然后选择“Serial Windows”,点击“UART #1”,如下图所示:

在这里插入图片描述

最后,点击“Run”运行程序,右下角串口显示窗口将打印两个任务的信息。

在这里插入图片描述

如果想退出模拟器仿真,再次"Debug"按钮退出,如下图所示:

在这里插入图片描述

1.10 使用逻辑分析仪

本课程的程序有两种输出方式:

  • 串口:查看打印信息
  • 逻辑分析仪:观察全局变量的波形,根据波形解析任务调度情况

下面举例说明逻辑分析仪的用法。

双击"FreeRTOS_06_taskdelay\FreeRTOS\Demo\CORTEX_STM32F103_Keil\RTOSDemo.uvprojx"打开该示例。

打开之后,首先要编译工程,点击"Build"图标进行编译。

编译完成后,点击"Debug"按钮进行仿真。

本实例使用模拟器的逻辑分析仪观察现象。

首先在“main.c”的主函数加入断点,在代码行前的灰色处,点击一下就会有一个红色小点,就是设置的“断点”。

在这里插入图片描述

然后点击“Run”运行,程序运行到断点位置,就会停下来等待下一步操作:

  • 在代码中找到全局变量flag

  • 鼠标选中flag,然后点击鼠标右键,在弹出的菜单里选择"Add ‘flag’ to…",选择“Analyzer”,

    如下图所示:
    在这里插入图片描述
    此时在代码框上面,就会出现逻辑分析仪“Logic Analyzer”显示窗口,里面分析的就是变量flag。

点击这个flag,然后右键,选择“Bit”,以便观察,如下图所示:
在这里插入图片描述

再点击一下“Run”,继续运行,此时逻辑分析仪窗口显示变量flag的bit值变化,如下图所示:
在这里插入图片描述

在逻辑分析仪窗口,可以使用鼠标滚轮放大、缩小波形。

需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/

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

freeRTOS系列教程之【第一章】FreeRTOS概述与体验 的相关文章

  • 在C++中使用map来取代很多个if else和switch

    在C 43 43 中使用map来取代很多个if else和switch 利用map中的key和value键值对来取代if else效率会好不少 span class token macro property span class token
  • C++类:类中的静态属性和函数、常量函数与常对象、类在内存中的存储

    静态属性 静态成员包括静态成员属性 静态成员函数 一个属性一旦设置为静态 xff0c 那么整个程序中就独其一份 如上所示 xff0c 之前p m A的值是100 使用p2 m A更改了该值为200后 xff0c 即使再用p m A去调用 x
  • ADRC学习心得(持续更新)

    两年前第一次接触到PID觉得很高深 xff0c 很神奇 xff1b 后来逐渐觉得单纯的PID小儿科了 xff0c 又了解到专家PID xff0c 模糊PID xff0c 神经网络PID这些改进算法 xff0c 再后来又知道了ADRC xff
  • 四/六旋翼迷你无人机设计制造(一)硬件设计制作

    四旋翼 xff0c 小飞机 飞到东 xff0c 飞到西 上日天 xff0c 下怼地 我的飞机真神奇 鲁迅 很早就有弄个小飞机自己玩的想法了 xff0c 因为疫情拖到现在 不过感谢时间 xff0c 过滤掉了很多不成熟的想法 xff0c 也有足
  • SLAM14讲第七讲习题10:Ceres实现ICP优化

    很好的学习ceres的习题 难度很低 容易入手 ceres结构体构造 struct ICPCeres 64 brief Construct a new ICPCeres object 64 param uvw 当前帧3d点 64 param
  • ZED2i相机在ROS2上运行vins排坑与用docker运行Kalibr标定ZED2i相机

    按照ZED官网提供的方式ZED2i的SDK和ros2 wrapper之后 还有很多工作要做才能让ZED成功运行稳定的VINS 1 ZED2i用Kalibr标定IMU和相机 由于我的电脑怎么装Kalibr都装不上 说是啥boost这个库版本不
  • 解决MobaXterm无法连接虚拟机问题总结

    一 说明 ubuntu拒绝root ssh远程登录通常情况是ssh设置了禁止root远程登录 xff0c 解决办法就是 xff1a 修改ssh配置 xff0c 然后重启ssh服务即可 二 检查是否安装ssh远程登陆模块 命令 xff1a s
  • 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517

    深度强化学习教程 xff1a Spinning Up项目中文版 Spinning Up 文档 ERROR Failed building wheel for mpi4py Failed to build mpi4py ERROR Could
  • MarkDown插入图片调整大小

    一定要注意修改格式的时候要加空格 xff0c 例如 Alt https avatar csdn net 7 7 B 1 ralf hx163com jpg 61 100x jpg和 61 之间的空格不能没有 具体参照 xff1a https
  • Linux初学记录

    编写一个名为iffile程序 xff0c 它执行时判断 bin目录下date文件是否存在 xff1f bin bash fname 61 bin date if test f fname then echo exist fi 123456
  • tensorflow的奇妙下划线,形如(_,变量)变量命名操作的解释

    问题的发现 今天在尝试实现 深度学习之TensorFlow入门 原理与进阶实战 的时候书写了一段代码 xff0c 其中有一行代码我甚是纠结了半天 xff0c 代码如下 xff1a span class token punctuation s
  • zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持

    目录 1 网上同行的OSD方案 太low 2 本方案OSD的优势3 HLS实现方案4 OSD延时和资源占用情况5 工程1 xff1a zynq7100实现字符叠加6 上板调试验证7 福利 xff1a 工程源码获取 1 网上同行的OSD方案
  • 向日葵连接已断开的解决办法

    方法一 打开ubuntu系统的终端 xff0c 依次输入如下命令 xff1a sudo apt get update sudo apt get upgrade sudo apt install lightdm 重启电脑 方法二 xff08
  • UDP传输图片(分包)

    前提 xff1a 需要了解QUdp的简单通信 xff0c 比如收发个字符串 QP ixmap图片类 xff0c 以此类来加载图片 Q B uffer和Q B yteArray来记录数据 memcpy函数的用法 分包概念 xff1a 举个例子
  • 结构型设计模式(七种)

    3 结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构 它分为类结构型模式和对象结构型模式 xff0c 前者采用继承机制来组织接口和类 xff0c 后者采用组合或聚合组合对象 由于组合关系或聚合关系比较继承关系耦合度低 x
  • IDEA+Log4j2 设置控制台打印彩色日志

    在Log4j 2 10以前的版本 xff0c pattern中配置 highlight属性是可以正常打印彩色日志的 例如 xff1a pattern 34 d yyyy MM dd HH mm ss SSS highlight 5level
  • weex打包安卓艰苦之路

    weex打包安卓 一 配置安卓环境 下载安卓SDK配置ANDROID HOME配置 ANDROID HOME tools android h 检查是否配置成功 二 weex的安装使用 一 weex简介以及开发前提 1 简介 官网的解释为We
  • docker命令

    Docker命令详解 语法 docker run OPTIONS IMAGE COMMAND ARG Usage Run a command in a new container 中文意思为 xff1a 通过run命令创建一个新的容器 xf
  • PX4 mixer load

    mixer load dev pwm output0 fs microsd mixer ttt mix 启动一个自定义的mixer 系统默认从 etc mixers加载mixer 如果在 fs microsd etc mixers有相同名称
  • Bean三级缓存

    一 核心步骤 提前引用进行动态代理 后置处理器进行动态代理 二 具体步骤 1 获取bean AbstractBeanFactory doGetBean 2 第一次去单例池查询bean 最终调用 xff1a DefaultSingletonB

随机推荐

  • MinIO Client客户端使用

    安装 文档地址 xff1a https docs min io 基本上MinIO服务器和客户端支持在很多系统上安装 xff0c 比如Windows macOS等 xff0c 这里主要说Linux系统 minio安装 span class t
  • Security+Thymeleaf整合

    文章目录 1 版本介绍2 演示demo3 常见使用表达式Using the expression utility objectsUsing the attributes 官方地址 1 版本介绍 2 演示demo html界面 span cl
  • java正则的使用

    java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 xff1a Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式 Matcher 一个
  • cas服务端动态servers

    一 什么是servers cas的分为服务端和客户端 xff0c 如果客户端要使用cas需要把自己的域名或ip注册到cas服务端才可以使用 默认的servers为静态的 src main resources services HTTPSan
  • cas 配置相关

    默认配置 span class token comment span span class token comment CAS Cloud Bus Configuration span span class token comment sp
  • Elasticsearch分词器

    内置分词器 中文分词器 这篇博客主要讲 xff1a 分词器概念 ES内置分词器 ES中文分词器 一 分词器概念 1 Analysis 和 Analyzer Analysis xff1a 文本分析是把全文本转换一系列单词 term token
  • java中的引用

    背景 最近在研究ThreadLocal中发现最终存储的ThreadLocalMap中的key为弱引用 xff0c 因此来分析下使用弱引用的原因 实验 引用链为 list 61 gt gt person1 因此在GC的时候 list还强引用三
  • charles

    Charles 的简介如何安装 Charles将 Charles 设置成系统代理Charles 主界面介绍过滤网络请求截取 iPhone 上的网络封包截取 Https 通讯信息模拟慢速网络修改网络请求内容给服务器做压力测试修改服务器返回内容
  • CAN通信

    CAN通信控制器通过两根线上的电位差来判断总线电平 xff0c 是ISO国际标准化的串行通信协议 总线电平分为显性电平和隐形电平 xff0c 二者必居其一 发送方通过总线上电平的变化将信息发送给接收方 CAN通讯是半双工的 xff0c 收发
  • maddpg 复现过程中遇到的问题

    最近在复现论文Multi Agent Actor Critic for Mixed Cooperative Competitive Environments https github com openai multiagent partic
  • 【解决】VSCode在windows下不能打开标准头文件

    鼠标放到标准头文件上 xff0c VSCode提示一下错误 xff1a include errors detected Please update your includePath IntelliSense features for thi
  • SPI通信方式总结

    SPI xff08 Serial Peripheral interface xff09 是一种同步串行传输规范 xff0c 也是单片机外设芯片串行外设扩展接口 xff0c 该接口是一种高速 xff0c 全双工 xff0c 同步的通信总线 x
  • 轮询机制的介绍

    轮询是一种CPU决策如何提供周边设备服务的方式 xff0c 又称 程控输入输出 xff08 Programmed I O xff09 是由CPU定时发出询问 xff0c 依序询问每一个周边设备是否需要其服务 xff0c 有即给予服务 xff
  • stm32面试题总结

    1 嵌入式系统中ROM RAM Register的概念和作用是什么 xff1f ROM是只读存储器 断电后能保证数据不会丢失 xff08 硬盘 xff09 RAM是随机存储器 断电后数据会丢失 xff08 内存 xff09 Register
  • 有刷电机,无刷电机和电调的总结

    有刷直流电机工作原理 xff1a 有刷直流电机的主要结构就是定子 43 转子 43 电刷 xff0c 通过旋转磁场获得转动力矩 xff0c 从而输出动能 电刷与换向器不断接触摩擦 xff0c 在转动中起到导电和换相作用 有刷直流电机采用机械
  • leetcode刷题(五)——找出数组中唯一出现的数

    给定一个只包含整数的有序数组 nums xff0c 每个元素都会出现两次 xff0c 唯有一个数只会出现一次 xff0c 请找出这个唯一的数字 你设计的解决方案必须满足 O log n 时间复杂度和 O 1 空间复杂度 示例 1 输入 nu
  • leetcode刷题(六)——快乐数

    编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 xff1a 对于一个正整数 xff0c 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 xff0c 也可能是 无限循环 但始终变不到 1 如果这个
  • leetcode刷题(七)——移动零

    给定一个数组 nums xff0c 编写一个函数将所有 0 移动到数组的末尾 xff0c 同时保持非零元素的相对顺序 请注意 xff0c 必须在不复制数组的情况下原地对数组进行操作 示例 1 输入 nums 61 0 1 0 3 12 输出
  • STM32 HAL库 串口接收不定长数据(帧头)

    写的比较垃圾 xff0c 将就着用 欢迎各位大佬指导 xff0c 我这里要用串口中断接收两种帧头的数据 xff0c 1 以0x0D 0x0A为帧头的数据 2 xff0c 以0x55 0xA5为帧头的数据 两数据包帧头不同 大小不同 其中定义
  • freeRTOS系列教程之【第一章】FreeRTOS概述与体验

    文章目录 教程目录1 1 FreeRTOS目录结构1 1 FreeRTOS目录结构1 2 核心文件1 3 移植时涉及的文件1 4 头文件相关 1 4 1 头文件目录1 4 2 头文件 1 5 内存管理1 6 Demo1 7 数据类型和编程规