zoukankan      html  css  js  c++  java
  • FreeRTOS config开始的宏

    FreeRTOSConfig.h系统配置文件中可以自定义,FreeRTOS.h中定义默认值

    configAPPLICATION_ALLOCATED_HEAP
    默认情况下FreeRTOS的堆内存是由编译器来分配的,将宏configAPPLICATION_ALLOCATED_HEAP定义为1的话堆内存可以由用户自行设置(heap_1.c、heap_2.c、heap_3.c、heap_4.c和heap_5.c)

    /* Allocate the memory for the heap. */
    #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
        /* The application writer has already defined the array used for the RTOS
        heap - probably so it can be placed in a special segment or address. */
        extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    #else
        static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    #endif /* configAPPLICATION_ALLOCATED_HEAP */

    configASSERT
    断言,类似 C 标准库中的 assert()函数,调试代码的时候可以检查传入的参数是否合理(调试阶段使用)

    #ifndef configASSERT
        #define configASSERT( x )
        #define configASSERT_DEFINED 0
    #else
        #define configASSERT_DEFINED 1
    #endif

    configCHECK_FOR_STACK_OVERFLOW
    设置堆栈溢出检测,每个任务都有一个任务堆栈。如果使用函数xTaskCreate()创建一个任务的话那么这个任务的堆栈是自动从FreeRTOS的堆(ucHeap)中分配的。如果使用函数xTaskCreateStatic()创建任务的话任务堆栈是由用户设置的,参数pxStackBuffer为任务堆栈,一般是一个数组

    使能堆栈检测功能(configCHECK_FOR_STACK_OVERFLOW大于0),而且用户必须提供一个钩子函数(回调函数)。当内核检测到堆栈溢出以后就会调用这个钩子函数

    /* Callback function prototypes. --------------------------*/
    #if(  configCHECK_FOR_STACK_OVERFLOW > 0 )
        extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName );
    #endif

    configCHECK_FOR_STACK_OVERFLOW==1:堆栈溢出检测方法 1。优点就是快
    configCHECK_FOR_STACK_OVERFLOW==2:堆栈溢出检测方法 2。能检测到几乎所有的堆栈溢出

    configCPU_CLOCK_HZ
    CPU的频率

    #define configCPU_CLOCK_HZ          ( ( unsigned long ) 72000000 )  

    configSUPPORT_DYNAMIC_ALLOCATION
    1(默认):在创建FreeRTOS的内核对象的时候所需要的RAM从FreeRTOS的堆中动态获取内存
    0:所需的RAM需要用户自行提供

    #ifndef configSUPPORT_DYNAMIC_ALLOCATION
        /* Defaults to 1 for backward compatibility. */
        #define configSUPPORT_DYNAMIC_ALLOCATION 1
    #endif

    configENABLE_BACKWARD_COMPATIBILITY

    #ifndef configENABLE_BACKWARD_COMPATIBILITY
        #define configENABLE_BACKWARD_COMPATIBILITY 1
    #endif
    #if configENABLE_BACKWARD_COMPATIBILITY == 1
        #define eTaskStateGet eTaskGetState
        #define portTickType TickType_t
        #define xTaskHandle TaskHandle_t
        #define xQueueHandle QueueHandle_t
        #define xSemaphoreHandle SemaphoreHandle_t
        #define xQueueSetHandle QueueSetHandle_t
        #define xQueueSetMemberHandle QueueSetMemberHandle_t
        #define xTimeOutType TimeOut_t
        #define xMemoryRegion MemoryRegion_t
        #define xTaskParameters TaskParameters_t
        #define xTaskStatusType TaskStatus_t
        #define xTimerHandle TimerHandle_t
        #define xCoRoutineHandle CoRoutineHandle_t
        #define pdTASK_HOOK_CODE TaskHookFunction_t
        #define portTICK_RATE_MS portTICK_PERIOD_MS
        #define pcTaskGetTaskName pcTaskGetName
        #define pcTimerGetTimerName pcTimerGetName
        #define pcQueueGetQueueName pcQueueGetName
        #define vTaskGetTaskInfo vTaskGetInfo
    
        /* Backward compatibility within the scheduler code only - these definitions
        are not really required but are included for completeness. */
        #define tmrTIMER_CALLBACK TimerCallbackFunction_t
        #define pdTASK_CODE TaskFunction_t
        #define xListItem ListItem_t
        #define xList List_t
    #endif /* configENABLE_BACKWARD_COMPATIBILITY */

    V8.0.0之前的FreeRTOS中会使用到这些数据类型

    configGENERATE_RUN_TIME_STATS
    1:开启时间统计功能
    0:关闭时间统计功能

    #if ( configGENERATE_RUN_TIME_STATS == 1 )
    
        #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS /* 初始化一个外设来作为时间统计的基准时钟 */
            #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.
        #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */
    
        #ifndef portGET_RUN_TIME_COUNTER_VALUE /* 返回当前基准时钟的时钟
    值 */
            #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE
                #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.
            #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */
        #endif /* portGET_RUN_TIME_COUNTER_VALUE */
    
    #endif /* configGENERATE_RUN_TIME_STATS */

    configIDLE_SHOULD_YIELD
    1:空闲任务会为处于同等优先级的用户任务让出CPU使用权
    0:空闲任务不会为其他处于同优先级的任务让出CPU使用权
    建议关闭这个功能,因为空闲任务用不了多少时间

    #define configIDLE_SHOULD_YIELD     1

    configMAX_CO_ROUTINE_PRIORITIES
    设置可以分配给协程的最大优先级。协程的优先级可以从0到configMAX_CO_ROUTINE_PRIORITIES-1 ,其中0是最低的优先级

    #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

    configMAX_PRIORITIES
    设置任务的优先级数量。同上

    #define configMAX_PRIORITIES        ( 5 )

    configMAX_TASK_NAME_LEN
    设置任务名最大长度

    #define configMAX_TASK_NAME_LEN     ( 16 )

    configMINIMAL_STACK_SIZE
    设置空闲任务的最小任务堆栈大小。以字为单位。比如在STM32上设置为100的话,那么真正的堆栈大小就是100*4=400字节

    #define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 128 )

    configNUM_THREAD_LOCAL_STORAGE_POINTERS
    设置每个任务的本地存储指针数组大小

    #ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS
        #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
    #endif

    configQUEUE_REGISTRY_SIZE
    设置可以注册的队列和信号量的最大数量。在使用内核调试器查看信号量和队列的时候需
    要设置此宏

    #ifndef configQUEUE_REGISTRY_SIZE
        #define configQUEUE_REGISTRY_SIZE 0U
    #endif

    configSUPPORT_STATIC_ALLOCATION
    1:在创建一些内核对象的时候需要用户指定RAM
    0:使用heap.c中的动态内存管理函数来自动的申请RAM

    #ifndef configSUPPORT_STATIC_ALLOCATION
        /* Defaults to 0 for backward compatibility. */
        #define configSUPPORT_STATIC_ALLOCATION 0
    #endif

    configTICK_RATE_HZ
    设置FreeRTOS的系统时钟节拍频率,单位为HZ

    #define configTICK_RATE_HZ          ( ( TickType_t ) 1000 )

    configTIMER_QUEUE_LENGTH
    配置FreeRTOS软件定时器。FreeRTOS的软件定时器API函数会通过命令队列向软件定时器任务发送消息,此宏用来设置这个软件定时器的命令队列长度

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

    configTIMER_TASK_STACK_DEPTH
    设置定时器服务任务的任务堆栈大小

    configTOTAL_HEAP_SIZE
    设置堆大小。如果使用了动态内存管理的话

    /* Allocate the memory for the heap. */
    #if( configAPPLICATION_ALLOCATED_HEAP == 1 )
        /* The application writer has already defined the array used for the RTOS
        heap - probably so it can be placed in a special segment or address. */
        extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    #else
        static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    #endif /* configAPPLICATION_ALLOCATED_HEAP */

    configUSE_16_BIT_TICKS
    设置系统节拍计数器变量数据类型
    1:TickType_t是16位的
    0:TickType_t是32位的

    #define configUSE_16_BIT_TICKS      0

    configUSE_CO_ROUTINES
    1:启用协程,协程可以节省开销
    0:关闭。建议关闭

    #define configUSE_CO_ROUTINES       0

    configUSE_COUNTING_SEMAPHORES
    1:启用计数型信号量

    #ifndef configUSE_COUNTING_SEMAPHORES
        #define configUSE_COUNTING_SEMAPHORES 0
    #endif

    configUSE_IDLE_HOOK
    1:使用空闲任务钩子函数。用户需要实现空闲任务钩子函数

    #define configUSE_IDLE_HOOK         0

    configUSE_MALLOC_FAILED_HOOK
    1:使用内存分配失败钩子函数。用户需要实现内存分配失败钩子函数

    #ifndef configUSE_MALLOC_FAILED_HOOK
        #define configUSE_MALLOC_FAILED_HOOK 0
    #endif

    configUSE_MUTEXES
    1:使用互斥信号量

    #ifndef configUSE_MUTEXES
        #define configUSE_MUTEXES 0
    #endif

    configUSE_PORT_OPTIMISED_TASK_SELECTION
    选择下一个要运行的任务
    1:硬件的特殊指令
    0:C语言来实现

    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
        #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
    #endif

    configUSE_PREEMPTION
    1:使用抢占式调度器。每个时钟节拍中断中进行任务切换
    0:使用协程。任务切换:

    一个任务调用了函数 taskYIELD()
    一个任务调用了可以使任务进入阻塞态的 API 函数
    应用程序明确定义了在中断中执行上下文切换

    #define configUSE_PREEMPTION        1

    configUSE_QUEUE_SETS
    1:启用队列集功能

    #ifndef configUSE_QUEUE_SETS
        #define configUSE_QUEUE_SETS 0
    #endif

    configUSE_RECURSIVE_MUTEXES
    1:使用递归互斥信号量

    #ifndef configUSE_RECURSIVE_MUTEXES
        #define configUSE_RECURSIVE_MUTEXES 0
    #endif

    configUSE_TASK_NOTIFICATIONS
    1:使用任务通知功能

    #ifndef configUSE_TASK_NOTIFICATIONS
        #define configUSE_TASK_NOTIFICATIONS 1
    #endif

    configUSE_TICK_HOOK
    1:使能时间片钩子函数。用户需要实现时间片钩子函数

    #define configUSE_TICK_HOOK         0

    configUSE_TICKLESS_IDLE
    1:使能低功耗tickless模式

    #ifndef configUSE_TICKLESS_IDLE
        #define configUSE_TICKLESS_IDLE 0
    #endif

    configUSE_TIMERS
    1:使用软件定时器

    #ifndef configUSE_TIMERS
        #define configUSE_TIMERS 0
    #endif

    configUSE_TIME_SLICING
    0:不在时钟节拍中断中执行相同优先级任务的任务切换

    #ifndef configUSE_TIME_SLICING
        #define configUSE_TIME_SLICING 1
    #endif

    configUSE_TRACE_FACILITY
    1:启用可视化跟踪调试

    #define configUSE_TRACE_FACILITY    0
  • 相关阅读:
    Intellij IDEA 快捷键整理
    Jquery Datatables 请求参数及接收参数处理
    Java 并发编程实战 摘要
    【树莓派】关于盒子服务检测
    RPi Desktop盒子安装与服务配置
    使用Jmeter对API进行性能测试
    【树莓派】RPi desktop系统重启或关机挂起几个问题:plymouth-reboot.service、plymouth-poweroff.service、Deconfiguring network interfaces
    【自动化测试】基于IntelliJ IDEA的Gradle和testNG
    【树莓派】树莓派盒子性能监控管理
    【SCM】关于Gradle与maven的几篇文章
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709538.html
Copyright © 2011-2022 走看看