freertos系列教程之第一章freertos概述与体验:1.1freertos的目录结构(代码片段)

挨踢民工biubiu 挨踢民工biubiu     2023-02-04     156

关键词:

需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址: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/

韦东山freertos系列教程之第十一章中断管理(interruptmanagement)(代码片段)

文章目录系列教程总目录概述11.1两套API函数11.1.1为什么需要两套API11.1.2两套API函数列表11.1.3xHigherPriorityTaskWoken参数11.1.4怎么切换任务11.2中断的延迟处理11.3中断与任务间的通信需要获取更好阅读体验的同学,请访问我专门设... 查看详情

韦东山freertos系列教程之第十三章调试方法(代码片段)

文章目录系列教程总目录第十三章调试方法需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击... 查看详情

韦东山freertos系列教程:入门文档教程+进阶视频教程(全部免费的freertos系列教程freertos学习路线)(代码片段)

...录学前知识普及初级文档教程进阶视频教程进阶一:FreeRTOS的内部机制进阶二:深入理解FreeRTOS队列之队列实战进阶三:RTOS商业产品案例源码讲解学前知识普及对于RTOS初学者或者对RTOS的基础概念不太清楚的同学,... 查看详情

韦东山freertos系列教程:入门文档教程+进阶视频教程(全部免费的freertos系列教程freertos学习路线)(代码片段)

...及入门视频教程初级文档教程进阶视频教程进阶一:FreeRTOS的内部机制进阶二:深入理解FreeRTOS队列之队列实战进阶三:RTOS商业产品案例源码讲解学前知识普及对于RTOS初学者或者对RTOS的基础概念不太清楚的同学,... 查看详情

韦东山freertos系列教程:入门文档+视频教程+进阶视频教程(全部免费的freertos系列教程freertos学习路线)(代码片段)

...及入门视频教程初级文档教程进阶视频教程进阶一:FreeRTOS的内部机制进阶二:深入理解FreeRTOS队列之队列实战进阶三:RTOS商业产品案例源码讲解学前知识普及对于RTOS初学者或者对RTOS的基础概念不太清楚的同学,... 查看详情

韦东山freertos系列教程之第十章软件定时器(softwaretimer)(代码片段)

...34;,这无数的"闹钟"要基于一个真实的闹钟。在FreeRTOS里, 查看详情

韦东山freertos系列教程之第五章队列(queue)(代码片段)

文章目录系列教程总目录概述5.1队列的特性5.1.1常规操作5.1.2传输数据的两种方法5.1.3队列的阻塞访问5.2队列函数5.2.1创建5.2.2复位5.2.3删除5.2.4写队列5.2.5读队列5.2.6查询5.2.7覆盖/偷看5.3示例8:队列的基本使用5.4示例9:分辨数据源5.5... 查看详情

韦东山freertos系列教程之第九章任务通知(tasknotifications)(代码片段)

文章目录系列教程总目录概述9.1任务通知的特性9.1.1优势及限制9.1.2通知状态和通知值9.2任务通知的使用9.2.1两类函数9.2.2xTaskNotifyGive/ulTaskNotifyTake9.2.3xTaskNotify/xTaskNotifyWait9.3示例22:传输计数值9.4示例23:传输任意值需要获取更好阅读... 查看详情

韦东山freertos系列教程之第六章队列(queue)(代码片段)

文章目录系列教程总目录概述6.1信号量的特性6.1.1信号量的常规操作6.1.2信号量跟队列的对比6.1.3两种信号量的对比6.2信号量函数6.2.1创建6.2.2删除6.2.3give/take6.3示例12:使用二进制信号量来同步6.4示例13:防止数据丢失6.5示例14:使用计... 查看详情

freertos(教程非常详细)

概述:   之前写了关于FreeRTOS的部分内容,为了方便阅读,现在给汇总到一起了。全部学习完后,恭喜你对FreeRTOS有了更深的认知。 第一章 FreeRTOS移植到STM32 第二章FreeRTOS创建任务 第三章 FreeRTOS任务管理第四... 查看详情

韦东山freertos系列教程之第八章事件组(eventgroup)(代码片段)

文章目录系列教程总目录概述8.1事件组概念与操作8.1.1事件组的概念8.1.2事件组的操作8.2事件组函数8.2.1创建8.2.2删除8.2.3设置事件8.2.4等待事件8.2.5同步点8.3示例20:等待多个事件8.3示例21:任务同步需要获取更好阅读体验的同学,... 查看详情

韦东山freertos系列教程之第十二章资源管理(resourcemanagement)(代码片段)

文章目录系列教程总目录概述12.1屏蔽中断12.1.1在任务中屏蔽中断12.1.2在ISR中屏蔽中断12.2暂停调度器需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/系列教程总目录本教程连载... 查看详情

freertos系列教程目录索引

...设立的站点查看,地址:http://rtos.100ask.net第一章FreeRTOS概述与体验1.1FreeRTOS目录结构1.2核心文件1.3移植时涉及的文件1.4头文件相关1.5内存管理1.6Demo1.7数据类型和编程规范1.8安装Keil1.9使用模拟器运行第1个程序1.10使用逻辑... 查看详情

从0开始的freertos

“从0开始的FreeRTOS”系列教程第一讲作者:satori大家好,这次给大家带来了Freertos的教程。这个系列的教程的主要目的是带大家了解实时系统(realtimeoperatingsystem)的基本概念,熟悉freertos的api使用方法,具备基本的使用rtos进行工程... 查看详情

freertos系列第2篇---freertos入门指南

...l protected] 目录(?)[-]查找相关文档页获取RTOS源代码FreeRTOS源码目录结构编译工程运行演示例程  FreeRTOS可以被移植到很多不同架 查看详情

从0开始的freertos

“从0开始的FreeRTOS”系列教程第二讲作者:satori这一期教程中,我们将介绍FreeRTOS源码的内容,如何使用cubemx快速生成一个包含freertos的工程,以及包含freertos的工程的结构。https://sourceforge.net/projects/freertos/files/FreeRTOS/在上面的网... 查看详情

freertos系列第20篇---freertos信号量api函数

   FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。    信号量API函数实... 查看详情

freertos系列第13篇---freertos内核控制

   内核控制的一些功能须要移植层提供,为了方便移植。这些API函数用宏来实现,比方上下文切换、进入和退出临界区、禁止和使能可屏蔽中断。内核控制函数还包含启动和停止调度器、挂起和恢复调度器以及用于低... 查看详情