首页 > 其他分享 >FreeRTOS 简单内核实现1 前言

FreeRTOS 简单内核实现1 前言

时间:2024-06-14 22:33:56浏览次数:18  
标签:task 前言 FreeRTOS 实现 RTOS 内核 include

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 防丢失!

标签:task,前言,FreeRTOS,实现,RTOS,内核,include
From: https://www.cnblogs.com/lc-guo/p/18248756

相关文章

  • 用Ubuntu24编译打包6.9.4内核(仅供参考)
    目录环境介绍前期安装下载内核源代码并编译打包并更新内核重启无法进入系统问题注意事项环境介绍Ubuntu24/4U/12G/120G/NAT172.16.186.148/24rambo@test1:~$uname-aLinuxtest1.lab.example.com6.8.0-35-generic#35-UbuntuSMPPREEMPT_DYNAMICMonMay2015:51:52UT......
  • debian12升级内核
    参考检查当前内核版本uname-r升级系统包sudoaptupdate查找最新的Debian12内核sudoapt-cachesearchlinux-image升级内核sudoaptinstall<linux_image_version>比如:sudoaptinstalllinux-image-6.5.0-0.deb12.4-amd6验证安装rambo@test1:~$dpkg--list|......
  • FreeRTOS学习笔记-基于stm32(14)内存管理
    一、FreeRTOS内存管理简介        FreeRTOS有两种方法来创建任务,队列,信号量等,一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候FreeRTOS内核在创建任务、队列、信号量的时候会动态的申请RAM。    我们在移植FreeRTOS时可以看到......
  • 《Linux内核完全注释》学习笔记:2.7 Linux内核源代码的目录结构
    由于Linux内核是一种单内核模式的系统,因此内核中所有程序几乎都有紧密的联系,它们之间的调用关系非常密切。所以在阅读一个源代码文件时往往需要参阅其他相关的文件。因此有必要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构。这里我们首先列出Linux内核完整的源代......
  • 【FreeRTOS】事件组 event group(附源码)
    引言:事件组是一种用于同步多个任务之间的状态和行为的机制。在操作系统中,事件组通常由操作系统提供,用于实现任务间的通信和同步。事件组通常包含一组独立的事件或标志,每个事件或标志都可以表示一种特定的状态或条件。任务可以等待事件组中的一个或多个事件被设置,也可以设置、......
  • petalinux 交叉编译指定内核驱动
    需要编译u-dma-buf驱动。ThisrepositorycontainsaMakefie.MakefilehasthefollowingParameters:ParameterNameDescriptionDefaultValueARCHArchitectureName$(shelluname-m|sed-es/arm.*/arm/-es/aarch64.*/arm64/)KERNEL_SRCKernelSourc......
  • linux内存管理(六)- 内核新struct - folio
    folio大概是5.16引入的,看起来像是page的封装,这里有一篇讲解folio很好的博客,论好名字的重要性:Linux内核page到folio的变迁-CSDN博客structfolio{/*private:don'tdocumenttheanonunion*/union{struct{/*public:*/unsignedlon......
  • linux内核空间进程为什么无论如何切换,内核地址空间转换到物理地址的关系是永远不变的?
    在Linux内核中,无论如何切换进程,内核地址空间转换到物理地址的关系是永远不变的,主要原因是内核地址空间在所有进程中是共享的。这种设计有几个关键点:1.内核地址空间共享在Linux操作系统中,每个进程都有自己独立的用户空间地址范围,但内核空间地址范围对所有进程是共享的。具体来说......
  • 定时器-内核定时器
    在Linux内核中,定时器通过软件中断实现,而这个软件中断其实依赖于实际的物理定时器中断。概括来说,物理定时器会每隔一段时间发送一次中断,然后有一个全局变量jiffies就会加1,当到达某个阈值时,就会触发定时器软件中断。软件中断是在每次发生了硬件(物理)中断并处理中断后由内核去检查是否......
  • 【驱动】Linux内核调试之使用模块参数
    环境:处理器架构:arm64内核源码:linux-6.6.29ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope本文主要介绍内核开发中常用的模块传参手段,通过模块参数传递可以通过用户态来获取内核的一些信息,也可以通过用户态写入一些值来控制内核相关行为。一般内核开发者很喜欢使用模块传参......