FreeRTOS基于Cube MX配置的解析

news/2024/11/25 17:19:48/

目录

一、Kernel settings设置

二、Memory management settiings设置

三、Hook function related definitions设置

四、Run time and task stats gathering related definitions设置

五、Co-routine related definitions设置

六、Software timer definitions 设置

七、Interrupt nesting behaviour configuration设置

八、Include definitions设置


一、Kernel settings设置

  1. USE_PREEMPTION: 这个选项用于启用或禁用抢占式调度。如果启用,任务可以在更高优先级任务准备运行时被抢占。如果禁用,任务只能在当前任务主动放弃 CPU 控制权后才能切换。

  2. CPU_CLOCK_HZ: 这个选项用于设置CPU的时钟频率,以赫兹为单位。这个值在FreeRTOS中用于时间计算和延迟等操作。

  3. TICK_RATE_HZ: 这个选项定义了FreeRTOS内部的时钟节拍频率,以赫兹为单位。它影响任务调度和时间相关操作。

  4. MAX_PRIORITIES: 这个选项设置系统中支持的最大任务优先级数。任务的优先级用于确定任务调度顺序。

  5. MINIMAL_STACK_SIZE: 这个选项设置每个任务的最小堆栈大小,以字为单位。任务需要堆栈来保存上下文和本地变量。

  6. MAX_TASK_NAME_LEN: 这个选项定义任务名称的最大长度,以字符为单位。这主要用于调试和诊断。

  7. USE_16_BIT_TICKS: 这个选项指示是否使用16位计数器来计算时间。如果选择使用16位计数器,有可能会限制时间跟踪的范围。

  8. IDLE_SHOULD_YIELD: 这个选项控制空闲任务是否应该在没有其他任务可运行时让出CPU控制权。如果启用,空闲任务将执行任务调度。

  9. USE_MUTEXES: 这个选项用于启用或禁用互斥量,它们是用于同步多个任务对共享资源的访问的机制。

  10. USE_RECURSIVE_MUTEXES: 这个选项控制是否使用递归互斥量。递归互斥量允许同一个任务多次获取同一个互斥量,而不会导致死锁。

  11. USE_COUNTING_SEMAPHORES: 这个选项用于启用或禁用计数信号量,它们允许多个任务访问某个资源。

  12. QUEUE_REGISTRY_SIZE: 这个选项设置任务队列注册表的大小,用于调试和分析。

  13. USE_APPLICATION_TASK_TAG: 这个选项启用了应用程序任务标签,用于在调试时标识任务。

  14. USE_PORT_OPTIMISED_TASK_SELECTION: 这个选项用于启用或禁用端口优化的任务选择算法。

  15. USE_TICKLESS_IDLE: 这个选项用于启用或禁用 tickless 低功耗模式,以降低系统能耗。

  16. USE_TASK_NOTIFICATIONS: 这个选项用于启用或禁用任务通知,作为一种任务间通信和同步机制。

  17. RECORD_STACK_HIGH_ADDRESS: 这个选项用于记录高地址堆栈的地址,用于调试。

二、Memory management settiings设置

  1. ​​​​​Memory Allocation: 这个选项涉及到内存分配的方式。FreeRTOS需要一些内存来管理任务和其他内部结构。在配置中,您可以选择使用静态内存分配或动态内存分配。
    • 静态内存分配 (Static Memory Allocation): 在这种方式下,您需要在编译时为每个任务、队列和其他内部结构分配一定大小的固定内存块。这些内存块在运行时不会变化。这种方式相对较简单,但需要在编译时就确定内存需求。
    • 动态内存分配 (Dynamic Memory Allocation): 在这种方式下,FreeRTOS会在运行时使用标准的动态内存分配函数(例如mallocfree)来动态分配和释放任务和内部结构的内存。这允许更灵活地管理内存,但需要在系统中包含适当的内存管理功能。
  2. TOTAL HEAP SIZE: 如果您选择使用动态内存分配,那么这个选项定义了可供FreeRTOS使用的堆内存的总大小。堆是用于动态内存分配的内存池。您需要根据系统需求和内存使用情况来设置这个值。
  3. Memory Management scheme: 这个选项用于定义内存分配方案,具体取决于您选择的内存分配方式。

    • Heap_1: 这是最简单的动态内存分配方案,使用一个单一的连续内存块来分配任务和内部结构。它需要一个TOTAL HEAP SIZE参数来指定堆的大小。

    • Heap_2: 类似于Heap_1,但允许多个内存块,每个块大小相等。您需要设置TOTAL HEAP SIZENUMBER OF BLOCKS参数。

    • Heap_3: 这是一个更高级的动态内存分配方案,支持不同大小的内存块。您需要设置TOTAL HEAP SIZEMINIMUM BLOCK SIZEUSE_INTERNAL_FRAGMENTATION参数。

    • Heap_4: 这个方案使用C库中的mallocfree函数进行内存分配,而不是使用FreeRTOS的内部内存分配器。您只需设置TOTAL HEAP SIZE

三、Hook function related definitions设置

  1. USE_IDLE_HOOK: 如果启用,FreeRTOS将在空闲任务运行时调用一个用户定义的回调函数,通常用于在系统空闲时执行某些任务。

  2. USE_TICK_HOOK: 如果启用,FreeRTOS将在每个时钟节拍(tick)时调用一个用户定义的回调函数。这可以用于定时任务或其他需要在每个时钟节拍时执行的操作。

  3. USE_MALLOC_FAILED_HOOK: 如果启用,FreeRTOS将在内存分配失败时调用一个用户定义的回调函数。这可以用于处理内存不足的情况。

  4. USE_DAEMON_TASK_STARTUP_HOOK: 如果启用,FreeRTOS将在守护任务(daemon task)启动时调用一个用户定义的回调函数。守护任务是FreeRTOS内部用于一些特定功能的任务。

  5. CHECK_FOR_STACK_OVERFLOW: 如果启用,FreeRTOS将在每个任务切换时检查堆栈溢出。如果任务的堆栈溢出,系统将调用一个用户定义的回调函数。

四、Run time and task stats gathering related definitions设置

  1. GENERATE RUN TIME STATS: 如果启用,FreeRTOS会生成任务运行时间统计数据。这些统计数据可以用于分析任务的运行时间和调度性能。您可以使用FreeRTOS提供的API来访问这些统计数据,以便进行性能分析。

  2. USE TRACE FACILITY: 如果启用,FreeRTOS将提供一种跟踪机制,可用于在运行时跟踪任务和事件的执行情况。这对于调试和性能分析很有用,可以用来查看任务的活动和执行路径。

  3. USE STATS FORMATTING FUNCTIONS: 如果启用,FreeRTOS将提供用于格式化和显示运行时统计数据的API函数。这些函数可以帮助您将统计数据以适当的格式输出,以供查看和分析。

五、Co-routine related definitions设置

  1. USE_CO_ROUTINES: 如果启用,FreeRTOS将支持协程功能。协程是一种比标准任务更轻量级的任务,它们与标准任务共享相同的调度器,但具有更小的栈占用和更快的切换时间。协程通常用于实现一些短暂的协作式多任务操作。

  2. MAX_CO_ROUTINE_PRIORITIES: 这个选项定义了协程的优先级数量。在FreeRTOS中,每个协程可以被分配一个优先级。这个选项决定了可用的协程优先级的数量。例如,如果设置为3,那么协程的优先级可以从0到2。

        启用协程功能可以在某些情况下提供更高的性能和更低的资源消耗,特别是对于需要频繁切换和较小堆栈的任务。然而,使用协程也需要小心,因为它们通常比标准任务更难以调试和管理。

六、Software timer definitions 设置

  1. USE_TIMERS: 如果启用,FreeRTOS将支持软件定时器功能。软件定时器是一种机制,允许您在后台执行回调函数,以实现基于时间的任务或事件。

        软件定时器非常有用,特别是在需要按时间间隔执行任务或操作的场景下。例如,您可以使用软件定时器来定期更新传感器数据、发送周期性的网络请求、执行周期性的数据处理等。

        启用这个选项后,您可以使用FreeRTOS提供的API来创建、启动和停止软件定时器,同时为定时器指定回调函数。每当定时器到达指定的时间间隔时,回调函数将被调用,从而执行所需的操作。

        要使用软件定时器功能,您需要考虑定时器的精度、优先级和资源消耗。不适当地使用定时器可能会导致不必要的系统负担,因此在配置和使用定时器时需要谨慎考虑。

        启用USE_TIMERS选项后,您可以使用FreeRTOS提供的API来创建、启动和管理软件定时器。以下是一些使用软件定时器的基本步骤:

①包含头文件: 在您的FreeRTOS应用中,首先包含软件定时器的头文件。通常,这个头文件是timers.h

#include "timers.h"

②定义回调函数: 为每个定时器定义一个回调函数,该函数将在定时器到期时执行。

void timerCallback(TimerHandle_t xTimer) {// 在这里执行定时器到期时的操作
}

③创建定时器: 使用xTimerCreate函数创建一个软件定时器。该函数接受定时器名称、定时器周期、是否自动重载等参数。

TimerHandle_t xTimer = xTimerCreate("MyTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, timerCallback);

        在上面的示例中,定时器名称是"MyTimer",定时器周期是1000毫秒(1秒),定时器将会自动重载(周期性定时器)。

④启动定时器: 使用xTimerStart函数启动定时器。定时器启动后,它会在指定的时间周期内运行回调函数。

xTimerStart(xTimer, portMAX_DELAY);

        在这里,我们使用了portMAX_DELAY,这会让定时器等待无限长的时间,直到定时器到期。

⑤处理定时器: 在FreeRTOS的任务中,需要在适当的位置调用xTimerStart函数,以便处理定时器的计时和回调。

void vTaskFunction(void *pvParameters) {// 其他任务代码while (1) {// 处理定时器vTaskDelay(pdMS_TO_TICKS(10)); // 适当的延迟以释放CPU资源}
}

        这样,软件定时器将按照设置的周期运行回调函数。

        请注意,软件定时器的使用需要在FreeRTOS的任务上下文中完成。确保在任务中正确处理定时器以避免竞争条件或其他问题。

        这只是一个基本的示例,您可以根据您的应用需求来调整定时器的创建、启动和处理方法。根据需要,您还可以在创建定时器时配置其他参数,如定时器优先级、定时器类型等。在实际应用中,仔细考虑资源管理、延迟和优先级是非常重要的。

七、Interrupt nesting behaviour configuration设置

  1. LIBRARY_LOWEST_INTERRUPT_PRIORITY: 这个宏定义了系统中断的最低优先级。中断优先级是一个非负整数,具有较低数字的中断具有较高的优先级。这个宏定义了系统中断可以具有的最低优先级值。

  2. LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY: 这个宏定义了允许由系统调用中断的最高优先级。系统调用是一种特殊类型的中断,用于在中断上下文中执行与操作系统相关的任务,如任务切换。这个宏定义了允许系统调用中断具有的最高优先级值。

        这两个宏的定义可能会因特定的FreeRTOS端口而异,因为不同的处理器和架构可能具有不同的中断控制机制和优先级范围。它们的主要目的是确保系统中断和系统调用之间有足够的优先级间隔,以防止系统调用中断干扰系统中断的正常运行。

        在配置这些宏时,您需要参考特定的FreeRTOS文档和端口文档,以确保您设置了适当的值,以避免中断优先级冲突和系统不稳定。在多任务系统中,正确管理中断优先级是确保系统稳定性和可靠性的关键。

八、Include definitions设置

  1. vTaskPrioritySet: 用于设置任务的优先级。它接受一个任务句柄和一个优先级参数,并将该任务的优先级设置为指定值。
  2. uxTaskPriorityGet: 用于获取任务的当前优先级。它接受一个任务句柄,并返回该任务的当前优先级。
  3. vTaskDelete: 用于删除一个任务。它接受一个任务句柄,并在调用时终止该任务的执行。
  4. vTaskCleanUpResources: 用于清理任务使用的资源。它可以释放由任务分配的内存、关闭打开的文件等。
  5. vTaskSuspend: 用于挂起一个任务,使其暂停执行。它接受一个任务句柄,并将该任务的状态设置为挂起。
  6. vTaskDelayUntil: 用于使任务延迟到指定的时间。它接受一个指向时间变量的指针和一个时间间隔,任务将在指定的时间到达之前进行延迟。
  7. vTaskDelay: 用于使任务延迟一段时间。它接受一个时间间隔参数,任务将在指定的时间后进行延迟。
  8. xTaskGetSchedulerState: 用于获取调度器的状态。它返回一个枚举值,表示调度器当前的状态(运行中、暂停等)。
  9. xTaskResumeFromISR: 在中断服务程序中恢复一个被挂起的任务。它接受一个任务句柄,并将任务的状态从挂起改为就绪。
  10. xQueueGetMutexHolder: 用于获取互斥信号量的持有者句柄。它接受一个互斥信号量句柄,并返回当前持有该互斥信号量的任务句柄。
  11. xSemaphoreGetMutexHolder: 用于获取互斥信号量的持有者句柄。它接受一个互斥信号量句柄,并返回当前持有该互斥信号量的任务句柄。
  12. pcTaskGetTaskName: 用于获取任务的名称。它接受一个任务句柄,并返回一个指向任务名称字符串的指针。
  13. uxTaskGetStackHighWaterMark: 用于获取任务堆栈的高水位线。它接受一个任务句柄,并返回任务堆栈中未使用的最大字节数。
  14. xTaskGetCurrentTaskHandle: 用于获取当前任务的句柄。它返回当前执行的任务的句柄。
  15. eTaskGetState: 用于获取任务的当前状态。它接受一个任务句柄,并返回任务的状态(就绪、运行、挂起等)。
  16. xEventGroupSetBitFromISR: 在中断服务程序中设置事件组的位。它接受一个事件组句柄和要设置的位编号,并在中断上下文中设置事件组的相应位。
  17. xTimerPendFunctionCall: 在定时器回调函数中安排一个函数调用。它接受一个指向函数的指针和要传递给该函数的参数,并在定时器上下文中调度函数的执行。
  18. xTaskAbortDelay: 中止任务的延迟。它接受一个任务句柄,并取消任务的延迟等待,使其立即变为就绪状态。
  19. xTaskGetHandle: 用于获取任务的句柄。它接受一个指向任务函数的指针,并返回与该任务函数关联的任务句柄。


http://www.ppmy.cn/news/1075266.html

相关文章

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

51页企业数字化转型战略实践与启示PPT(附400份转型资料)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除&#xff0c;更多内容浏览公众号&#xff1a;智慧方案文库 企业数字化转型之路.pptx企业数字化转型大数据湖一体化平台项目建设方案PPT.pptx企业数字化转型大数据湖一体化运营管…

SciencePub学术 | Elsevier出版社SCIEEI征稿中

SciencePub学术刊源推荐:Elsevier出版社SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机科学类SCI-01 【期刊简介】6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区&#xff1b; 【检索情况】正刊&#xff0c;SC…

计网第四章(网络层)(七)

目录 一、路由信息协议RIP 1.距离向量&#xff1a; 2.跳数&#xff1a; 3.基本工作原理&#xff1a; 三个要点&#xff1a; 4.基本工作过程&#xff1a; &#xff08;1&#xff09;初始状态&#xff1a; &#xff08;2&#xff09;交换并更新信息 &#xff08;3&#…

解决RabbitMQ报错Stats in management UI are disabled on this node

文章目录 问题描述&#xff1a;解决步骤&#xff1a;进入容器后&#xff0c;cd到以下路径修改 management_agent.disable_metrics_collector false退出容器重启rabbitmq容器 问题描述&#xff1a; linux 部署 rabbitmq后&#xff0c;打开rabbitmq管理界面。点击channels&#…

Redis执行lua脚本-Time函数-获取当前时间

演变过程&#xff1a; TIME 命令返回当前服务器的时间&#xff0c;包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…

使用Spring的getBeansOfType实现接口多实现类的动态调用

使用Spring的getBeansOfType实现接口多实现类的动态调用 package com.xxl.job.admin.core.alarm;import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sp…

【函数栈帧解析:代码的迷人堆积和无限嵌套】

本章重点 一、何为函数栈帧 二、函数栈帧特性 - 同栈 - 后进先出 三、认识内存空间布局图 四、认识相关寄存器 五、认识相关汇编命令 六、测试代码&#xff1a; 七、函数栈帧全过程 要解决的问题​​​​​​​ 局部变量是怎么创建的&#xff1f;为什么局部变量的值是随机值&am…