博主最近在搞 Sensor hub,跑的是 FreeRTOS,所以来学一学 FreeRTOS。 FreeRTOS 官网:www.freertos.org FreeRTOS 可以分为两部分:Free 和 RTOS,Free 就是免费的、自由的、 不受约束的,RTOS 是 Real Time Operating FreeRTOS 的资料少,而且大多数是英文的,那为何要选择它?原因如下: 1、FreeRTOS 免费! 3、许多软件厂商也使用 FreeRTOS 做本公司软件的操作系统,比如著名的 TouchGFX,其 所有的例程都是基于 FreeRTOS 操作系统的。 FreeRTOS 特点 FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括: ● FreeRTOS 的内核支持抢占式,合作式和时间片调度。
FreeRTOS 官网:https://freertos.org/ 在官网中可以下载到 FreeRTOS 的源码,博主下载了一份,解压后目录如下: FreeRTOS 源码中有三个文件夹,7 个 HTML 格式的网页和 2 个 txt 文档,HTML 网页和 txt 文档看名字就知道是什么东西了,重点在于上面那两个文件夹:FreeRTOS 和 FreeRTOS-Plus,这两个文件夹里面的东西就是 FreeRTOS 1、FreeRTOS 文件夹 1)Demo 文件夹里面就是 FreeRTOS 的相关例程: FreeRTOS 针对不同的 MCU 提供了非常多的 Demo,其中就有 ST 的 F1、F4 和 F7 我们看一下 Source: FreeRTOS-Plus 中的源码其实并不是 FreeRTOS 系统的源码,而是在 FreeRTOS 系统上另外增加的一些功能代码,比如 CLI、FAT、Trace 等等 就系统本身而言,和 FreeRTOS 里面的一模一样的,所以我们如果只是学习 FreeRTOS 这个系统的话,FreeRTOS-Plus 就没必要看了。
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
ID:技术让梦想更伟大 作者:李肖遥 FreeRTOS提供了几个内存堆管理方案,有复杂的也有简单的。 为了避免这个问题,FreeRTOS在移植层保留内存分配API函数。移植层在RTOS核心代码源文件之外(不属于核心源代码),这使得不同的应用程序可以提供适合自己的应用实现。 FreeRTOS下载包中提供5种简单的内存分配实现,本文稍后会进行描述。用户可以适当的选择其中的一个,也可以自己设计内存分配策略。 FreeRTOS提供的内存分配方案分别位于不同的源文件(heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c)之中,源文件位于下载包\FreeRTOS\Source\ 应用程序直接调用pvPortMalloc() 和 vPortFree()函数,而不仅是通过FreeRTOS API间接调用。
目前协程很少被使用到,因此对于协程FreeRTOS作者既没有把它删除也没有进一步开发。 所以本系列文章以后不会对协程过多描述,包括其API函数。 FreeRTOS调度器确保处于最高优先级的就绪或运行态任务获取处理器,换句话说,处于运行状态的任务,只有其中的最高优先级任务才会运行。 任何数量的任务可以共享同一个优先级。 在较新的FreeRTOS移植包中,如果 试图从一个任务中返回,将会调用configASSERT()(如果定义的话)。 如果使用FreeRTOS-MPU(在官方下载包中,为Cortex-M3内核写了两个移植方案,一个是普通的FreeRTOS移植层,还有一个是FreeRTOS-MPU移植层。 在使用FreeRTOS-MPU的情况下,使用xTaskCreate()函数可以创建运行在特权模式或用户模式(见下面对函数参数uxPriority的描述)的任务。
从这个章节开始,我们把FreeRTOS移植进来,同时还考虑兼容性。 上一节我们介绍了移植FreeRTOS的方法,并基于此实现一个最基本的例子:串口定时打印数据。 这一节我们分析下FreeRTOS的任务管理。 开发板是GD32的开发板。 关键字:FreeRTOS,STM32,GD32,任务管理 关于FreeRTOS的官方文档,里面实际上也讲的很详细,参见:FreeRTOS官方文档[1] 任务 如果非要给任务下个定义的话,在嵌入式系统中, FreeRTOS的任务已经具备了进程的特性,类似于Linux中没有线程的进程。 官方文档: https://www.freertos.org/Documentation/RTOS_book.html
接下来就在 STM32F103 单片机上移植 FreeRTOS。 移植 FreeRTOS 以正点原子的跑马灯工程为基础,在上面扩展。 在基础工程中新建一个名为 FreeRTOS 的文件夹: 创建 FreeRTOS 文件夹以后就可以将 FreeRTOS 的源码添加到这个文件夹中,,添加完以后 如图所示: portable 文件夹,我们只需要留下 keil、MemMang 和 RVDS 这三个文件夹,其他的都可以删除掉: 打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组 中添加文件 分组 FreeRTOS_CORE 中的文件就是 FreeRTOS 源码。 我们可以找找 FreeRTOS 的官方移植工程中会不会有这个文件,打开 FreeRTOS 针对 STM32F103 的移植工程文件,文件夹是 CORTEX_STM32F103_Keil,打开以后官方的移植工程中有这个文件
这一章介绍 FreeRtos 消息队列的基本使用, 重点分析其实现的方式。 分析的源码版本是 v9.0.0 ---- Queue 使用 FreeRTOS 官方提供了比较详细的接口使用文档 ( 戳我 ), 因此这里不花费太多的篇幅重复。 注意,在中断中使用 FreeRTOS 的接口, 需是结尾带有 FromISR的。 因为 FreeRTOS 是一个实时操作系统, 为了保证中断发生时的实时响应, 做了优先级设置。 到此, 对 FreeRTOS 队列的介绍完毕。 后续会专门一章分析下其信号量和互斥锁 基于队列的实现。 ---- 参考 FreeRTOS Queue FreeRTOS Queue API
我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我们就从基础的任务创建讲起,任务创建是RTOS 学习中很重要的一步,因为你的应用就是基于大量的任务来实现的,那么在freeRTOS下如何来创建任务呢,首先打开任意一个移植好的例程或者我们移植的demo,找到task.h和tasks.c这两个文件里面定义声明了许多与任务相关的类型和函数
本文学习一下 FreeRTOS的任务基础知识,分为如下几部分: 1、什么是多任务系统 2、FreeRTOS 任务与协程 3、初次使用 3、任务状态 4、任务优先级 5、任务实现 6、任务控制块 7、任务堆栈 2、FreeRTOS 任务与协程 FreeRTOS 中应用既可以使用任务,也可以使用协程(Co-Routine),或者两者混合使用。 但是 FreeRTOS 目前还没有把协程移除的计划,但是 FreeRTOS 是绝对不会再更新和维护协程了,因此协程大家了解一下就行了。 (4)、FreeRTOS 的延时函数,此处不一定要用延时函数,其他只要能让 FreeRTOS 发生任务 切换的 API 函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。 FreeRTOS 的任务函数和 UCOS 的任务函数模式基本相同的,不止 FreeRTOS,其他 RTOS 的任务函数基本也是这种方式的。
简述 FreeRTOS 从版本 V8.2.0开始提供任务通知这个功能,每个任务都有一个32位的通知值。 按照 FreeRTOS 官方的说法,使用消息通知比通过二进制信号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队列)。 FreeRTOS 提供以下几种方式发送通知给任务 : 发送消息给任务, 如果有通知未读, 不覆盖通知值 发送消息给任务,直接覆盖通知值 发送消息给任务,设置通知值的一个或者多个位 发送消息给任务,递增通知值 当然,消息通知也有其限制 : 通知只能一对一,因为通知必须指定任务 等待通知的任务可以被阻塞, 但是发送消息的任务,任何情况下都不会被阻塞等待 分析的源码版本是 v9.0.0 通知 API FreeRTOS ---- 参考 FreeRTOS Notifications FreeRTOS API
整理:李肖遥 FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制。每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核。 #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H /*Here is a good place to include header files FreeRTOS提供了一个灵活的机制,使得应用程序可以使用线程本地存储指针来读写线程本地存储。具体参见后续文章《FreeRTOS系列第12篇---FreeRTOS任务应用函数》。 详细描述见FreeRTOS software timers。 FreeRTOS内核代码的关键点都会调用configASSERT( x )函数,如果参数x为0,则会抛出一个错误。这个错误很可能是传递给FreeRTOS API函数的无效参数引起的。
FreeRTOS 中断方式事件标志组的实现 FreeRTOS 中断方式事件标志组的实现是指中断函数和 FreeRTOS 任务之间使用事件标志。 如果 FreeRTOS 工程的中断函数中没有调用 FreeRTOS 的事件标志组 API 函数,与裸机编程是一样的。 如果 FreeRTOS 工程的中断函数中调用了 FreeRTOS 的事件标志组的 API 函数,退出的时候要检测是否有高优先级任务就绪,如果有就绪的,需要在退出中断后进行任务切换,这点跟裸机编程稍有区别 而 FreeRTOS 不允许在中断服务程序和临界段中执行不确定性操作。 为了不在中断服务程序中执行,就通过此函数给FreeRTOS 的 daemon 任务(就是 FreeRTOS 的定时器任务)发送消息,在 daemon 任务中执行事件标志的置位操作。
从这个章节开始,我们把 FreeRTOS 移植进来,同时还考虑兼容性。 本文我们将介绍如何移植 FreeRTOS,并基于此实现一个最基本的例子:串口定时打印数据。 关键字:FreeRTOS,STM32,GD32 FreeRTOS 介绍 为什么要用实时操作系统? 软件中的数据交互只有 2 种,一种是轮询,一种是通知。 demo 在 github 上下载:FreeRTOS DEMO[3] 目录是:FreeRTOS\Demo 可参考:FreeRTOS\Demo\CORTEX_STM32F103_Keil 编译 先把最简单的程序弄出来 参考资料 [1]FreeRTOS官网: https://www.freertos.org/ [2]FreeRTOSConfig: https://www.freertos.org/a00110.html [3]FreeRTOS DEMO: https://github.com/FreeRTOS/FreeRTOS
在很早之前我们就曾在公众号里给大家介绍过freeRTOS,并且还介绍过在NXP kenitis KV46上的移植,相信很多猿友应该还有印象,freeRTOS因其占用资源少,开源等特点,应用越来越广泛,尤其是在嵌入式开发领域 ,随着物联网的大热,更是火的一塌糊涂,据官方报道,平均每260秒就有一次freeRTOS的下载。 虽然freeRTOS是开源免费的,但是在做产品时候,还是要注意,从freeRTOS到OpenRTOS在到SafeRTOS的区别,选择合适自己的。不同的license提供的支持也不一样。
最近在看 FreeRTOS 的源码,发现其命名规则和 Linux 很不一样,遂写文章记录一下。 1.FreeRTOS 编码标准 FreeRTOS的核心源代码遵从 MISRA 编码标准指南。 MISRA-C全称 Motor Industry Software Reliability Association (汽车工业软件可靠性协会) FreeRTOS 源代码也有一些是不符合 MISRA 标准的 3 数据类型 FreeRTOS 使用的数据类型主要分为 stdint.h 文件中定义的和自己定义的。其中 char 和 char * 定义的变量要特别注意。 不使用 C++ 风格的双斜线(//)注释 布局:FreeRTOS的源代码被设计成尽可能的易于查看和阅读。
像其他RTOS一样,freeRTOS同样有对事件标志位的创建和处理,在中断中可以通过事件组传递信息给其他的任务,那么如何创建事件组呢? xCreatedEventGroup == NULL ) { /* The event group was not createdbecause there was insufficient FreeRTOS 更多有关使用freeRTOS事件组的问题可以参阅官方文档或网站。具体在我们的工程应用中,比如可以在串口接收中断使用事件组。
空闲任务是 FreeRTOS 必不可少的一个任务,其他 RTOS 类系统也有空闲任务,比如 uC/OS。 当然了,实际上肯定不会这么浪费宝贵的处理器资源,FreeRTOS 空闲任务中也会执行一些其他的处理。 1、空闲任务详解 1、空闲任务简介 当 FreeRTOS 的调度器启动以后就会自动的创建一个空闲任务,这样就可以确保至少有一任务可以运行。 这种通用低功耗模式和 FreeRTOS 自带的 Tickless 模式的区别我们通过下图来对比分析一下。 可以看出相对与通用低功耗模式,FreeRTOS 自带的 Tickless 模式更加合理有效,所以如果有低功耗设计需求的话大家尽量使用 FreeRTOS 再带的 Tickless 模式。
用户应用层代码也可以 FreeRTOS 提供的内存管理函数来申请和释放内存,本文学习一下 FreeRTOS 自带的内存管理。 1、FreeRTOS 内存管理简介 FreeRTOS 创建任务、队列、信号量等的时候有两种方法,一种是动态的申请所需的 RAM。 FreeRTOS 将内存分配作为移植层的一部分,这样 FreeRTOS 使用者就可以使用自己的合适的内存分配方法。 FreeRTOS 提供了 5 种内存分配方法,FreeRTOS 使用者可以其中的某一个方法,或者自己的内存分配方法。 这 5 个文件再 FreeRTOS 源码中,路径:FreeRTOS->Source->portable->MemMang。
FreeRTOS 对此提供了一个叫做“队列”的机制来完成任务与任务、任务与中断之间的消息传递,由于队列用来传递消息的,所以也称为消息队列。 但是也可以使用 LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓冲机制。 FreeRTOS中使用队列传递消息的话虽然使用的是数据拷贝,但是也可以使用引用来传递消息啊,我直接往队列中发送指向这个消息的地址指针不就可以了! queueQUEUE_TYPE_COUNTING_SEMAPHORE 计数型信号量 queueQUEUE_TYPE_BINARY_SEMAPHORE 二值信号量 queueQUEUE_TYPE_RECURSIVE_MUTEX 递归互斥信号量 4、向队列发送消息 FreeRTOS 6、从队列读取消息 有入队就有出队,出队就是从队列中获取队列项(消息),FreeRTOS 中出队函数如表示: 具体的函数用法大家可以在用到的时候百度,这里就不详细介绍了,大家知道有这些东西就行。
腾讯云X-P2P以新一代的 P2P 技术为核心,充分利用边缘计算存储能力和整体网络闲置带宽,结合音视频 SaaS 服务,提供给客户更好用户体验、更高性价比的流媒体方案。客户通过客户端集成 SDK,能够获得更流畅播放体验并显著降低分发成本,适用于互动直播、电视内容直播、赛事直播、在线视频、短视频等业务场景。
扫码关注腾讯云开发者
领取腾讯云代金券