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

[FreeRTOS]1.FreeRTOS基础知识

FreeRTOS基础知识

一、什么是 FreeRTOS

FreeRTOS(Free Real-Time Operating System)是一个轻量级、开源的实时操作系统内核,广泛用于嵌入式系统开发中。它提供了多任务调度、任务通信、时间管理、内存管理等常用操作系统功能。

  • 开源免费:MIT License,商业可用
  • 高度可移植:支持 STM32、ESP32、ARM Cortex-M、RISC-V 等数百种芯片
  • 体积小、效率高:内核代码几千行,适用于资源受限的系统

二、FreeRTOS 架构简述

FreeRTOS 是一个抢占式内核(支持可配置为协作式),由如下核心组件组成:

  1. 任务(Task):最小的执行单位,相当于传统操作系统中的线程
  2. 调度器(Scheduler):决定哪个任务运行,负责任务切换
  3. 中断管理(Interrupt Management):FreeRTOS 本身不屏蔽中断,但要求 ISR 内不要调用阻塞型 API
  4. 时间管理(Tick):使用定时器中断(SysTick),每个 Tick 触发一次调度判断
  5. 任务通信机制
    • 队列(Queue)
    • 信号量(Semaphore)
    • 互斥锁(Mutex)
    • 事件组(Event Group)
  6. 内存管理:提供几种内存分配器(heap_1~5),常用的是 heap_4.c

三、任务(Task)的核心概念

1. 任务的生命周期

创建 -> 就绪态 -> 运行态 -> 阻塞态/挂起态 -> 删除

2. 任务优先级

  • 数字越大优先级越高
  • 同优先级任务采用时间片轮转(需启用 configUSE_TIME_SLICING)

3. 任务函数结构

void Task1(void *pvParameters)
{while (1){// 任务执行代码vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时1秒}
}

4. 创建任务示例

xTaskCreate(Task1,             // 任务函数"Task1",           // 名称128,               // 堆栈大小(单位:字)NULL,              // 参数2,                 // 优先级NULL               // 任务句柄
);

四、FreeRTOS 的调度机制

  1. 抢占式调度

    • 当前运行任务被高优先级任务打断
    • 配置:#define configUSE_PREEMPTION 1
  2. 时间片调度

    • 同优先级任务轮流运行
    • 配置:#define configUSE_TIME_SLICING 1
  3. 调度器启动

vTaskStartScheduler();  // 启动调度器,正式开始任务调度

五、系统 Tick 与时间管理

  • 每个 Tick(通常是 1ms)会触发一次调度器检查是否需要切换任务
  • 用 vTaskDelay() 让任务延时
vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时 1000ms

六、任务之间的通信机制简介

机制用途特点
队列 Queue数据传输线程安全 FIFO
信号量 Semaphore同步/互斥二值/计数
互斥锁 Mutex资源保护支持优先级继承
事件组 EventGroup多事件同步位操作,适合状态同步

七、内存管理策略

模式特点
heap_1简单线性分配,无法释放
heap_2支持释放,简单
heap_3使用 malloc/free
heap_4空间管理复杂,碎片少,推荐
heap_5支持多个区域

配置方式(FreeRTOSConfig.h):

#define configFRTOS_MEMORY_SCHEME 4

八、示意图:FreeRTOS运行模型

(此处应有FreeRTOS运行模型示意图)

九、实际工程中常见错误和建议

问题可能原因建议
任务不运行没有启动调度器检查 vTaskStartScheduler()
系统死机堆栈溢出开启 configCHECK_FOR_STACK_OVERFLOW
ISR中调用阻塞API非法操作ISR内使用 FromISR 后缀函数

十、小结

FreeRTOS 的基础核心在于:

  • 多任务调度
  • 任务创建与优先级管理
  • Tick 时间管理
  • 各类通信与同步机制
http://www.xdnf.cn/news/13063.html

相关文章:

  • Java处理字符数组转换为开始日期和结束日期
  • 【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略
  • LLMs之MCP:《Evaluation Report on MCP Servers》翻译与解读
  • 『uniapp』自定义隐私政策弹窗 调整颜色和多语言国际化支持超链接 演示本地插件的使用,和一般性的插件自定义(保姆级图文)
  • CppCon 2015 学习:Live Lock-Free or Deadlock
  • AI架构师修炼之道
  • Linux系统编程中的_GNU_SOURCE宏
  • Promise 基础:异步编程的救星
  • 使用idea开发工具创建javaweb项目工程
  • CQF预备知识:Python相关库 -- 傅里叶变换 scipy.fft
  • 第十八章 归档与备份
  • python打卡第48天
  • linux库(AI回答)
  • SpringBoot的5种日志输出规范策略
  • 深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
  • 《光子技术成像技术》第三章 预习2025.6.8
  • 代码审计 BlueCms SQL注入
  • Linux 文件系统底层原理笔记:磁盘结构、ext2 文件系统与软硬链接解析
  • 基于Python学习《Head First设计模式》第九章 迭代器和组合模式
  • Spring Cloud 微服务架构实战指南 -- SpringCLoud概述
  • [深度学习]搭建开发平台及Tensor基础
  • 第23讲、Odoo18 二开常见陷阱
  • SQL导出Excel支持正则脱敏
  • AtCoder AT_abc409_c [ABC409C] Equilateral Triangle
  • Agent短期记忆的几种持久化存储方式
  • 时间序列预测的机器学习方法:从基础到实战
  • HTML前端开发:JavaScript 获取元素方法详解
  • 5. TypeScript 类型缩小
  • 【JVM】Java虚拟机(三)——类加载与类加载器
  • synchronized 关键字​​ 和 ​​Lock 接口(ReentrantLock)​​ 的详细说明及示例,涵盖核心概念、使用场景、代码实现及两者对比