配置FreeRTOS
原文链接:https://ydamooc.github.io/posts/c9defcd/
1.1 下载FreeRTOS
打开FreeRTOS官网:https://www.freertos.org/
点击下载,并且选择"FreeRTOS 202212.01"版本,再点击Download按钮下载官方的资源包。
下载好资源包后,解压到任意目录,例如我解压到了“G:\FreeRTOS”目录下,由于资源包里面包含的文件较多,解压相对会慢一点,大家需要耐心等待。
解压完成后,我们打开FreeRTOS文件夹中的FreeRTOSv202212.01文件夹,打开后可以看到里面有很多文件和文件夹,其中我们要使用的是FreeRTOS文件夹中的东西。
1.2 配置相关的文件
随后打开FreeRTOS文件夹,我们在这里面需要关注的是Source文件夹中的内容,以及Demo文件夹中的内容(后续会使用到其中的文件)。我们打开Source文件夹,在当前目录下,我们需要保留这一部分的文件,其他用不到可以删除掉。
接着再打开portable文件夹,在当前目录下,我们需要保留这一部分的文件,其他用不到可以删除掉。其中MemMang文件夹中存放的是内存管理的相关文件,RVDS文件夹中存放的各个内核相关的文件,我们这里使用的是STM32F103C8T6单片机,所以我们需要的是ARM_CM3文件夹中的内容,其他用不到可以删除掉。
- 因为我们使用的是STM32F103C8T6单片机,在Source文件夹中还缺少FreeRTOS相关的配置文件,我们回到"FreeRTOSv202212.01\FreeRTOS"目录下,然后打开Demo文件夹,在里面找到CORTEX_STM32F103_Keil项目打开,将里面的FreeRTOSConfig.h文件复制到前面的Source文件夹中。
接下来我们需要打开一个空白的STM32工程文件,本文使用的空白工程文件来自于立创开发板的地阔星STM32F103C8T6资料中的空白工程模板,大家可以自行点击下载地阔星资料。当然使用别的空白工程模板也是可以的,只要能正常编译即可。
下载解压后,打开第03章【立创·STM32F103C8T6开发板】软件资料中的空白工程模板文件夹,然后将里面的STM32F103C8T6_ProjectTemplate.zip解压到任意目录下,解压完成后,将名字修改成FreeRTOS_ProjectTemplate,方便后续操作。
接着在FreeRTOS_ProjectTemplate中创建一个名为FreeRTOS的文件夹,然后回到"FreeRTOSv202212.01\FreeRTOS\Source"目录下,将前面我们保留的Source文件夹中的内容复制到FreeRTOS_ProjectTemplate中的FreeRTOS文件夹中。
1.3 配置Keil中的STM32代码
在FreeRTOS_ProjectTemplate中,根据下面路径,打开项目。打开后,我们先编译一次项目。
接着我们为项目创建文件夹,分别为FreeRTOS_CORE和FreeRTOS_PORT,然后根据下图,将相关的文件添加进这两个文件夹中。
添加完文件之后,打开魔术棒,然后点击C/C++选项卡,将FreeRTOS文件夹中的.h路径添加进去。
由于需要对stm32f10x_it.c文件进行修改,而在项目中是没有添加进去的,我们需要手动添加一下,该文件所在路径是FreeRTOS_ProjectTemplate\module,所以我们在左侧右键MODULE文件夹,然后选择Add Files to Group ‘MODULE’,然后选择stm32f10x_it.c文件添加进去。添加完之后需要编译一下,确保没有问题。
接着在左侧打开FreeRTOS_CORE文件夹,打开FreeRTOSConfig.h文件,在第49行处,将原来的171024修改成101024。
在FreeRTOSConfig.h文件中的最一行前添加上必要的中断声明。
#define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
在stm32f10x_it.c文件中,找到SVC_Handler函数、PendSV_Handler函数和SysTick_Handler函数,将原来的代码注释掉,并且在main.c中添加上头文件,然后编译。
1.4 对配置好的工程进行测试
在main.c文件开头创建一个任务句柄,并且创建一个任务函数,任务函数的形参必须为void*类型。创建完成后在函数里面写上以下代码。
void myTask(void* pv) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_ResetBits(GPIOC,GPIO_Pin_13); while(1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); vTaskDelay(1000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); vTaskDelay(1000); } }
在main函数中,创建任务,并且启动调度器,代码修改如下。
int main(void) { board_init(); xTaskCreate(myTask, "myTask", 1024, NULL, 2, &myTaskHandler); vTaskStartScheduler(); while(1) { } }
编译通过后,将程序下载到开发板中,可以看到LED灯每隔1秒闪烁一次,至此说明FreeRTOS相关的配置已经配置完成。