FreeRTOS基于Cube MX配置的解析

这篇具有很好参考价值的文章主要介绍了FreeRTOS基于Cube MX配置的解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、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文档和端口文档,以确保您设置了适当的值,以避免中断优先级冲突和系统不稳定。在多任务系统中,正确管理中断优先级是确保系统稳定性和可靠性的关键。文章来源地址https://www.toymoban.com/news/detail-685820.html

八、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: 用于获取任务的句柄。它接受一个指向任务函数的指针,并返回与该任务函数关联的任务句柄。

到了这里,关于FreeRTOS基于Cube MX配置的解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • proteus仿真stm32——流水灯(Cube MX+Keil5+proteus操作详解)

    之前都是用HAL库+实际单片机进行调试,网上proteus教程多基于51单片机且并非HAL库,本文便基于proteus仿真stm32——流水灯,利用Cube MX+Keil5+proteus来实现8个led依次交替闪烁,并且总结自己踩过的大坑,如有问题请多多指教。 芯片选择 proteus能够选择的stm32单片机有限,此次试验采

    2023年04月23日
    浏览(44)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(63)
  • 单片机移植freemodbus主机(STM32、GD32、瑞萨、国民技术等)

    从github下载:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 无法下载或者下载太慢可以用资源下载,无需积分。freeModbus主机源码下载 示例代码 参考从机代码创建 将FreeModbus主机源代码拷贝到工程中间件-第三方库-freemodbus源码库:即MiddlewaresThird_PartyFreeModbusMaster文件夹中。

    2024年02月11日
    浏览(47)
  • 单片机(STM32,GD32,NXP等)中BootLoader的严谨实现详解

    Bootloader( 引导加载程序 )的主要任务是引导加载并运行应用程序,我们的软件升级逻辑也一般在BootLoader中实现。本文将详细介绍BootLoader在单片机中的实现,包括 STM32、GD32、NXP Kinetis 等等的所有单片机,因为无论是什么样的芯片,它实现的逻辑都是一样的。 注意,本篇文章主

    2024年02月02日
    浏览(60)
  • 如果STM32/GD32一类的ARM单片机解除读写保护的方法

    有时候啊,使用ST-Link给STM32一类的ARM单片机下载程序的时候,发现怎么也下载不了,可能是由于芯片被写保护了。那怎么办呢?可以使用STM32 ST-LINK Utility工具解除芯片的写保护,本篇博文介绍操作步骤,文章最后有工具下载链接。 双击“STM32 ST-LINK Utility.exe”,打开软件。 软

    2024年02月09日
    浏览(53)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(73)
  • STM32 GD32 瑞萨 psoc 等单片机 无线wifi蓝牙最佳解决方案

    新联鑫威一系列低功耗高性价比sdio wifi/蓝牙combo的模块CYWL6208 , CYWL6312, CYW6209等可以搭配stm32 各种型号例如以下,支持sta/ap/ap+sta,双模蓝牙的应用,支持ThreadX,rt-thread, freertos, Azure RTOS, Linux, Android系统. 稳定强,功耗低,吞吐量高等优势可以应用在新能源充电桩 安防 工控 智能

    2024年01月17日
    浏览(56)
  • FreeRTOS_Stm32F103系列单片机标准库移植

    链接:FreeRTOS 下面的教程是基于从github下载压缩包进行的,最好下载这个或者直接看3.1,从我百度网盘下载。如果是别的下载源也问题不大,大同小异。 此时我们需要下载以下两个仓库, 点进去按下面的步骤下载就行了,另一个也是这样下。 链接: FreeRTOS官网 打开链接我们

    2024年01月22日
    浏览(53)
  • GD32_时钟配置解析

    本文以GD32F303型号为基础,依照标准库GD32F30x_Firmware_Library_V2.1.5为例,作为笔记简单记录个人对其时钟配置的理解,后续会持续更新本篇笔记内容。 因为某些原因,国外半导体供应供应短缺,以STM32为例的系列芯片紧缺,价格跳水严重。技术群的部分码友们所在公司纷纷寻找替

    2024年02月09日
    浏览(35)
  • stm32以及freertos 堆栈解析

    以前在mcu编程的时候没有太注意堆栈的情况,只知道需要将堆栈设置的大一点。现在逐步使用freertos,在freertos中也有关于堆栈的设置,freertos的堆栈和启动文件中的堆栈关系是什么?为了以后使用的无误,本次一次性把这些弄清楚。 堆栈是一个特定的存储区或者寄存器。一般

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包