要想看懂 FreeRTOS 源码并学习其原理,有一个东西绝对跑不了,那就是 FreeRTOS 的列表和列表项。...列表和列表项是 FreeRTOS 的一个数据结构,FreeRTOS 大量使用到了列表和列表项, 它是 FreeRTOS 的基石。...要想深入学习并理解 FreeRTOS,那么列表和列表项就必须首先掌握, 否则后面根本就没法进行。...列表 ---> 链表 1、列表 列表是 FreeRTOS 中的一个数据结构,概念上和【链表】有点类似,列表被用来跟踪 FreeRTOS 中的任务。...2、列表项 列表项就是存放在列表中的项目,FreeRTOS 提供了两种列表项:列表项和迷你列表项。
静态创建任务 源代码 xTaskCreateStatic 静态的方式创建任务,需要用户先申请任务控制模块和任务栈需要的内存(一般使用静态内存),然后把内存地址传递给函数,函数负责其他初始化。...= NULL)) { // 设置用户传递进来的任务控制块和栈的内存地址到对应指针变量 pxNewTCB = (TCB_t *)pxTaskBuffer;...= 0 ) { // 标识这个任务控制块和栈内存时静态的 // 删除任务的时候, 系统不会做内存回收处理...NULL; } return xReturn; } 动态创建任务 源代码 xTaskCreate 动态创建任务, 调用函数内部向系统申请创建新任务所需的内存,包括任务控制块和栈...= 0 ) { // 标志任务控制块和栈是动态申请 // 删除任务系统会自动回收内存 pxNewTCB->
Cortex-M 处理器有多个用于管理中断和异常的可编程寄存器,这些寄存器大多数都在 NVIC 和系统控制块(SCB)中,CMSIS 将这些寄存器定义为结构体。...以 STM32F103 为例,打开 core_cm3.h,有两个结构体,NVIC_Type 和 SCB_Type,就存储了这些信息。...FreeRTOS 的 API 函数!...3、FreeRTOS 开关中断 FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),这两个函数其实是宏定义,在 portmacro.h...() 和taskEXIT_CRITICAL_FROM_ISR(),这四个函数其实是宏定义,在 task.h 文件中有定义。
格式的网页和 2 个 txt 文档,HTML 网页和 txt 文档看名字就知道是什么东西了,重点在于上面那两个文件夹:FreeRTOS 和 FreeRTOS-Plus,这两个文件夹里面的东西就是 FreeRTOS...1、FreeRTOS 文件夹 1)Demo 文件夹里面就是 FreeRTOS 的相关例程: FreeRTOS 针对不同的 MCU 提供了非常多的 Demo,其中就有 ST 的 F1、F4 和 F7...重点来看一下其中的 portable 这个文件夹,FreeRTOS 是个系统,归根结底就是个纯软件的东西,它是怎么和硬件联系在一起的呢?...2、FreeRTOS-Plus 文件夹 FreeRTOS-Plus 也有 Demo 和 Source,Demo 是一些例程。...就系统本身而言,和 FreeRTOS 里面的一模一样的,所以我们如果只是学习 FreeRTOS 这个系统的话,FreeRTOS-Plus 就没必要看了。
FreeRTOS 官网:www.freertos.org FreeRTOS 可以分为两部分:Free 和 RTOS,Free 就是免费的、自由的、 不受约束的,RTOS 是 Real Time Operating...4、简单,FreeRTOS 的文件数量很少,这个在我们后面的具体学习中就会看到,和 UCOS 系统相比要少很多!...5、文档相对齐全,在 FreeRTOS 的官网(www.freertos.org)上可以找到所需的文档和源码, 但是所有的文档都是英文版本的,而且下载 pdf 文档的时候是要收费的。...6、FreeRTOS 被移植到了很多不同的微处理器上,比如我们使用的 STM32,F1、F3、F4 和 最新的 F7 都有移植,这个极大的方便了我们学习和使用。...FreeRTOS 特点 FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括: ● FreeRTOS 的内核支持抢占式,合作式和时间片调度。
FreeRTOS也允许你自己实现内存堆管理,甚至允许你同时使用两种内存堆管理方案。同时实现两种内存堆允许任务堆栈和其它RTOS对象放置到快速的内部RAM,应用数据放置到低速的外部RAM。...嵌入式/实时系统具有千差万别的RAM和时间要求,因此一个RAM内存分配算法可能仅属于一个应用的子集。 为了避免这个问题,FreeRTOS在移植层保留内存分配API函数。...FreeRTOS提供的内存分配方案分别位于不同的源文件(heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c)之中,源文件位于下载包\FreeRTOS\Source\...「heap_1功能简介」: 用于从不会删除任务、队列、信号量、互斥量等的应用程序(实际上大多数使用FreeRTOS的应用程序都符合这个条件) 执行时间是确定的并且不会产生内存碎片 实现和分配过程非常简单...应用程序直接调用pvPortMalloc() 和 vPortFree()函数,而不仅是通过FreeRTOS API间接调用。
从这个章节开始,我们把FreeRTOS移植进来,同时还考虑兼容性。 上一节我们介绍了移植FreeRTOS的方法,并基于此实现一个最基本的例子:串口定时打印数据。...关键字:FreeRTOS,STM32,GD32,任务管理 关于FreeRTOS的官方文档,里面实际上也讲的很详细,参见:FreeRTOS官方文档[1] 任务 如果非要给任务下个定义的话,在嵌入式系统中,...任务需要解决资源和资源冲突的问题。 写过单片机程序的同学应该都写过裸机程序,官方叫法叫前后台系统。 具体做法就是: 定义一个时基,比如:10ms。 给不同的任务定义不同的运行周期。...FreeRTOS的任务已经具备了进程的特性,类似于Linux中没有线程的进程。...xTaskResumeFromISR( TaskHandle_t xTaskToResume ); 注:使用本函数需要在FreeRTOSConfig.h中设置INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR
消息队列作为主要的通信方式, 支持在任务间, 任务和中断间传递消息内容。 这一章介绍 FreeRtos 消息队列的基本使用, 重点分析其实现的方式。...发送消息 & 接受消息 队列的基本操作就是出队(接收消息)和入队(发送消息), 如上图所示, 有两个任务 A 和 B, A 发送消息给任务 B void funOfTaskA() { unsigned...注意,在中断中使用 FreeRTOS 的接口, 需是结尾带有 FromISR的。...因为 FreeRTOS 是一个实时操作系统, 为了保证中断发生时的实时响应, 做了优先级设置。...到此, 对 FreeRTOS 队列的介绍完毕。 后续会专门一章分析下其信号量和互斥锁 基于队列的实现。 ---- 参考 FreeRTOS Queue FreeRTOS Queue API
仅当明确的分别调用vTaskSuspend() 和xTaskResume() API函数后,任务才会进入或退出挂起状态。...5.空闲任务和空闲任务钩子(idle task和Idle Task hook) 5.1空闲任务 空闲任务是启动RTOS调度器时由内核自动创建的任务,这样可以确保至少有一个任务在运行。...如果使用FreeRTOS-MPU(在官方下载包中,为Cortex-M3内核写了两个移植方案,一个是普通的FreeRTOS移植层,还有一个是FreeRTOS-MPU移植层。...注:传递的参数ucParameterToPass必须和任务具有相同的生存周期, 因此这里定义为静态变量。...如果它只是一个自动变量,可能不会有太长的生存周期,因为 中断和高优先级任务可能会用到它。
简述 FreeRTOS 从版本 V8.2.0开始提供任务通知这个功能,每个任务都有一个32位的通知值。...按照 FreeRTOS 官方的说法,使用消息通知比通过二进制信号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队列)。...下面分析下任务通知这个功能如何实现信号量获取和释放。 获取信号量 任务中,调用了函数 ulTaskNotifyTake等待通知,相当于尝试获取信号量。...举个应用例子, 一个处理串口事件的任务,串口事件包括接收和发送,对应在其中断中发送通知,我们利用任务通知实现事件分组如下实现 : /定义事件位标记 #define TX_BIT 0x01 #define...---- 参考 FreeRTOS Notifications FreeRTOS API
、删除、挂起和恢复等操作,由此可见任务管理的重要性。...任务进入和退出挂起态通过调用函数 vTaskSuspend()和 xTaskResume()。...(注意和中断的优先级区分,任务和中断不一样,中断一般是数字越小优先级越大) 当宏 configUSE_TIME_SLICING 定义为 1 的时候多个任务可以共用一个优先级,数量不限。...FreeRTOS 的任务函数和 UCOS 的任务函数模式基本相同的,不止 FreeRTOS,其他 RTOS 的任务函数基本也是这种方式的。...类似于 Linux 的 task_struct 结构体,保存进程信息用的,每个进程有一个。
我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我们就从基础的任务创建讲起,任务创建是RTOS...学习中很重要的一步,因为你的应用就是基于大量的任务来实现的,那么在freeRTOS下如何来创建任务呢,首先打开任意一个移植好的例程或者我们移植的demo,找到task.h和tasks.c这两个文件里面定义声明了许多与任务相关的类型和函数
FreeRTOS 系统的心跳被称为系统节拍。FreeRTOS 配置系统生成一个周期性的节拍中断。用户可以配置节拍中断的频率,通常在毫秒级别。...这九行代码是 FreeRTOS 的核心。FreeRTOS 的其他 8900 多行代码存在的目的是确保这九行代码足以保持最高优先级任务的运行。下图是就绪列表的高级图示。
玩了嵌入式 Linux 以后,发现单片机真简单;后来接触了安卓,觉得还是 Linux 简单。 嵌入式有三个方向:单片机、嵌入式 Linux 、Android,系统复杂性依次提高。...keil、MemMang 和 RVDS 这三个文件夹,其他的都可以删除掉: 打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组 中添加文件...FreeRTOS_PORTABLE 分组中的 port.c 和 heap_4.c ,port.c 是 RVDS 文件夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的...看名字就知道,他是 FreeRTOS 的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,基本都是通过宏定义来完成对系统的配置和裁剪的。...如果还有错误的话大家自行根据错误类型查找和修改错误!
configUSE_PORT_OPTIMISED_TASK_SELECTION 某些运行FreeRTOS的硬件有两种方法选择下一个要执行的任务:通用方法和特定于硬件的方法(以下简称“特殊方法”)。...如果系统节拍中断频率过快,则大部分电能和CPU时间会消耗在进入和退出低功耗状态上。 FreeRTOS的tickless空闲模式会在空闲周期时停止周期性系统节拍中断。...读者应该了解在FreeRTOS中互斥量和二进制信号量的区别。 关于互斥量和二进制信号量简单说: 互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。...configENABLE_BACKWARD_COMPATIBILITY 头文件FreeRTOS.h包含一系列#define宏定义,用来映射版本V8.0.0和V8.0.0之前版本的数据类型名字。...这是移植和应用FreeRTOS出错最多的地方,所以需要打起精神仔细读懂。
使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题。 FreeRTOS 任务间事件标志组的实现 任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制。...FreeRTOS 中断方式事件标志组的实现 FreeRTOS 中断方式事件标志组的实现是指中断函数和 FreeRTOS 任务之间使用事件标志。...如果 FreeRTOS 工程的中断函数中没有调用 FreeRTOS 的事件标志组 API 函数,与裸机编程是一样的。...而 FreeRTOS 不允许在中断服务程序和临界段中执行不确定性操作。...为了不在中断服务程序中执行,就通过此函数给FreeRTOS 的 daemon 任务(就是 FreeRTOS 的定时器任务)发送消息,在 daemon 任务中执行事件标志的置位操作。
在很早之前我们就曾在公众号里给大家介绍过freeRTOS,并且还介绍过在NXP kenitis KV46上的移植,相信很多猿友应该还有印象,freeRTOS因其占用资源少,开源等特点,应用越来越广泛,尤其是在嵌入式开发领域...,随着物联网的大热,更是火的一塌糊涂,据官方报道,平均每260秒就有一次freeRTOS的下载。...虽然freeRTOS是开源免费的,但是在做产品时候,还是要注意,从freeRTOS到OpenRTOS在到SafeRTOS的区别,选择合适自己的。不同的license提供的支持也不一样。
NVIC 的全称是 Nested Vectored Interrupt Control,即嵌套向量中断控制器,在 Cortex M3 和 M4 内核的 MCU 中,每个中断的优先级都是 8 bit 的寄存器来表示...但实际上,厂商一般只用到高 4 bit(对应的配置宏是__NVIC_PRIO_BITS,大家可以在代码中看看这个宏的使用方式),也就是 16 个优先级;这 16 个优先级,又分成 2 bit 抢占式优先级和...涉及到优先级的配置: configKERNEL_INTERRUPT_PRIORITY 这个配置定义了 FreeRTOS 用到的 Systick 和 PendSV 中断的优先级,必须配置为最低优先级,也就是...configMAX_PRIORITIES 延伸阅读:faultmask,primask 和 basepri 中断屏蔽寄存器。...primask:屏蔽除 NMI 和 HardFalut 外的所有异常和中断。faultmask:屏蔽除 NMI 外的所有异常和中断。
FreeRTOS 对此提供了一个叫做“队列”的机制来完成任务与任务、任务与中断之间的消息传递,由于队列用来传递消息的,所以也称为消息队列。...队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。...但是也可以使用 LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓冲机制。...FreeRTOS中使用队列传递消息的话虽然使用的是数据拷贝,但是也可以使用引用来传递消息啊,我直接往队列中发送指向这个消息的地址指针不就可以了!...其中最重要的是任务级和中断级不一样,在中断处理函数中是由一套自己的 API 用的。
使用任务通知的话效率会更高,我们来学习一下 FreeRTOS 的任务通知功能。...FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue 就是这个通知值。...合理、灵活的使用上面这些更改任务通知值的方法可以在一些场合中替代队列、二值信号量、计数型信号量和事件标志组。...2、发送任务通知 3、任务通知通用发送函数 任务级任务通知发送函数:xTaskNotify()、xTaskNotifyGive()和 xTaskNotifyAndQuery(),这三个函数最终调用的都是函数...其中函数 xTaskNotifyFromISR()和 xTaskNotifyAndQueryFromISR()最终调用的都是函数 xTaskGenericNotifyFromISR()。
领取专属 10元无门槛券
手把手带您无忧上云