前言
虽然一直在使用freertos实时系统,但是一直没有系统的记录自己的学习过程,此次趁着本次机会,把操作过程写成文字,纰漏之处,还望众多大佬们批评指正。
一:下载freertos源码
1,freertos官网下载地址:https://sourceforge.net/projects/freertos/files/FreeRTOS/
本次使用官网上最新版本,如图:
2,解压下载的压缩包<FreeRTOSv202012.00-LTS.exe>,解压后文件如图:
二:准备裸机工程
文章中使用的STM32裸机程序,为使用STM32CubeMX生成的点灯程序。
三:移植
1, 在STM32工程目录下创建文件夹<freertos>,将freertos压缩包解压后的FreeRTOS文件夹下的source文件夹整体复制到STM32工程目录下的freertos文件夹中,如图:
2,打开MDK工程,创建FREERTOS分组并将相关源文件添加进分组,操作步骤如图:
注:port.c在portable\RVDS\ARM_CM3路径下;heap_4.c在portable\MemMang路径下。
3,添加头文件,如图:
4,将freertos的配置文件<FreeRTOSConfig.h>复制到STM32工程的freertos\Source\include路径下,<FreeRTOSConfig.h>可以在解压后的FreeRTOS\Demo\CORTEX_STM32F103_Keil路径下找到。
5,更改STM32中断向量表(将图1内容修改成图2),如图:
6,添加代码:
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "FreeRTOS.h"
#include "task.h"
void vTaskLED(void * pvParameters)
{
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
while(1){
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_RATE_MS ) );
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
printf("start!\r\n");
xTaskCreate(vTaskLED, "LED0", 128, NULL, 4, NULL);
vTaskStartScheduler();
while (1);
}
7,编译。