FreeRTOS操作系统
文章平均质量分 83
FreeRTOS操作系统学习
留小乙
这个作者很懒,什么都没留下…
展开
-
FreeRTOS任务通知
从FreeRTOSv8.2.0版本开始,FreeRTOS新增了任务通知(Task Notifictions)这个功能,可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高。一、任务通知简介任务通知在FreeRTOS中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS定义为1。FreeRTOS的每个任务都有一个32位的通知值,任务控制块中的成员变量ulNotifiedValue就是这个通知值。任务通知是一个事件,假如某原创 2021-10-29 09:26:35 · 4016 阅读 · 3 评论 -
FreeRTOS内存管理
一、内存管理简介FreeRTOS创建任务、队列、信号量等的时候有两种方法,一种是动态的申请所需的RAM。一种是由用户自行定义所需的RAM,这种方法也叫静态方法,使用静态方法的函数一般以"Static"结尾,比如任务创建函数xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈。使用动态内存管理的时候FreeRTOS内核在创建任务、队列、信号量的时候会动态的申请RAM。标准C库中的malloc()和free()还是也可以实现动态内存管理,但是如下原因限制了其使用:1、在原创 2021-10-28 19:09:06 · 2074 阅读 · 1 评论 -
FreeRTOS事件标志组
信号量来同步的话任务只能与单个的事件或任务进行同步。有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了。FreeRTOS为此提供了一个可选的解决方法,那就是事件标志组。一、事件标志组简介1、事件位(事件标志)事件位用来表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子:当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置1,当队列中没有消息需要处理的时候就可以将这个位(标志)置0。当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置1,当没有原创 2021-10-28 15:27:46 · 1102 阅读 · 0 评论 -
FreeRTOS软件定时器
一、软件定时器简介1、软件定时器概述软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。2、回调函数的注意事项软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任何会阻塞任务的API函数!比如,定时器回调函数中千万不能调用vTaskDelay()、vTaskDelayUnti(),还有一些访问队列或者信号量的非零原创 2021-10-27 21:08:53 · 5051 阅读 · 1 评论 -
FreeRTOS信号量详解第四讲(全网最全)——互斥信号量
一、互斥信号量简介互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一个钥匙,当任务想要使用资源的时候就必须先获得这个钥匙,当使用完资源以后就必须归还这个钥匙,这样其他的任务就可以拿着这个钥匙去使用资源。互斥信号量使用和二值信号量相同的API操作函数,所以互斥信号量也可以设置阻塞时间,不同于二值信号量的是互斥信号量具有优先级继承的特性。当一个互斥信号量正在被一个低优先原创 2021-10-26 14:36:38 · 7308 阅读 · 1 评论 -
FreeRTOS——优先级翻转
一、优先级翻转在使用二值信号量的时候会遇到很常见的一个问题——优先级翻转,优先级翻转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。二、优先级翻转流程图(1)任务H和任务M处于挂起状态,等待某一事件的发生,任务L正在运行。(2)某一时刻任务L想要访问共享资源,原创 2021-10-25 20:29:13 · 1824 阅读 · 1 评论 -
FreeRTOS信号量详解第三讲(全网最全)——计数信号量
一、计数型信号量简介有些资料中也将计数型信号量叫做数值信号量,二值信号量相当于长度为1的队列,那么计数型信号量就是长度大于1的队列。**同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关心队列是否为空即可。**计数型信号量通常用于如下两个场合:1、事件计数在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减一,信号量值就是队列结构体成员变量uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始原创 2021-10-25 19:45:45 · 872 阅读 · 0 评论 -
FreeRTOS信号量详解第二讲(全网最全)——二值信号量
一、二值信号量简介二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号另更适合用于同步(任务与任务或任务与中断的同步),而互斥信号量适合用于简单的互斥访问。和队列一样,信号量API函数允许设置一个阻塞时间,阻塞时间是当任务获取信号量的时候由于信号量无效从而导致任务进入阻塞态的最大时钟节拍数。如果多个任务同时阻塞在同一个信号量上的话那么优先级最高的那个任务优先获得信号量,这样当信号量有效的时候高优先级原创 2021-10-25 14:48:35 · 6364 阅读 · 4 评论 -
FreeRTOS信号量详解第一讲(全网最全)——概述
一、信号量信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。不同的信号量其应用场景不同,但有些应用场景是可以互换着使用的。二、信号量简介信号量常常用于控制对共享资源的访问和任务同步。举一个很常见的例子,某个停车场有100个停车位,这100个停车位大家都可以用,对于大家来说这100个停车位就是共享资源。假设现在这个停车场正常运行,你要把车停到这个这个停车场肯定要先看一下现在停了多少车了?还有没有停车位原创 2021-10-24 21:02:25 · 1228 阅读 · 0 评论 -
FreeRTOS消息队列详解第五讲(全网最全)——队列读取消息
一、消息队列读取消息有消息入队就有出队,出队就是从队列中获取队列项(消息),FreeRTOS中出队函数如下表所示:1、函数xQueueReceive()此函数用于在任务中从队列中读取一条(请求)消息,读取成功以后就会将队列中的这条数据删除,此函数的本质是一个宏,真正执行的函数是xQueueGenericReceive()。此函数在读取消息的时候是采用拷贝方式的,所以用户需要提供一个数组或缓冲区来保存读取到的数据,所读取的数据长度是创建队列的时候所设定的每个队列项目的长度,函数原型如下:BaseTy原创 2021-10-24 15:59:09 · 8892 阅读 · 1 评论 -
FreeRTOS消息队列详解第四讲(全网最全)——队列上锁解锁
一、队列上锁在任务级通用入队函数和中断级通用入队函数的时候都提到了队列的上锁和解锁,队列的上锁API函数为prvLockQueue()。首先来看一下队列上锁函数prvLockQueue(),此函数本质上就是一个宏,定义如下:#define prvLockQueue( pxQueue ) \ taskENTER_CRITICAL(); \ { \ if( ( pxQueue )->cRxLock == queueUNLOCKED )原创 2021-10-24 15:16:02 · 2701 阅读 · 3 评论 -
FreeRTOS消息队列详解第三讲(全网最全)——队列发送消息
一、队列发送消息函数简介创建好队列以后就可以向队列发送消息了,FreeRTOS提供了8个向队列发送消息的API函数。如下表所示:1、函数xQueueSend()、xQueueSendToBack()和xQueueSendToFront()这三个函数都是用于向队列中发送消息的,这三个函数本质都是宏,其中函数xQueueSend()和xQueueSendToBack()是一样的,都是后向入队,即将新的消息插入到队列的后面。函数xQueueSendToToFront()是前向入队,即将新消息插入到队列的前原创 2021-10-24 14:43:43 · 13265 阅读 · 0 评论 -
FreeRTOS消息队列详解第二讲(全网最全)——队列创建
今天主要来讲讲消息队列相关的API。一、队列创建1、函数xQueueCreate()该函数本质上是一个宏,用来动态创建队列,该宏最终调用的是函数xQueueGenericCreate(),函数原型如下:xQueueCreate( uxQueueLength, uxItemSize )参数描述uxQueueLength要创建的队列的队列长度,这里是队列的项目数。uxItemSize队列中每个项目(消息)的长度,单位为字节返回值队列创捷成功以后返回的队列句柄!原创 2021-10-23 11:14:59 · 6496 阅读 · 0 评论 -
FreeRTOS消息队列详解第一讲(全网最全)——消息队列概述
一、队列简介队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。 任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。FreeRTOS中的信号量的也是依据队列实现的!所以有必要深入的了解FreeRTOS的队列。1、数据存储通常队列采用先进先出(FIFO)的存储缓冲机制,原创 2021-10-22 20:49:13 · 14190 阅读 · 0 评论 -
FreeRTOS内核控制函数介绍
一、内核控制函数预览FreeRTOS中有一些函数只供系统内核使用,用户应用程序一般不允许使用,这些API函数就是系统内核控制函数。在FreeRTOS的官网(https://www.freertos.org)可以查到这些函数。函数描述taskYIELD()任务切换taskENTER_CRITICAL()进入临界区,用于任务中taskEXIT_CRITICAL()退出临界区,用于任务中taskENTER_CRITICAL_FROM_ISR()进入临界区,用于中原创 2021-10-22 18:41:10 · 271 阅读 · 0 评论 -
FreeRTOS时间片调度
一、FreeRTOS时间片调度概述FreeRTOS支持多个任务同时拥有一个优先级,这些任务的调度就可以使用时间片来进行调度。在FreeRTOS中允许一个任务允许一个时间片(一个时钟节拍的长度)后让出CPU的使用权,让拥有同优先级的下个任务运行。下图展示了运行在同一优先级的执行时间图。其中的task1、task2、task3是同一优先级N就绪的任务。1、任务3正在运行。2、这时一个时钟节拍中断(滴答定时器中断)发生,任务3的时间片用完,但是任务3还没有执行完。3、FreeRTOS将任务切换到任务1原创 2021-10-22 16:41:54 · 7818 阅读 · 0 评论 -
FreeRTOS任务创建过程详解(全网最细)
一、任务创建函数分析FreeRTOS的任务创建由函数xTaskCreate()完成。函数源码如下:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * co原创 2021-10-21 21:14:30 · 6564 阅读 · 2 评论 -
FreeRTOS列表和列表项(2)
今天继续来介绍FreeRTOS中的列表和列表项。主要是介绍列表和列表项的API。一、列表初始化新创建或者定义的列表需要对其做初始化处理,列表的初始化其实就是初始化列表结构体List_t中的各个成员变量,列表的初始化通过使函数vListInitialise()来完成,此函数在list.c中有定义,函数如下:void vListInitialise( List_t * const pxList ){ pxList->pxIndex = ( ListItem_t * ) &( pxLi原创 2021-10-21 10:42:17 · 393 阅读 · 0 评论 -
FreeRTOS列表和列表项(1)
一、什么是列表和列表项1、列表列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西都在文件list.c和list.h中。在list.h中定义了一个叫List_t的结构体,如下:typedef struct xLIST{listFIRST_LIST_INTEGRITY_CHECK_VALUE (1)configLIST_VOLATILE UBaseType_t uxNumberOfItems原创 2021-10-19 21:39:30 · 352 阅读 · 0 评论 -
FreeRTOS创建任务(3)
一、任务挂起和恢复API函数有时候需要暂停某个任务的运行,过一段时间以后在重新运行。这个时候要是使用任务删除和重建的方法的话,那么任务中变量保存的值肯定丢失了!FreeRTOS提供了解决这种问题的方法,那就是任务挂起和恢复,当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS的任务挂起和恢复API函数如下表所示:函数描述vTaskSuspend()挂起一个任务vTaskResume()恢复一个任务的运行xTa原创 2021-10-19 20:53:10 · 329 阅读 · 0 评论 -
FreeRTOS创建任务(2)
一、FreeRTOS任务相关API函数1、任务创建和删除API函数FreeRTOS最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreateStatic()使用静态的方法创建一个任务xTaskCrearteRestricted()创建一个使用MPU进行限制的任务,相关内存使用动态内存分配vTaskDelete()原创 2021-10-18 19:50:40 · 532 阅读 · 0 评论 -
FreeRTOS创建任务(1)
一、任务基础知识在STM32F4中以前的单片机裸机(未使用系统)的时候一般都是在mai函数中用循环来处理所有事物,循环调用相应的函数完成事物的处理。原创 2021-10-18 16:10:22 · 1459 阅读 · 1 评论 -
FreeRTOS移植
一、FreeRTOS系统RTOS全称是 Real Time Operating System,中文名就是实时操作系统。可以看出 FreeROTS就是一个免费的RTOS类系统。这里要注意,RTOS不是指某一个确定的系统,而是指一类系统。比如UCOS, FreeRTOS,RTX,RT- Thread等这些都是RTOS类操作系统。操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责仼就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切原创 2021-10-14 20:46:06 · 1692 阅读 · 0 评论