由浅入深学习FreeRTOS-系列文章目录
第一章 汇编指令以及堆栈概念
第二章 RTOS如何使用栈
第三章 FreeRTOS源码概述
前言
我们为什么要使用 FreeRTOS?为什么要进行移植?
为什么要使用 FreeRTOS?
实时性: 提供实时调度和中断管理,满足嵌入式应用的实时要求。
多任务管理: 允许并发运行多个任务,提高代码可维护性和可读性。
资源管理: 提供队列、信号量、互斥量等机制,高效管理系统资源。
便携性: 易于移植到不同硬件平台,方便代码迁移。
社区和支持: 拥有活跃的社区和丰富的文档资源,便于开发者获取帮助。
为什么要移植?
硬件差异: 适配不同硬件平台的寄存器、指令集和内存布局。
中断处理: 编写特定架构的中断处理代码,确保正确处理硬件中断。
上下文切换: 实现特定架构的上下文切换代码,保证任务调度正确。
定时器和时钟: 配置和管理硬件定时器,生成时钟滴答(tick)。
堆栈和内存管理: 配置堆栈和内存分配策略,适应不同硬件平台的内存布局。
先了解下FreeRTOS源码
一、FreeRTOS目录结构
1)FreeRTOSConfig.h: FreeRTOS 的配置文件,包含了许多 FreeRTOS 的配置选项,如任务优先级、堆大小、钩子函数等。
freertos.c: STM32CubeMX 创建的默认任务文件,通常包含任务创建和调度器启动代码。
CMSIS_RTOS_V2下的函数是FreeRTOS 的 CMSIS 封装,这些文件提供了基于 CMSIS-RTOS 标准的 API,使得 FreeRTOS 可以兼容 CMSIS-RTOS 标准。
include: FreeRTOS 的头文件目录,包含 FreeRTOS 内核及其他组件的头文件。
2)核心代码:
croutine.c: 协程实现文件,包含了 FreeRTOS 协程(coroutines)的实现。
event_groups.c: 事件组实现文件,用于管理事件组(event groups)。
list.c: 列表实现文件,FreeRTOS 内部使用的链表实现。
queue.c: 队列实现文件,包含了队列的实现和管理。
stream_buffer.c: 流缓冲区实现文件,用于管理流缓冲区。
tasks.c: 任务管理实现文件,包含了任务创建、删除、调度等功能。
timers.c: 软件定时器实现文件,包含了软件定时器的实现和管理。
3)portable: 移植层文件,包含特定架构和编译器的移植文件。
RVDS: 针对 RVDS、MAK-ARM 编译器的移植文件。
ARM_CM3: 针对 ARM Cortex-M3 架构的移植文件。
port.c, portmacro.h: 移植层核心文件,包含了 FreeRTOS 在 ARM Cortex-M3 上运行所需的特定实现。
4)MemMang: 内存管理文件,包含不同的堆实现。
heap_1.c, heap_2.c, heap_3.c, heap_4.c, heap_5.c: 不同的堆管理实现文件。每个文件提供一种不同的内存分配策略,用户可以根据需求选择合适的堆实现。
二、入口函数
在Core\Src\main.c的main函数里,初始化了FreeRTOS环境、创建了任务,然后启动调度器。源码如下:
/* Init scheduler */
osKernelInitialize(); /* 初始化FreeRTOS运行环境 */
MX_FREERTOS_Init(); /* 创建任务 */
/* Start scheduler */
osKernelStart(); /* 启动调度器 */
三、数据类型
1.数据类型
每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型:
1)TickType_t:
配置一个周期性的时钟中断(Tick Interrupt)是为了实现任务调度和时间管理。这种中断被称为“时钟滴答”(Tick),每隔一个固定的时间间隔发生一次,而每发生一次中断,中断次数累加,这被称为tick_count。
TickType_t可以是16位的,也可以是32位的
FreeRTOSConfig.h中定义configUSE_16_BIT_TICKS时,TickType_t就是uint16_t
否则TickType_t就是uint32_t。
2)BaseType_t:
这是该架构最高效的数据类型
32位架构中,它就是uint32_t
16位架构中,它就是uint16_t
8位架构中,它就是uint8_t
BaseType_t通常用作简单的返回值的类型,还有逻辑值,比如pdTRUE/pdFALSE
2.变量名前缀
3.函数名前缀
4.宏名
宏的名字是大小,可以添加小写的前缀。前缀是用来表示:宏在哪个文件中定义。
通用的宏定义:
总结
以上