首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

FreeRTOS学习笔记 | 基础知识体系梳理

Blocked—阻塞态 由于等待信号量,消息队列,事件标志组等而处于状态被称之为阻塞态,另外任务调用延迟函数也 会处于阻塞态。...这里优先级分配方案是我们推荐一种方式,实际项目也可以采用这种方法。调试出适合项目需求才是最好。...Task2 会一直运行直到遇到系统阻塞 API 函数,比如延迟,事件标志等待,信号量等待,Task2任务会被挂起,继而执行就绪列表中下一个最高优先级任务。...默认情况下,此宏定义已经 FreeRTOS.h 文件里面使能了,用户可以不用在FreeRTOSConfig.h 文件中再单独使能。...时间延时 FreeRTOS时间延迟函数主要有以下两个作用: 为周期性执行任务提供延迟

88810

FreeRTOS 消息队列

, 如果队列已经满了, 直接返回阻塞。...开头提到过 FreeRTOS 信号量,互斥锁也是基于队列实现, 而这个函数第三个参数作用用于指定创建对象类型, 这个类型变量主要用于调试。...对于正常情况下, 数据可以插入队列, 调用拷贝函数将新数据保存到队列队列项存储区域, 更新队列相关指针和参数, 对于拷贝函数队列作为互斥锁时, 发送消息实际上就是释放锁, 而互斥锁为了避免任务优先级反转...中断中调用发送函数 相比在任务中调用发送函数中断中调用函数会更加简单一些, 没有任务阻塞操作。...遇到队列满情况, 函数会直接返回, 而不是阻塞等待, 因为中断中阻塞是不允许!!!

2.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

FreeRTOS(八):列表列表

那是因为有些情况下我们不需要列表项这么全功能,可能只需要其中某几个成员变量,如果此时用列表项的话会造成内存浪费!...4、列表初始化 新创建或者定义列表需要对其做初始化处理,列表初始化其实就是初始化列表结构体List_t 中各个成员变量,列表初始化通过使函数 vListInitialise() 来完成,此函数...5、列表项初始化 同列表一样,列表使用时候也需要初始化,列表项初始化由函数 vListInitialiseItem() 来完成。...9、列表遍历 介绍列表结构体时候说过列表 List_t 中成员变量 pxIndex 是用来遍历列表FreeRTOS提供了一个函数来完成列表遍历,这个函数是 listGET_OWNER_OF_NEXT_ENTRY...每调用一次这个函数列表 pxIndex 变量就会指向下一个列表项,并且返回这个列表 pxOwner变量值。这个函数本质上是一个宏,这个宏文件 list.h 中定义。

2K40

韦东山freeRTOS系列教程之【第十一章】中断管理(Interrupt Management)

怎么切换任务 11.2 中断延迟处理 11.3 中断与任务间通信 概述 RTOS中,需要应对各类事件。...由硬件决定 ISR优先级高于任务:即使是优先级最低中断,它优先级也高于任务。任务只有没有中断情况下,才能执行。...在任务中调用:需要指定超时时间,表示如果不成功就阻塞一会 ISR中调用:不需要指定超时时间,无论是否成功都要即刻返回 如果强行把两套函数揉在一起,会导致参数臃肿、无效 移植FreeRTOS时,..."FromISR"函数 反过来就不行,非FromISR函数无法ISR中使用 第三方库函数也许会提供OS抽象层,自行判断当前环境是在任务还是ISR中,分别调用不同函数 11.1.2 两套API函数列表...t4:任务2处理完中断后,进入阻塞态以等待下一个中断,任务1重新运行 11.3 中断与任务间通信 前面讲解过队列、信号量、互斥量、事件组、任务通知等等方法,都可使用。

1.9K71

FreeRTOS源码探析之——事件标志组

调用此函数任务离开阻塞状态到退出函数 xEventGroupWaitBits 之间这段时间,如果一个高优先级任务抢占执行了,并且修改了事件标志位,那么此函数返回值会跟当前事件标志组数值不同...在这里访问事件列表是安全,因为它是事件组一部分——中断直接访问事件组(相反,它们通过挂起任务级别的函数调用来间接访问事件组) */ vListInsertEnd( pxEventList,...*/ xReturn = pdTRUE; /* 在用户没有使用ISR安全FreeRTOS函数“xHigherPriorityTaskWoken”参数情况下,...为了不在中断服务程序中执行,就通过此函数FreeRTOS daemon 任务(即软件定时器任务)发送消息, daemon 任务中执行事件标志置位操作。...xEventGroupClearBits手动清除) 4 总结与注意事项 事件标志组可以指定要等待哪些事件,但如果是其它事件触发了,等待超时后,这些希望等待事件也会在超时后作为等待返回结果 由于函数

1K20

FreeRTOS源码探析之——任务调度相关

全局变量会产生不可重入函数造成逻辑混乱 RTOS运行时,CPU是各个任务间跳来跳去,若使用全局变量恰当,会导致原本设计逻辑产生混乱。...流缓冲区(StreamBuffer):队列基础上,优化一种更适合数据结构,可以一次写入任意数量字节,并且可以一次读取任意数量字节。...3.2 调度器 FreeRTOS中提供任务调度器是基于优先级抢占式调度:系统中除了中断处理函数、调度器上锁部分代码和禁止中断代码是不可抢占之外,系统其他部分都是可以抢占。...5 FreeRTOS任务调度相关源码 5.1 任务控制块TCB_t FreeRTOS对各个任务进行调度,首先需要一种方式来访问和控制各个任务,任务控制块就可以实现这种功能,它本质是一个结构体,记录了任务堆栈指针...,恢复调度器之前,不会被放置就绪列表中或从阻塞列表中删除 此任务不能出现在事件列表中,因为它是当前正在执行任务。

1.3K21

FreeRTOS系列第9篇---FreeRTOS任务概述基础篇

通常情况下,协程仅用在资源非常少微处理器中,特别是RAM非常稀缺情况下。 目前协程很少被使用到,因此对于协程FreeRTOS作者既没有把它删除也没有进一步开发。...如果你想将任务程序功能运行在空闲优先级上,可以有两种选择: 一个空闲任务钩子中实现这个功能:因为FreeRTOS必须至少有一个任务处于就绪或运行状态,因此钩子函数不可以调用可能引起空闲任务阻塞API...使用FreeRTOS-MPU情况下,使用xTaskCreate()函数可以创建运行在特权模式或用户模式(见下面对函数参数uxPriority描述)任务。...xTaskCreateRestricted()函数具有更大灵活性。 6.2参数描述 「pvTaskCode」:指针,指向任务函数入口。任务永远不会返回(位于死循环)。...任务删除后将会从就绪、阻塞、暂停和事件列表中移除。文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。

1.5K40

FreeRTOS源码探析之——消息队列

任务或者中断服务程序都可以给消息队列发送消息,当发送消息时: 如果队列未满或者允许覆盖入队,FreeRTOS会将消息拷贝到消息队列队尾 否则(队列已满),会根据用户指定阻塞超时时间进行阻塞,在这段时间中...那么,如何实现这个机制呢,其实FreeRTOS已经为我们做好了,每个对消息队列读写函数,都有这种机制,我称之为阻塞机制。...,需要调用在中断中发送消息API函数接口,因为发送消息上下文环境是中断中,不允许有阻塞情况。...,可能会进行阻塞延时(发送消息但队列已满,结束消息但队列中没有消息),此时会进行任务切换,关于任务切换内容可参考: FreeRTOS源码探析之——任务调度相关 3.1 发送消息队列函数 xQueueSend...——在这种情况下,不会导致上下文切换,除非也等待一个更高优先级任务就绪列表 */ if( xTaskResumeAll() == pdFALSE

62410

韦东山freeRTOS系列教程之【第七章】互斥量(mutex)

本章涉及如下内容: 为什么要实现互斥操作 怎么使用互斥量 互斥量导致优先级反转、优先级继承 7.1 互斥量使用场合 多任务系统中,任务A正在使用某个资源,还没用完情况下任务B也来使用的话...上述问题解决方法是:任务A访问这些全局变量、函数代码时,独占它,就是上个锁。这些全局变量、函数代码必须被独占地使用,它们被称为临界资源。...但是FreeRTOS未实现这点:任务A占有互斥量情况下,任务B也可释放互斥量。 7.2 互斥量函数 7.2.1 创建 互斥量是一种特殊二进制信号量。 使用互斥量时,先创建、然后去获得、释放它。...本节代码为: FreeRTOS_16_mutex_who_give 。 main函数创建了2个任务: 任务1:高优先级,一开始就获得互斥锁,永远释放。...程序运行结果如下图所示: 7.5 示例17: 优先级反转 假设任务A、B都想使用串口,A优先级比较低: 任务A获得了串口互斥量 任务B也想使用串口,它将会阻塞、等待A释放互斥量 高优先级任务,被低优先级任务延迟

1K50

FreeRTOS介绍与源码结构分析

相比于计算机中用到Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式处理多个任务时实时性不高问题。...这种使用大循环程序运行方式也叫轮询系统,加上中断处理函数后又称前后台系统,中断处理称作前台,无限循环称作后台。...多任务系统 多任务系统是将各个处理模块编写为单独任务,每个任务本身是个无限循环,程序运行初期会创建各个子任务,通过任务调度方式,利用各任务阻塞时刻不断切换运行各个任务,达到一种看起来是多个任务同时运行一种效果...FreeRTOS文件夹中主要关注source文件夹,这里是FreeRTOS全部源码,包括6个c文件和include文件夹下多个h文件。...: 列表FreeRTOS一种基础数据结构 queue.c : 队列相关 tasks.c : 任务创建、挂起、恢复、调度相关 timers.c : 软件定时器相关 另外在Demo文件夹下还需要用到一个

1.9K20

FreeRTOS(十五):任务通知

FreeRTOS 每个任务都有一个 32 位通知值,任务控制块中成员变量 ulNotifiedValue 就是这个通知值。...也可以更新接收任务任务通知值,任务通知可以通过如下方法更新接收任务通知值: ● 覆盖接收任务通知值(如果上次发送给接收任务通知还没被处理)。 ● 覆盖接收任务通知值。...● 更新接收任务通知值一个或多个 bit。 ● 增加接收任务通知值。 合理、灵活使用上面这些更改任务通知值方法可以一些场合中替代队列、二值信号量、计数型信号量和事件标志组。...假如接收任务因为等待任务通知而阻塞的话那么接收到任务通知以后就会解除阻塞态。...此函数文件 tasks.c 中定义。

1.1K40

嵌入式随记 —— 调度器

调度器共有特征 调度器有很多种类,但所有的调度器都有以下共同特征: ① 调度器可以区分就绪态任务和挂起任务(由于延迟,信号量等待,邮箱等待,事件组等待等原因而使得任务被挂起)。...① 抢占式调度,每个任务都有不同优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞 API 函数,比如 vTaskDelay(延时函数)。...② 时间片调度,每个任务都有相同优先级,任务会运行固定时间片个数或者遇到阻塞 API 函数,比如vTaskDelay,才会执行同优先级任务之间任务切换 抢占式调度器 实际应用中,不同任务需要不同响应时间... FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户FreeRTOSConfig.h 文件中使能宏定义: #define configUSE_TIME_SLICING 1...默认情况下,此宏定义已经 FreeRTOS.h 文件里面使能了,用户可以不用在 FreeRTOSConfig.h 文件中再单独使能。

19410

FreeRTOS源码探析之——软件定时器

2 软件定时器工作原理 通过查看FreeRTOS源码,可以发现,软件定时器运行原理实际是FreeRTOS 通过一个 prvTimerTask任务(也叫守护任务Daemon)管理软定时器,它是启动调度器时自动创建...2.1 任务调度器函数创建Daemon任务 main函数最后会启动FreeRTOS任务调度函数函数中会创建软件定时器任务(即Daemon守护任务),并且可以看到是通过宏定义方式选择编译: /...2.2 创建Daemon任务 软件定时器任务(Daemon任务)创建是通过xTaskCreate方法来创建,创建守护任务之前,还要先通过prvCheckForValidListAndQueue函数创建两个列表和一个消息队列...,现在回到重点,回顾2.2xTimerCreateTimerTask()函数创建列表与消息队列后,会使用xTaskCreate方法来创建软件定时器任务prvTimerTask(),该任务实体具体内容如下...软件定时器回调函数中应快进快出,绝对不允许使用任何可能引软件定时器起任务挂起或者阻塞API接口,回调函数中也绝对不允许出现死循环。

1.2K10

深入探索Java集合框架

此链接列表定义了迭代顺序,即按照将元素插入到集合中顺序(插入顺序)进行迭代。LinkedHashSet迭代访问方面比HashSet更快,但需要更多内存。...此链接列表定义了迭代顺序,即按照将键-值对插入到映射中顺序(插入顺序)或访问顺序进行迭代。因此,LinkedHashMap迭代访问方面比HashMap更快,但需要更多内存。...三、迭代迭代器(Iterator)是Java集合框架中一个关键概念。它提供了一种方法来访问集合中每个元素,而无需暴露该集合底层表示。...当队列已满时,添加操作线程会被阻塞;当队列为空时,移除操作线程会被阻塞。 DelayQueue:一个支持延迟获取阻塞队列。队列中元素只有达到指定延迟时间后才能被获取。...如果尝试获取未达到延迟时间元素,获取操作线程会被阻塞。 2.

12210

韦东山freeRTOS系列教程之【第三章】任务管理

3.2 任务创建与删除 3.2.1 什么是任务 FreeRTOS中,任务就是一个函数,原型如下: void ATaskFunction( void *pvParameters ); 要注意是: 这个函数不能返回...实际产品中,我们不会让一个任务一直运行,而是使用"事件驱动"方法让它运行: 任务要等待某个事件,事件发生后它才能运行 等待事件过程中,它不消耗CPU资源 等待事件过程中,这个任务就处于阻塞状态...,母亲可以暂停: 好烦啊,我暂停一会 领导说:你暂停一下 FreeRTOS任务也可以进入暂停状态,唯一方法是通过vTaskSuspend函数。...:指定是任务执行间隔、周期 3.6 空闲任务及其钩子函数 3.6.1 介绍 FreeRTOS_03_delete_task实验里,我们体验过空闲任务(Idle任务)作用:释放被删除任务内存...在这种情况下,我们说用户任务"抢占"(pre-empt)了空闲任务,这是由调度器实现

97330

使用FreeRTOS要好好理解任务状态机

前面一文利用FreeRTOS点灯,算是将FreeRTOS给跑起来了,要用好RTOS,从黑盒角度去理解一下调度器是怎么工作是很必要,当然如果想研究其内部实现原理,可以去读其内部实现代码,但是个人感觉如果是从用角度...需要注意区分是:阻塞态与暂停态是两回事,暂停是被移除调度列表,除非被人为恢复进任务调度表。而阻塞态,当阻塞事件解除,会自动进入就绪态,从而有机会被调度器换入CPU进而运行。...阻塞事件基本可以分成两类: 时间事件:比如vTaskDelay调用,任务将延迟一定时间,一旦该函数被调用,该任务就被阻塞,直到延迟时间结束会进入就绪态。...应用例子:比如某个需要固定周期执行任务,就可以在任务应用代码执行完后调用这个延迟函数,出让CPU。让其他任务有机会被转载运行。...,等待某一个消息或者事件时候,将该任务阻塞而不是裸奔查询等待,本质上就是为了提高CPU利用率

1.1K30

韦东山freeRTOS系列教程之【第九章】任务通知(Task Notifications)

比队列、信号量、事件组都有大优势。 更节省内存:使用其他方法时都要先创建对应结构体,使用任务通知时无需额外创建结构体。...9.2.1 两类函数 任务通知有2套函数,简化版、专业版,列表如下: 简化版函数使用比较简单,它实际上也是使用专业版函数实现 专业版函数支持很多参数,可以实现很多功能 简化版 专业版 发出通知 xTaskNotifyGivevTaskNotifyGiveFromISR...,表示有数据了、待处理 可以使用ulTaskNotifyTake函数来取出通知值: 如果通知值等于0,则阻塞(可以指定超时时间) 当通知值大于0时,任务从阻塞态进入就绪态 ulTaskNotifyTake...很多ISR函数中,这个参数作用都是类似的,使用场景如下: 被通知任务,可能正处于阻塞状态 xTaskNotifyFromISR函数发出通知后,会把接收任务从阻塞状态切换为就绪态 如果被唤醒任务优先级...xTaskNotifyWait函数列表如下: 参数 说明 ulBitsToClearOnEntry xTaskNotifyWait入口处,要清除通知值哪些位?

1.6K40

【干货】用FreeRTOS搭建Event-Driven应用框架

Event-DrivenEvent计算机编程方法中,是一种广为使用编程范式。...GUI编程中,这是一种主要编程范式。 其基本结构可以用下面这张图来描述: ?...一旦需求稍有变动,可能就需要比较大修改。现代编程方法论中,软件复杂度越来越大,传统过程方法不能满足复杂软件需求,可维护性很差。用户与软件交互体验也很差。...中断中发送 比如是一个中断需要对该任务发送事件0,就可以该中断函数如下发送事件: void xxx_ISR(void) { .......如果调用API函数导致任务离开阻塞状态,并且未阻塞任务优先级等于或高于当前正在执行任务(被中断任务),那么API内部函数会将 *pxHigherPriorityTaskWoken设置为真。

1.2K51

最全java多线程总结3——了解阻塞队列和线程安全集合

队列满,阻塞 remove 移出并返回头元素 队列空,抛出 NoSuckElementException 异常 take 移出并返回头元素 队列空,则阻塞 上面的方法主要分成了三类,第一类:异常情况下抛出异常...可选指定是否需要公平性,如果设置了公平性,等待了最长时间线程会优先得到处理,但是会降低性能。 延迟队列   DelayQueue 也是阻塞队列一种,不过它要求队列中元素实现Delayed接口。...需要重新两个方法: long getDelay(TimeUnit unit)返回延迟时间,负值表示延迟结束,只有延迟结束情况下,元素才能从队列中移出。...,不过处理键 map.merge(key,value,(existingValue,newValue)->existingValue+newValue+1) 批操作   java8 引入,即使有其他线程处理映射...当构建一个迭代器时,迭代器指向是当前数组引用,如果后来数组被修改了,迭代器指向任然是旧数组。

1.1K30
领券