当前位置: 首页 > news >正文

FreeRTOS源码分析

目录

1、FreeRTOS目录结构

2、核心文件

3、移植时涉及的文件

4、头文件相关

4.1 头文件目录

4.2 头文件

5、内存管理

6、入口函数

7、数据类型和编程规范

7.1 数据类型

7.2 变量名

7.3 函数名

7.4 宏的名


1、FreeRTOS目录结构

使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下:

主要涉及2个目录:

  • Core
    • Inc 目录下的 FreeRTOSConfig.h 是配置文件
    • Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务
  • Middlewares\Third_Party\FreeRTOS\Source
    • 根目录下是核心文件,这些文件是通用的
    • portable 目录下是移植时需要实现的文件
      • 目录名为:[compiler]/[architecture]
      • 比如:RVDS/ARM_CM3,这表示 cortexM3 架构在 RVDS 工具上的移植文件

2、核心文件

FreeRTOS的最核心文件只有2个:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/list.c

其他文件的作用也一起列表如下:

3、移植时涉及的文件

移植FreeRTOS时涉及的文件放在 FreeRTOS/Source/portable/[compiler]/[architecture] 目录下, 比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。

里面包含两个文件:

  • port.c
  • portmacro.h

4、头文件相关

4.1 头文件目录

FreeRTOS需要3个头文件目录:

  • FreeRTOS 本身的头文件: Middlewares\Third_Party\FreeRTOS\Source\include
  • 移植时用到的头文件: Middlewares\Third_Party\FreeRTOS\Source\portable\[compiler]\[architecture]
  • 含有配置文件 FreeRTOSConfig.h 的目录:Core\Inc

4.2 头文件

列表如下:

头文件作用
FreeRTOSConfig.h
FreeRTOS 的配置文件,比如选择调度算法: configUSE_PREEMPTION 每个 demo 都必定含有 FreeRTOSConfig.h 建议去修改 demo 中的 FreeRTOSConfig.h,而不是从头 写一个
FreeRTOS.h
使用 FreeRTOS API 函数时,必须包含此文件。 在 FreeRTOS.h 之后,再去包含其他头文件,比如:task.h、queue.h、semphr.h、event_group.h

5、内存管理

文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下,它也是放 在“portable”目录下,表示你可以提供自己的函数。

源码中默认提供了5个文件,对应内存管理的5种方法。

6、入口函数

在 Core\Src\main.c 的 main 函数里,初始化了 FreeRTOS 环境、创建了任务,然后启动调度器。源码如下:

 /* Init scheduler */osKernelInitialize(); /* 初始化FreeRTOS运行环境 */MX_FREERTOS_Init(); /* 创建任务 *//* Start scheduler */osKernelStart(); /* 启动调度器 */

7、数据类型和编程规范

7.1 数据类型

每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型:

  • TickType_t:
    • FreeRTOS 配置了一个周期性的时钟中断:Tick Interrupt
    • 每发生一次中断,中断次数累加,这被称为 tick count
    • tick count 这个变量的类型就是 TickType_t
    • TickType_t 可以是 16 位的,也可以是 32 位的
    • FreeRTOSConfig.h 中定义 configUSE_16_BIT_TICKS 时,TickType_t 就是 uint16_t
    • 否则 TickType_t 就是 uint32_t
    • 对于 32 位架构,建议把 TickType_t 配置为 uint32_t
  • BaseType_t:
    • 这是该架构最高效的数据类型
    • 32 位架构中,它就是 uint32_t
    • 16 位架构中,它就是 uint16_t
    • 8 位架构中,它就是 uint8_t
    • BaseType_t通常用简单的返回值的类型,还有逻辑值,比如 pdTRUE/pdFALSE

7.2 变量名

变量名前缀含义
cchar
sint16_t,short
Iint32_t,long
x

BaseType_t,

其他非标准的类型:结构体、task handle、queue handle

uunsigned
p指针
uc
uint8_t,unsigned char
pc
char 指针

7.3 函数名

函数名的前缀有2部分:返回值类型、在哪个文件定义。

函数名前缀
含义
vTaskPrioritySet
返回值类型:void
在 task.c 中定义
xQueueReceive
返回值类型:BaseType_t
在 queue.c 中定义
pvTimerGetTimerID
返回值类型:pointer to void
在 tmer.c 中定义

7.4 宏的名

宏的名字是大小,可以添加小写的前缀。前缀是用来表示:宏在哪个文件中定义。

宏的前缀
含义:在哪个文件里定义
port (比如 portMAX_DELAY)
portable.h 或 portmacro.h
task (比如 taskENTER_CRITICAL())
task.h
pd (比如 pdTRUE)
projdefs.h
config (比如
configUSE_PREEMPTION)
FreeRTOSConfig.h
err (比如 errQUEUE_FULL)
projdefs.h

通用的宏定义如下:

pdTRUE
1
pdFALSE
0
pdPASS
1
pdFAIL
0

相关文章:

  • 面试笔试--通用事件处理框架编写一个日志缓存插件
  • 技术差异,应用场景;虚拟机可以当作云服务器吗
  • SambaLingo——教会大模型新语言
  • 社区服务小程序功能设计,社区服务小程序的功能有哪些?
  • NLP基础知识——文本处理、张量表示、文本数据分析
  • 支持向量机 (SVM) 算法详解
  • 测试用例编写指导
  • PHP入门教程4:文件处理和表单处理
  • SPI协议——读取外部SPI Flash ID
  • Flink 窗口触发器
  • 【OpenHarmony开发】自定义系统应用之实践
  • 示例:WPF中绑定枚举到ComboBox想显示成中文或自定义名称如何实现
  • utf8和utf8mb4的主要区别
  • OceanBase 并行执行参数 parallel_servers_target 理解
  • git提交错了?别慌,直接删除提交记录
  • php的引用
  • 【comparator, comparable】小总结
  • docker容器内的网络抓包
  • echarts花样作死的坑
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Python 反序列化安全问题(二)
  • react 代码优化(一) ——事件处理
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue组件定义
  • 高性能JavaScript阅读简记(三)
  • 手写双向链表LinkedList的几个常用功能
  • 算法-插入排序
  • 想写好前端,先练好内功
  • kubernetes资源对象--ingress
  • NLPIR智能语义技术让大数据挖掘更简单
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ######## golang各章节终篇索引 ########
  • $.ajax中的eval及dataType
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (顺序)容器的好伴侣 --- 容器适配器
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (新)网络工程师考点串讲与真题详解
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)关于pipe()的详细解析
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 项目指定SDK版本
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net程序帮助文档制作
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @Bean, @Component, @Configuration简析
  • @ModelAttribute注解使用