首页 > 代码库 > FreeRTOS学习笔记4

FreeRTOS学习笔记4

FreeRTOS配置管理:

网上移植教程较多,也可以使用官方提供的各种Demo工程进行移植,不在详细介绍。本文主要介绍FreeRTOS移植成功后进行的配置方式。使其成为自己最匹配最精简,最适用的系统。

FreeRTOSConfig.h几乎包含了所有需要的配置。下文讲述主要的几项配置:

  1. 包含INCLUDE_。。。的宏定义。所有这些宏都是条件编译所需的。可以根据自身需要进行定义。例如INCLUDE_xTaskAbortDelay是需要使用函数 xTaskAbortDelay()时定义为1。这样做的好处是使处理器不编译不需要的函数。减少代码量。函数的功能在函数名字中已体现出来。根据需要进行定义即可。
  2. config开始的宏: 

   2.1 configAPPLICATION_ALLOCATED_HEAP 该宏定义为1时用户可以自己家设置堆内存,堆内存的详细代码在heap_1.c到heap_5.c中。具体取决于用户选择哪种内存管理方式。网上都推荐使用4。

   2.2 configASSERT 断言,和assert()函数类似,调试时可以判断传入的参数是否合理。一般在调试结束后关闭。FreeRTOS内核中的关键点都会调用 configASSERT(x),configASSERT()需要在 需要在 FreeRTOSConfig.h文 件中定义, 如下实例: #define configASSERT((x)) if((x)==0) vAssertCalled(__FILE_,__LINE__);
注意, vAssertCalled()函数需要用户自行去定义,可以是显示到 LCD上的 函数 ,也可以是 通过串口打印出来的 函数 ,原子的例程使用的定义:

//断言 #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int) #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
当参数 x错误的 时候就通过串口打印出发生文件名和所在错误的 时候就通过串口打印出发生文件名和所在行。

   2.3  configCHECK_FOR_STACK_OVERFLOW 堆栈溢出检测。堆栈的大小是从任务创建时就已经定义完成的。如果定义了堆栈溢出检测,用户必须定义一个钩子函数(回调函数)当堆栈溢出时,就会调用该函数。函数原型:

    void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName );

参数 xTask是任务句柄, pcTaskName是任务名字,要注意的堆栈溢出太严重话可能会 是任务名字,要注意的堆栈溢出太严重话可能会 是任务名字,要注意的堆栈溢出太严重话可能会 损毁这两个参数, 损毁这两个参数, 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 pxCurrentTCB来确定哪个任务发 生了堆栈溢出,一般在调试结束时将该宏关闭,减少系统开销。该宏可以等于1或者2,方法1较快,方法2慢一点但是几乎可以检测出所有堆栈溢出的情况。

   2.4 configCPU_CLOCK_HZ 设置 CPU的频率。

   2.5 configSUPPORT_DYNAMIC_ALLOCATION 定义为 1的话在创建 FreeRTOS的内核对象时候 所需要的 RAM就会从 FreeRTOS的堆中 的堆中 动态的获取内存,定义为0的话需要用户自行提供。默认为1。

   2.6 configGENERATE_RUN_TIME_STATS 置为 1开启时间统计功能, 开启时间统计功能, 相应的 API函数会被编译, 为 0时关闭间统计功能。 时关闭间统计功能。 如果 宏 configGENERATE_RUN_TIME_STATS为 1的话还需要定义一个外设来作为时间系统的基准,还需要一个宏返回当前基准时钟的值。

   2.7 configIDLE_SHOULD_YIELD 一般关闭,空闲任务。没什么作用。

   2.8 configKERNEL_INTERRUPT_PRIORITY、
       onfigMAX_SYSCALL_INTERRUPT_PRIORITY、
       onfigMAX_API_CALL_INTERRUPT_PRIORITY
       三个宏和FreeRTOS 的中断配置有关。

   2.9 configMAX_CO_ROUTINE_PRIORITIES 系统的最大优先级数量

   2.10 configMAX_PRIORITIES 设置任务的优先级数量,设置好以后任务就可以使用从0 到configMAX_PRIORITIES-1 的优先级,其中0 是最低优先级,configMAX_PRIORITIES-1 是最高优先级。

    2.11 configMAX_TASK_NAME_LEN 设置任务名最大长度。

    2.12 configMINIMAL_STACK_SIZE 设置空闲任务的最小堆栈大,以字为单位,不是字节。

    2.13 configNUM_THREAD_LOCAL_STORAGE_POINTERS 每个任务的指针数组大小。

    2.14 configUSE_MUTEXES 为1时使用互斥信号量。

    2.15 configUSE_PORT_OPTIMISED_TASK_SELECTION FreeRTOS有两种方法来选择下一个 要运行的任务,是通用另外有两种方法来选择下一个 要运行的任务,是通用另外有两种方法来选择下一个 要运行的任务,是通用另外是特殊的 方法, 也就是硬件方法, 使用 MCU自带 的硬件指令来实现。(注:使用硬件方式时和使用的CPU有关,例如stm32有32个中断,因此,使用stm32时硬件方式最多使用32个任务。而通用方式无限制。)

    2.16 onfigUSE_PREEMPTION 为1时使用抢占式任务调度器。0为协程方式。(FreeRTOS已经不再更新协程方式的算法。我们也可以使用同一优先级多个任务的方式来进行相类似的效果。)

    2.17 configUSE_TICKLESS_IDLE 低功耗模式

      configUSE_TIMERS 软件定时器模式。并不精确。

    2.18 configUSE_TIME_SLICING 为1时使用抢占式调度器,这样会使调度器无限调用最高级优先级任务。为0时使用轮盘式任务调度模式。默认为1。

  这是这个头文件中我认为最常用也是最基本的几个宏,在今后使用中有需要再具体查看即可。

FreeRTOS学习笔记4