第3章 嵌入式实时操作系统和FreeRTOS

上传人:jin****ng 文档编号:196688208 上传时间:2023-03-31 格式:DOCX 页数:17 大小:194.50KB
收藏 版权申诉 举报 下载
第3章 嵌入式实时操作系统和FreeRTOS_第1页
第1页 / 共17页
第3章 嵌入式实时操作系统和FreeRTOS_第2页
第2页 / 共17页
第3章 嵌入式实时操作系统和FreeRTOS_第3页
第3页 / 共17页
资源描述:

《第3章 嵌入式实时操作系统和FreeRTOS》由会员分享,可在线阅读,更多相关《第3章 嵌入式实时操作系统和FreeRTOS(17页珍藏版)》请在装配图网上搜索。

1、3.1 什么是实时操作系统3.1.1 实时操作系统定义实时操作系统(RTOS )是指当外界事件或数据产生时,能够接受并以足够 快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对 处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实 时任务协调一致运行的操作系统实时操作系统是保证在一定时间限制内完成特定功能的操作系统。实时操 作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这 是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完 成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操 作系统3.1.2 实时操作系统

2、的特征:高精度计时,系统计时精度是影响实时性的一个重要因素。在实时应用系 统中,经常需要精确确定实时地操作某个设备或执行某个任务,或精确的计算 一个时间函数。这些不仅依赖于一些硬件提供的时钟精度,也依赖于实时操作 系统实现的高精度计时功能。多级中断机制,一个实时应用系统通常需要处理多种外部信息或事件,但 处理的紧迫程度有轻重缓急之分。有的必须立即作出反应,有的则可以延后处 理。因此,需要建立多级中断嵌套处理机制,以确保对紧迫程度较高的实时事 件进行及时响应和处理。实时调度机制,实时操作系统不仅要及时响应实时事件中断,同时也要及 时调度运行实时任务。但是,处理机调度并不能随心所欲的进行,因为涉及

3、到 两个进程之间的切换,只能在确保“安全切换”的时间点上进行,实时调度机 制包括两个方面,一是在调度策略和算法上保证优先调度实时任务;二是建立 更多“安全切换”时间点,保证及时调度实时任务。实时操作系统的特点:异步的事件响应;切换时间和中断延迟时间确定;优先级中断和调度;抢占式调度3.2 实时操作系统在飞控中的重要性操作系统在飞控系统中的重要性飞行控制系统是无人机的重要组成部分,是飞行控制算法的运行平台,它 的性能好坏直接关系着无人机能否安全可靠的飞行随着航空技术的发展,无人机飞行控制系统正向着多功能、高精度、小型 化、可复用的方向发展。高精度要求无人机控制系统的精度高,稳定性好,能 够适应复

4、杂的外界环境,因此控制算法比较复杂,计算速度快,精度高小型化则对控制系统的重量和体积提出了更高的要求,要求控制系统的性 能越高越好,体积越小越好。此外,无人机飞行控制系统还要具有实时、可靠、 低成本和低功耗的特点近年来,实时操作系统在多媒体通信、在线事务处理、生产过程控制、交 通控制等各个领域得到广泛的应用。并且实时操作系统将实时多任务机制以功 能(函数)调用的方式提供给用户,它的系统调用时标准化、规格化的,使得 开发人员不必再考虑多个实时任务的同步问题,从而有更多的精力致力于应用 程序的开发3.3 FreeRTOS实时操作系统FreeRTOS(读作free-arr-to ss)是一个嵌入式系

5、统使用的开源实时操作系 统。FreeRTOS被设计为“小巧,简单,和易用”,能支持许多不同硬件架构以 及交叉编译器。FreeRTOS自2002年Richard Barry开始开发以来,一直都在积极开发中。 就像所有操作系统一样,FreeRTOS的主要工作是执行任务。大部分FreeRTOS 的代码都涉及优先权、调度以及执行用户自定义任务。但又与所有其他操作系 统不同,FreeRTOS是一款运行在嵌入式系统上的实时操作系统。大部分FreeRTOS致力于执行任务,所以你可以很好地看到它究竟是如何做到 的。FreeRTOS的主要特点如下:支持抢占式调度,合作式调度和时间片调度 SafeRTOS作为Fr

6、eeRTOS的衍生品大大提高了 FreeRTOS在代码完整性 方面的能力用于低功耗的Tickless模式 支持 35种系统架构(哈佛架构) FreeRTOS-MPU支持M3/M4/M7内核的MPU (内存保护单元) 设计的简单易用,典型的内核使用大小在 4k-9k移植非常简单,代码主要用C编写 同时支持合作式和抢占式任务 支持消息队列、二值信号量、计数信号量、递归信号量和互斥信号量,可用于任务与任务间的消息传递和同步,任务与中断间的消息传递和同 步 优先级继承方式的互斥信号量 高效的软件定时器强大的跟踪执行函数堆栈溢出检查 提供丰富的,配置好的工程例子 提供论坛技术支持,有可选的商业支持和许可

7、版本 任务的数量不限 任务优先级数量不限 多个任务可以分配相同优先级,即支持时间片调度 免费的开发工具 免费的嵌入式软件源码 免版权费FreeRTOS是一个相对较小的应用程序。最小化的FreeRTOS内核仅包括3个 (c)文件和少数头文件,总共不到9000行代码,还包括了注释和空行。一个 典型的编译后(二进制)代码映像小于10KB。FreeRTOS的代码可以分解为三个主要区块:任务,通讯和硬件接口。任务:大约有一半的FreeRTOS的核心代码用来处理多数操作系统首要关 注的问题:任务。任务是给定优先级的用户定义的C函数。task.c和 task.h完成了所有有关创建、调度和维护任务的繁重工作。

8、 通讯:任务很重要,不过任务间可以互相通讯则更为重要!它给我们带 来FreeRTOS的第二项任务:通讯。大约40%的FreeRTOS核心代码是用 来处理通讯的。queue.c和queue.h是负责处理FreeRTOS的通讯的。任 务和中断使用队列互相发送数据,并且使用信号灯和互斥来发送临界资 源的使用情况。硬件接口:接近9000行的代码拼凑起基本的FreeRTOS,是硬件无关的; 相同的代码都能够运行,不论FreeRTOS是运行在不起眼的8051,还是 最新、最炫的ARM内核上。大约有6%的FreeRTOS的核心代码,在硬件 无关的FreeRTOS内核与硬件相关的代码间扮演着垫片的角色。Fre

9、eRTOS User Tasks and I SR CodeFreeRTOS Hardware-Ind已p巳口cknt CotdtFreeRTOS Hardwaie-Depeiidcnt CodeHardware3.4 FreeRTOS支持的调度方式FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。抢占式调度,每个任务都有不同的优先级,任务会一直运行直到被高优 先级任务抢占或者遇到阻塞式的API函数,比如vTaskDelay (延时函 数)。 时间片调度,每个任务都有相同的优先级,任务会运行固定的时间片

10、个 数或者遇到阻塞式的API函数,比如vTaskDelay,才会执行同优先级 任务之间的任务切换。3.4.3 抢占式调度器在实际的应用中,不同的任务需要不同的响应时间。例如,我们在一个应 用中需要使用电机,键盘和LCD显示。电机比键盘和LCD需要更快速的响应, 如果我们使用合作式调度器或者时间片调度,那么电机将无法得到及时的响应 这时抢占式调度是必须的。如果使用了抢占式调度,当前最高优先级的任务一旦就绪,总能得到CPU 的控制权。比如,当一个运行着的任务被其它高优先级的任务抢占,当前任务 的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU的控制权并运行。又比如,如果

11、中断服务程序使一个高优先级的任务进入 就绪态,中断完成时,被中断的低优先级任务被挂起,优先级高的那个任务开 始运行。使用抢占式调度器,使得最高优先级的任务什么时候可以得到CPU的控制 权并运行是可知的,同时使得任务级响应时间得以最优化。3.4.4 时间片调度器在小型的嵌入式 RTOS 中,最常用的的时间片调度算法就是 Round-robin 调度算法。这种调度算法可以用于抢占式或者合作式的多任务中。另外,时间 片调度适合用于不太要求任务实时响应的情况。实现 Round-robin 调度算法需要给同优先级的任务分配一个专门的列表, 用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运

12、行的 时间长度,时间片用完了就进行任务切换)。在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还 需要用户在FreeRTOSConfig.h 文件中使能宏定义:#define configUSE_TIME_SLICING 1默认情况下,此宏定义已经在 FreeRTOS.h 文件里面使能了,用户可以不 用在 FreeRTOSConfig.h 文件中再单独使能。住务扰丘级,A时I可5调u H塞函数屮、J*fTask :Task 2-1Task 3*jTa sk 4Task L11i;3.5任务及任务优先级3.5.1 任务和协程在应用程序可以使用任务也可以使用协程,或者两者混

13、合使用,但是任务 和协程使用不同的API函数,因此在任务和协程之间不能使用同一个队列或信 号量传递数据。通常情况下,协程仅用在资源非常少的微处理器中,特别是RAM非常稀缺 的情况下。目前协程很少被使用到,因此对于协程FreeRTOS作者既没有把它删 除也没有进一步开发。简而言之:使用RTOS的实时应用程序可认为是一系列独立任务的集合。每 个任务在自己的环境中运行,不依赖于系统中的其它任务或者RTOS调度器。在 任何时刻,只有一个任务得到运行,RTOS调度器决定运行哪个任务。调度器会 不断的启动、停止每一个任务,宏观看上去就像整个应用程序都在执行。作为 任务,不需要对调度器的活动有所了解,在任务

14、切入切出时保存上下文环境 (寄存器值、堆栈内容)是调度器主要的职责。为了实现这点,每个任务都需 要有自己的堆栈。当任务切出时,它的执行环境会被保存在该任务的堆栈中, 这样当再次运行时,就能从堆栈中正确的恢复上次的运行环境。以下为几点任 务概要: 简单 没有使用限制 支持完全抢占 支持优先级每个任务都有自己的堆栈,消耗RAM较多如果使用抢占,必须小心的考虑可重入问题3.5.2 任务状态一个任务的状态可为下面中的一个:运行:如果一个任务正在执行,那么说这个任务处于运行状态。此时它占 用处理器。就绪:就绪的任务已经具备执行的能力(不同于阻塞和挂起),但是因为 有一个同优先级或者更高优先级的任务处于运

15、行状态而还没有真正执行。阻塞:如果任务当前正在等待某个时序或外部中断,我们就说这个任务处 于阻塞状态。比如一个任务调用vTaskDelay ()后会阻塞到延时周期到为止。任 务也可能阻塞在队列或信号量事件上。进入阻塞状态的任务通常有一个“超时” 周期,当事件超时后解除阻塞。挂起:处于挂起状态的任务同样对调度器无效。仅当明确的分别调用 vTaskSuspend()和xTaskResume() API函数后,任务才会进入或退出挂起状态。 不可以指定超时周期事件(不可以通过设定超时事件而退出挂起状态)。下图为任务之间的状态切换图is仃阻産每个任务都要被指定一个优先级,FreeRTOS中任务的最高优先

16、级是通过 FreeRTOSConfig.h文件中的configMAX_PRIORITIES进行配置的,用户实际可 以使用的优先级范围是0到configMAX_PRIORITIES - 1。比如我们配置此宏 定义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5。扛起诚用vTkSuspond调用诃如()调出 .vPaskSuspend 0调用川塞 AFI两数Y就绪用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的 优先级是 0。建议用户配置宏定义 configMAX_PRIORITIES 的最大值不要超过 32,即用户任 务可以使用的优先级范围是0到31。#clc

17、inc c onf iE_F EiEEMF TI ON#cleine conf i US E_I DL Z_ODK tdef ine conf iUE:E_T7!ZK_OCK tclefire configCPU_CLOCZ inw uzinf1zrTIC?C RATE=0 ( :二migned 2oncr ) .1 eF-IOCOCO )i ( eu工tTi.ukTvm ) m )i 5/任务优宪级数口丄2 w#clef ine #clef ine #clef ine #clef ine #cierme # citrineO3nf igMINII-IlL_STACK_S I ZE conf

18、QOT AL_HfAP_S IZE configMAX_TASKJJAl-lE_LEN ODnfigUSElEiAFACILITY conr igU5E_i 5_bit_t i cks conrigiDLE should yield unaigiied shortJ12S)、堆栈5ize_t ) I _0 - 1:2 )任务总堆桟 丄E厂对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。这里我推荐一个任务优先级设置方案。IRQ任务:IRQ任务是指通过中断服务程序进行触发的任务,此类任务 应该设置为所有任务里面优先级最高的。咼优先级后台任务:比女口按键检测,触

19、摸检测,USB消息处理,串口消 息处理等,都可以归为这一类任务。低优先级的时间片调度任务:比如emWin的界面显示,LED数码管的显 示等不需要实时执行的都可以归为这一类任务。 实际应用中用户不必拘 泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先 级,只需注意这类任务不需要咼实时性。 空闲任务:空闲任务是系统任务。特别注意:IRQ任务和高优先级任务必须设置为阻塞式(调用消息等待 或者延迟等函数即可,不然优先级低的任务会被饿死),只有这样,咼 优先级任务才会释放 CPU 的使用权,,从而低优先级任务才有机会得到 执行。任务优先级* vTaskPrioritySet() 设置任

20、务优先级* uxTaskPriorityGet()获取任务优先级* vTaskDelete()删除任务* vTaskSuspend() 任务挂起* vTaskSuspendAll()挂起全部任务* xTaskResumeAll()恢复全部任务* uxTaskPriorityGet()任务优先级获取* vTaskPrioritySet()任务优先级修改* vTaskResume()任务恢复* vTaskResumeFromISR()任务恢复* xTaskGetTickCount()获取当前的系统时间* vTaskDelayUntil() 绝对延时* vTaskDelay() 任务延时 延迟多少个

21、心跳周期,心跳周期由 configTICK_RATE_HZ指定,参数可以直接使用n/portTICK_RATE_MS定义延迟 n ms* xTaskGetTickCount() 获取任务滴答数* taskYIELD()主动让出任务时间片注意:函数的具体用法请参考 FreeRTOS API Reference 官方手册3.6任务间通讯一信号量semaphore3.6.1 信号量的概念FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简 称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。互斥量和信号量在用 法上不同: 信号量用于同步

22、,任务间或者任务和中断间同步; 互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上 一把锁。 信号量用于同步时,一般是一个任务(或中断)给出信号,另一个任务 获取信号; 互斥量必须在同一个任务中获取信号、同一个任务给出信号。 互斥量具有优先级继承,信号量没有。 互斥量不能用在中断服务程序中,信号量可以。创建互斥量和创建信号量的API函数不同,但是共用获取和给出信号 API函数;互斥量是一个包含优先级继承机制的二进制信号量。用于实现同步(任务 之间或者任务与中断之间)的话,二进制信号量是更好的选择,互斥量用于简 单的互锁。互斥信号量的用处:用于互锁的互斥量可以充当保护资源的令牌。当一

23、个任务希望访问某个资 源时,它必须先获取令牌。当任务使用完资源后,必须还回令牌,以便其它任 务可以访问同一资源。互斥量和信号量使用相同的 API 函数,因此互斥量也允许指定一个阻塞时 间。阻塞时间单位为系统节拍周期时间,数目表示获取互斥量无效时最多处于 阻塞状态的系统节拍周期个数。在很对场合下,某个东西的硬件资源仅仅只有一个,当低优先级任务占用 了,当高优先级任务需要占用该任务的时候,由于高优先级没有“令牌”,因 此高优先级任务也得等低优先级任务任务执行完,归还令牌后,高优先级任务 申请令牌,并且占用硬件资源。在使用互斥信号量的时候,得注意下死锁的问 题3.6.1 二进制信号量二进制信号量看作

24、只有一个项目的队列,因此这个队列只能为空或满(因 此称为二进制)。任务和中断使用队列无需关注谁控制队列-只需要知道队列 是空还是满。二进制信号量的用处:二进制信号量和互斥量非常相似,但是有一些细微差别:互斥量包含一个 优先级继承机制,二进制信号量则没有这个机制。这使得二进制信号量更好的 用于实现同步(任务间或任务和中断间),互斥量更好的用于实现简单互斥。 本节仅描述用于同步的二进制信号量。考虑这样一种情况,一个任务用来维护外设。使用轮询的方法会浪费CPU 资源并且妨碍其它任务执行。更好的做法是任务的大部分时间处于阻塞状态 (允许其它任务执行),直到某些事件发生该任务才执行。可以使用二进制信 号

25、量实现这种应用:当任务取信号量时,因为此时尚未发生特定事件,信号量 为空,任务会进入阻塞状态;当外设需要维护时,触发一个中断服务例程,该 中断服务仅仅给出信号量(向队列写数据)。任务只是取信号,并不需要归还, 中断服务只是给信号3.6.1 计数信号量二进制信号量可以被认为是长度为1的队列,计数信号量则可以被认为 长度大于1的队列。此外,信号量使用者不必关心存储在队列中的数据,只需 关心队列是否为空计数信号量的用处:计数事件:在这种场合下,每当事件发生,事件处理程序将给出一个 信号(信号量计数值增1),当处理事件时,处理程序会取走信号量(信号量 计数值减1) 。因此,计数值是事件发生的数量和事件

26、处理的数量差值。在这 种情况下,计数信号量在创建时其值为0。资源管理:这种用法下,计数值表示有效的资源数目。任务必须先获取信 号量才能获取资源控制权。当计数值减为零时表示没有的资源。当任务完成后, 它会返还信号量-信号量计数值增加。在这种情况下,信号量创建时,计数值 等于最大资源数目。3.6.2 FreeRTOS任务间计数信号量的实现任务间信号量的实现是指各个任务之间使用信号量实现任务的同步或者资源共 享功能FreeRTOS操作系统实现计数信号量的过程 1、创建2个任务Task 1和Task2。创建计数信号量可用资源为11、任务Task1运行过程中调用函数xSemaphoreTake获取信号量

27、资源,如果信 号量没有被任务Task2占用,Task1将直接获取资源。如果信号量被Task2占 用,任务Task 1将由运行态转到阻塞状态,等待资源可用。一旦获取了资源并 使用完毕后会通过函数 xSemaphoreGive 释放掉资源。2、任务Task2运行过程中调用函数xSemaphoreTake获取信号量资源,如果信 号量没有被任务Task1占用,Task2将直接获取资源。如果信号量被Task1占 用,任务Task2将由运行态转到阻塞状态,等待资源可用。一旦获取了资源并 使用完毕后会通过函数xSemaphoreGive释放掉资源。3.6.3 FreeRTOS中断方式计数信号量的实现Free

28、RTOS中断方式信号量的实现是指中断函数和FreeRTOS任务之间使用信号 量。信号量的中断方式主要是用于实现任务同步,FreeRTOS中断方式计数信号量的实现方式 1、创建 2 个任务 Task 1 和 Task2。 2、创建计数信号量可用资源为1。1、任务Task1运行过程中调用函数xSemaphoreTake,由于信号量的初始值是0, 没有信号量资源可用,任务Task 1由运行态进入到阻塞态。2、Task 1阻塞的情况下,串口接收到数据进入到了串口中断服务程序,在串口 中断服务程序中调用函数xSemaphoreGiveFromlSR释放信号量资源,信号量数 值加1,此时信号量计数值为1,

29、任务Task 1由阻塞态进入到就绪态,在调度器 的作用下由就绪态又进入到运行态,任务Task 1获得信号量后,信号量数值减 1,此时信号量计数值又变成了0。3、再次循环执行时,任务Task1调用函数xSemaphoreTake由于没有资源可用 再次进入到阻塞态,等待串口释放信号量资源,如此往复循环。串口接收中断丿Tatk2RutiTasklBlocked发运信号早同址惜号FreeRTOS信号量操作常用函数* 信号量 - xSemaphoreHandle* vSemaphoreCreateBinary()* xSemaphoreCreateMutex()* xSemaphoreGiveFromI

30、SR() 能,用于中断中二值信号量创建创建互斥量释放信号量,该函数带有临界区功* xSemaphoreTake()P操作,阻塞任务,除互斥信号量(Recursive Semaphore )外,都可以调用此函数计数信号量创建* xSemaphoreCreateCounting()3.7任务间通讯-message3.7.1 消息队列的概念消息队列就是通过RTOS内核提供的服务,任务或中断服务子程序可以 将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址, RTX,uCOS-II和uCOS-III是传递的地址)放入到队列。同样,一个或者多个任务可以通过RTOS内核服务从队列中

31、得到消息。 通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进 入到消息队列的消息,即先进先出的原则(FIFO), FreeRTOS的消息队列支持 FIFO和LIFO两种数据存取方式使用消息队列可以让RTOS内核有效地管理任务,而全局数组是无法做到 的,任务的超时等机制需要用户自己去实现。 使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好 了这个问题,用户无需担心。 使用消息队列可以有效地解决中断服务程序与任务之间消息传递的问题 FIFO机制更有利于数据的处理。3.7.2 FreeRTOS任务间消息队列的实现任务间消息队列的实现是指各个任务之间使用消息队列实现任

32、务间的通信消息臥列运行条件: I、创建消息队列,可以存放10个消息。 2、创建2个任务Taskl和Task2,任务Task 1向消息队列放数据,任务 Task2从消息队列取数据。 3、FreeRTOS的消息存取采用FIFO方式。运行过程主要有以下两种情况:任务Task1向消息队列放数据,任务Task2从消息队列取数据,如果 放数据的速度快于取数据的速度,那么会出现消息队列存放满的情况, FreeRTOS的消息存放函数xQueueSend支持超时等待,用户可以设置超 时等待,直到有空间可以存放消息或者设置的超时时间溢出。任务Task1向消息队列放数据,任务Task2从消息队列取数据,如果 放数据

33、的速度慢于取数据的速度,那么会出现消息队列为空的情况, FreeRTOS的消息获取函数xQueueReceive支持超时等待,用户可以设置 超时等待,直到消息队列中有消息或者设置的超时时间溢出。 3.7.3 FreeRTOS中断港式消息队列的实现FreeRTOS中断方式消息队列的实现是指中断函数和FreeRTOS任务之间使用 消息队列运行条件: 1、创建消息队列,可以存放10个消息。 2、创建1个任务Task1和一个串口接收中断。 3、FreeRTOS的消息存取采用FIFO方式。运行过程主要有以下两种情况:中断服务程序向消息队列放数据,任务Task 1从消息队列取数据,如果 放数据的速度快于取

34、数据的速度,那么会出现消息队列存放满的情况。由于中断服务程序里面的消息队列发送函数xQueueSendFromISR不支持超时设置,所以发送前要通过函数xQueuelsQueueFullFromlSR检测消息 队列是否满。中断服务程序向消息队列放数据,任务Task 1从消息队列取数据,如果 放数据的速度慢于取数据的速度,那么会出现消息队列存为空的情况。 在FreeRTOS的任务中可以通过函数xQueueReceive获取消息,因为此函 数可以设置超时等待,直到消息队列中有消息存放或者设置的超时时间 溢出。FreeRTOS 消息队列操作常用函数*消息队列 - xQueueHandle* xQue

35、ueCreate()NULL创建队列,会从堆中分配内存,内存不足返回* xQueueSend()将数据发送到队列尾将数据发送到队列尾将数据发送到队列头* xQueueSendToBack()* xQueueSendToBack()* xQueueSendToBackFromISR()在中断中,将数据发送到队列尾* xQueueSendToFrontFromISR()在中断中,将数据发送到队列头* 注:参数 xTicksToWait:当值为 portMAX_DELAY,并且INCLUDE_vTaskSuspend=1 时为无限制等待* xQueueReceive()从队列中取出数据* xQueu

36、ePeek()查看队列中的数据* xQueueReceiveFromISR()在中断中,从中断中将数据取出* uxQueueMessagesWaiting()查询队列中当前有效数据的单元个数在中断中,查询队列中当前有效* uxQueueMessagesWaitingFromISR() 数据的单元个数3.8任务间通讯-Mutex3.8.1 互斥信号量的概念互斥信号量的主要作用是对资源实现互斥访问,使用二值信号量也 可以实现互斥访问的功能,互斥信号量与二值信号量的区别在于互斥信号量 可以防止优先级翻转,而二值信号量 不支持。注意: 有关互斥信号量的介绍请看章节:3.6.1互斥信号量3.8.2 优先

37、级翻转问题优先级继承FreeRTOS 中一个”优先级继承”机制作为优先级反转的一种解决方案 优先级继承是最小化优先级反转负面影响的一种方案,但其并不能修正优先 级反转带来的问题,仅仅是减小优先级反转的影响。所以如果可以避免的话 并不建议系统实现对优先级继承有所依赖。优先级继承暂时地将互斥量持有者的优先级提升至所有等待此互斥量的 任务所具有的最高优先级。持有互斥量的低优先级任务”继承”了等待互斥 量的任务的优先级。运行条件:1、创建3个任务Taskl, Task2和Task3,优先级分别为3, 2, 1。也就是 Taskl的优先级最高。2、任务Task1和Task3互斥访问串口打印printf,

38、采用二值信号实现互斥 访问。3、起初Task3通过二值信号量正在调用printf,被任务Task1抢占,开始 执行任务Task1,也就是上图的起始位置IASK1T.SKlTASK! ITASK3 T%K2T-ASK5抢占TASK3TASK3完威T喝瞇返IAJSK3竝堡抉时同3.8.3互斥信号量API函数 * SemaphoreHandle_t xSemaphoreCreateMutex(void)* xSemaphoreGiveFromISR() 释放信号量,该函数带有临界区功能 用于中断中*xSemaphoreTake()P操作,阻塞任务,除互斥信号量(RecursiveSemaphore )外,都可以调用此函数

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!