熟悉FreeRTOSConfig.h主配置文件
#define configUSE_PREEMPTION 1 //1为抢占式调度器 0为协作式任务调度器
#define configUSE_IDLE_HOOK 0 //1使能idle hook才会调用空闲钩子函数 0则禁止
#define configUSE_TICK_HOOK 0 //1使能 0禁止
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 ) //MCU内核频率 单位Hz
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) //1000 Hz 时间片长度 1ms
#define configMAX_PRIORITIES ( 5 ) //任务的最大优先级
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) //堆栈的最小值 如果小于此值可能造成任务内存不足挂掉
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) //堆空间的大小 只有使用FreeRTOS提供的内存分配算法才会用到
#define configMAX_TASK_NAME_LEN ( 16 ) //任务函数名字最大长度 包含'\0'
#define configUSE_TRACE_FACILITY 0 //1 使能TRACE功能 0禁止 使用要三思 RAM占用很多
#define configUSE_16_BIT_TICKS 0 //1 portTickType被定义为16位无符号整型 0 32位无符号整型
#define configIDLE_SHOULD_YIELD 1 //1 当其他任务优先级与IDLE任务相同时 使IDLE占用的时间片更小
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0 //1 则包含co-routines功能
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //co-routines可以使用的优先级数量
/* 选择需要参加编译的功能 删除不需要的功能 节约RAM与ROM */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY 255 //决定了FreeRTOS内核使用的优先级
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY 不能设置为0!!!See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 //决定了可以调用API函数的中断的最高优先级 高于这个值的中断处理函数不能调用过任何的API函数
/* 这是ST库允许使用的值,ST库允许使用16优先级值,0到15。这必须对应于configKERNEL_INTERRUPT_PRIORITY设置。这里15是最小的NVIC值255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15
什么情况要开启钩子函数
#define configUSE_IDLE_HOOK 0 //1使能idle hook才会调用空闲钩子函数 0则禁止
#define configIDLE_SHOULD_YIELD 1 //1 当其他任务优先级与IDLE任务相同时 使IDLE占用的时间片更小
钩子函数
上层函数调用下层函数 并且传入一个函数指针 下层函数通过指针调用上层函数 由此就叫钩子函数
当创建的任务大部分时间都处于阻塞态。这种状态下所有的任务都不可运行,所以也不能被调度器选中。但是处理器又不可能什么代码都不运行,所以必须有一个空闲时执行的任务。