配置参量(位于FreeRTOSConfig.h)

分类: OS |
配置参量(位于FreeRTOSConfig.h)
configUSE_PREEMPTION
设置为1,使用抢先式内核;设置为0,为合作轮转内核。
configUSE_IDLE_HOOK
设置为1,
configUSE_TICK_HOOK
如果希望使用时间片钩子,
configCPU_CLOCK_HZ
内部处理器执行的频率。这个值需要正确配置外围定时器。
configTICK_RATE_HZ
The frequency of the RTOS tick interrupt.
RTOS时间片中断的频率。
时间片中断用来测量时间。因此更高时间片频率意味着时间测量可以有更高分辨率,同时意味着内核占用更多的CPU(效率很低)。演示程序都使用了1000Hz的时间片频率。这是为了测试内核,通常需要更高的频率。
多个任务共有同一优先级。通过切换任务,在每一个RTOS时间片内,内核将在同一优先级的任务间分配处理器时间。高时间片频率意味着将减少给予每个任务的时间份额。
configMAX_PRIORITIES
应用程序任务中可用优先级
任何数量的任务,都可以分配同一优先级。 任务单独分配优先级。参考configMAX_CO_ROUTINE_PRIORITIES。 内核分配的每个可用的优先级都消耗RAM,因此这个值不应该设置为高于实际应用程序中需要的。
configMINIMAL_STACK_SIZE
空闲任务使用的堆栈大小。通常这个值不用少于
configTOTAL_HEAP_SIZE
内核总共可用的RAM数量。如果程序中利用例子中内存分配方案(FreeRTOS
configMAX_TASK_NAME_LEN
当创建一个任务,能够给予描述任务名称的最大容许长度。这个长度指定符号数目,包括NULL终止字节。
configUSE_TRACE_FACILITY
设置为1,使用可视化追踪功能。设置为0,就不使用。如果使用可视化追踪,必须提供追踪缓冲区。
configUSE_16_BIT_TICKS
时间片(内核开始执行后,时间片中断的次数)来测量时间。时间片计数器定义为可用的portTickType.类型。
定义configUSE_16_BIT_TICKS为1,将使portTickType定义为16位无符号类型。定义为0,将是32位无符号类型。 使用16位类型,将使在16位或8位单片机大幅度提高性能。但是,这样限制了最大指定可用时间周期(65535时间片)。然而,假定时间片频率为250Hz,一个任务在16位上,最大延时或中断时间位262秒,而32位为17179869秒。
configIDLE_SHOULD_YIELD
这个参数控制任务与空闲任务优先级相同时的行为。仅仅有以下影响:
- 使用优先级调度
- 用户程序创建的任务,运行在空闲任务一样的优先级
任务在时间片轮转中,使用同一优先级。假定没有更高优先级的任务,这样每一个任务,在空闲优先级下,将被分配相同数量的处理时间。如果,他们的优先级高于空闲任务的优先级,那么这种情况更是如此。 当任务处于空闲优先级下的行为,会有稍许不同。当configIDLE_SHOULD_YIELD设置为1时,当其他在空闲优先级的任务准备运行时,空闲任务将立刻让出CPU。当程序的任务调度可用时,要确保空闲任务能够执行的最少时间以上。这个行为,产生了不好的影响(根据应用程序的需要),如下描述:
上述图表表明,四个在空闲优先级的任务执行模型。任务A,
这些可以通过如下避免:
- 如果合适,可以使用空闲钩子代替在空闲优先级的分开任务。创建程序任务的优先级高于空闲优先级。
- 设置configIDLE_SHOULD_YIELD为1
设置configIDLE_SHOULD_YIELD为1,将阻止空闲任务让出执行时间直到它的时间片用完。这就确保了所有在空闲优先级的任务分配了相同数量的执行时间。这是以分配给空闲任务更高比例的执行时间为代价。
configUSE_MUTEXES
设置为1,将使用互斥功能;设置为0,将不使用。读者应该明白FreeRTOS.org
configUSE_RECURSIVE_MUTEXES
设置为1,将使用递归互斥功能;设置为0,将不使用。
configUSE_COUNTING_SEMAPHORES
设置为1,将使用计数器型信号量功能;设置为0,将不使用。
configUSE_ALTERNATIVE_API
设置为1,将包含替代队列函数;设置为0,将不包含。替代API在queue.h头文件中有详细的描述。
configCHECK_FOR_STACK_OVERFLOW
The
configQUEUE_REGISTRY_SIZE
队列记录有两个功能,都这涉及到内核相关的调试:
- 允许一个队列相关的名称,可以在GUI调试中容易定义。
- 包含了调试器所需的信息,来定位每个记录的队列和信号量。
队列记录除了进行内核相关的调试外,没有什么目的。
configQUEUE_REGISTRY_SIZE定义了可以记录的队列和信号量的最大数目。这些仅能够在使用内核相关调试时需要记录的。查看API中vQueueAddToRegistry()
configUSE_CO_ROUTINES
设置为1,将使用(协同例程)合作轮转式程序;设置为0,将不使用。当使用时,必须把Croutine.c包含进去项目中。
configMAX_CO_ROUTINE_PRIORITIES
合作式应用程序中可用的优先级数目。
Cortex
configKERNEL_INTERRUPT_PRIORITY应该设置为最低优先级。
注意如下讨论中,以"FromISR"
那些仅仅设置configKERNEL_INTERRUPT_PRIORITY的接口
内核本身为
configKERNEL_INTERRUPT_PRIORITY
内核本身为configKERNEL_INTERRUPT_PRIORITY设置优先级。可以设置configMAX_SYSCALL_INTERRUPT_PRIORITY为从调用FreeRTOS.org
可以设置configMAX_SYSCALL_INTERRUPT_PRIORITY高于
这些参数配置允许很灵活的中断处理:
-
中断处理的任务,像系统里其他任务一样,书写和分配优先级。这些任务都是被一个中断激活。ISR本身编写的应该尽可能的短小——仅仅为了唤醒更高优先级的任务而占用RAM。ISR返回,直接进入要唤醒的任务——因此中断处理是及时的好像所有是中断本身做的一样。这样的好处是:执行处理的任务时,所有的中断都允许。
执行
configMAX_SYSCALL_INTERRUPT_PRIORITY的接口提供更多——在内核中断和configMAX_SYSCALL_INTERRUPT_PRIORITY 之间允许全嵌套模式嵌套和程序调用API函数。中断优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY执行从不延时。 -
运行在高于系统调用最大优先级的ISR,从不会被内核本身屏蔽,所以他们的响应性不被内核功能所影响。对于那些需要瞬间高精度的中断来说是个好方法——例如:执行发动机换向的中断。然而,这样的ISR不能够使用FreeRTOS.org
API函数
为了利用这个方案,应用程序必须遵守如下原则:任何使用FreeRTOS.org
Cortex
configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY
configKERNEL_INTERRUPT_PRIORITY一般适用于Cortex-M3,