FreeRTOS 简单内核实现1 前言

news2025/7/18 23:42:16

文章目录

  • 0、写在前面
  • 1、参考资料
  • 2、准备工作
    • 2.1、STM32 空工程
    • 2.2、创建 RTOS 文件目录
  • 3、约定
  • 4、专栏目录
  • 5、项目仓库

0、写在前面

为深入理解 RTOS 内核工作机制,笔者制作了名为 “FreeRTOS 内核简单实现” 的项目专栏 ,目标为自己动手从 0 到 1 编程一个简单的 RTOS 内核,从而实现任务并行工作的效果,主要实现了以下功能

  1. 静态创建任务
  2. 临界段保护
  3. 支持任务多优先级
  4. 任务阻塞延时
  5. 时间片轮询

注意:本项目不是仿真,而是基于 STM32F407 开发板从 0 到 1 编程实现的 RTOS 简单内核,最终会使用 GPIO 输出作为各种效果的演示,支持 Keil 与 CLion 两种开发环境,两者项目流程几乎一致,只是在汇编程序与工程配置上存在区别,不同之处会在教程中做明确说明

1、参考资料

  1. FreeRTOS内核实现_忆昔z的博客-CSDN博客
  2. GitHub - aeneag/FreeRTOS_kernel: 深入理解FreeRTOS内核,从零开始实现内核
  3. FreeRTOS内核实现与应用开发实战指南

2、准备工作

2.1、STM32 空工程

参考 STM32CubeMX教程1 工程建立 文章创建一个 STM32F407VGT6 空工程

参考 STM32CubeMX教程2 GPIO输出 - 点亮LED灯 文章初始化 4 个 LED 灯用于对本项目实现的 RTOS 内核验证

注意:空工程中 NVIC 选择 4 位抢占优先级,并应将 SysTick 和 PendSV 中断设置为最低优先级

2.2、创建 RTOS 文件目录

工程根目录下创建一个 RTOS 目录,目录结构如下

  1. RTOS
    1. Inc
      1. FreeRTOS.h,用来包含 RTOS 所有的头文件
      2. FreeRTOSConfig.h,用来配置裁剪 RTOS 的功能
      3. list.h,双向链表数据结构头文件
      4. portMacro.h,用来统一 RTOS 中用到的类型和定义一些功能宏
      5. task.h,任务管理头文件
    2. Src
      1. list.c,双向链表数据结构源文件
      2. prot.c,用来定义与底层芯片架构有关的函数和中断服务函数
      3. 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、约定

整个专栏文章做如下约定

  1. 代码段开头会添加该代码段中函数 / 定义所处的文件位置,如下所示代码段表示变量 xTickCount 应该在 task.c 文件中定义
/* task.c */
// 滴答定时器计数值
static volatile TickType_t xTickCount = (TickType_t)0U;
  1. 请自行安排本专栏文章中各个代码段在工程文件中的位置

4、专栏目录

如下所示为 “FreeRTOS 简单内核实现” 专栏所有文章链接

  1. FreeRTOS 简单内核实现1 前言
  2. FreeRTOS 简单内核实现2 双向链表
  3. FreeRTOS 简单内核实现3 任务管理
  4. FreeRTOS 简单内核实现4 临界段
  5. FreeRTOS 简单内核实现5 阻塞延时
  6. FreeRTOS 简单内核实现6 优先级
  7. FreeRTOS 简单内核实现7 阻塞链表
  8. FreeRTOS 简单内核实现8 时间片轮询

5、项目仓库

项目 github 工程代码链接如下 FreeRTOS 简单内核实现,标 Star 防丢失!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券股市资讯:苹果,重回第一!

苹果以弱小的优势,从头夺回市值榜首宝座。 当地时间6月13日周四,美股三大股指涨跌纷歧,纳指与标普500指数均录得接连第四日上涨,而且再创前史新高。 周四,美国5月份生产者价格指数(PPI)意外下…

Apache Doris单机快速安装(已踩坑)

官方文档:https://doris.incubator.apache.org/zh-CN/docs/get-starting/quick-start/ 环境: 操作系统:CentOS7.6 X86_64 JDK:Oracle jdk1.8.0_351 1.版本下载 从 doris.apache.org 下载相应的 Doris 安装包,并且解压…

碎片化知识如何被系统性地吸收?

一、方法论 碎片化知识指的是通过各种渠道快速获取的零散信息和知识点,这些信息由于其不完整性和孤立性,不易于记忆和应用。为了系统性地吸收碎片化知识,可以采用以下策略: 1. **构建知识框架**: - 在开始吸收之前&am…

吉时利Keithley2611B单通道SMU数字源表

Keithley吉时利2611B数字源表 2611B、2612B、2614B 系统 Sourcemeter SMU 仪器 2611B、2612B 和 2634B 系统 Sourcemeter SMU 仪器为 30W DC / 200W 脉冲 SMU,支持 10A 脉冲,1.5A 至 100fA 和 200V 至 100nV DC。所有 2600B SMU 均配备吉时利 TSP 脚本…

硬件开发笔记(十八):核心板与底板之间的连接方式介绍说明:板对板连接器

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139663096 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

基于SSD的安全帽检测

目录 1. 作者介绍2. SSD算法介绍2.1 SSD算法网络结构2.2 SSD算法训练过程2.3 SSD算法优缺点 3. 基于SSD的安全帽检测实验3.1 VOC 2007安全帽数据集3.2 SSD网络架构3.3 训练和验证所需的2007_train.txt和2007_val.txt文件生成3.4 模型训练3.5 GUI界面3.6 结果展示3.7 文件下载 4…

C#版 iText7——画发票PDF(完整)

显示描述&#xff1a; 1、每页显示必须带有发票头、“销售方和购买方信息” 2、明细填充为&#xff1a;当n≤8 行时&#xff0c;发票总高度140mm&#xff0c;每条发票明细行款高度4.375mm&#xff1b; 当8<n≤12行时&#xff0c;发票高度增加17.5mm&#xff0c;不换页&#…

人工智能内容生成元年-AI绘画原理解析

随着人工智能技术的飞速发展&#xff0c;AI绘画作为其引人注目的应用领域&#xff0c;正在以惊人的速度崭露头角。从最初的生成对抗网络&#xff08;GAN&#xff09;到如今的深度学习&#xff0c;AI绘画技术在艺术创作、设计等领域展现出了无限的可能性。其独特的算法和智能化特…

构建 deno/fresh 的 docker 镜像

众所周知, 最近 docker 镜像的使用又出现了新的困难. 但是不怕, 窝们可以使用曲线救国的方法: 自己制作容器镜像 ! 下面以 deno/fresh 举栗, 部署一个简单的应用. 目录 1 创建 deno/fresh 项目2 构建 docker 镜像3 部署和测试4 总结与展望 1 创建 deno/fresh 项目 执行命令…

情侣飞行棋系统微信小程序+H5+微信公众号+APP 源码

情侣飞行棋系统&#xff1a;浪漫与策略并存的双人游戏 &#x1f3b2; 一、引言&#xff1a;寻找爱情的乐趣 在繁忙的生活中&#xff0c;情侣们总是渴望找到一种既能增进感情又能带来乐趣的活动。而“情侣飞行棋系统”正是这样一个完美的选择。它结合了传统飞行棋的玩法和情侣…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试&#xff0c;其实也是一种功能测试&#xff0c;只是平时大家说的功能测试更多代指 UI 层面的功能测试&#xff0c;而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移&#xff0c;尽早介入测试&a…

失眠焦虑?这些小妙招助你重拾宁静之夜

在这个快节奏的时代&#xff0c;失眠与焦虑似乎成了不少人的“常客”。每当夜幕降临&#xff0c;躺在床上却辗转反侧&#xff0c;思绪万千&#xff0c;仿佛整个世界的喧嚣都涌入了脑海。&#x1f4ad; 其实&#xff0c;放松心情&#xff0c;调整心态&#xff0c;是缓解失眠焦虑…

【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 界面布局 计算器界面的主要元素分为几大部分&#xff1a;显示屏、功能按钮、数字按钮和操作符按钮。 显示屏 显示屏&#xff08;Edit Text&#xff09;&#xff1a;位于界面顶部中央&#xff0c;用于显示用户输入的表达式和…

Java聚合快递系统对接云洋系统快递小程序APP公众号系统源码

聚合快递对接云洋系统小程序&#xff1a;一键解决物流难题 一、引言&#xff1a;为何选择聚合快递对接&#xff1f; 在电商日益繁荣的今天&#xff0c;物流成为了连接卖家与买家的关键桥梁。然而&#xff0c;面对市场上琳琅满目的快递公司&#xff0c;如何高效、便捷地进行快…

Fluid 1.0 版发布,打通云原生高效数据使用的“最后一公里”

作者&#xff1a;顾荣 前言 得益于云原生技术在资源成本集约、部署运维便捷、算力弹性灵活方面的优势&#xff0c;越来越多企业和开发者将数据密集型应用&#xff0c;特别是 AI 和大数据领域应用&#xff0c;运行于云原生环境中。然而&#xff0c;云原生计算与存储分离架构虽…

低代码组件扩展方案在复杂业务场景下的设计与实践

组件是爱速搭的前端页面可视化模块的核心能力之一&#xff0c;它将前端研发人员从无休止的页面样式微调和分辨率兼容工作中解放了出来。 目前&#xff0c;爱速搭通过内置的上百种功能组件&#xff08;120&#xff09;&#xff0c;基本可以覆盖大部分中后台页面的可视化设计场景…

什么是数字人大?一分钟带你了解!

在数字化浪潮席卷全球的今天&#xff0c;中国作为数字经济的领跑者&#xff0c;正积极推动数字技术与国家治理体系的深度融合。其中&#xff0c;“数字人大”作为新时代国家治理体系和治理能力现代化的重要一环&#xff0c;正逐步成为推动民主法治建设、提升人大工作效能的新引…

ThinkPHP5.0 apache服务器配置URL重写,index.php去除

本地环境wamp .htaccess文件代码 <IfModule mod_rewrite.c>Options FollowSymlinks -MultiviewsRewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule> 踩过这个坑&a…

不用下软件,51建模网上传模型就能直接在网页预览!

在数字化时代&#xff0c;3D建模和渲染技术日益成为各行各业不可或缺的工具。然而&#xff0c;传统的建模和预览流程往往需要用户安装复杂的软件&#xff0c;这不仅增加了技术门槛&#xff0c;也限制了模型在不同设备间的共享和查看。 为了解决这一痛点&#xff0c;51建模网凭…

【在线OJ】发帖功能前后段代码实现

一、页面布局 二、前端代码 <template><div id"app"><div style"height: 100vh"><div style"display: flex" ><el-input style"width: 95%" v-model"title" placeholder"输入标题"&g…