FreeRTOSConfig.h参数理解
①调度算法
#define configUSE_PREEMPTION 1 //可抢占
#define configUSE_TIME_SLICING 1 //时间片轮转
#define configIDLE_SHOULD_YIELD 1 //空闲任务让步
②时钟配置
#define configCPU_CLOCK_HZ (64000000)
#define configTICK_RATE_HZ (1000)
//#define configSYSTICK_CLOCK_HZ (8000000)
其中configCPU_CLOCK_HZ是写入实际的CPU内核时钟频率,也就是CPU指令执行频率,在我这板子上是64Mhz(F103ZET6),因为我是用HSI倍频得来的,最高只有64Mhz。
configTICK_RATE_HZ是FreeRTOS系统自己的节拍中断的频率。即一秒中断的次数,每次中断FreeRTOS都会进行任务调度。这里设置为1000表示1ms中断一次。
configSYSTICK_CLOCK_HZ是滴答定时器时钟,一般来说这个默认是和configCPU_CLOCK_HZ相等的。所以在这将其注释。
③设置任务运行优先级
#define configMAX_PRIORITIES 15
表示可用优先级为0~14,数值越高优先级越高。
空闲任务的优先级为0(taskIDLE_PRIORITY),因此它是最低优先级任务。
④设置内核中断优先级
#define configKERNEL_INTERRUPT_PRIORITY 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 95
#define configMAX_API_CALL_INTERRUPT_PRIORITY 95
设置FreeRTOS内核的中断优先级(内核PendSV中断和SysTick中断使用的中断优先级),因为FreeRTOS内核中断(PendSV中断和SysTick中断)不允许抢占用户使用的中断(例如:用户的USART1中断,用户的SPI1中断),因此这个宏configKERNEL_INTERRUPT_PRIORITY一般定义为硬件最低优先级(例如:15)。
在cortex-m3内核,只使用了8位中的高四位[7:4]作为中断优先级,低四位无任何意义,一般填充1。
configKERNEL_INTERRUPT_PRIORITY=255,而255=1111 1111B,高4位的1111B=0x0F=15。所以,255就表示FreeRTOS内核的中断优先级号=15。
configMAX_SYSCALL_INTERRUPT_PRIORITY =95,95=0101 1111B,高4位的0101B=0x05=5。所以,95就表示可受FreeRTOS管控的起始中断优先级号=5。
其中configMAX_SYSCALL_INTERRUPT_PRIORITY不能设置为0,因为中断优先级号0是专门用于SVC中断启动任务使用的,内核启动中断vTaskStartScheduler()来调度任务。
这些内核中断优先级参数可参考 https://blog.csdn.net/ba_wang_mao/article/details/127301127
⑤配置堆栈内存
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE (1024*10)
#define configAPPLICATION_ALLOCATED_HEAP 0
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 1
#define configMINIMAL_STACK_SIZE 128
其中configSUPPORT_STATIC_ALLOCATION表示使用静态分配内存,如果使能,还需要实现vApplicationGetIdleTaskMemory()和vApplicationGetTimerTaskMemory()函数。在这里设置动态内存分配。
configTOTAL_HEAP_SIZE表示用户为freertos申请的总的堆大小,工程项目中动态创建的每个任务都从这堆申请到栈区(称之为任务栈)后,该任务的形参、非静态局部变量以及函数调用信息都会使用这个栈区(称之为任务栈)进行入栈和出栈。所有任务的栈内存的总和不能超过该大小。这里设置为10k字节。
configAPPLICATION_ALLOCATED_HEAP表示让用户自己定义一个堆空间,让FreeRTOS从用户定义的堆空间中进行内存分配。如果使能,需要在应用程序的源文件中声明一个名为ucHeap的uint8_t数组,并由configTOTAL_HEAP_SIZE设置确定,如uint8_t ucHeap[configTOTAL_HEAP_SIZE]。
configMINIMAL_STACK_SIZE定义空闲任务使用的堆栈大小,是以字为单位的。在这里,栈大小为128表示栈内存占用128*4=512字节的空间。
⑥使能互斥量
#define configUSE_MUTEXES 1
⑦使能软件定时器
#define configUSE_TIMERS 1
⑧weak内核中断服务函数
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
在cortex-m3中,这三个内核中断会在freertos中重新实现,所以需要将stm32f1xx_it.c文件中的这三个中断服务函数用weak修饰,或者直接删去。
SysTick_Handler是滴答定时器的中断服务函数,此时freertos会重写SysTick_Handler并把滴答定时器作为时基源,但是本来HAL库的时基源是滴答定时器,所以需要另一个定时器作为HAL库的时基源。
当然,以上都是自己移植Freertos所需要关心和修改的宏定义。如果用CubeMX来配置,上面的基本不用修改,只要知道宏定义的意义是什么就可以了。