【FreeRTOS】os调试记录
1.FreeRTOSConfig.h配置解释
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html.
*----------------------------------------------------------*/
/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
/* 基础配置项 */
#define configUSE_PREEMPTION 1 /* 1: 抢占式调度器, 0: 协程式调度器 */
#define configCPU_CLOCK_HZ ( SystemCoreClock ) /* 定义CPU主频, 单位: Hz */
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) /* 定义系统时钟节拍频率, 单位: Hz */
#define configMAX_PRIORITIES ( 7 ) /* 定义最大优先级数, 最大优先级=configMAX_PRIORITIES-1 */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) /* 定义空闲任务的栈空间大小, 单位: Word */
#define configMAX_TASK_NAME_LEN ( 8 ) /* 定义任务名最大字符数 */
#define configUSE_16_BIT_TICKS 0 /* 1: 定义系统时钟节拍计数器的数据类型为16位无符号数 */
#define configIDLE_SHOULD_YIELD 1 /* 1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务 */
/* FreeRTOS.h中的配置 */
#define configUSE_TASK_NOTIFICATIONS 1 /* 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1 */
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 定义任务通知数组的大小, 默认: 1 */
#define configUSE_MUTEXES 1 /* 1: 使能互斥信号量, 默认: 0 */
#define configUSE_RECURSIVE_MUTEXES 0 /* 1: 使能递归互斥信号量, 默认: 0 */
#define configUSE_COUNTING_SEMAPHORES 0 /* 1: 使能计数信号量, 默认: 0 */
#define configQUEUE_REGISTRY_SIZE 0 /* 定义可以注册的信号量和消息队列的个数, 默认: 0 */
#define configUSE_QUEUE_SETS 0 /* 1: 使能队列集, 默认: 0 */
#define configUSE_TIME_SLICING 1 /* 1: 使能时间片调度, 默认: 1 */
#define configUSE_NEWLIB_REENTRANT 0 /* 1: 任务创建时分配Newlib的重入结构体, 默认: 0 */
#define configENABLE_BACKWARD_COMPATIBILITY 1 /* 1: 使能兼容老版本, 默认: 1 */
/* 内存分配相关定义 */
#define configSUPPORT_STATIC_ALLOCATION 0 /* 1: 支持静态申请内存, 默认: 0 */
#define configSUPPORT_DYNAMIC_ALLOCATION 1 /* 1: 支持动态申请内存, 默认: 1 */
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7 * 512 ) ) /* FreeRTOS堆中可用的RAM总量, 单位: Byte */
/* 钩子函数相关定义 */
#define configUSE_IDLE_HOOK 0 /* 1: 使能空闲任务钩子函数 */
#define configUSE_TICK_HOOK 0 /* 1: 使能系统时钟节拍中断钩子函数 */
#define configCHECK_FOR_STACK_OVERFLOW 0 /* 1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2 */
#define configUSE_MALLOC_FAILED_HOOK 0 /* 1: 使能动态内存申请失败钩子函数 */
/* 查看os运行状态 */
#define configUSE_TRACE_FACILITY 0 /* 1: 使能可视化跟踪调试 */
#define configGENERATE_RUN_TIME_STATS 0 /* 1: 使能任务运行时间统计功能, 默认: 0 */
#define configUSE_STATS_FORMATTING_FUNCTIONS 0 /* 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 */
/* 协程相关定义 */
#define configUSE_CO_ROUTINES 0 /* 1: 启用协程, 默认: 0 */
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* 软件定时器相关定义 */
#define configUSE_TIMERS 0 /* 1: 使能软件定时器, 默认: 0 */
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) /* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_QUEUE_LENGTH 5 /* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 */
/* os函数使能 */
#define INCLUDE_vTaskPrioritySet 0 /* 设置任务优先级 */
#define INCLUDE_uxTaskPriorityGet 0 /* 获取任务优先级 */
#define INCLUDE_vTaskDelete 0 /* 删除任务 */
#define INCLUDE_vTaskSuspend 0 /* 挂起任务 */
#define INCLUDE_xResumeFromISR 0 /* 恢复在中断中挂起的任务 */
#define INCLUDE_vTaskDelayUntil 0 /* 任务绝对延时 */
#define INCLUDE_vTaskDelay 1 /* 任务延时 */
#define INCLUDE_xTaskGetSchedulerState 0 /* 获取任务调度器状态 */
#define INCLUDE_xTaskGetCurrentTaskHandle 0 /* 获取当前任务的任务句柄 */
#define INCLUDE_uxTaskGetStackHighWaterMark 0 /* 获取任务堆栈历史剩余最小值 */
#define INCLUDE_xTaskGetIdleTaskHandle 0 /* 获取空闲任务的任务句柄 */
#define INCLUDE_eTaskGetState 0 /* 获取任务状态 */
#define INCLUDE_xEventGroupSetBitFromISR 0 /* 在中断中设置事件标志位 */
#define INCLUDE_xTimerPendFunctionCall 0 /* 将函数的执行挂到定时器服务任务 */
#define INCLUDE_xTaskAbortDelay 0 /* 中断任务延时 */
#define INCLUDE_xTaskGetHandle 0 /* 通过任务名获取任务句柄 */
#define INCLUDE_xTaskResumeFromISR 0 /* 恢复在中断中挂起的任务 */
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif
/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* Interrupt priorities used by the kernel port layer itself. These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#endif /* FREERTOS_CONFIG_H */
2.任务或系统占用堆栈大小
在FreeRTOS的配置文件中,我们需要设置os占用内存的大小,那怎么确定具体的数值呢?
一般的,我们在开发初期都会基于足够大的内存分配,后期在进行调整。
① 查看任务堆栈是否溢出
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
{
// 使能FreeRTOSConfig.h中的configCHECK_FOR_STACK_OVERFLOW,则使能任务内存溢出检测
// 在内存中查看pcTaskName指针的内容,即可判断是哪个任务堆栈溢出
}
② 实时查看每个任务以及系统的堆栈大小占用
将局部变量拉出来直接全部变量,实时监控即可。
void vApplicationIdleHook(void)
{
// 使能FreeRTOSConfig.h中的configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS,则使能实时查看任务堆栈的函数
// 使能FreeRTOSConfig.h中的configUSE_IDLE_HOOK,该函数会在空闲任务中调用
// vTaskList会返回具体的数值,直接在内存中查看pcWriteBuffer
char pcWriteBuffer[200] = {'0'};
vTaskList(pcWriteBuffer);
long memValue[3];
memValue[0] = configTOTAL_HEAP_SIZE; // FreeRTOS总内存大小 (单位字节)
memValue[1] = xPortGetFreeHeapSize(); //查询当前剩余堆内存大小 (单位字)
memValue[2] = xPortGetMinimumEverFreeHeapSize(); //查询历史剩余最小内存大小 (单位字)
}
③注意事项:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7 * 512 ) ) /* FreeRTOS堆中可用的RAM总量, 单位: Byte */
该宏定义是为os分配总内存大小的。
而xTaskCreate函数的第三个参数是为该任务分配内存大小的,其分配的内存其实就从总内存中分出来的。
所以,我们修改os内存占用mcu内存时,应该修改总内存。修改任务内存是没用的。