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

初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁

当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细介绍FreeRTOS的特性、任务调度、内存管理、通信机制以及一些示例代码。

文章目录

    • 1. FreeRTOS简介
    • 2. 任务调度
    • 3. 内存管理
    • 4. 通信机制
    • 5. IO操作
    • 总结

1. FreeRTOS简介

FreeRTOS是一个开源的实时操作系统,专门设计用于嵌入式系统。它提供了一套任务调度、内存管理、中断处理和通信机制,使开发者能够更方便地开发实时应用程序。FreeRTOS具有以下特点:

  • 开源免费:FreeRTOS遵循GNU通用公共许可证(GPL)的开源协议,可以免费使用和修改。
  • 简单轻量:FreeRTOS的内核非常小巧,适用于资源有限的嵌入式系统。
  • 可移植性:FreeRTOS提供了可移植的API接口,可以在不同的处理器和开发环境中使用。
  • 可裁剪性:FreeRTOS的内核和组件可以根据需求进行裁剪,以减少内存占用和代码大小。

2. 任务调度

FreeRTOS的核心是任务调度器(Task Scheduler),它负责按照一定的调度策略将任务分配给处理器执行。每个任务都是一个独立的函数,可以有不同的优先级和堆栈大小。任务调度器根据任务的优先级和调度策略决定哪个任务被执行。

下面是一个简单的示例代码,展示了如何在FreeRTOS中创建和调度任务:

#include "FreeRTOS.h"
#include "task.h"// 任务1的函数
void vTask1(void *pvParameters)
{while (1){// 任务1的代码}
}// 任务2的函数
void vTask2(void *pvParameters)
{while (1){// 任务2的代码}
}int main()
{// 创建任务1xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 创建任务2xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动任务调度器vTaskStartScheduler();return 0;
}

以上代码中,通过调用xTaskCreate函数创建了两个任务vTask1vTask2。任务函数中的代码会被不断执行,不需要显式地进行任务调度。在main函数中,通过调用vTaskStartScheduler函数启动了任务调度器,使得任务可以被调度执行。

3. 内存管理

FreeRTOS提供了一套内存管理机制,用于动态分配和释放任务堆栈和其他资源。开发者可以使用FreeRTOS提供的内存分配函数,如pvPortMallocvPortFree,来管理内存。

下面是一个示例代码,展示了如何使用FreeRTOS的内存管理函数:

#include "FreeRTOS.h"
#include "task.h"// 任务的堆栈大小
#define TASK_STACK_SIZE 128// 任务的优先级
#define TASK_PRIORITY 1int main()
{// 创建任务的堆栈StackType_t *taskStack = (StackType_t *)pvPortMalloc(TASK_STACK_SIZE * sizeof(StackType_t));// 创建任务xTaskCreate(vTask, "Task", TASK_STACK_SIZE, NULL, TASK_PRIORITY, NULL);// 启动任务调度器vTaskStartScheduler();// 释放任务的堆栈vPortFree(taskStack);return 0;
}

以上代码中,通过调用pvPortMalloc函数动态分配了任务的堆栈空间,然后通过调用vTaskCreate函数创建了任务。在任务执行完毕后,通过调用vPortFree函数释放任务的堆栈空间。

4. 通信机制

FreeRTOS提供了多种通信机制,如信号量、消息队列和事件组,用于实现任务间的通信和同步。

下面是一个示例代码,展示了如何使用FreeRTOS的信号量来实现任务间的同步:

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"// 信号量
SemaphoreHandle_t xSemaphore;// 任务1的函数
void vTask1(void *pvParameters)
{while (1){// 等待信号量xSemaphoreTake(xSemaphore, portMAX_DELAY);// 任务1的代码// 发送信号量xSemaphoreGive(xSemaphore);}
}// 任务2的函数
void vTask2(void *pvParameters)
{while (1){// 等待信号量xSemaphoreTake(xSemaphore, portMAX_DELAY);// 任务2的代码// 发送信号量xSemaphoreGive(xSemaphore);}
}int main()
{// 创建信号量xSemaphore = xSemaphoreCreateBinary();// 创建任务1xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 创建任务2xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动任务调度器vTaskStartScheduler();// 删除信号量vSemaphoreDelete(xSemaphore);return 0;
}

以上代码中,通过调用xSemaphoreCreateBinary函数创建了一个二值信号量。任务1和任务2在执行前都会等待信号量,当某个任务执行完毕后,通过调用xSemaphoreGive函数发送信号量,使得另一个任务可以执行。

5. IO操作

任务:使用freertos进行基于stm32的两个任务控制,一个任务是pa0口控制一个led灯每500ms闪烁一次,另一个任务是pa1口控制一个led灯每1s闪烁一次

#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"// 定义任务句柄
TaskHandle_t task1Handle, task2Handle;// 定义任务1的函数
void Task1(void *pvParameters)
{while(1){// 控制PA0口的LED灯每500ms闪烁一次GPIO_ToggleBits(GPIOA, GPIO_Pin_0);vTaskDelay(pdMS_TO_TICKS(500));}
}// 定义任务2的函数
void Task2(void *pvParameters)
{while(1){// 控制PA1口的LED灯每1s闪烁一次GPIO_ToggleBits(GPIOA, GPIO_Pin_1);vTaskDelay(pdMS_TO_TICKS(1000));}
}int main()
{// 初始化GPIOA的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上下拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz// 初始化GPIOA的PA0和PA1口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOA, &GPIO_InitStructure);// 创建任务1xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &task1Handle);// 创建任务2xTaskCreate(Task2, "Task2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &task2Handle);// 启动任务调度器vTaskStartScheduler();while(1){// 如果任务调度器启动失败,可以在此处处理异常情况}return 0;
}

以上示例代码中,首先使用STM32的库函数RCC_AHB1PeriphClockCmdGPIO_InitTypeDef初始化GPIO引脚PA0PA1的设置。然后,在任务1和任务2函数中分别控制PA0口和PA1口的LED灯闪烁,通过调用vTaskDelay函数来实现延时。

在main函数中,使用xTaskCreate函数创建任务1和任务2,并分别传入相应的函数指针、任务名称、堆栈大小和优先级。然后通过调用vTaskStartScheduler函数启动任务调度器。

总结

本篇博客详细介绍了FreeRTOS的特性、任务调度、内存管理、通信机制和举例对STM32的IO口进行操作。
FreeRTOS的源代码和文档可以在官方网站(https://www.freertos.org/)上找到。

相关文章:

初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁

当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细…...

STM32CUBUMX配置FLASH(W25Q128)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…...

【Golang 接口自动化04】 解析接口返回JSON串

目录 前言 解析到结构体 json数据与struct字段是如何相匹配的呢? 解析到interface Go类型和JSON类型 实例代码 simpleJson 总结 资料获取方法 前言 上一次我们一起学习了如何解析接口返回的XML数据,这一次我们一起来学习JSON的解析方法。 JSO…...

EPPlus与Microsoft.Office.Interop.Excel的使用区别

文章目录 代码的使用区别EPPlus的工作原理Microsoft.Office.Interop.Excel的使用原理代码的使用区别 static void ExportToExcel(List<(string, double, double)> list, string outputFilePath){//Microsoft.Office.Interop.Excel的使用 /* Excel.Application excelAp…...

ncrack工具使用说明

介绍 网络认证破解工具。 Ncrack是用于网络身份验证破解的开源工具。 它设计为使用可适应不同网络情况的动态引擎进行高速并行破解。 Ncrack还可以针对特殊情况进行广泛的微调,尽管默认参数的通用性足以覆盖几乎所有情况。 它建立在模块化架构上,可以轻松扩展以支持其他协议…...

第二章:进程管理(处理机/CPU管理)

文章目录 2.1 进程与线程1.进程(1)进程的概念、进程的组成、进程的组织(2)进程控制块PCB(3)进程的状态与转换:五状态模型(4)进程控制(5)进程间的通信①共享存储②消息传递③管道通信(6)父进程与子进程(7)进程的内存空间2.线程 Thread(1)线程的概念(2)线程的实现方式:用户级线…...

MySQL中锁的简介——表级锁-元数据锁、意向锁

1.元数据锁 查看元数据锁 select object_type,object_scheme,object_name,lock_type,lock_duration from perfomance_scheme.metadata_locks;2.意向锁 线程A开启事务后在执行update更新语句时候&#xff0c;会给数据加上行锁&#xff0c;加上行锁以后&#xff0c;会对整张表加…...

React几种避免子组件无效刷新的方案

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 前言 一个很常见的场景&#xff0c;React中父组件和子组件在一起&#xff0c;子组件不依赖于父组件任何数据&#xff0c;但是会一起发生变化。 在探究原…...

分享亿款好用的PDF编辑工具

所周知&#xff0c;PDF文件是不能够像word/excel/ppt等文件一样&#xff0c;可以被随意编辑的&#xff0c;PDF文件往往只能够被查看&#xff0c;我们无法对它进行编辑&#xff0c;或者对上面的文字进行复制&#xff0c;也不能任意删除上面的页面。但是很多时候&#xff0c;我们…...

AI生成式视频技术来临:Runway Gen-2文本生成视频

Runway Gen-2的官方网站提供了一种文本生成视频的工具。以下是对该工具的介绍&#xff1a; 文本生成视频&#xff1a;Runway Gen-2是一个创新的在线工具&#xff0c;可以将文本转化为视频。用户只需输入文本描述或句子&#xff0c;Runway Gen-2就能自动生成相应的视频内容。这…...

react钩子函数

React组件的生命周期包括多个阶段和方法&#xff0c;用于在组件不同的生命周期时执行特定的操作。以下是React类组件中常见的生命周期方法&#xff1a; 挂载阶段&#xff08;Mounting Phase&#xff09;&#xff1a; constructor&#xff1a;组件实例化时调用&#xff0c;用于初…...

RISC-V公测平台发布 · 如何在SG2042上玩转k3s

前言 Kubernetes是一个开源的容器管理平台&#xff0c;通过Kubernetes的跨集群管理功能&#xff0c;用户可以方便地进行应用程序的复制、迁移和跨云平台的部署。 而k3s作为Kubernetes的轻量级发行版&#xff0c;相比传统的Kubernetes具有更小的二进制文件大小和更低的资源消耗…...

Linux系统常见小问题

1、新系统在输入命令时&#xff0c;不会自动提示&#xff0c;按上箭头&#xff08;↑&#xff09;和下向下箭头&#xff08;↓&#xff09;不会匹配之前的输入 以CentOS 为例&#xff0c;可以通过配置 ~/.bashrc 文件来实现按向上箭头显示最相近的命令。以下是具体的实现步骤 …...

WEB:mfw

背景知识 Git泄露 Githack使用 命令执行漏洞 题目 这里页面里有Git&#xff0c;猜测是Git泄露 先用dirsearch扫一下 确实存在.git目录&#xff0c;可以尝试访问一下 使用Githack来下载并恢复.git文件 这里记得使用的时候关闭杀毒软件 结果会自动保存 点进去先看一下flag这个…...

2.4 传统经验光照模型详解

一、光照模型 光照模型&#xff08;illumination model&#xff09;&#xff0c;也称为明暗模型&#xff0c;用于计算物体某点处的光强&#xff08;颜色值&#xff09;。从算法理论基础而言&#xff0c;光照模型分为两类&#xff1a;一种是基于物理理论的&#xff0c;另一种是…...

基于高通QCC5171的对讲机音频数据传输系统设计

一 研发资料准备 二 设计方法 蓝牙连接与配对&#xff1a;使用QCC5171的蓝牙功能&#xff0c;实现设备之间的蓝牙连接和配对。确保设备能够相互识别并建立起稳定的蓝牙连接。 音频采集与处理&#xff1a;将麦克风采集到的音频数据通过QCC5171的ADC&#xff08;模数转换器&…...

【题解】判断链表中是否有环、链表中环的入口结点

文章目录 判断链表中是否有环链表中环的入口结点 判断链表中是否有环 题目链接&#xff1a;判断链表中是否有环 解题思路1&#xff1a;快慢指针 代码如下&#xff1a; bool hasCycle(ListNode *head) {if(head nullptr) return false;ListNode* fast head;ListNode* slow …...

Pytorch 最全入门介绍,Pytorch入门看这一篇就够了

本文通过详细且实践性的方式介绍了 PyTorch 的使用&#xff0c;包括环境安装、基础知识、张量操作、自动求导机制、神经网络创建、数据处理、模型训练、测试以及模型的保存和加载。 1. Pytorch简介 在这一部分&#xff0c;我们将会对Pytorch做一个简单的介绍&#xff0c;包括它…...

Lambda 表达式的作用域

在Lambda表达式中访问外层作用域和旧版本的匿名对象中的方式类似。你可以直接访问标记了final的外层局部变量&#xff0c;或者实例的字段以及静态变量。 Lambda表达式不会从超类&#xff08;supertype&#xff09;中继承任何变量名&#xff0c;也不会引入一个新的作用域。Lambd…...

【portswigger】第二专题-XSS(二)

portswigger 靶场&#xff08;第二章节&#xff09;XSS 视频同步更新至bilibili bibi地址 【【portswigger】第二专题-XSS&#xff08;一前置知识&#xff09;】 https://www.bilibili.com/video/BV1mp4y157xA/?share_sourcecopy_web 【【portswigger】第二专题-XSS&#xff…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...