本文是《ALIENTEK STM32F429 FreeRTOS 开发教程》第三章学习笔记
第一章笔记–FreeRTOS简介与源码下载
第二章笔记–FreeRTOS在STM32F4上移植
FreeRTOSConfig.h
FreeRTOS的配置基本是通过在FreeRTOSConfig.h中定义宏定义实现。
INCLUDE_ 开头的宏
用来配置FreeRTOS中可选API函数,设置为1表示使能包含的API函数,设置为0表示不使用包含的API函数
从文件tasks.c中可以看到,当满足
INCLUDE_vTaskPrioritySet == 1
函数vTaskPrioritySet()才会被编译。使用条件编译的方法,根据实际需求来减少系统占用ROM和RAM的大小。
从FreeRTOS.h中可以看到
如果未宏定义”INCLUDE_vTaskPrioritySet”则默认为0,即不使能
INCLUDE_开头宏列表
宏 | 对应函数(宏定义为1时使能) |
---|---|
INCLUDE_xSemaphoreGetMutexHolder | xQueueGetMutexHolder() |
INCLUDE_xTaskAbortDelay | xTaskAbortDelay() |
INCLUDE_vTaskDelay | vTaskDelay() |
INCLUDE_vTaskDelayUntil | vTaskDelayUntil() |
INCLUDE_vTaskDelete | vTaskDelete() |
INCLUDE_xTaskGetCurrentTaskHandle | xTaskGetCurrentTaskHandle() |
INCLUDE_xTaskGetHandle | xTaskGetHandle() |
INCLUDE_xTaskGetIdleTaskHandle | xTaskGetIdleTaskHandle() |
INCLUDE_xTaskGetSchedulerState | xTaskGetSchedulerState() |
INCLUDE_uxTaskGetStackHighWaterMark | uxTaskGetStackHighWaterMark() |
INCLUDE_uxTaskPriorityGet | uxTaskPriorityGet() |
INCLUDE_vTaskPrioritySet | vTaskPrioritySet() |
INCLUDE_xTaskResumeFromISR | xTaskResumeFromISR() |
INCLUDE_eTaskGetState | eTaskGetState() |
INCLUDE_vTaskSuspend | vTaskSuspend()、vTaskResume()、prvTaskIsTaskSuspended()、xTaskResumeFromISR()(使用函数xTaskResumeFromISR()时宏INCLUDE_xTaskResumeFromISR和INCLUDE_vTaskSuspend都必须为i) |
INCLUDE_xTimerPendFunctionCall | xTimerPendFunctionCall()、xTimerPendFunctionCallFromISR()(使用这两函数宏INCLUDE_xTimerPendFunctionCall和configUSE_TIMERS都必须为1) |
config 开头的宏
config 开头的宏 用来完成 FreeRTOS的配置
1. configUSE_PREEMPTION
1:使用抢占式内核;0:使用协程
使用抢占式调度器内核会在每个时钟节拍中断中进行任务切换;
使用协程会在以下地方进行任务切换
一个任务调用了函数taskTIELD()
一个任务调用了可以使任务进入阻塞态的API函数
应用程序明确定义了在中断中执行上下文切换
2. configUSE_IDLE_HOOK
1:使能空闲任务钩子函数; 0: 禁用
用户需要自行实现空闲任务钩子函数 函数原型:
void vApplicationIdleHook(void)
3. configUSE_TICK_HOOK
1:使能时间片钩子函数; 0: 禁用
用户需要自行实现时间片钩子函数 函数原型:
void vApplicationTickHook(void)
4. configCPU_CLOCK_HZ
设置CPU的频率 此时是16MHz
5. configTICK_RATE_HZ
FreeRTOS的系统时钟节拍频率(滴答定时器的中断频率),为了兼容HAL库,设置频率为1000HZ(滴答定时器的中断时间为1ms)
6. configMAX_PRIORITIES
设置任务优先级数量,任务可以使用从0到configMAX_PRIORITIES-1的优先级
0是最低优先级,configMAX_PRIORITIES-1是最高优先级
7. configMINIMAL_STACK_SIZE
设置空闲任务的最小任务堆栈大小,单位是字(不是字节)
stm32上设置为130,真正堆栈大小为 130*4=520字节
8. configTOTAL_HEAP_SIZE
设置堆大小,如果试用了动态内存管理,FreeRTOS在创建任务、信号量、队列等的时候使用heap_x.c(x为1-5)中内存申请函数申请内存。内存从堆ucHeap[configTOTAL_HEAP_SIZE]
9. configMAX_TASK_NAME_LEN
设置任务名最大长度
10 . configUSE_TRACE_FACILITY
1:启用可视化跟踪调试
与宏configUSE_STATS_FORMATTING_FUNCTIONS同时为1时会编译下面3个函数
prvWriteNameToBuffer()
vTaskList()
vTaskGetRunTimeStats()
11. configUSE_16_BIT_TICKS
设置系统节拍计数器变量数据类型
1:为16位无符号整形;0:为32位无符号整形
12. configIDLE_SHOULD_YIELD
1:空闲任务会为处于同等优先级的用户任务让出CPU使用权;
0:空闲任务不会为其他处于同优先级的任务让出CPU使用权
建议关闭此功能,因为此功能的开启可能会导致空闲任务和用户任务使用同一个时间片,使得此用户任务比其他用户任务运行时间少
13.configUSE_MUTEXES
1:使用互斥信号量,相关API函数会被编译
0:不使用互斥信号量
14. configQUEUE_REGISTRY_SIZE
设置可以注册的队列和信号量的最大数量
15. configCHECK_FOR_STACK_OVERFLOW
设置堆栈溢出检测
若使用函数xTaskCreate()创建一个任务,任务的堆栈是自动从FreeRTOS的堆(ucHeap)中分配的,堆栈的大小是由函数xTaskCreate()的参数usStackDepth决定的; 若使用函数xTaskCreateStatic()创建任务任务堆栈由用户设置,参数pxStackBuffer为任务堆栈
如果使能了堆栈检测功能,用户必须自行定义一个钩子函数,函数原型:
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
参数xTask是任务句柄,pcTaskName是任务名字
0: 不使用堆栈溢出检测
1: 使用堆栈溢出检测方法1
上下文切换的时候需要保存现场,现场保存在堆栈中,这个时候任务堆栈使用率可能达到最大值,此时不断检测任务堆栈指针是否指向有效空间,如果指向了无效空间,回掉使用钩子函数。 方法1优点快,缺点是不能检测所有的堆栈溢出
2: 使用堆栈溢出检测方法2
向任务堆栈填充一个已知的标记值,方法2会一直检测堆栈后面的几个bytes(标记值)是否被改写,如果改写调用堆栈溢出钩子函数。相对方法1要慢一点,几乎能检测到所有的堆栈溢出(溢出值和标记值相同时检测不到)
16. configUSE_RECURSIVE_MUTEXES
1: 使用递归护持信号量,相关API函数被编译
17. configUSE_MALLOC_FAILED_HOOK
1: 使能内存分配失败钩子函数, 用户需要自行实现内存分配失败钩子函数,函数原型:
void vApplicationMallocFailedHook( void )
18. configUSE_APPLICATION_TASK_TAG
1: 设置为1时 以下函数会被编译
void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask );
BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
19. configUSE_COUNTING_SEMAPHORES
1: 使能计数型信号量 相关API函数被编译
20. configGENERATE_RUN_TIME_STATS
1: 开启时间统计功能,响应API函数被编译
还需定义表中的宏:
宏 | 描述 |
---|---|
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS | 此宏用来初始化一个外设来作为时间统计的基准时钟 |
portGET_RUN_TIME_COUNTER_VALUE()或portALT_GET_RUN_TIME_COUNTER_VALUE | 此宏用来返回当前基准时钟的时钟值 |
0:关闭时间统计功能
21. configUSE_CO_ROUTINES
1:启用协程 启用协程以后必须添加文件croutine.c
0:不启用协程
22. configMAX_CO_ROUTINE_PRIORITIES
设置协程的最大优先级,0是最低优先级,configMAX_CO_ROUTINE_PRIORITIES-1是最高优先级
23. configUSE_TIMERS
1:启用软件定时器
宏configUSE_TIMERS和configUSE_DAEMON_TASK_STARTUP_HOOK都为1时需要定义函数vApplicationDaemonTaskStartupHook() 函数原型:
void vApplicationDaemonTaskStartupHook( void );
24. configTIMER_TASK_PRIORITY
设置软件定时器任务的任务优先级
25. configTIMER_QUEUE_LENGTH
设置软件定时器命令队列的长度 FreeRTOS的软件定时器API函数会通过命令队列向软件定时器任务发送消息
26. configTIMER_TASK_STACK_DEPTH
设置定时器服务任务的任务堆栈大小 这里是两倍的空闲任务使用的堆栈大小