You are on page 1of 5

配置参量(

(位于 FreeRTOSConfig.h
FreeRTOSConfig.h))
configUSE_PREEMPTION

设置为1,使用抢先式内核;设置为0,为合作轮转内核。

configUSE_IDLE_HOOK

设置为1, 使用空闲钩子;设置为0,不使用空闲钩子,。

configUSE_TICK_HOOK

如果希望使用时间片钩子, 就设置为1,设置为0,不使用

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

空闲任务使用的堆栈大小。通常这个值不用少于 FreeRTOSConfig.h file 中演示程序提供的。

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

这个参数控制任务与空闲任务优先级相同时的行为。仅仅有以下影响:
1 使用优先级调度
2 用户程序创建的任务,运行在空闲任务一样的优先级

任务在时间片轮转中,使用同一优先级。假定没有更高优先级的任务,这样每一个任务,在空闲优
先级下,将被分配相同数量的处理时间。如果,他们的优先级高于空闲任务的优先级,那么这种情
况更是如此。 当任务处于空闲优先级下的行为,会有稍许不同。当 configIDLE_SHOULD_YIELD
设置为1时,当其他在空闲优先级的任务准备运行时,空闲任务将立刻让出 CPU。当程序的任务调度
可用时,要确保空闲任务能够执行的最少时间以上。这个行为,产生了不好的影响(根据应用程序
的需要),如下描述:

上述图表表明,四个在空闲优先级的任务执行模型。任务 A, B,和 C,是应用程序任务。任务 I 是空


闲任务。上下文切换在 T0, T1....T6规律的周期间发生。当空闲任务执行时,任务 A 准备执行,但是
空闲任务已经占去了当前时间片的部分时间。结果是,任务 I 和任务 A 共同分享一个时间片。任务
B 和任务 C 比任务 A 获得更多的执行时间。

这些可以通过如下避免:
3 如果合适,可以使用空闲钩子代替在空闲优先级的分开任务。创建程序任务的优先级高于空
闲优先级。
4 设置 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

队列记录有两个功能,都这涉及到内核相关的调试:
5 允许一个队列相关的名称,可以在 GUI 调试中容易定义。
6 包含了调试器所需的信息,来定位每个记录的队列和信号量。

队列记录除了进行内核相关的调试外,没有什么目的。 configQUEUE_REGISTRY_SIZE 定义了可以


记录的队列和信号量的最大数目。这些仅能够在使用内核相关调试时需要记录的。查看 API 中
vQueueAddToRegistry() 和 vQueueUnregisterQueue()参考文档,获得更多信息。

configUSE_CO_ROUTINES

设置为1,将使用(协同例程)合作轮转式程序;设置为0,将不使用。当使用时,必须把 Croutine.c
包含进去项目中。

configMAX_CO_ROUTINE_PRIORITIES

合作式应用程序中可用的优先级数目。 任何合作式程序可使用同一优先级。任务分别设置优先级
——参考 configMAX_CO_ROUTINE_PRIORITIES.

Cortex M3 使用着请注意部分结尾特别说明的地方。

configKERNEL_INTERRUPT_PRIORITY 应该设置为最低优先级。

注意如下讨论中,以"FromISR" 结尾的 API 函数仅能够在中断服务函数中调用。

那些仅仅设置 configKERNEL_INTERRUPT_PRIORITY 的接口

内核本身为 configKERNEL_INTERRUPT_PRIORITY 设置优先级。调用 API 函数的中断,也必须以


这个优先级执行。没有调用 API 函数的中断,可以有更高的优先级,因此内核调动,他们执行从不
延时(在他们硬件限制的范围内)。 那些在这两种情况下:

configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY 执 行


的接口。

内 核 本 身 为 configKERNEL_INTERRUPT_PRIORITY 设 置 优 先 级 。 可 以 设 置
configMAX_SYSCALL_INTERRUPT_PRIORITY 为从调用 FreeRTOS.org API 函数的中断设置更高
的优先级。

可 以 设 置 configMAX_SYSCALL_INTERRUPT_PRIORITY 高 于 ( 一 个 很 高 优 先 级 的 水 平 )
configKERNEL_INTERRUPT_PRIORITY 来获得 中断全嵌套模式。没有调用 API 函数的中断可以在
高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 优先级下执行,因此是不会被内核执行延时。
例如,假定一个微控制器,为8级中断优先级水平——0是最低优先级,7为最高(参考 Cortex M3用
户在这部分的结尾特别注意的地方)。如下图片,描述了在每一个优先级下什么可以和什么不可以,
两个常量被设置为4和0。

中断优先级配置例子

这些参数配置允许很灵活的中断处理:
中断处理的任务,像系统里其他任务一样,书写和分配优先级。这些任务都是被一个中断激活。ISR
本身编写的应该尽可能的短小——仅仅为了唤醒更高优先级的任务而占用 RAM。ISR 返回,直接进
入要唤醒的任务——因此中断处理是及时的好像所有是中断本身做的一样。这样的好处是:执行处
理的任务时,所有的中断都允许。

执 行 configMAX_SYSCALL_INTERRUPT_PRIORITY 的 接 口 提 供 更 多 —— 在 内 核 中 断 和
configMAX_SYSCALL_INTERRUPT_PRIORITY 之间允许全嵌套模式嵌套和程序调用 API 函数。中
断优先级在 configMAX_SYSCALL_INTERRUPT_PRIORITY 执行从不延时。
运行在高于系统调用最大优先级的 ISR,从不会被内核本身屏蔽,所以他们的响应性不被内核功能
所影响。对于那些需要瞬间高精度的中断来说是个好方法——例如:执行发动机换向的中断。然而,
这样的 ISR 不能够使用 FreeRTOS.org API 函数

为了利用这个方案,应用程序必须遵守如下原则:任何使用 FreeRTOS.org API 的中断必须设置为


同一优先级,像内核( configKERNEL_INTERRUPT_PRIORITY 配置的一样),或者处于或低于
configMAX_SYSCALL_INTERRUPT_PRIORITY 。
configMAX_SYSCALL_INTERRUPT_PRIORITY(为了接口包含了这个功能)

Cortex M3 用和特别要注意的地方: 记住,Cortex M3 核心数值上使用低优先级来代替高优先级的


中断(这样看起来反常规和容易忘记)。如果希望分配够中断一个低优先级,不要分配为0优先级(或
其 他 低 数 值 ), 因 为 这 样 实 际 上 在 系 统 中 这 个 中 断 为 最 高 优 先 级 —— 如 果 设 置 优 先 级 在
configMAX_SYSCALL_INTERRUPT_PRIORITY 可能使系统崩溃。 在 Cortex M3核心 最低优先级
实际上是255——然而不同于 Cortex M3 卖主说明的不同数目的优先级位和支持库函数(期待优先
级使用不同方法指定)。例如在 STM32 ,在 ST 驱动库中能够指定的最低优先级是15——最高优先
级 可 以 指 定 为 0 。 < type="text/javascript"> < src="http://www.google-analytics.com/ga.js"
type="text/javascript"> < type="text/javascript">
configKERNEL_INTERRUPT_PRIORITY and
configMAX_SYSCALL_INTERRUPT_PRIORITY

configKERNEL_INTERRUPT_PRIORITY 一 般 适 用 于 Cortex-M3, PIC24, dsPIC and PIC32 接 口 。


configMAX_SYSCALL_INTERRUPT_PRIORITY 一般 PIC32和 Cortex M3 接口中可用。其他接口将
很快更新。

You might also like