FreeRTOS 简单内核实现1 前言
0、写在前面
为深入理解 RTOS 内核工作机制,笔者制作了名为 “FreeRTOS 内核简单实现” 的项目专栏 ,目标为自己动手从 0 到 1 编程一个简单的 RTOS 内核,从而实现任务并行工作的效果,主要实现了以下功能
- 静态创建任务
- 临界段保护
- 支持任务多优先级
- 任务阻塞延时
- 时间片轮询
注意:本项目不是仿真,而是基于 STM32F407 开发板从 0 到 1 编程实现的 RTOS 简单内核,最终会使用 GPIO 输出作为各种效果的演示,支持 Keil 与 CLion 两种开发环境,两者项目流程几乎一致,只是在汇编程序与工程配置上存在区别,不同之处会在教程中做明确说明
1、参考资料
- FreeRTOS内核实现_忆昔z的博客-CSDN博客
- GitHub - aeneag/FreeRTOS_kernel: 深入理解FreeRTOS内核,从零开始实现内核
- FreeRTOS内核实现与应用开发实战指南
2、准备工作
2.1、STM32 空工程
参考 STM32CubeMX教程1 工程建立 文章创建一个 STM32F407VGT6 空工程
参考 STM32CubeMX教程2 GPIO输出 - 点亮LED灯 文章初始化 4 个 LED 灯用于对本项目实现的 RTOS 内核验证
注意:空工程中 NVIC 选择 4 位抢占优先级,并应将 SysTick 和 PendSV 中断设置为最低优先级
2.2、创建 RTOS 文件目录
工程根目录下创建一个 RTOS 目录,目录结构如下
- RTOS
- Inc
- FreeRTOS.h,用来包含 RTOS 所有的头文件
- FreeRTOSConfig.h,用来配置裁剪 RTOS 的功能
- list.h,双向链表数据结构头文件
- portMacro.h,用来统一 RTOS 中用到的类型和定义一些功能宏
- task.h,任务管理头文件
- Src
- list.c,双向链表数据结构源文件
- prot.c,用来定义与底层芯片架构有关的函数和中断服务函数
- task.c,任务管理源文件
- Inc
如果使用 Keil 则需要将上面创建的文件添加到 Keil 工程中,并在设置中增加头文件路径,具体步骤如下图所示
如果使用的 CLion 需要在 CMakeLists_template.txt 模板文件中添加 RTOS 目录下的源文件目录和头文件目录,具体如下所示
// 增加头文件目录
include_directories(${includes} RTOS/Inc)
// 增加源文件目录
file(GLOB_RECURSE SOURCES ${sources} "RTOS/*.*")
FreeRTOS.h
#ifndef INC_FREERTOS_H
#define INC_FREERTOS_H
#include "FreeRTOSConfig.h"
#include "portMacro.h"
#include "list.h"
#include "task.h"
// 如果后续编程提示找不到 __DSB() 等汇编,可添加该 MCU 头文件
#include "stm32f4xx_hal.h"
#endif //INC_FREERTOS_H
FreeRTOSConfig.h、list.h、portMacro.h 和 task.h
// XXX 替换为对应头文件名称
#ifndef XXX_H
#define XXX_H
#include "FreeRTOS.h"
#endif //XXX_H
list.c、prot.c 和 task.c
/*list.c*/
#include "list.h"
/*prot.c*/
#include "FreeRTOS.h"
/*task.c*/
#include "task.h"
按照上述列出的文件添加内容,添加完成后编译整个工程应该不会有错误发生,之后将在各个文件中添加程序逐步实现 RTOS 简单内核
3、约定
整个专栏文章做如下约定
- 代码段开头会添加该代码段中函数 / 定义所处的文件位置,如下所示代码段表示变量
xTickCount
应该在task.c
文件中定义
/* task.c */
// 滴答定时器计数值
static volatile TickType_t xTickCount = (TickType_t)0U;
- 请自行安排本专栏文章中各个代码段在工程文件中的位置
4、专栏目录
如下所示为 "FreeRTOS 简单内核实现" 专栏所有文章链接
- FreeRTOS 简单内核实现1 前言
- FreeRTOS 简单内核实现2 双向链表
- FreeRTOS 简单内核实现3 任务管理
- FreeRTOS 简单内核实现4 临界段
- FreeRTOS 简单内核实现5 阻塞延时
- FreeRTOS 简单内核实现6 优先级
- FreeRTOS 简单内核实现7 阻塞链表
- FreeRTOS 简单内核实现8 时间片轮询
5、项目仓库
项目 github 工程代码链接如下 FreeRTOS 简单内核实现,标 Star 防丢失!