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

news/2024/4/20 15:17:33/文章来源:https://blog.csdn.net/Naisu_kun/article/details/125782481

文章目录

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

目的

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      256TaskHandle_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.luyixian.cn/news_show_72415.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】Anti-Adversarially Manipulated Attributions for WSSS

一篇CVPR2021上的论文,用于弱监督分割及半监督分割 论文标题: Anti-Adversarially Manipulated Attributions for Weakly and Semi-Supervised Semantic Segmentation(AdvCAM) 作者信息: 代码地址: htt…

2023年华为HCIE-Dacom认证题库(H12-891)

1、如图所示是某位网络工程师在排查OSPF故障时的输出信息。据此判断,以下哪种原因可能导致邻接关系无法正常建立。 Hello报文发送时间不一致认证密码不一致接口的IP地址掩码不一致区域类型不一致 正确答案:C 2、如图所示,路由器的所有接口开启…

ATTCK实战系列——红队实战(二)

网络配置 网卡: WEB: PC: DC: IPWEB10.10.10.80(内)/192.168.111.80(外)PC10.10.10.201(内)/192.168.111.201(外)DC10.10.10.10物理机…

C++线程/阻塞/同步异步----2

本章节内容为记录改写RTK代码时,学习的知识 同步和异步区别 1.定义不同:同步需要将通信双方的时钟统一到一个频率上,异步通信发送的字符间隔时间可以是任意的; 2.准确性不同:同步通信需要比较高精度的精确度,异步则不…

5.12 BGP选路原则综合实验

配置BGP的选路原则 1. 实验目的 熟悉BGP的选路的应用场景掌握BGP的选路的配置方法2. 实验拓扑 实验拓扑如图5-11所示: 图5-11:配置BGP的选路原则 3. 实验步骤 (1)配置IP地址 R1的配置

你知道 GO 中的 协程可以无止境的开吗?

GO语言天生高并发的语言&#xff0c;那么是不是使用 go 开辟协程越多越好的&#xff0c;那么在 go 里面&#xff0c;协程是不是可以开无限多个呢&#xff1f; 那么我们就一起来看看尝试写写 demo 吧 尝试开辟尽可能多的 协程 写一个 demo &#xff0c;循环开 1 << 31 …

Mac 安装 homebrew

文章目录1. 简介2. 安装2.1 官方安装2.2 安装 ARM 版 Homebrew2.3 安装 X86 版 Homebrew2.4 多版本共存3. 设置镜像3.1 初次安装brew后配置中科大 zsh3.2 换源配置中科大 zsh3.3 换源清华大学 zsh4. 问题1. 简介 omebrew是一款包管理工具&#xff0c;目前支持macOS和linux系统…

「TCG 规范解读」第10章 TPM工作组 保护你的数字环境

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

【春秋云境】CVE-2022-28512

靶标介绍&#xff1a; ​ Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。…

IDEA工具系列之连接Linux

我们在开发的时候&#xff0c;用IDEA开发程序&#xff0c;用XSHELL来管理服务器&#xff0c;这两个工具切换比较麻烦。有没有用IDEA来连接Linux。当然有&#xff0c;下面有实践步骤&#xff1a; 首先&#xff1a;连接Linux 打开IDEA->Tools->Start SSH Session 其中1&…

REDIS09_LBS出现背景、GEO算法介绍、算法步骤、剖析、邻近网格位置推算

文章目录①. LBS出现的背景②. 重新认识经纬度③. 感性认识GeoHash④. Geohash算法介绍⑤. Geohash算法步骤⑥. 更深入剖析GeoHash⑦. 邻近网格位置推算①. LBS出现的背景 ①. 移动互联网时代LBS应用越来越多,所在位置附近三公里的药店、交友软件中附近的小姐姐、外卖软件中附近…

stm32f407探索者开发板(二十)——独立看门狗实验

文章目录一、独立看门狗概述1.1 独立看门狗二、常用寄存器和库函数配置2.1 独立看门狗框图2.2 键值寄存器IWDG_KR2.3 预分频寄存器IWDG_PR2.4 重装载寄存器IWDG_RLR2.5 状态寄存器IWDG_SR2.6 IWDG独立看门狗操作库函数三、手写独立看门狗实验3.1 操作步骤3.2 iwdg.c3.3 iwdg.h3…

NLP学习笔记(九) 分词(上)

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲分词算法 1 概述 分词是自然语言处理领域中的基础任务&#xff0c;是文本预处理的重要步骤 简单来说&#xff0c;就是将文本段落分解为基本语言单位&#xff0c;亦可称之为词元 ( token\text{token}token ) 按照粒度的不…

[Flink]概述day1第4个视频完

一、概述什么是Flink是一种大数据计算引擎&#xff0c;用于对无界&#xff08;流数据&#xff09;和有界&#xff08;批数据&#xff09;数据进行有状态计算。特点1&#xff09;批流一体&#xff1a;统一批处理、流处理2&#xff09;分布式&#xff1a;Flink程序可以运行在多台…

python小基础-更多请自学,或者某某教程-2023-2-21 小扒菜的自学之路【1】

python基础 基础学习 自己跟着菜鸟教程看的一些基础,会java或者js的话,1个半小时就可以over 好久没更新博客了,现在慢慢来发吧,基础内容不太多,自己理解会很快的(下面是一段个人的小经历,大家也可以看看,嘻嘻) 假期看了灵魂摆渡几部电视剧,无聊中收到了一个python爬虫公开课穷,…

单Buffer的缺点与改进方法

单Buffer的缺点与改进方法 文章目录单Buffer的缺点与改进方法一、 单Buffer的缺点二、 使用多Buffer来改进三、 内核驱动程序、APP互相配合使用多buffer致谢参考资料 内核自带的LCD驱动程序 IMX6ULL驱动源码&#xff1a;Linux-4.9.88\drivers\video\fbdev\mxsfb.c 一、 单Buf…

I/O多路复用模型实现——epoll

epoll IO多路复用模型实现机制I/O多路复用epollepoll_create(int size)epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)epoll eventepoll流程I/O多路复用 I/O 多路复用的本质…

Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理

前言 在开发的时候&#xff0c;有一些敏感信息是不能直接通过明白直接保存到数据库的。最经典的就是密码了。如果直接把密码以明文的形式入库&#xff0c;不仅会泄露用户的隐私&#xff0c;对系统也是极其的不厉&#xff0c;这样做是非常危险的。 那么我们就需要对这些铭文进…

MyBatis分页插件

目录 分页插件 Mybatis插件典型适用场景 实现思考 第一个问题 第二个问题 自定义分页插件 分页插件使用 添加pom依赖 插件注册 调用 代理和拦截是怎么实现的 PageHelper 原理 分页插件 MyBatis 通过提供插件机制&#xff0c;让我们可以根据自己的需要去增强MyBati…

去中心化开源社交平台Misskey

本文是应网友 anthony084 的要求写的&#xff1b; 什么是 Misskey &#xff1f; Misskey 是一个开源、去中心化的社交媒体平台&#xff0c;发帖方式类似于微博和推特。 去中心化则意味着一个 Misskey 实例可以与其他 Misskey 实例进行相互连接&#xff0c;在 Fediverse (Activi…