FreeRTOS入门(01):基础说明与使用演示

news2025/7/18 16:29:35

文章目录

  • 目的
  • 基础说明
  • 系统移植
  • 基础使用演示
  • 数据类型和命名风格
  • 总结
  • 碎碎念

目的

FreeRTOS是一个现在非常流行的实时操作系统(Real Time Operating System)。本文将介绍FreeRTOS入门使用相关内容,这篇是第一篇,主要介绍基础背景方面的内容。

FreeRTOS官网:https://www.freertos.org/ (网站现在已更新中文)
在这里插入图片描述

Real-time operating system for microcontrollers

Developed in partnership with the world’s leading chip companies over an 18-year period, and now downloaded every 170 seconds, FreeRTOS is a market-leading real-time operating system (RTOS) for microcontrollers and small microprocessors. Distributed freely under the MIT open source license, FreeRTOS includes a kernel and a growing set of IoT libraries suitable for use across all industry sectors. FreeRTOS is built with an emphasis on reliability and ease of use.

微控制器实时操作系统

FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS),与世界领先的芯片公司合作开发,现在每 170 秒下载一次。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建强调可靠性和易用性。

基础说明

OS最核心的功能是调度器,用于调度系统CPU和内存等资源。在大型项目或者多人开发的项目中这通常是必不可少的,没有调度器对资源合理的管理和分配,开发过程中就需要人为花大量时间精力来协调分配资源。

调度器表现到用户而言就是在编写程序时可以编写为一个个独立的任务(task),你可以专心编写每个任务而不太用担心该任务会不会影响其它任务,这是主要是调度器来操心的。

OS其它的功能主要是围绕 task 展开的,用于处理不同 task 间通讯、协同操作等需求。另外OS通常还会提供一些趁手的附加功能。

RTOS在一般的OS基础上针对控制领域特点会更加注重实时响应性能。

系统移植

目前大多数热门的单片机厂家都有给出移植好FreeRTOS的项目示例,很多时候并不需要自己从头进行移植,本文也直接使用现成的模板展开。但是理解FreeRTOS源码结构和移植相关内容对于FreeRTOS后续的使用上会有一定的帮助,所以这里也稍微对相关内容进行介绍。

在FreeRTOS官网下载源码,下图中上面那个包中有非常多热门单片机的移植使用工程示例,如果要自己移植的话可以参考这些示例:
在这里插入图片描述

下面是下载解压后其中的部分目录,最核心的就是内核源码部分了:
在这里插入图片描述
当然如果要手动移植的话需要自行处理一些芯片特定代码,可以参考上图中的portable目录下内容。系统移植时通常涉及系统定时器、中断、内存这一些内容,其中有部分还需要使用汇编代码来处理,比如任务切换调度过程就必须用到一些汇编代码才能处理。不过大部分情况下参考portable目录下现有的内容来进行其实也不难。

对于FreeRTOS而言在使用时通常还有个 FreeRTOSConfig.h 文件,该文件用于设置FreeRTOS的一些参数选项。这个文件是即使FreeRTOS已经由厂家移植好了,但根据各自的项目需求还可以在这里调整的地方。

本文演示基于沁恒CH32V307单片机官方FreeRTOS项目模板进行,并不需要自己手动移植系统。

沁恒CH32V307单片机基础使用可以参考《沁恒CH32V307单片机入门(01):基础说明与流程体验》:
https://blog.csdn.net/Naisu_kun/article/details/128734532

在这里插入图片描述
在这里插入图片描述
使用FreeRTOS项目模板新建项目后可以看到项目中已经包含了FreeRTOS的内核代码以及相关配置文件。目前该项目模板工程中 FreeRTOS 内核版本为 V10.4.6。

基础使用演示

使用上面的CH32V307的FreeRTOS项目模板方式创建项目,新项目中只需要替换 main.c 为下面内容:

#include "debug.h"
#include "FreeRTOS.h" // 引入头文件
#include "task.h"     // 引入头文件
#include "semphr.h"   // 引入头文件

SemaphoreHandle_t xMutex; // 声明互斥量,
                          // 下面两个任务中使用了同一个串口,所以需要使用互斥量进行保护

/* Task1相关参数与任务处理函数 */
#define TASK1_TASK_PRIO     3
#define TASK1_STK_SIZE      256

TaskHandle_t Task1Task_Handler; // 用于保存任务句柄

void task1_task(void *pvParameters) // 任务就是函数
{
    while(1) //每一个任务都是无限循环运行的
    {
        xSemaphoreTake(xMutex, portMAX_DELAY); // 申请互斥量,如果别人在使用那么这里就会阻塞直到可用为止
        printf("USART1_Task1: ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
        xSemaphoreGive(xMutex);                // 释放互斥量
        vTaskDelay(250);                       // FreeRTOS的延时函数,单位是FreeRTOS的任务周期
    }
}

/* Task2任务处理函数 */
void task2_task(void *pvParameters)
{
    while(1)
    {
        xSemaphoreTake(xMutex, portMAX_DELAY);
        printf("USART1_Task2: 01234567890123456789\r\n");
        xSemaphoreGive(xMutex);
        vTaskDelay(500);
    }
}

/* 主函数 */
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(9600); // 使用9600波特率,每秒串口约可通讯960字节,
		                     // 默认configTICK_RATE_HZ为500,即每2ms调度一次,每次调度间可以发送约9个字节

	printf("FreeRTOS Kernel Version:%s\r\n",tskKERNEL_VERSION_NUMBER); // 打印FreeRTOS内核版本号

	xMutex = xSemaphoreCreateMutex(); // 创建互斥量

	// 创建一个任务
	// 创建成功会返回pdPASS(1),失败通常返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(-1),即内存不足
    xTaskCreate((TaskFunction_t )task1_task,          // 任务函数
                (const char*    )"task1",             // 任务名称,长度由FreeRTOSConfig.h中configMAX_TASK_NAME_LEN定义
                (uint16_t       )TASK1_STK_SIZE,      // 该任务栈深度(栈大小),对于32位架构一个深度为四字节
                (void*          )NULL,                // 传递给任务的参数
                (UBaseType_t    )TASK1_TASK_PRIO,     // 任务优先级,值越大优先级越高,最大值为FreeRTOSConfig.h中configMAX_PRIORITIES - 1
                (TaskHandle_t*  )&Task1Task_Handler); // 任务句柄,后续可以用过该句柄来操作任务

    xTaskCreate(task2_task, "task2", 128, NULL, 5, NULL); // 创建一个任务

    vTaskStartScheduler(); // 任务调度,程序将在这里无序循环

	while(1){} // 程序不会运行到这里
}

上面代码中创建了两个任务,交替通过USART1打印一些文本,实际效果如下:
在这里插入图片描述

FreeRTOS中供用户使用的最核心的功能是Task,除此之外的大部分内容(队列、互斥锁、信号量……)都是为了Task与Task之间交互而服务了。具体的这些相关内容会在后面的文章中详细介绍。

数据类型和命名风格

FreeRTOS对编程风格上有自己的一些规定,但是大多数内容(比如缩进格式、注释格式等)我们并不用太关心,这里只介绍一些FreeRTOS中相对独特的内容。

FreeRTOS的数据类型使用 stdint.h 中定义的一些,但是其中的 charchar * 通常包含或者指向 ASCII 字符(也就是默认认为这个必须是有符号类型)。除了这些基本的类型FreeRTOS中还定义了下面四个类型:

  • TickType_t 系统时钟计数类型,32位架构下为32位数据类型;
  • BaseType_t 平台架构中最高有效数据类型,32位架构下为32位数据类型;
  • UBaseType_t 无符号的 BaseType_t
  • StackType_t 供FreeRTOS内部使用;

FreeRTOS中对变量、函数、宏等命名有一定的格式习惯。

变量名:
变量名带有前缀(前缀可以组合)。

变量名前缀说明变量名前缀说明
ucuint8_tusuint16_t
uluint32_txsize_t
u非stdint类型的无符号类型x非stdint类型的有符号类型
e枚举类型p指针类型
ccharpcchar *

函数名:
对于私有函数使用 prv 作为前缀,对于其它函数使用返回类型和函数所在文件名作为前缀。

函数名返回值类型所在文件
vTaskDeletevoidtask.c
xQueueReceiveBaseType_tqueue.c
pvTimerGetTimerIDchar *tmer.c

宏名:
宏名前缀通常和该宏所在文件有关;除前缀外,所有宏均使用大写字母书写,并使用下划线来分隔单词。

宏名前缀所在文件
task (如taskENTER_CRITICAL())task.h
port (如portMAX_DELAY)portable.h 或 portmacro.h
config (比如configUSE_PREEMPTION)FreeRTOSConfig.h
pd (比如pdTRUE)projdefs.h
err (比如errQUEUE_FULL)projdefs.h

部分通用宏定义:

pdFALSE0pdTRUE1
pdFAIL0pdPASS1

总结

这篇文章对FreeRTOS入门使用相关的一些基础背景内容进行了介绍,还进行了演示使用,更多详细的内容将在接下来的文章中展开。

碎碎念

我刚开始学单片机的时候RTOS比较流行的是μC/OS,FreeRTOS当时还不是很常见,因为其免费特性被很多单片机厂商用于默认的RTOS例程,慢慢的变得常见了。比如现在很流行的ESP32整个开发包默认就是建立在FreeRTOS之上的。

自从FreeRTOS被亚马逊收购后现在发展的也越来越好了。我这篇文章刚开始写的官网还是英文的,现在都更新中文了(虽然感觉是机翻的)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

追梦之旅【数据结构篇】——详解C语言动态实现带头结点的双向循环链表结构

详解C语言动态实现带头结点的双向循环链表结构~😎前言🙌预备小知识💞链表的概念及结构🙌预备小知识💞链表的概念及结构🙌带头结点的双向循环链表结构🙌整体实现内容分析💞1.头文件编…

openpose在win下环境配置

1.下载OpenPose库 以下二选一进行下载源码 (1)git进行下载 打开GitHub Desktop或者Powershell git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose cd openpose/ git submodule update --init --recursive --remote(2)在github上手动下载 由于下载环境问…

SpringCloud Alibaba 之Nacos集群部署-高可用保证

文章目录Nacos集群部署Linux部署docker部署(参考待验证)Nacos 集群的工作原理Nacos 集群中 Leader 节点是如何产生的Nacos 节点间的数据同步过程官方推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。http://nacos.com:port/ope…

go进阶(1) -深入理解goroutine并发运行机制

并发指的是同时进行多个任务的程序,Web处理请求,读写处理操作,I/O操作都可以充分利用并发增长处理速度,随着网络的普及,并发操作逐渐不可或缺 一、goroutine简述 在Golang中一个goroutines就是一个执行单元&#xff…

活动报名丨亚马逊科学家杨靖锋:复现和使用GPT3/ChatGPT的想法

2023年2月23日(星期四)11:00-12:00,由智源社区主办的「智源LIVE 第30期丨亚马逊科学家杨靖锋讲解『一些关于复现和使用GPT3/ChatGPT的想法』将在线举办,敬请期待。杨靖锋杨靖锋是来自亚马逊的科学家。他的研究主要集中在自然语言处…

ESP32设备驱动-深度休眠与唤醒

深度休眠与唤醒 文章目录 深度休眠与唤醒1、ESP32的休眠模式介绍1.1 ESP32的休眠模式1.2 RTC_GPIO1.3 唤醒源1.4 唤醒流程2、软件准备3、硬件准备4、定时器唤醒5、触摸唤醒6、外部中断唤醒6.1 外部中断ext0唤醒6.2 外部中断ext1唤醒6.3 多GPIO唤醒本文将详细在Arduino IDE中如何…

Spring MVC常用功能及注解

目录 一、什么是Spring MVC 1.1 Spring MVC定义 1.2 MVC定义 1.3 MVC和Spring MVC的关系 1.4 Spring MVC的作用 二、Spring MVC的使用 2.1 Spring MVC的创建和连接 2.1.1 RequestMapping注解 2.1.2 GetMapping注解 2.1.3 PostMapping注解 2.2 获取参数 2.2.1 获取单…

unbound部署DNS

dns的主要作用是将域名解析为ip地址然后在进行访问 安装配置dns准备3台服务器(地址都要设置为静态的以便自己配置dns)192.168.92.1 用户ip地址(windows) 192.168.92.132 dns服务器地址 192.168.92.133 web服务器地址 dns服务器 …

网络编程之TCP 网络应用程序开发流程

TCP 网络应用程序开发流程学习目标能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍TCP 网络应用程序开发分为:TCP 客户端程序开发TCP 服务端程序开发说明:客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门为客…

【沐风老师】3DMAX橱柜生成器工具使用教程

3DMAX橱柜生成器工具使用教程 【生成的橱柜模型】 3DMAX橱柜生成器(Kitchen Cabinet Creator)用于在3ds Max中自动制作橱柜模型。是需要频繁设计厨房、家具和室内设计的用户的理想工具插件,也是所有希望通过点击几下鼠标来填充一些空白空间的…

游戏服务器算法-AOI九宫格python实现

将空间按照一定的方法进行分割,例如根据AOI范围的大小将整个游戏世界切分为固定大小的格子。当游戏物体位于场景的时候,根据坐标将它放入特定的格子中。 例如玩家1在位置7中,如果游戏内的AOI的范围为1个格子。当我们需要获取这个玩家周围的AO…

第九章 - 多表查询(join,left join 等),合并查询(union union all),子查询

第九章 - 多表查询(join,left join 等),合并查询(union & union all),子查询交叉链接(笛卡尔积)内连接查询外连接查询左链接: left join右链接&#xff1…

python3遍历目录的三种方法浅谈

日期:2023年2月22日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

JavaScript中怎么实现链表?

JavaScript中怎么实现链表? 学习数据结构的的链表和树时,会遇到节点(node)这个词,节点是处理数据结构的链表和树的基础。节点是一种数据元素,包括两个部分:一个是实际需要用到的数据&#xff1b…

MATLAB | 如何用MATLAB绘制这样有气泡感的网络图

今天给大家带来一款用来绘制有气泡感的网络图的工具函数,绘制效果如下: 花里胡哨的,气泡大小代表流入流出数据量综合,不同颜色的气泡代表属于不同类,两个气泡之间有连线代表有数据流动,连线透明度代表流动数…

木鱼cms 审计小结

MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。‍环境搭建我们利用 phpstudy 来搭建环境,选择 Apache2.4.39 MySQL5.7.26 php5.6.9 ,同时利用 PhpStorm 来实现对项目的调试‍漏洞复现分析‍…

经过深思熟虑后的接口测试自动化的总结与思考

序近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于:服务端接口测试介绍接…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索,即时零售已经逐步走向成熟,并开始向三四线城市以及乡镇城市渗透。 过去一年,京东、美团、阿里争先布局即时零售市场,完善即时配送网络、培养用户消费习惯,即时零售订单迎来了骤增。2022年下半年&#…

【字节面试】Fail-fast知识点相关知识点

字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。 1.问题 什么是Fail-fast机制? Hashmap是否拥…

斯坦福大学团队提出AI生成文本检测器DetectGPT,通过文本对数概率的曲率进行可解释判断

原文链接:https://www.techbeat.net/article-info?id4583 作者:seven_ 随着以ChatGPT等大型语言模型(large language models,LLMs)的爆火,学界和工业界目前已经开始重视这些模型的安全性,由于C…