基于STM32F103的HAL库手动配置FreeRTOS
源码下载
FreeRTOS源码下载包括示例工程与内核工程。
示例工程:获取与开发环境相关的架构文件
内核工程:移植FreeRTOS的内核文件
示例工程Gitee地址
内核工程GirHub地址
STM32工程创建
使用STM32CubeMX创建新工程,注意基准时钟源使用除滴答时钟(SysTick)外的定时器担当。
原因:在FreeRTOS中滴答定时器被作为任务调度定时器。
FreeRTOS移植
1、源文件移植
将下载的内核工程目录下的所有C文件添加到工程中
2、头文件移植
将下载的内核工程目录中的include文件夹添加到工程中
3、环境文件移植
将下载的内核工程目录中的portable文件夹添加到工程中,其中保留Keil、MenMang、RVDS三个文件夹即可,Keil为使用的环境,MenMang为内存管理文件,RVDS为所使用的芯片架构
4、添加配置文件
在下载的示例工程中选择对应的芯片Demo,复制FreeRTOSConfig.h(配置头文件)到工程下
Keil工程配置
创建Groups并添加相应的资源文件
在FreeRTOSConfig.h文件中添加宏定义(用于顶替默认工程的相关中断),同时删除默认工程下的对应定义(stm32f1xx_it.c文件夹中)
编译后无报错无警告即可。
测试
测试示例:一个LED1S闪烁,另外一个0.5S闪烁
添加头文件:
#include "FreeRTOS.h"
#include "task.h"
任务函数:
void VTask1(void *pvParameters)
{
while(1)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_Delay(1000);
}
}
void VTask2(void *pvParameters)
{
while(1)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(500);
}
}
创建任务并执行:
xTaskCreate(VTask1,"LED1",128,NULL,1,NULL);
xTaskCreate(VTask2,"LED2",128,NULL,1,NULL);
vTaskStartScheduler();