一:利用STM32CubeMX生成+手动移植FreeRTOS
1. 从FreeRTOS官网下载源码,将部分文件拷出
在新建的STM32CubeMX工程中可以创建一个名为"RTOS"的文件夹,然后将上方左图选中的文件拷入此文件夹中。
此后进入FreeRTOS/Source/portable文件夹中,进入GCC文件夹,进入你的芯片对应的内核文件夹,将里面的文件拷贝到项目中。然后返回上一级打开MemMang文件夹,拷贝heap_4.c文件到项目中。
最后自己新建一个名为"FreeRTOSConfig.h"的文件,此文件具体内容参见:点我。
下面我给一些常见的"FreeRTOSConfig.h"文件里面的参数。
二:相关"FreeRTOSConfig.h"参数
具体每个参数的意思,请学习相关系统知识。
configUSE_PREEMPTION | //1使用抢占式内核,0使用协程 |
configUSE_TIME_SLICING | //1使能时间片调度(默认式使能的) |
configCPU_CLOCK_HZ | //CPU频率(可以设为SystemCoreClock) |
configTICK_RATE_HZ | //时钟节拍频率,👆设好后,这里设置为1000,周期为1ms |
configMINIMAL_STACK_SIZE | //空闲任务使用的堆栈大小 |
configMAX_TASK_NAME_LEN | //任务名字字符串长度 |
建议前往正点原子下载例程取得"FreeRTOSConfig.h"文件,然后参看官网说明,以及相关书籍来编写自己的"FreeRTOSConfig.h"文件。
三:其他函数的修改
在中断回调函数的stm32****_it.c文件中,屏蔽PendSV_Handler,SVC_Handler函数,然后在SysTick_Handler函数中可以这样写:
#include "FreeRTOS.h"
#include "task.h"
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif /* INCLUDE_xTaskGetSchedulerState */
/* USER CODE END SysTick_IRQn 1 */
}
这样当你使用HAL_Delay函数和FreeRTOS中的vTaskDelay函数都会起作用。但是那个if判断条件的宏定义必须在"FreeRTOSConfig.h"中增加,这个的意义是:如果没有检测到FreeRTOS的初始化,那么就不会执行xPortSysTickHandler函数。(如果你不加这个if判断并且也没初始化RTOS,那么执行此xPortSysTickHandler函数会直接跑进硬件错误)
后记
为什么要手动移植Free-RTOS,首先应该不会只用STM32的芯片,其次STM32CubeMX生成的FreeRTOS是ARM公司封装的CMSIS-RTOS,感觉还是原汁原味好一些。