
RTOS
文章平均质量分 91
FreeRTOS
爱洋葱
One battle, one person
展开
-
自制 RTOS
目录0. 配置1. 体系架构2. 内存管理3. 任务/调度器3. IPC3.1 信号量3.2 互斥锁3.3 消息队列4. 临界区保护4.1. 全局中断4.2. 挂起调度器4.3. 互斥锁5. 软件定时器6. 支持 Log 日志分级7. Trace8. Shell9. Demo都说,不会写 RTOS 的程序员不是好厨师,那么就写点东西吧;V1.0 版本大概的组织是这样的:这个 RTOS 命名为 MxOS;项目地址为:原创 2021-12-30 11:13:18 · 3875 阅读 · 9 评论 -
FreeRTOS --(17)任务通知浅析
之前聊到,FreeRTOS 可以通过信号量(二值信号量和计数信号量)、队列、事件组来同步任务与任务,任务与中断;在 FreeRTOS 中,还有一个东西也可以用作任务与任务,中断与任务的同步,它叫任务通知(Task Notifications);如果我们通过信号量、队列、事件组的形式来同步,在 FreeRTOS 中,叫通过了一个Communication Object;也就是说通过了一个用于连续接收方和发送方的中间模块;FreeRTOS 的任务通知(Task Notifications),..原创 2020-07-21 00:03:35 · 6159 阅读 · 1 评论 -
FreeRTOS --(16)资源管理之临界区
临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为:读->改->写;在不带 OS 的系统下,普通代码希望对某个寄存器进行读->改->写,此刻,一个 IRQ 打断了这个操作,也同时对这个寄存器进行读->改->写,中断返回,后,普通代码又继续进行,这样就会导致逻辑错误;在带 OS 的情况下,不光是有 IRQ,而且存在任务切换,这样,同一个资源在 ISR 和不同任务之间修改,这造成了临界区;临界区的资源需要保护起来,临界区保护的不是代码,而是数据;.原创 2020-07-17 11:57:53 · 3877 阅读 · 2 评论 -
FreeRTOS --(15)信号量之概述
FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步;针对不同的应用场景,信号量分为两种:1、二值信号量;2、计数信号量;1、二值信号量1.1、Usage顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.原创 2020-07-16 00:20:17 · 5266 阅读 · 0 评论 -
FreeRTOS --(14)队列管理之概述
在任何的 OS 中,都需要支持任务与任务,中断与任务之间的数据传输机制,在 FreeRTOS 中,这种数据传输的方式被称之为队列(Queue);队列是一个 FIFO 模型,在创建一个队列用于数据传递的时候,需要指定队列的长度,创建完队列,便可以使用它进行数据传递;一个简单的例子:有两个任务 A 和 B,任务 A 将数据传递进队列,任务 B 作为接收端,从队列中获取数据:1、下面是创建了一个长度为 5 的队列:2、此刻任务 A 写一个数据 10 到 Queue:3、任务 A 在写一原创 2020-07-10 18:02:35 · 6707 阅读 · 0 评论 -
FreeRTOS --(13)任务管理之空闲任务
创建完毕任务,启动调度器,任务控制,系统 SysTick 来临后判断是否需上下文切换;如果没有其他任务执行的情况下,FreeRTOS 的 Idle 任务将被调度投入运行;在启动调度器的时候,Idle 任务就被创建了,优先级为最低 0;void vTaskStartScheduler( void ){.....................xReturn = xTaskCreate( prvIdleTask, configIDLE_TAS原创 2020-07-07 19:24:09 · 3279 阅读 · 0 评论 -
FreeRTOS --(11)任务管理之系统节拍
前面有了创建任务、启动调度器、任务控制,接下来便开始分析一个 Tick 到来之后,FreeRTOS 即将有什么行为;在启动调度器的时候,就已经配置好了 SysTick,它作为 OS 的心跳,每隔一个固定周期来一次 SysTick 中断,来驱动 OS 做事(任务调度);以 STM32 为例,定义的configTICK_RATE_HZ 为 1000,由《FreeRTOS --(9)任务管理之启动调度器》得知,系统节拍时钟周期为1ms;不同的处理器结构可能有所区别,所以他是需要移植的部分,在 p.原创 2020-07-06 21:16:32 · 2134 阅读 · 5 评论 -
FreeRTOS --(10)任务管理之任务延时
在《FreeRTOS --(7)任务管理之入门篇》中讲过,如果有几个任务同时跑,但是又都不阻塞的话,那么最高优先级的任务将会占领整个 CPU,因为每次都会调度到它,一直处于 Ready 状态,所以呢,调度器每次都要选择优先级最高的任务来让它执行;所以,不管怎么样,任务做完自己该做的事情,就应该进入阻塞状态,等待下次该自己做任务的时候,在占领 CPU,这样既可以让 Idle 线程,在系统空闲的时候跑,也可以让让任务在合理的时间占领 CPU;之前也说过,让任务进入阻塞状态的方式有两种:1、让任务延时:原创 2020-07-05 20:22:19 · 3389 阅读 · 1 评论 -
FreeRTOS --(12)任务管理之任务切换
现在创建任务(xTaskCreate)、启动调度器(vTaskStartScheduler),都分析完成了,SysTick,PendSV 中断已经使能,接下来第一个任务便可以自由的奔跑;等待下一次 SysTick 来临(1ms 后),调度器工作;1、xPortSysTickHandlerSysTick 触发后,会调用到它的 ISR 函数xPortSysTickHandler,这个函数的实现和处理器体系架构相关,定义在 port.c:void xPortSysTickHandler( v..原创 2020-07-07 00:57:07 · 2461 阅读 · 0 评论 -
FreeRTOS --(9)任务管理之启动调度器
目录1、vTaskStartScheduler2、xPortStartScheduler3、vPortSetupTimerInterrupt4、prvStartFirstTask5、vPortSVCHandler在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并没有被调度起来,仅仅是创建了,如果想要真正的跑起来,那么还需要调用让调度器跑起来的函数:vTaskStartScheduler典型的用法是:xTaskCreate(.."task_1.原创 2020-07-01 16:05:08 · 4639 阅读 · 3 评论 -
FreeRTOS --(8)任务管理之创建任务
在《FreeRTOS --(7)任务管理之入门篇》文章基本分析了任务相关的轮廓后,我们知道使用什么接口来创建一个任务、怎么去开启调度器、以及根据宏配置,选择调度器的行为;接下来我们深入到 FreeRTOS 任务创建的源码来看看一个任务是怎么被创建的(某大神说过,Read The F**king Source Code ,能用代码解决的,尽量不 BB);1、描述任务的结构在 FreeRTOS 中,使用TCB_t 来描述一个任务:/* * Task control block. A t..原创 2020-06-30 20:24:17 · 2885 阅读 · 0 评论 -
FreeRTOS --(7)任务管理之入门篇
任务管理是操作系统中重中之重,不管什么 OS ,任务的调度管理都是核心,FreeRTOS 也是一样;在深入到 FreeRTOS 任务管理的源码之前,鄙人觉得有必要先去从全局的角度进行把握,从全局到局部,从粗线条,到细节,鄙人觉得这样方可更快的熟悉相关的内部原理;从全局来看的话,可以先梳理 FreeRTOS 关于任务相关的 APIs,支持的 Feature,以及相关的特性,这样一来,在深入到源码级分析的话,知道使用场景,便知道为何这样设计;分析基于 FreeRTOS V 10.3.1首先,Fr原创 2020-06-29 21:59:05 · 2340 阅读 · 0 评论 -
FreeRTOS --(6)内存管理 heap5
FreeRTOS 中的 heap 5 内存管理,相对于 heap 4《FreeRTOS --(5)内存管理 heap4》 只增加了对非连续内存区域的管理,什么叫非连续区域内存呢?比如一款芯片,它即支持了内部的 RAM,也支持了外挂 RAM,那么这两个内存就可能在地址上不是连续的,比如 RAM1、RAM2、RAM3,如下所示:针对这种情况,就可以使用 heap 5 来管理;不同于之前的 heap 管理,heap 5 引入了一个结构体来管理这些非连续的区域:typedef struct Hea原创 2020-06-14 22:26:49 · 3447 阅读 · 0 评论 -
FreeRTOS --(5)内存管理 heap4
FreeRTOS 中的 heap 4 内存管理,可以算是 heap 2 的增强版本,在 《FreeRTOS --(3)内存管理 heap2》中,我们可以看到,每次内存分配后都会产生一个内存块,多次分配后,会产生很多内存碎片,在较为复杂的场景(需要经常动态分配和释放场景)下,几乎是无法胜任;所以就有了 heap 4,它相比 heap 2 来说,提供了相邻空闲的内存块合并的功能,一定程度上减少了内存碎片,使得释放了的内存能够再度合并称为较为大的内存块,以供有大内存块的分配场景使用;1、内存大小.原创 2020-06-14 14:06:52 · 2830 阅读 · 1 评论 -
FreeRTOS --(4)内存管理 heap3
heap3 来说,是直接使用了 malloc 和 free 来直接替代自己的策略:原创 2020-06-11 00:19:20 · 815 阅读 · 0 评论 -
FreeRTOS --(3)内存管理 heap2
在《FreeRTOS --(2)内存管理 heap1》知道 heap 1 的内存管理其实只是简单的实现了内存对齐的分配策略,heap 2 的实现策略相比 heap 1 稍微复杂一点,不仅仅是提供了分配内存的接口,同时也提供了释放内存的接口;但是 heap 2 的内存分配策略中,并没有提供空闲内存的合并策略,对内存碎片没有处理;换句话来说,如果有多次的,大小各异的内存申请和释放的场景下,很可能导致很多内存碎片;1、内存大小和 heap 1 一样,用于内存管理的内存大小来自于一个大数组,数组的下标就原创 2020-06-11 00:17:22 · 1560 阅读 · 0 评论 -
FreeRTOS --(2)内存管理 heap1
FreeRTOS 提供了5种内存堆管理方案,分别对应heap1/heap2/heap3/heap4/heap5,提供内存管理是作为 OS 的一项基本功能,FreeRTOS 根据具体的使用场景,将内存管理按需切分成为了 5 部分,以供不同的场景来针对性使用;其实库函数的 malloc 和 free 已经是提供了内存的动态管理功能,但是呢介于一下几个原因:在嵌入式系统中,它们并不总是可以使用的; 它们会占用更多宝贵的代码空间; 它们没有线程保护; 它们不具有确定性(每次调用执行的时间可...原创 2020-06-09 00:37:09 · 1552 阅读 · 0 评论 -
FreeRTOS --(1)链表
Based On FreeRTOS KernelV10.3.11、相关文件链表结构是 OS 内部经常使用到的,FreeRTOS 自然也不例外,在深入分析各个模块的工作原理之前,首先来分析 FreeRTOS 的链表结构,和链表相关的代码被定义在:list.hlist.c2、数据结构...原创 2020-06-06 01:02:08 · 1963 阅读 · 1 评论 -
FreeRTOS --(0)简介
FreeRTOS 是一个嵌入式实时操作系统,具有相对(相对 Linux、Windows等)较小的体积,使用精简的代码实现了简单的进程调度,内存管理,消息发送,等,常常用在一些需要支持多任务的 MCU 上;在没有 RTOS 的嵌入式小系统中,代码都跑在 while 1 中,我们称之为 “裸机”,也没有任务的概念;而 RTOS 的出现,使得可以支持多任务执行(宏观并行,微观串行),任务与任务,中断与任务,之间可以通过消息传递数据;RTOS(Real Time Operation System)实时操作系原创 2020-06-04 23:25:46 · 1479 阅读 · 0 评论