登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
1
2
/ 2 页
下一页
返回列表
首页
›
业界区
›
安全
›
FreeRTOS 简单内核实现1 前言
FreeRTOS 简单内核实现1 前言
[ 复制链接 ]
坠矜
2025-6-7 09:36:13
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
0、写在前面
为深入理解 RTOS 内核工作机制,笔者制作了名为 “FreeRTOS 内核简单实现” 的项目专栏 ,目标为自己动手从 0 到 1 编程一个简单的 RTOS 内核,从而实现任务并行工作的效果,主要实现了以下功能
静态创建任务
临界段保护
支持任务多优先级
任务阻塞延时
时间片轮询
注意:
本项目不是仿真,而是基于 STM32F407 开发板从 0 到 1 编程实现的 RTOS 简单内核,目前只在 Cortex-M4 内核 MCU 上进行了验证,最终会使用 GPIO 输出作为各种效果的演示,支持 Keil 与 CLion 两种开发环境,两者项目流程几乎一致,只是在汇编程序与工程配置上存在区别,不同之处会在教程中做明确说明
本项目实现的 RTOS 时间基准使用了 SysTick,但 STM32 HAL 库的时间基准也为 SysTick ,因此可能存在潜在的问题,如果出现问题可以按照 “6、补充 - 更换 RTOS 时基” 小节所述修改完成的 RTOS 内核
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,任务管理源文件
如果使用 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 防丢失!
6、补充 - 更换 RTOS 时基
首先,在 CubeMX 中设置任意 Timer 为 1ms 的周期定时器(你可以随意更改 RTOS 的心跳周期),具体可以参考 STM32CubeMX教程5 TIM 定时器概述及基本定时器 文章内容,笔者以 STM32F4 的 TIM6 为例子,注意在 NVIC 中勾选 TIM6 全局中断,抢占优先级为最低优先级 15
然后,修改 portMacro.h 中的 xPortSysTickHandler 宏定义
/* portMacro.h */
#define xPortSysTickHandler HAL_TIM_PeriodElapsedCallback
复制代码
其次,修改 port.c 中的 xPortSysTickHandler 函数
/* port.c */
// RTOS 时基中断处理
void xPortSysTickHandler(TIM_HandleTypeDef *htim)
{
if(htim == &htim6)
{
// 关中断
vPortRaiseBASEPRI();
// 更新系统时基
if(xTaskIncrementTick() != pdFALSE)
{
taskYIELD();
}
// 开中断
vPortSetBASEPRI(0);
}
}
复制代码
最后,在 port.c 文件中启动调度器函数中 xPortStartScheduler() 启动 RTOS 的时基
/* port.c */
extern TIM_HandleTypeDef htim6;
// 启动调度器
BaseType_t xPortStartScheduler(void)
{
// 设置 PendSV 和 SysTick 中断优先级为最低
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
// 初始化 RTOS 时基
HAL_TIM_Base_Start_IT(&htim6);
// 启动第一个任务,不再返回
prvStartFirstTask();
// 正常不会运行到这里
return 0;
}
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
FreeRTOS
简单
内核
实现
前言
相关帖子
Python 实现 PDF 表单域的自动化创建与智能填充
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
前端实现速度线
实现特征交互与序列建模的框架
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Python 实现 PDF 表单域的自动化创建与智能填充
2
957
陈兰芳
2026-02-12
业界
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
1
13
明思义
2026-02-12
业界
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
2
31
聚怪闩
2026-02-12
业界
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
4
32
颜才
2026-02-12
业界
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
0
35
湛恶
2026-02-12
代码
前端实现速度线
1
871
寨亳
2026-02-13
业界
实现特征交互与序列建模的框架
0
1010
鞠古香
2026-02-16
安全
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
0
9
羊舌正清
2026-02-20
安全
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
0
7
蒲善思
2026-02-20
安全
[LKD/Linux 内核] 关于对 current_thread_info 的一点研究
0
80
轧岔
2026-02-20
回复
(33)
印萍
2025-10-18 12:28:48
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
很好很强大 我过来先占个楼 待编辑
单于易槐
2025-10-18 15:26:30
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个好,看起来很实用
驳嗦
2025-11-12 05:31:01
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个有用。
揿纰潦
2025-11-30 11:02:20
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
凳舒
2025-12-7 01:21:32
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个有用。
倡粤
2025-12-7 13:21:49
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
庞环
2026-1-12 17:01:02
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
yyds。多谢分享
觞刈
2026-1-15 21:12:53
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,试用一下
任俊慧
2026-1-16 20:08:45
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
炳裘垦
2026-1-16 23:36:48
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
懂技术并乐意极积无私分享的人越来越少。珍惜
忆雏闲
2026-1-18 21:22:14
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢发布原创作品,程序园因你更精彩
柩通奉
2026-1-19 10:19:51
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
支智敏
2026-1-21 21:45:56
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
裒噎
2026-1-27 02:43:44
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享
裒噎
2026-2-3 02:48:26
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
申倩语
2026-2-5 05:14:52
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
懂技术并乐意极积无私分享的人越来越少。珍惜
溜椎干
2026-2-5 11:45:50
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享
崔和美
2026-2-7 04:08:03
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢分享,试用一下
指陡
2026-2-7 04:22:03
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢分享,试用一下
下一页 »
1
2
/ 2 页
下一页
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
业界
科技
程序
签约作者
程序园优秀签约作者
发帖
坠矜
2026-2-7 04:22:03
关注
0
粉丝关注
23
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
宋子
9898
6
韶又彤
9918
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9883
10
遗憩
10006
查看更多
今日好文热榜
317
OpenClaw多Agent协作踩坑实录:从翻车到跑
712
【节点】[MainLightShadow节点]原理解析与
630
模拟退火算法
899
Claude Code 的 Skills 可以在 Trae IDE 中
254
付费 AI 用户和免费用户之间,究竟差了什么
699
手把手教你使用vscode开发stm32!
1003
“老东西,你懦弱了”——关于Vibe Coding
926
告别Hyprland/Niri键鼠共享难题:Pynergy
752
解惑|公司员工健身房需要哪些器材?上海皓
518
凸优化数学基础笔记(六):凸集、凸函数与
389
SeeDance2.0提示词之跳舞女孩
11
SeeDance2.0提示词之跳舞女孩
683
国内零门槛首个免费 开源 7×24小时帮
572
[拆解LangChain执行引擎]非常规Pending Wri
69
AI开发-python-milvus向量数据库(2-8 -mil
80
[LKD/Linux 内核] 关于对 current_thread_i
9
[LKD/Linux 内核] 关于对 current_thread_i
7
[LKD/Linux 内核] 关于对 current_thread_i
7
9、PipedInputStream和PipedOutputStream的