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

FreeRTOS的学习记录(基础知识)

FreeRTOS 简介

FreeRTOS 是一个开源的实时操作系统(RTOS),专为嵌入式系统设计。它提供了任务管理、时间管理、信号量、消息队列、内存管理等功能,适用于资源受限的微控制器。

FreeRTOS 是一个开源的实时操作系统内核,广泛应用于嵌入式系统中。其任务调度机制是其核心功能之一,确保多个任务能够高效、有序地运行。

任务调度机制

FreeRTOS 使用抢占式调度算法,允许高优先级的任务抢占低优先级任务的执行。每个任务都有一个优先级,优先级越高,任务越容易被调度执行。FreeRTOS 支持固定优先级调度,任务在创建时指定优先级,运行时不会动态改变。

任务状态

任务在 FreeRTOS 中有以下几种状态:

  • 运行态(Running):任务正在执行。
  • 就绪态(Ready):任务已准备好运行,但当前未被调度。
  • 阻塞态(Blocked):任务等待某个事件(如信号量、队列等)或延时。
  • 挂起态(Suspended):任务被显式挂起,不会被调度。

 

调度器

FreeRTOS 的调度器负责决定哪个任务应该运行。调度器有两种模式:

  • 抢占式调度:高优先级任务一旦就绪,立即抢占低优先级任务的执行。
  • 时间片调度:FreeRTOS 支持时间片轮转调度,允许相同优先级的任务轮流执行。每个任务分配一个时间片,时间片用完后,调度器切换到下一个就绪任务。(时间片可设置,在FreeRTOS中,一个时间片时间等于Systick中断周期
  • 协程式调度:任务主动让出 CPU 控制权,其他任务才能运行。

任务切换

任务切换发生在以下情况:

  • 高优先级任务就绪。
  • 当前任务主动阻塞或挂起。
  • 时间片轮转调度中,当前任务的时间片用完。

任务管理

FreeRTOS 的核心是任务(Task),每个任务都是一个独立的执行单元。任务可以创建、删除、挂起和恢复。任务的优先级决定了它们的执行顺序。

void vTaskFunction(void *pvParameters) {for (;;) {// 任务代码}
}xTaskCreate(vTaskFunction, "TaskName", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

时间管理

FreeRTOS 提供了 vTaskDelayvTaskDelayUntil 函数,用于任务的延时操作。vTaskDelay 使任务进入阻塞状态,直到指定的时间过去。

vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时1秒

信号量

信号量用于任务间的同步和互斥。FreeRTOS 提供了二进制信号量和计数信号量。信号量可以用于控制资源的访问。

SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();xSemaphoreGive(xSemaphore); // 释放信号量
xSemaphoreTake(xSemaphore, portMAX_DELAY); // 获取信号量

消息队列

消息队列用于任务间的数据传递。任务可以通过消息队列发送和接收数据。

QueueHandle_t xQueue = xQueueCreate(10, sizeof(int));int data = 10;
xQueueSend(xQueue, &data, portMAX_DELAY); // 发送数据
xQueueReceive(xQueue, &data, portMAX_DELAY); // 接收数据

内存管理

FreeRTOS 提供了动态内存分配功能,用户可以选择使用 FreeRTOS 自带的内存管理方案,或者自定义内存管理方案。

void *pvPortMalloc(size_t xWantedSize);
void vPortFree(void *pv);

中断管理

FreeRTOS 支持中断服务例程(ISR),并且提供了与任务同步的机制。中断服务例程可以使用 xQueueSendFromISRxSemaphoreGiveFromISR 等函数与任务通信。

void vISRFunction(void) {BaseType_t xHigherPriorityTaskWoken = pdFALSE;xQueueSendFromISR(xQueue, &data, &xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

配置与移植

FreeRTOS 的配置通过 FreeRTOSConfig.h 文件进行。用户可以根据需求配置任务优先级、堆栈大小、时钟频率等参数。移植 FreeRTOS 到不同的硬件平台需要实现特定的硬件抽象层(HAL)。

#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ (SystemCoreClock)
#define configTICK_RATE_HZ ((TickType_t)1000)

调试与优化

FreeRTOS 提供了丰富的调试工具,如任务状态查看、堆栈使用情况分析等。通过合理配置和优化,可以提高系统的实时性和稳定性。

void vTaskList(char *pcWriteBuffer);
void vTaskGetRunTimeStats(char *pcWriteBuffer);

参考资料

  • FreeRTOS 官方文档
  • FreeRTOS GitHub 仓库

通过以上内容,可以初步了解 FreeRTOS 的基础知识,并开始在实际项目中应用。

相关文章:

  • STM32F103_LL库+寄存器学习笔记12.1 - 串口DMA高效收发实战:引入ringbuffer结构
  • [计算机网络]网络层
  • Matlab 模糊控制节水洗衣机模型
  • 中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
  • 9.渐入佳境 -- 套接字的多种可选项
  • iptables实现DDos
  • 计算频谱的方法
  • [Java实战]Spring Boot 整合 Session 共享(十七)
  • 什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?
  • ros1+docker环境快速搭建
  • postgresql主从集群一键搭建脚本分享
  • 人工智能领域1-4区所有SCI汇总!
  • springCloud/Alibaba常用中间件之Setinel实现熔断降级
  • ctfshow——web入门351~356
  • WebGL图形编程实战【6】:性能优化 × 调试工具与技巧精讲
  • 基于FastAPI框架的日志模块设计
  • STM32入门教程——GPIO输出
  • 信息瓶颈理论(Information Bottleneck Theory)中的“最小化信息”是否意味着“最大化抽象能力”?
  • 【超详细教程】安卓模拟器如何添加本地文件?音乐/照片/视频一键导入!
  • Spring的异步
  • 欧元区财长会讨论国际形势及应对美国关税政策
  • 山西省委常委李金科添新职
  • 视觉周刊|纪念苏联伟大卫国战争胜利80周年
  • 巴基斯坦外长:印巴已同意立即停火
  • 1450亿元!财政部拟发行2025年中央金融机构注资特别国债(二期)
  • 蔡达峰:推动食品安全法全面有效实施,为维护人民群众身体健康提供有力法治保障