上图:
今天试着在IDE上面配置FreeRTOS,因为之前都是直接在keil上面移植裁剪系统,第一次在IDE上图形化配置导致很多参数都看不懂,很多需要配置的重要参数也找不到位置,所有我把所有可以配置的参数都翻译了一遍。(注:只做翻译,不详细叙述作用)
翻译按照上图中1、2、3、4的顺序
第一部分:Configure paremeters
USE_PREEMPTION 参数说明:设置为1时使用抢占式RTOS调度器,设置为0时使用合作式RTOS调度器。
TICK_RATE_HZ 取值范围为1~1000。参数说明:设置tick中断频率。取值为Hz。警告:最大值是1000,因为较大的值会产生编译错误(除以0)
MINIMAL_STACK_SIZE 必须在64到768个单词之间。参数说明:设置分配给空闲任务的堆栈大小。该值是用字(这里是32位定的,而不是字节。警告:用户选择的值应该考虑线程数、总堆大小和系统堆栈大小。如果使用的堆栈总大小大于总堆大小,FreeRTOS将无法创建和管理任务。maxvalue=configTOTAL_HEAP_SIZE/4(当分配是动态的)maxvalue=MCUram大小/4(当分配是静态的)
MAX_TASK_NAME_LEN 必须在12到255之间。参数说明:设置可用于任务名称的最大字符数。NULL结束符包含在字符计数中。
IDLE_SHOULD_YIELD 参数说明:如果有应用程序任务也以空闲优先级运行,则IDLE_SHOULD_YIELD控制空闲任务的行为。只有在使用抢占式调度程序时才有效果。如果IDLE_SHOULD_YIELD设置为0,则空闲任务永远不会让位于另一个任务,只在被抢占时才会离开运行状态。如果IDLE_SHOULD_YIELD设置为1,那么当有另一个空闲优先级任务处于Ready状态时,空闲任务将不会执行它定义的功能的不止一次迭代,而不会屈服于另一个任务。这确保当应用程序任务可以运行时,在空闲任务上花费的时间最少。
USE_MUTEXES 参数说明:使用CMSIS_RTOS_V2时强制为1(由于FW包中当前的cmsis_os2.c文件存在约束)。
USE_RECURSIVE_MUTEXES 诊断:使用CMSIS_RTOS_v2时强制为1参数说明:使用CMSIS_RTOS_V2时强制为1(由于FW包中当前cmsis_os2.c文件存在约束)。
USE_COUNTING_SEMAPHORES 诊断:当使用CMSIS_RTOS_v2时强制为1。参数说明:设置为1则包含构建中的计数信号量功能,设置为0则省略构建中的计数信号量功能。使用CMSIS_RTOS_V2时强制为1(FW包中当前cmsis_os2.c文件约束)。
QUEUE_REGISTRY_SIZE 必须在0到255之间。参数说明:队列注册表有两个目的,它们都与RTOS内核感知调试相关:它允许将文本名称与队列关联起来,以便在调试GUI中轻松识别队列。2.它包含调试器定位每个注册队列和信号量所需的信息。除非您使用RTOS内核感知调试器,否则队列注册表没有任何用途。
USE_APPLICATION_TASK_TAG 参数说明:要使vTaskSetApplicationTaskTag功能可用,USE_APPLICATION_TASK_TAG必须定义为1。本功能仅供高级用户使用。可以给每个任务分配一个'tag'值。这个值仅供应用程序使用RTOS内核本身不会以任何方式使用它。FreeRTOS跟踪宏文档页面提供了一个应用程序如何使用该特性的好例子。
ENABLE_BACKWARD_COMPATIBILITY 参数说明:FreeRTOS.h头文件包括一组#define宏,将8.0.0版本之前的FreeRTOS版本中使用的数据类型的名称映射到FreeRTOS8.0.0版本中使用的名称。这些宏允许应用程序代码将其构建的FreeRTOS版本从8.0.0前版本更新到8.0.0后版本,而不需要修改。在FreeRTOSConfig.h中将configENABLE_BACKWARD_COMPATIBILITY设置为0将从构建中排除宏,这样做允许验证没有使用8.0.0版本前的名称。
USE_TICKLESS_IDLE 参数说明:通过设置configUSE_TICKLESS_IDLE,空闲任务将抑制节拍,处理器将尽可能长时间处于低功耗模式。当设置为1(内置功能启用),两个宏,configPRE_SLEEP_PROCESSING和configPOST_SLEEP_PROCESSING会在FreeRTOSConfig.h中生成,两个空函数,preleepprocessing和PostSleepProcessing会在freertos.c中生成(由用户代码完成)。当设置为2(用户定义功能启用),完成…
USE_TASK_NOTIFICATIONS 参数说明:每个RTOS任务都有一个32位的通知值。RTOS任务通知是一个直接发送给任务的事件,它可以解除接收任务的阻塞,并可选地更新接收任务的通知值。RTOS任务通知功能在默认情况下是启用的,并且可以通过在FreeRTOSConfig.h中将configUSE_TASK_NOTIFICATIONS设置为0(当将USE_TASK_NOTIFICATIONS设置为Disabled时实现)从构建中排除(每个任务节省8字节)。
RECORD_STACK_HIGH_ADDRESS 参数说明:当设置为1(Enabled)时,堆栈开始地址保存到每个任务的TCB中(假设堆栈向下增长)。
TOTAL_HEAP_SIZE 必须在512byte~64kbytes之间。诊断:F1的值(除了F105/F107)参数说明:RTOS内核可用的RAM总数。除非应用程序正在使用heap_1.c、heap_2.c、heap_4.c或heap_5.c,否则TOTAL_HEAP_SIZE设置不会起作用(更多信息请参阅内存管理方案参数)。警告:用户选择的值应该考虑到应用程序对RAM的消耗,否则会导致链接问题!关于信息:minvalue=configMINIMAL_STACK_SIZE*4
MemoryManagementscheme 参数说明:每次创建任务、队列、互斥锁、软件定时器或信号量时,RTOS内核都会分配内存。为了替换和改进C标准库malloc()和free()函数的使用,FreeRTOS下载包含四个示例内存分配实现。这些方案分别在heap_1.c、heap_2.c、heap_3.c、heap_4.c和heap5.c源文件中实现。由heap_1.c、heap_2.c、heap_4.c和heap_5.c定义的方案从静态分配的数组中分配内存,称为FreeRTOS堆。TOTAL_HEAP_SIZE设置该数组的大小。大小以字节为单位指定。
USE_IDLE_HOOK 参数说明:空闲任务钩子函数是一个钩子(或回调)函数,如果定义和配置了它,它将在每次迭代实现时被空闲任务调用。—如果USE_IDLE_HOOK设置为1(Enabled),那么应用程序必须定义一个空闲任务钩子函数:如果USE_IDLE_HOOK设置为0(Disabled),那么将不会调用空闲任务钩子函数,即使已经定义了一个。注意:当设置为1时,freertos.c文件中会生成一个空函数(由用户完成)
USE_TICK_HOOK 参数说明:tick钩子函数是一个钩子(或回调)函数,如果定义和配置了它,它将在每次tick中断期间被调用。如果USE_TICK_HOOK设置为1(Enabled),那么应用程序必须定义一个tick钩子函数:如果USE_TICK_HOOK设置为0(Disabled),那么tick钩子函数将不会被调用,即使已经定义了一个。注意:当设置为1时,freertos.c文件中会生成一个空函数(由用户完成)
USE_MALLOC_FAILED_HOOK 参数说明:malloc()failed钩子函数是一个钩子(或回调)函数,如果pvPortMalloc()返回NULL,则该钩子(或回调)函数将被调用。-只有当没有足够的FreeRTOS堆内存用于成功分配请求时,才会返回NULL。如果USE_MALLOC_FAILED_HOOK设置为1(Enabled),那么应用程序必须定义一个malloc()失败的钩子函数:如果USE_MALLOC_FAILED_HOOK设置为0(Disabled),那么malloc()失败的钩子函数将不会被调用,即使已经定义了一个。注意:当设置为1时,freertos.c文件中会生成一个空函数(由用户完成)
USE_DAEMON_TASK_STARTUP_HOOK 诊断:自FreeRTOSv9支持以来增加的参数说明:如果USE_TIMERS和USE_DAEMON_TASK_STARTUP_HOOK都设置为1(Enabled),那么应用程序必须定义一个钩子函数:注意:当设置为1时,freertos.c文件中会生成一个空函数(由用户完成)
CHECK_FOR_STACK_OVERFLOW 参数说明:FreeRTOS提供了两种可选机制,可用于辅助堆栈溢出检测和调试。当CHECK_FOR_STACK_OVERFLOW设置为1(option1)时,使用一种机制。如果CHECK_FOR_STACK_OVERFLOW没有设置为0(Disabled),应用程序必须提供一个堆栈溢出钩子(或回调)函数:注意:当设置为1或2时,freertos.c文件中会生成一个空函数(由用户完成)
GENERATE_RUN_TIME_STATS 参数说明:可以配置FreeRTOS来收集任务运行时统计信息。vTaskGetRunTimeStats()API函数将收集到的运行时统计数据格式化为人类可读的表。GENERATE_RUN_TIME_STATS必须设置为1(Enabled),以便vTaskGetRunTimeStats()可用。注意:当设置为1时,freertos.c文件中会生成两个空函数(由用户完成)
USE_TRACE_FACILITY 诊断:默认启用(可能需要一些工具链,如MDK-ARM编译cmsis_os2.c)参数描述:如果您希望包含额外的结构成员和函数来帮助执行可视化和跟踪,则设置为1(启用)。
USE_STATS_FORMATTING_FUNCTIONS 参数描述:设置USE_TRACE_FACILITY和USE_STATS_FORMATTING_FUNCTIONS为1(Enabled),以便在构建中包含vTaskList()和vTaskGetRunTimeStats()函数。设置为0(Disabled)将从构建中省略vTaskList()和vTaskGetRunTimeStates()。
USE_CO_ROUTINES 参数描述:设置为1表示在构建中包含协同例程功能,或设置为0表示从构建中省略协同例程功能。要包含协同例程,例程必须包含在项目中。
MAX_CO_ROUTINE_PRIORITIES 必须在1到255之间。参数说明:设置可分配给协同例程的最大优先级。协同例程可以从零分配一个优先级,零是最低的优先级(MAX_CO_ROUTINE_PRIORITIES-1),这是最高的优先级。
TIMER_TASK_PRIORITY 必须在0到55之间。诊断:当configUse_TIMERS被启用时可用参数说明:设置软件定时器服务/守护任务的优先级。
TIMER_QUEUE_LENGTH 必须在1到255之间。诊断:在启用configUse_TIMERS时可用参数说明:设置软件定时器命令队列的长度。
TIMER_TASK_STACK_DEPTH 必须在128Word到16.384KWords之间。诊断:当configUse_TIMERS被启用时可用(用于定时器任务的静态分配)参数说明:设置分配给定时器服务任务的堆栈大小(以字为单位,而不是字节)。
LIBRARY_LOWEST_INTERRUPT_PRIORITY 必须在1到15之间。诊断:可用于非M0皮质内核系列。参数说明:可用于调用“设置优先级”功能的最低中断优先级。
LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORIT 必须在1到15之间。诊断:可用于非M0皮质内核系列。参数说明:最高中断优先级,可以被任何调用中断安全的FreeRTOSAPI函数的中断服务程序使用。不要从任何具有更高优先级的中断调用中断安全的freertosAPI函数!(较高的优先级是较低的数值)。
第二部分Include parameters
(注:这一部分翻译大多都一样,基本都是关于某个函数是否需要包含,包含则置1)
vTaskPrioritySet 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被排除在你的构建。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskPrioritySet()API函数,将vTaskPrioritySet设置为1(Enabled)
uxTaskPriorityGet 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被从你的构建中排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含uxTaskPriorityGet()API函数,将uxTaskPriorityGet设置为1(Enabled)。要从构建中排除它,将uxTaskPriorityGet设置为0(Disabled)。
vTaskDelete 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件从你的构建中被排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskDelete()API函数,将vTaskDelete设置为1(Enabled)。要从构建中排除它,请将vTaskDelete设置为0(Disabled)。
vTaskCleanUpResources 参数说明:它是一个宏,允许那些不被你的应用程序利用的实时内核的组件被排除在你的构建。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskCleanUpResources()API函数,请将TaskCleanUpResources设置为1(Enabled)。要从构建中排除它,请将vtaskcleanupressources设置为0(Disabled)。
vTaskSuspendvTaskSuspend 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被从你的构建中排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskSuspend()API函数,设置vTaskSuspend为1(Enabled)。要从构建中排除它,请将vTaskSuspend设置为0(Disabled)。
vTaskDelayUntil 诊断:默认是启用的(可能需要一些工具链,如MDK-ARM编译cmsis_os_2.c)参数说明:它是一个宏,允许那些实时内核的组件没有被您的应用程序使用,从您的构建被排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskDelayUntil()API函数,将vTaskDelayUntil设置为1(Enabled)。要从构建中排除它,请将vTaskDelayUntil设置为0(Disabled)。
vTaskDelay 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被从你的构建中排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含vTaskDelay()API函数,设置vTaskDelay为1(Enabled)。要从构建中排除它,请将vTaskDelay设置为0(Disabled)。
xTaskGetSchedulerStateDiagnostic configUSE_TIMERS所允许的两个值是启用的,这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xTaskGetSchedulerState()API函数,将xTaskGetSchedulerState设置为1(Enabled)。要从构建中排除它,请将xTaskGetSchedulerState设置为0(Disabled)。
xTaskResumeFromISR 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被排除在你的构建。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xTaskResumeFromISR()API函数,将xTaskResumeFromISR和vTaskSuspend设置为1(Enabled)。要从构建中排除它,将xTaskResumeFromISR或vTaskSuspend设置为0(Disabled)。
xQueueGetMutexHolder 参数说明:在FreeRTOSv7.2.0中引入的配置常量,用作xSemaphoreGetMutexHolder的默认值(如果没有显式设置)
xSemaphoreGetMutexHolder 参数说明:它是一个宏,允许那些不被你的应用程序利用的实时内核的组件被排除在你的构建。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xSemaphoreGetMutexHolder()API函数,将xSemaphoreGetMutexHolder和USE_MUTEXES设置为1(Enabled)。要从构建中排除它,将xSemaphoreGetMutexHolder或USE_MUTEXES设置为0(Disabled)。
pcTaskGetTaskName 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件从你的构建中被排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含pcTaskGetTaskName()API函数,将pcTaskGetTaskName设置为1(Enabled)。要从构建中排除它,将pcTaskGetTaskName设置为0(Disabled)。
uxTaskGetStackHighWaterMark 诊断:默认启用(可能需要一些MDK-ARM等工具链编译cmsis_os2.c)参数描述:这是一个宏允许这些组件的实时内核不利用被排除在构建您的应用程序。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含uxTaskGetStackHighWaterMark()API函数,将uxTaskGetStackHighWaterMark设置为1(Enabled)。要从构建中排除它,将uxTaskGetStackHighWaterMark设置为0(Disabled)。
xTaskGetCurrentTaskHandle 参数说明:它是一个宏,允许那些不被你的应用程序利用的实时内核的组件被排除在你的构建。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xTaskGetCurrentTaskHandle()API函数,将xTaskGetCurrentTaskHandle设置为1(Enabled)。要从构建中排除它,将xTaskGetCurrentTaskHandle设置为0(Disabled)。
eTaskGetStateeTaskGetState 诊断:默认是启用的(可能需要一些工具链,如MDK-ARM编译cmsis_os2.c)这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含eTaskGetState()API函数,将eTaskGetState设置为1(Enabled)。要从构建中排除它,请将eTaskGetState设置为0(Disabled)。
xEventGroupSetBitFromISRDiagnostic 自FreeRTOSv8支持以来可。xEventGroupSetBits()的一个版本,可以从中断服务例程(ISR)调用。注意:INCLUDE_xTimerPendFunctionCall必须设置为1,以使xEventGroupSetBitFromISR()函数可用。
xTimerPendFunctionCall 诊断:默认启用(可能需要一些工具链,如MDK-ARM编译cmsis_os2.c)参数描述:用于将函数的执行等待到RTOS守护进程任务(定时器服务任务,因此该函数的前缀为'timer')。注意:必须将configUSE_TIMERS设置为1以使xTimerPendFunctionCall()函数可用
xTaskAbortDelay 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件被从你的构建中排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xTaskAbortDelay()API函数,将xTaskAbortDelay设置为1(Enabled)。要从构建中排除它,请将xTaskAbortDelay设置为0(Disabled)。
xTaskGetHandle 参数说明:它是一个宏,允许那些不被你的应用程序使用的实时内核的组件从你的构建中被排除。这确保了RTOS不会使用更多的ROM或RAM,除了必要的特定嵌入式应用程序。要包含xTaskGetHandle()API函数,将xTaskGetHandle设置为1(Enabled)。要从构建中排除它,将xTaskGetHandle设置为0(Disabled)。
第三部分Advanced settings
USE_NEWLIB_REENTRANT 参数说明:(fromhttps://freertos.org/a00110.html)如果configUSE_NEWLIB_REENTRANT设置为1,那么将为每个创建的任务分配一个newlibrent结构。注意,Newlib支持已经被普遍的需求所包含,但是FreeRTOS维护者自己并没有使用。FreeRTOS不负责生成的newlib操作。用户必须熟悉newlib,并且必须提供必要存根的系统范围实现。请注意(在编写本文时)当前的newlib设计实现了一个必须提供锁的系统范围的malloc()。警告:如果在不使用newlib的情况下启用,CubeMx项目编译将失败("无法打开源代码文件"reent.h")
UseFWpackheapfile 使用FWpackheapfile参数说明:如果启用(默认值),则将堆文件(内存管理方案中定义)从FW包复制到生成的项目中。如果禁用,则由用户提供至少包含vPortFree()和pvPortMalloc()实现的文件(否则在链接时它们将丢失)。
第四部分FreeRTOS HeapUsage
HEAPSTILLAVAILABLE 堆仍然可用的数量(等于config_TOTAL_HEAP_SIZE-总堆使用)
TOTALHEAPUSED 已知对象(用户对象、内部freertos对象)使用的堆总数关于freertos堆的更多信息:freertos使用一个名为HEAP(进入RAM)的内存区域来分配内存,用于任务、队列、计时器、信号量、互斥以及动态创建变量。(FreeRTOS堆不同于在编译器级别定义的系统堆)可用堆空间的总数量由configTOTAL_HEAP_SIZE设置,该设置在FreeRTOSConfig.h中定义。FreeRTOS提供了几种不同复杂度和特性的堆管理方案。当FreeRTOS需要RAM时,选择的堆管理方案不是heap_3:*,而不是调用标准的malloc,而是调用PvPortMalloc()。*当需要释放内存时,它调用PvPortFree()而不是标准的free()。
Totalamountfortasks 定义的任务使用的RAM总量。关于任务的更多信息:每个创建的任务(包括空闲任务)都需要一个任务控制块(TCB)和一个在堆中分配的堆栈。TCB大小以字节为单位取决于FreeRTOSConfig.h*中启用的选项,最小配置TCB大小为96字节。*ifconfigUSE_TRACE_FACILITYenabled,add8bytes
ifconfigUSE_MUTEXESenabled,add8bytes创建任务时,任务堆栈大小作为参数传递。最后,FreeRTOS要求在堆中为每个任务分配:字节数=TCB_size+(4*任务堆栈大小)
Totalamountforqueues 被定义的队列使用的RAM总量(包括定时器队列,如果适用)关于队列的更多信息:FreeRTOS需要在堆中为每个消息队列分配:字节数=76+queue_storage_areaQueue_storage_area(bytes)=(element_size*nb_elements)+16。
Totalamountfortimers 定义的计时器使用的RAM总量。关于计时器的更多信息:FreeRTOS需要在堆中为每个计时器分配48个字节。
Totalamountformutexesandsemaphores定义的互斥体和信号量使用的RAM总量。更多关于互斥锁和信号量的信息:FreeRTOS需要为每个互斥锁/信号量在堆中分配88个字节。
Totalamountforevent 事件使用的RAM总数。关于事件的更多信息:FreeRTOS需要在堆中为每个vent分配32个字节。
Idletask(FreeRTOSinternal) 空闲任务(由FreeRTOS调度器创建)关于空闲任务的更多信息:空闲任务是在RTOS调度器启动时自动创建的,以确保始终有至少一个任务能够运行。它以尽可能低的优先级创建,以确保在有高优先级的应用程序任务处于就绪状态时,它不会占用任何CPU时间。(参见tasks.c文件中的vTaskStartScheduler函数)FreeRTOS要求在堆中分配空闲任务:字节数=TCB大小+(4*configMINIMAL_STACK_SIZE)这里:TCB大小=120configMINIMAL_STACK_SIZE=128
Timerservicetask(FreeRTOSinternal) 定时器服务任务(由FreeRTOS调度器创建)关于定时器服务任务的更多信息:当configUSE_TIMERS设置为1时,当RTOS调度器启动时,定时器服务任务将自动创建。FreeRTOS需要在堆中分配定时器服务任务:字节数=TCB大小+(4*configTIMER_TASK_STACK_DEPTH)这里:TCB大小=120configTIMER_TASK_STACK_DEPTH=256
defaultTask 用户任务(启动函数:StartDefaultTask)FreeRTOS需要在堆中为用户任务分配字节数=TCB大小+(4*任务堆栈大小)这里:TCB大小=120任务堆栈大小=128