当前位置: 首页 > 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 的基础知识,并开始在实际项目中应用。

http://www.xdnf.cn/news/412273.html

相关文章:

  • FPGA----petalinux开机启动自定义脚本/程序的保姆级教程(二)
  • 【超详细教程】安卓模拟器如何添加本地文件?音乐/照片/视频一键导入!
  • 利用基于LLM的概念提取和FakeCTI数据集提升网络威胁情报对抗虚假信息活动的能力
  • 区块链+农业:从田间到餐桌的信任革命
  • Ref是什么
  • 洛谷 P1082:[NOIP 2012 提高组] 同余方程 ← 求逆元
  • 代码随想录训练营第二十二天| 101.对称二叉树 100.相同的树
  • 综合实验二之grub2密文加密
  • (leetcode) 力扣100 10.和为K的子数组(前缀和+哈希)
  • 【Bootstrap V4系列】学习入门教程之 组件-模态框(Modal)
  • css 点击后改变样式
  • Megatron系列——张量并行
  • 我们来学mysql -- 安装8.4版本
  • 在CentOS 7上仅安装部署MySQL 8.0客户端
  • 将arduino开发的Marlin部署到stm32(3D打印机驱动)
  • 【GESP】C++三级练习 luogu-B2156 最长单词 2
  • NeurIPS 2025 截稿攻略
  • 无线传感器网络期末复习自整理资料(天大)
  • 【Game】Powerful——Hero Trial(11)
  • Windows下安装Docker Desktop到C盘以外的盘
  • 透视相机:创意摄影新体验,解锁照片无限可能
  • 计网第四次作业
  • MyBatis 一对多关联映射在Spring Boot中的XML配置
  • 北京市通州区经信局对新增通过国家级生成式人工智能及深度合成算法备案企业给予100w、20w一次性补贴
  • 【软考-软件设计师学习总结】- 计算机网络概述
  • MINIX 1.0 文件系统的实现(C/C++实现)
  • Lynx-字节跳动跨平台框架多端兼容Android, iOS, Web 原生渲染
  • Vue学习百日计划-Deepseek版
  • 残差网络(ResNet)
  • c/c++爬虫总结