10 爱洋葱

尚未进行身份认证

我要认证

真正的男人就像孤独的 ROSHAN ,即使被伤的再深,都会再一次爬起来并且把不朽的祝福送给那个曾经伤害过他的人

等级
TA的排名 1w+

FreeRTOS --(17)任务通知浅析

之前聊到,FreeRTOS 可以通过信号量(二值信号量和计数信号量)、队列、事件组来同步任务与任务,任务与中断;在 FreeRTOS 中,还有一个东西也可以用作任务与任务,中断与任务的同步,它叫任务通知(Task Notifications);如果我们通过信号量、队列、事件组的形式来同步,在 FreeRTOS 中,叫通过了一个Communication Object;也就是说通过了一个用于连续接收方和发送方的中间模块;FreeRTOS 的任务通知(Task Notifications),..

2020-07-21 00:03:35

FreeRTOS --(16)资源管理之临界区

临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为:读->改->写;在不带 OS 的系统下,普通代码希望对某个寄存器进行读->改->写,此刻,一个 IRQ 打断了这个操作,也同时对这个寄存器进行读->改->写,中断返回,后,普通代码又继续进行,这样就会导致逻辑错误;在带 OS 的情况下,不光是有 IRQ,而且存在任务切换,这样,同一个资源在 ISR 和不同任务之间修改,这造成了临界区;临界区的资源需要保护起来,临界区保护的不是代码,而是数据;.

2020-07-17 11:57:53

FreeRTOS --(15)信号量之概述

FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步;针对不同的应用场景,信号量分为两种:1、二值信号量;2、计数信号量;1、二值信号量1.1、Usage顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.

2020-07-16 00:20:17

FreeRTOS --(14)队列管理之概述

在任何的 OS 中,都需要支持任务与任务,中断与任务之间的数据传输机制,在 FreeRTOS 中,这种数据传输的方式被称之为队列(Queue);队列是一个 FIFO 模型,在创建一个队列用于数据传递的时候,需要指定队列的长度,创建完队列,便可以使用它进行数据传递;一个简单的例子:有两个任务 A 和 B,任务 A 将数据传递进队列,任务 B 作为接收端,从队列中获取数据:1、下面是创建了一个长度为 5 的队列:2、此刻任务 A 写一个数据 10 到 Queue:3、任务 A 在写一

2020-07-10 18:02:35

FreeRTOS --(13)任务管理之空闲任务

创建完毕任务,启动调度器,任务控制,系统 SysTick 来临后判断是否需上下文切换;如果没有其他任务执行的情况下,FreeRTOS 的 Idle 任务将被调度投入运行;在启动调度器的时候,Idle 任务就被创建了,优先级为最低 0;void vTaskStartScheduler( void ){.....................xReturn = xTaskCreate( prvIdleTask, configIDLE_TAS

2020-07-07 19:24:09

FreeRTOS --(12)任务管理之任务切换

现在创建任务(xTaskCreate)、启动调度器(vTaskStartScheduler),都分析完成了,SysTick,PendSV 中断已经使能,接下来第一个任务便可以自由的奔跑;等待下一次 SysTick 来临(1ms 后),调度器工作;1、xPortSysTickHandlerSysTick 触发后,会调用到它的 ISR 函数xPortSysTickHandler,这个函数的实现和处理器体系架构相关,定义在 port.c:void xPortSysTickHandler( v..

2020-07-07 00:57:07

FreeRTOS --(11)任务管理之系统节拍

前面有了创建任务、启动调度器、任务控制,接下来便开始分析一个 Tick 到来之后,FreeRTOS 即将有什么行为;在启动调度器的时候,就已经配置好了 SysTick,它作为 OS 的心跳,每隔一个固定周期来一次 SysTick 中断,来驱动 OS 做事(任务调度);以 STM32 为例,定义的configTICK_RATE_HZ 为 1000,由《FreeRTOS --(9)任务管理之启动调度器》得知,系统节拍时钟周期为1ms;不同的处理器结构可能有所区别,所以他是需要移植的部分,在 p.

2020-07-06 21:16:32

FreeRTOS --(10)任务管理之任务延时

在《FreeRTOS --(7)任务管理之入门篇》中讲过,如果有几个任务同时跑,但是又都不阻塞的话,那么最高优先级的任务将会占领整个 CPU,因为每次都会调度到它,一直处于 Ready 状态,所以呢,调度器每次都要选择优先级最高的任务来让它执行;所以,不管怎么样,任务做完自己该做的事情,就应该进入阻塞状态,等待下次该自己做任务的时候,在占领 CPU,这样既可以让 Idle 线程,在系统空闲的时候跑,也可以让让任务在合理的时间占领 CPU;之前也说过,让任务进入阻塞状态的方式有两种:1、让任务延时:

2020-07-05 20:22:19

FreeRTOS --(9)任务管理之启动调度器

目录1、vTaskStartScheduler2、xPortStartScheduler3、vPortSetupTimerInterrupt4、prvStartFirstTask5、vPortSVCHandler在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并没有被调度起来,仅仅是创建了,如果想要真正的跑起来,那么还需要调用让调度器跑起来的函数:vTaskStartScheduler典型的用法是:xTaskCreate(.."task_1.

2020-07-01 16:05:08

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

FreeRTOS --(7)任务管理之入门篇

任务管理是操作系统中重中之重,不管什么 OS ,任务的调度管理都是核心,FreeRTOS 也是一样;在深入到 FreeRTOS 任务管理的源码之前,鄙人觉得有必要先去从全局的角度进行把握,从全局到局部,从粗线条,到细节,鄙人觉得这样方可更快的熟悉相关的内部原理;从全局来看的话,可以先梳理 FreeRTOS 关于任务相关的 APIs,支持的 Feature,以及相关的特性,这样一来,在深入到源码级分析的话,知道使用场景,便知道为何这样设计;分析基于 FreeRTOS V 10.3.1首先,Fr

2020-06-29 21:59:05

Cortex-M3 处理器窥探

...

2020-06-28 20:50:06

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

FreeRTOS --(5)内存管理 heap4

FreeRTOS 中的 heap 4 内存管理,可以算是 heap 2 的增强版本,在 《FreeRTOS --(3)内存管理 heap2》中,我们可以看到,每次内存分配后都会产生一个内存块,多次分配后,会产生很多内存碎片,在较为复杂的场景(需要经常动态分配和释放场景)下,几乎是无法胜任;所以就有了 heap 4,它相比 heap 2 来说,提供了相邻空闲的内存块合并的功能,一定程度上减少了内存碎片,使得释放了的内存能够再度合并称为较为大的内存块,以供有大内存块的分配场景使用;1、内存大小.

2020-06-14 14:06:52

FreeRTOS --(4)内存管理 heap3

heap3 来说,是直接使用了 malloc 和 free 来直接替代自己的策略:

2020-06-11 00:19:20

FreeRTOS --(3)内存管理 heap2

在《FreeRTOS --(2)内存管理 heap1》知道 heap 1 的内存管理其实只是简单的实现了内存对齐的分配策略,heap 2 的实现策略相比 heap 1 稍微复杂一点,不仅仅是提供了分配内存的接口,同时也提供了释放内存的接口;但是 heap 2 的内存分配策略中,并没有提供空闲内存的合并策略,对内存碎片没有处理;换句话来说,如果有多次的,大小各异的内存申请和释放的场景下,很可能导致很多内存碎片;1、内存大小和 heap 1 一样,用于内存管理的内存大小来自于一个大数组,数组的下标就

2020-06-11 00:17:22

FreeRTOS --(2)内存管理 heap1

FreeRTOS 提供了5种内存堆管理方案,分别对应heap1/heap2/heap3/heap4/heap5,提供内存管理是作为 OS 的一项基本功能,FreeRTOS 根据具体的使用场景,将内存管理按需切分成为了 5 部分,以供不同的场景来针对性使用;其实库函数的 malloc 和 free 已经是提供了内存的动态管理功能,但是呢介于一下几个原因:在嵌入式系统中,它们并不总是可以使用的; 它们会占用更多宝贵的代码空间; 它们没有线程保护; 它们不具有确定性(每次调用执行的时间可...

2020-06-09 00:37:09

FreeRTOS --(1)链表

Based On FreeRTOS KernelV10.3.11、相关文件链表结构是 OS 内部经常使用到的,FreeRTOS 自然也不例外,在深入分析各个模块的工作原理之前,首先来分析 FreeRTOS 的链表结构,和链表相关的代码被定义在:list.hlist.c2、数据结构...

2020-06-06 01:02:08

FreeRTOS --(0)简介

FreeRTOS 是一个嵌入式实时操作系统,具有相对(相对 Linux、Windows等)较小的体积,使用精简的代码实现了简单的进程调度,内存管理,消息发送,等,常常用在一些需要支持多任务的 MCU 上;在没有 RTOS 的嵌入式小系统中,代码都跑在 while 1 中,我们称之为 “裸机”,也没有任务的概念;而 RTOS 的出现,使得可以支持多任务执行(宏观并行,微观串行),任务与任务,中断与任务,之间可以通过消息传递数据;RTOS(Real Time Operation System)实时操作系

2020-06-04 23:25:46

ZYNQ 中断子系统

ZYNQ-7000 带双核 Cortex-A9 处理器的 7020 芯片,PS 端集成的是 GIC 中断控制器;

2020-05-13 21:24:33

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 签到王者
    签到王者
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证
    技术圈认证
    用户完成年度认证,即可获得
  • 阅读者勋章Lv3
    阅读者勋章Lv3
    授予在CSDN APP累计阅读博文达到30天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。