配置FreeRTOS

转载于http://blog.csdn.net/liyuanbhu/article/details/7912170

配置 FreeRTOS

标签: include任务hookapisemaphore任务调度
23156人阅读 评论(2) 收藏 举报
本文章已收录于:
分类:

配置FreeRTOS

FreeRTOS 是高度可配置的。所有的可配置项都在FreeRTOSConfig.h 文件中。每一个Demo 程序中都包含了一个配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作为模板,在其基础上加以修改。

下面先给出一个典型的FreeRTOSConfig.h 文件,然后再逐项加以说明。

  1. #ifndef FREERTOS_CONFIG_H  
  2. #define FREERTOS_CONFIG_H  
  3.   
  4. /* Here is a good place to include header files that are required across  
  5. your application. */  
  6. #include "something.h"  
  7.   
  8. #define configUSE_PREEMPTION                1  
  9. #define configUSE_IDLE_HOOK                 0  
  10. #define configUSE_TICK_HOOK                 0  
  11. #define configCPU_CLOCK_HZ                  58982400  
  12. #define configTICK_RATE_HZ                  250  
  13. #define configMAX_PRIORITIES                5  
  14. #define configMINIMAL_STACK_SIZE            128  
  15. #define configTOTAL_HEAP_SIZE               10240  
  16. #define configMAX_TASK_NAME_LEN             16  
  17. #define configUSE_TRACE_FACILITY            0  
  18. #define configUSE_16_BIT_TICKS              0  
  19. #define configIDLE_SHOULD_YIELD             1  
  20. #define configUSE_MUTEXES                   0  
  21. #define configUSE_RECURSIVE_MUTEXES         0  
  22. #define configUSE_COUNTING_SEMAPHORES       0  
  23. #define configUSE_ALTERNATIVE_API           0  
  24. #define configCHECK_FOR_STACK_OVERFLOW      0  
  25. #define configQUEUE_REGISTRY_SIZE           10  
  26. #define configGENERATE_RUN_TIME_STATS       0  
  27.   
  28. #define configUSE_CO_ROUTINES               0   
  29. #define configMAX_CO_ROUTINE_PRIORITIES     1  
  30.   
  31. #define configUSE_TIMERS                    1  
  32. #define configTIMER_TASK_PRIORITY           3  
  33. #define configTIMER_QUEUE_LENGTH            10  
  34. #define configTIMER_TASK_STACK_DEPTH        configMINIMAL_STACK_SIZE  
  35.   
  36. #define configKERNEL_INTERRUPT_PRIORITY         [dependent of processor]  
  37. #define configMAX_SYSCALL_INTERRUPT_PRIORITY    [dependent on processor and application]  
  38.   
  39. #define configASSERT( ( x ) )               if( ( x ) == 0 ) vCallAssert( __FILE__, __LINE__ )  
  40.   
  41. #define INCLUDE_vTaskPrioritySet                1  
  42. #define INCLUDE_uxTaskPriorityGet               1  
  43. #define INCLUDE_vTaskDelete                     1  
  44. #define INCLUDE_vTaskSuspend                    1  
  45. #define INCLUDE_xResumeFromISR                  1  
  46. #define INCLUDE_vTaskDelayUntil                 1  
  47. #define INCLUDE_vTaskDelay                      1  
  48. #define INCLUDE_xTaskGetSchedulerState          1  
  49. #define INCLUDE_xTaskGetCurrentTaskHandle       1  
  50. #define INCLUDE_uxTaskGetStackHighWaterMark     0  
  51. #define INCLUDE_xTaskGetIdleTaskHandle          0  
  52. #define INCLUDE_xTimerGetTimerDaemonTaskHandle  0  
  53. #define INCLUDE_pcTaskGetTaskName               0  
  54.   
  55. #endif /* FREERTOS_CONFIG_H */  
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/* Here is a good place to include header files that are required across 
your application. */
#include "something.h"

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                 0
#define configUSE_TICK_HOOK                 0
#define configCPU_CLOCK_HZ                  58982400
#define configTICK_RATE_HZ                  250
#define configMAX_PRIORITIES                5
#define configMINIMAL_STACK_SIZE            128
#define configTOTAL_HEAP_SIZE               10240
#define configMAX_TASK_NAME_LEN             16
#define configUSE_TRACE_FACILITY            0
#define configUSE_16_BIT_TICKS              0
#define configIDLE_SHOULD_YIELD             1
#define configUSE_MUTEXES                   0
#define configUSE_RECURSIVE_MUTEXES         0
#define configUSE_COUNTING_SEMAPHORES       0
#define configUSE_ALTERNATIVE_API           0
#define configCHECK_FOR_STACK_OVERFLOW      0
#define configQUEUE_REGISTRY_SIZE           10
#define configGENERATE_RUN_TIME_STATS       0

#define configUSE_CO_ROUTINES               0 
#define configMAX_CO_ROUTINE_PRIORITIES     1

#define configUSE_TIMERS                    1
#define configTIMER_TASK_PRIORITY           3
#define configTIMER_QUEUE_LENGTH            10
#define configTIMER_TASK_STACK_DEPTH        configMINIMAL_STACK_SIZE

#define configKERNEL_INTERRUPT_PRIORITY			[dependent of processor]
#define configMAX_SYSCALL_INTERRUPT_PRIORITY	[dependent on processor and application]

#define configASSERT( ( x ) )               if( ( x ) == 0 ) vCallAssert( __FILE__, __LINE__ )

#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_xResumeFromISR                  1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskGetSchedulerState          1
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_uxTaskGetStackHighWaterMark     0
#define INCLUDE_xTaskGetIdleTaskHandle          0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle  0
#define INCLUDE_pcTaskGetTaskName               0

#endif /* FREERTOS_CONFIG_H */


可配置的参数

configUSE_PREEMPTION

设为 1则采用抢占式调度器, 设为 0则采用协作式调度器。

configUSE_IDLE_HOOK

设为1则使能 idle hook,设为0则禁止idle hook。

configUSE_TICK_HOOK

设为1则使能 tick hook,设为0则禁止tick hook。

configCPU_CLOCK_HZ

设置为 MCU 内核的工作频率,以Hz为单位。配置FreeRTOS的时钟Tick时会用到。对不同的移植代码也可能不使用这个参数。如果确定移植代码中不用它就可以注释掉这行。

configTICK_RATE_HZ

FreeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越大。FreeRTOS 自带的Demo 程序中将TickRate 设为了1000Hz只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。

当多个任务共用一个优先级时,内核调度器回来每次时钟中断到来后轮转切换任务(round robin),因此,更高的Tick Rate 会导致任务的时间片“time slice”变短。

configMAX_PRIORITIES

程序中可以使用的最大优先级。FreeRTOS 会为每个优先级建立一个链表,因此没多一个优先级都会增加些RAM 的开销。所以,要根据程序中需要多少种不同的优先级来设置这个参数。

configMINIMAL_STACK_SIZE

任务堆栈的最小大小,FreeRTOS根据这个参数来给idle task 分配堆栈空间。这个值如果设置的比实际需要的空间小,会导致程序挂掉。因此,最好不要减小Demo 程序中给出的大小。

configTOTAL_HEAP_SIZE

设置堆空间(Heap)的大小。只有当程序中采用FreeRTOS 提供的内存分配算法时才会用到。

configMAX_TASK_NAME_LEN

任务名称最大的长度,这个长度是以字节为单位的,并且包括最后的 NULL 结束字节。

configUSE_TRACE_FACILITY

如果程序中需要用到TRACE功能,则需将这个宏设为1。否则设为0。开启TRACE功能后,RAM占用量会增大许多,因此在设为1之前请三思。

configUSE_16_BIT_TICKS

将 configUSE_16_BIT_TICKS设为 1后portTickType 将被定义为无符号的16位整形类型,configUSE_16_BIT_TICKS 设为0 后portTickType 则被定义为无符号的32位整型。

configIDLE_SHOULD_YIELD

这个参数控制那些优先级与idle 任务相同的任务的行为,并且只有当内核被配置为抢占式任务调度时才有实际作用。

内核对具有同样优先级的任务会采用时间片轮转调度算法。当任务的优先级高于idle任务时,各个任务分到的时间片是同样大小的。

但当任务的优先级与idle任务相同时情况就有些不同了。当configIDLE_SHOULD_YIELD 被配置为1时,当任何优先级与idle 任务相同的任务处于就绪态时,idle任务会立刻要求调度器进行任务切换。这会使idle任务占用最少的CPU时间,但同时会使得优先级与idle 任务相同的任务获得的时间片不是同样大小的。因为idle任务会占用某个任务的部分时间片。

configUSE_MUTEXES

设为 1 则程序中会包含mutex 相关的代码,设为 0 则忽略相关的代码。

configUSE_RECURSIVE_MUTEXES

设为 1 则程序中会包含recursive mutex 相关的代码,设为 0 则忽略相关的代码。

configUSE_COUNTING_SEMAPHORES

设为 1 则程序中会包含semaphore 相关的代码,设为 0 则忽略相关的代码。

configUSE_ALTERNATIVE_API

设为 1 则程序中会包含一些关于队列操作的额外API函数,设为 0 则忽略相关的代码。这些额外提供的API运行速度更快,但是临界区(关中断)的长度也更长。有利也有弊,是否要采用需要用户自己考虑了。

configCHECK_FOR_STACK_OVERFLOW

控制是否检测堆栈溢出。

configQUEUE_REGISTRY_SIZE

队列注册表有两个作用,但是这两个作用都依赖于调试器的支持:

1.        给队列一个名字,方便调试时辨认是哪个队列。

2.        包含调试器需要的特定信息用来定位队列和信号量。

如果你的调试器没有上述功能,哪个这个注册表就毫无用处,还占用的宝贵的RAM空间。

configGENERATE_RUN_TIME_STATS

设置是否产生运行时的统计信息,这些信息只对调试有用,会保存在RAM 中,占用RAM空间。因此,最终程序建议配置成不产生运行时统计信息。

configUSE_CO_ROUTINES

设置为1则包含co-routines 功能,如果包含了co-routines功能,则编译时需包含croutine.c 文件

configMAX_CO_ROUTINE_PRIORITIES

co-routines 可以使用的优先级的数量。

configUSE_TIMERS

设置为1则包含软件定时器功能。

configTIMER_TASK_PRIORITY

设置软件定时器任务的优先级。

configTIMER_QUEUE_LENGTH

设置软件定时器任务中用到的命令队列的长度。

configTIMER_TASK_STACK_DEPTH

设置软件定时器任务需要的任务堆栈大小。

configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

Cortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代码中会使用到 configKERNEL_INTERRUPT_PRIORITY.

PIC32, RX600 和 Cortex-M系列 会使用到 configMAX_SYSCALL_INTERRUPT_PRIORITY

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


对那些只定义了 configKERNEL_INTERRUPT_PRIORITY 的系统:

configKERNEL_INTERRUPT_PRIORITY决定了FreeRTOS内核使用的优先级。

所有调用API函数的中断的优先级都应设为这个值,不调用API函数的中断可以设为更高的优先级。


对那些定义了configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY的系统:

configKERNEL_INTERRUPT_PRIORITY决定了FreeRTOS内核使用的优先级。

configMAX_SYSCALL_INTERRUPT_PRIORITY决定了可以调用API函数的中断的最高优先级。高于这个值的中断处理函数不能调用任何API 函数。

configASSERT

宏configASSERT()的作用类似C语言标准库中的宏assert(),configASSERT() 可以帮助调试,但是定义了configASSERT()后会增加程序代码,也会使程序变慢。

以INCLUDE 开头参数

以 'INCLUDE' 开头的宏允许我们将部分不需要的API 函数排除在编译生成的代码之外。这可以使内核代码占用更少的ROM 和RAM。

比如,如果代码中需要用到 vTaskDelete 函数则这样写:

#defineINCLUDE_vTaskDelete    1

如果不需要,则这样写:

#defineINCLUDE_vTaskDelete    0


4
0
 
 
我的同类文章

配置 FreeRTOS


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值