
FreeRTOS基础知识篇
文章平均质量分 88
本专栏是根据官方文档进行知识的梳理以及各个函数的应用介绍
南山府嵌入式
专注于嵌入式知识分享
展开
-
26-RTOS事件组和事件标志位 API 函数
事件组和事件标志位 API 函数。原创 2023-02-01 11:02:15 · 930 阅读 · 0 评论 -
25-RTOS FreeRTOS 软件定时器 API 函数
timers.h创建一个新的软件定时器实例, 并返回一个可以引用定时器的句柄。要使此 RTOS API 函数可用:configUSE_TIMERS 和 configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中同时设置为 1(configSUPPORT_DYNAMIC_ALLOCATION 也可以不定义,此时其默认值为 1)。每个软件定时器都需要少量 RAM 来保存定时器的状态。原创 2023-01-31 14:45:28 · 1049 阅读 · 0 评论 -
24-RTOS 信号量_互斥锁 API 函数
semphr. h创建一个,并返回一个可以引用该信号量的 句柄。必须在 FreeRTOSConfig.h 中被设置为 1,或保留未定义状态(此时,它默认 (此时默认为1),才能使用RTOSAPI函数。每个二进制信号量需要少量RAM,用于保持 信号量的状态。如果使用 xSemaphoreCreateBinary() 创建二进制信号量 则会从RAM。如果使用创建二进制信号量, 那么RAM由应用程序编写者提供,这需要用到一个附加参数, 但允许在编译时静态分配 RAM。原创 2023-01-31 13:57:49 · 927 阅读 · 0 评论 -
23-RTOS 消息缓冲区 API 函数
使用动态分配的内存新建。消息缓冲区会在每次发送和接收操作完成后执行回调。使用 xMessageBufferCreate() API 创建的消息缓冲区共享相同的发送和接收完成回调函数,这些回调函数通过 sbSEND_COMPLETED() 和 sbRECEIVE_COMPLETED() 宏定义。使用 xMessageBufferCreateWithCallback() API 创建的消息缓冲区 可以有自己唯一的发送和接收完成回调函数。请参阅获取使用静态分配内存(在编译时分配的内存)的相应版本。原创 2023-01-30 10:09:19 · 602 阅读 · 0 评论 -
22-RTOS 流缓冲区 API 函数
创建一个使用动态分配内存的新。流缓冲区 在完成每个发送和接收操作时执行回调。使用 xStreamBufferCreate()API 创建的流缓冲区 共享相同的发送和接收完成回调函数,这些函数是用 sbSEND_COMPLETED() 和 sbRECEIVE_COMPLETED() 宏定义的。使用 xStreamBufferCreateWithCallback() API 创建的流缓冲区可以有各自独特的发送和接收完成 回调函数。原创 2023-01-13 10:37:49 · 959 阅读 · 1 评论 -
21-FreeRTOS队列集API函数
队列集提供了一种机制,允许 RTOS 任务从多个 RTOS 队列或信号量同时进行读取操作后阻塞(挂起)。请注意, 除了使用队列集之外,还有更简单的替代方法。有关详细信息,请参阅 阻塞多个对象页面。必须使用调用 xQueueCreateSet() 显式创建队列集, 然后才能使用它。创建后,可以将标准 FreeRTOS 队列和信号量添加到集合中 (通过调用 xQueueAddToSet())。原创 2023-01-11 10:43:08 · 946 阅读 · 0 评论 -
20-FreeRTOS队列API函数
创建一个新队列并返回 可引用此队列的句柄。configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1,或保留未定义状态(此时,它默认 为 1) ,才能使用此 RTOS API 函数。每个队列需要 RAM 用于保存队列状态和 包含在队列(队列存储区域)中的项目。如果使用 xQueueCreate() 创建队列,则所需的 RAM 将自动 从 FreeRTOS 堆中分配。原创 2023-01-10 14:50:54 · 1486 阅读 · 0 评论 -
19-FreeRTOS 任务通知API
每个任务都有一组“任务通知” (或仅“通知” ) ,每个 通知都包含状态和一个 32 位值。直达任务通知是直接发送至任务的事件, 可以取消接收任务的阻塞状态,还 可以选择通过多种方式更新接收任务的某个通知值。例如,通知可覆盖接收任务的通知值中的一个,或仅设置 更多位。当任务通知 用作轻量级且更快的二进制或计数信号量 替代方案时,可以使用宏 xTaskNotifyGive ()。原创 2023-01-09 15:20:15 · 982 阅读 · 0 评论 -
18-FreeRTOS内核控制
1-taskYIELD请求上下文切换到其他任务task. htaskYIELD() 用于请求切换上下文到另一个任务。 但是, 除非存在其他任务,其优先级等于或高于调用 taskYIELD() 的任务的优先级, 否则 RTOS 调度器将选择 调用了 taskYIELD() 的任务并使其再次运行。如果 configUSE_PREEMPTION 设置 为 1,则 RTOS 调度器将始终运行 能够运行的优先级最高的任务,因此调用 taskYIELD() 将永远无法 切换到一个优先级更高的任务。2-t原创 2023-01-09 01:07:37 · 1457 阅读 · 0 评论 -
17-FreeRTOS任务应用函数(3)
从任务的名称中查找任务的句柄。注意: 此函数需要较长的时间才能完成,并且只能 为每个任务调用一次。一旦获得了一个任务的句柄, 它就可以被储存在本地以便重新使用。必须在 FreeRTOSConfig.h 中将 INCLUDE_xTaskGetHandle 设置为 1,xTaskGetHandle() 才可用。原创 2023-01-03 14:16:08 · 3337 阅读 · 0 评论 -
16-FreeRTOS任务应用函数(2)
xTaskGetApplicationTaskTagFromISR是在中断服务中调用的另一个版本。:正在查询任务的句柄。任务可以使用NULL作为参数值查询自己的标记值。原创 2022-12-26 15:32:39 · 866 阅读 · 0 评论 -
15-FreeRTOS任务应用函数(1)
该函数向TaskStatus_t结构体填充相关信息,系统中每一个任务的信息都可以填充到TaskStatus_t结构体数组中,数组大小由uxArraySize指定。注意,这个函数仅用来调试用,调用此函数会挂起所有任务,直到函数最后才恢复挂起的任务,因此任务可能被挂起很长时间。在文件FreeRTOSConfig.h中,宏configUSE_TRACE_FACILITY必须设置为1,此函数才有效。原创 2022-12-20 18:06:19 · 819 阅读 · 0 评论 -
14-FreeRTOS任务控制
调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数xTicksToDelay指定,单位是系统节拍时钟周期。常量portTICK_RATE_MS 用来辅助计算真实时间,此值是系统节拍时钟中断的周期,单位是毫秒。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必须设置成1,此函数才能有效。vTaskDelay()指定的延时时间是从调用vTaskDelay()后开始计算的相对时间。原创 2022-12-19 14:55:51 · 2625 阅读 · 0 评论 -
13-FreeRTOS任务创建与删除
任务创建和删除API函数位于文件task.c中,需要包含task.h头文件。task.h里面包函数任务的类型函数。例如,对xTaskCreate的调用(通过指针方式)返回一个TaskHandle_t 变量,然后可将该变量用vTaskDelete来进行任务的删除工作。原创 2022-12-17 18:22:37 · 1123 阅读 · 0 评论 -
12-FreeRTOS内存管理
RTOS内核在每次创建任务、队列、互斥量、软件定时器、信号量或事件组时都需要RAM。RAM可以在RTOS API对象创建函数中从RTOS堆中自动动态分配,也可以由应用程序编写人员提供。FreeRTOS提供了五种内存分配方案,用户可以根据自己的实际情况选择需要的方案。本篇将对这五种进行介绍。原创 2022-12-16 16:25:31 · 1998 阅读 · 0 评论 -
11-FreeRTOS配置函数 FreeRTOSConfig.h
这个表示是否启用调度函数,1表示使用抢占式RTOS调度程序,0是表示使用协程RTOS调度程序。原创 2022-12-14 17:07:27 · 1956 阅读 · 2 评论 -
10-FreeRTOS堆栈溢出
如果使用xTaskCreate()创建任务,那么作为任务堆栈的内存将自动从FreeRTOS堆中分配,并通过传递给xTaskCreate() API函数的参数进行内存划分。如果使用xTaskCreateStatic()创建任务,那么应用程序编写人需要预先分配用作任务堆栈的内存。堆栈的溢出是导致程序稳定性不良的一个常见的原因。因此,FreeRTOS提供了两种配置方式,能够帮助检测堆栈溢出的问题。在配置函数中需要把configCHECK_FOR_STACK_OVERFLOW进行设置。需要注意的是,这些需要在原创 2022-12-07 19:52:30 · 1903 阅读 · 0 评论 -
9-FreeRTOS之静态内存分配与动态内存分配
从9.0版本之后,FreeRTOS允许用户自己定义内存的大小,允许在以下对象创建而不用创建内存的分配:任务静态内存分配的创建静态内存分配的好处是,可以更好的对应用程序的内存的利用,具有更好的控制代码的编写:以上这些函数后面都会讲解。下面是官方提供的有关上面这些函数的静态应用,自己可以看一下,我看了一下,基本上没有理解难度:原创 2022-12-06 21:42:02 · 1880 阅读 · 1 评论 -
8-事件组或标志
事件位用于指示事件是否发生。事件位通常称为事件标志。例如,一个应用程序可以:事件组是一组事件位。事件组是由单个事件位组成的。例如:事件组由EventGroupHandle_t类型的变量定义。如果configUSE_16_BIT_TICKS设置为1,则事件组中存储的位(或标志)为8,如果configUSE_16_BIT_TICKS设置为0,则存储的比特位(或标志)数目为24。对configUSE_16_BIT_TICKS的依赖源于进程内部实现中用于线程本地存储的数据类型。事件组中的所有事件位都存储在一个无原创 2022-12-05 20:33:54 · 538 阅读 · 1 评论 -
7-FreeRTOS软件定时器
软件定时器就是允许函数设置一定的等待时间,然后执行。定时器执行的函数被称为定时器的回调函数。定时器从启动到执行回调函数之间的时间称为定时器的周期。定时器的回调函数在定时器的时间到达时执行。软件定时器要先创建才能使用。软件定时器功能的实现是非常容易的,但是想要有效的实现可能会优点困难,FreeRTOS的定时器,不会从中断中执行定时器的回调函数,除非定时器到达了,否则不会消耗任何的运算时间,不会像时钟中添加任何的运算负担,如果中断禁用了,也不会遍历任何的链表结构。定时器服务任务主要利用了FreeRTOS的一原创 2022-12-04 14:22:18 · 755 阅读 · 0 评论 -
6-FreeRTOS流缓冲区
FreeRTOS流和缓冲区是任务和任务之间、中断和任务之间的通信原语。和其他多数FreeRTOS通信原语不同,他们针对读和写的单一性进行了方案的优化工作。例如将数据从中断服务例程传递到任务,或在双核cpu上从一个微控制器内核传递到另一个微控制器内核。数据通过拷贝传递——发送端将数据复制到缓冲区,读取端将数据复制出缓冲区。流缓冲区传递连续的字节流。消息缓冲区传递大小可变但离散的消息。消息缓冲区使用流缓冲区进行数据传输。在FreeRTOS对象是惟一的,流缓冲区的实现(也是消息缓冲区的实现,因为消息缓冲区是建原创 2022-12-03 21:51:49 · 968 阅读 · 0 评论 -
5- FreeRTOS任务通知
每个系统任务都会有一个任务通知。然后每个任务通知都具有挂起或者未挂起的状态,以及32位的通知。常量configTASK_NOTIFICATION_ARRAY_ENTRIES()是用来设置任务通知索引的数组。任务通知是直接发送给任务事件,不是通过中间对象(队列、事件组、信号量)间接发送给任务的。当任务发送任务通知时,会将目标任务通知的状态设定位挂起状态。就像任务阻塞中间对象一样,例如,信号在等待信号量的可用情况,任务组织这个等待通知的状态变为挂起的状态。原创 2022-12-02 15:06:55 · 1465 阅读 · 0 评论 -
4-FreeRTOS队列、互斥、信号量
队列(我对队列的理解就是上体育课,排队这种)是任务之间通信的一种方式。队列可以用于任务和任务之间或者中断和任务之间消息的接收与发送。在多数情况下,他们消息缓冲是按照FIFO(先进先出)原则。也就是最新的数据在上一个数据的后面,换句话说就是,类似于吃羊肉串,比如第一个串起来的,就第一个被吃掉。下图是队列的数据读写:FreeRTOS队列用户通常情况下会把灵活性与简单性相结合,但是这种类型通常是属于互斥的。原创 2022-12-01 21:48:15 · 1861 阅读 · 0 评论 -
3-FreeRTOS任务和协程
简单没有使用限制支持全部的抢占优先级完全优先X每个任务都有自己的堆栈,会导致RAM的使用空间增加若是使用优先级,应该考虑优先级的问题在协程之间共享堆栈会大大降低RAM使用量。协程操作使再入问题变得不那么严重。跨架构的可移植性很强。完全优先级相对于其他协程,但如果两者混合,总是可以被任务抢占。缺乏堆栈需要特别考虑。API调用的位置限制。协程操作只在协程之间进行。原创 2022-11-30 16:42:12 · 2030 阅读 · 0 评论 -
2-FreeRTOS编码标准、风格指南
宏的定义是以他们的文件为前缀,前缀小写。比如:configUSE_PREEMPTION这个定义是在配置文件FreeRTOSConfig.h 中定义。除前缀外,宏全部以大写形式书写,并使用下划线分隔。原创 2022-11-29 11:28:24 · 1643 阅读 · 0 评论 -
1-FreeRTOS入门指南
FreeRTOS内核最初由Richard Barry在2003年左右开发,到现在有19年的历史,可以看出无论是维护还是系统升级能持续到现在都是非常优秀得了。不过在2017年Barry这个公司把FreeRTOS项目的管理权交给了Amazon Web Services(AWS)。但是呢,人家还是作为其中的一员,继续工作。原创 2022-11-28 19:58:00 · 2514 阅读 · 0 评论