- 在工程模版里新建FreeRTOS的文件夹
- 将FreeRTOSv9.0.0文件夹下的\FreeRTOS\Source里的文件,复制到刚刚创建的FreeRTOS文件夹中。
- 在FreeRTOS\portable的文件夹下,使用Keil环境时,只使用Keil、MemMang、RVDS文件,可以删除其他的文件夹,节省空间。
-
打开工程,添加工程文件,新建Groups,名称FreeRTOS_core,点击添加文件,添加文件如下图。
继续新建Groups,名称FreeRTOS_port,添加文件FreeRTOS\portable\MemMang目录下的heap_4.c内存管理文件。
这里使用的是M3内核的单片机,继续添加文件FreeRTOS\portable\RVDS\ARM_CM3目录下的port.c文件。
点击ok,完成添加。 -
点击魔术棒->C/C+±>IncludePaths,添加文件目录如下图。
-
在FreeRTOSv9.0.0文件夹里,FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下,复制FreeRTOSConfig.h文件。 粘贴到工程目录的User文件夹下。
为了方便配置和移植,直接使用下载链接里重新注释过配置好的FreeRTOSConfig.h文件。
打开工程,编译,此时应该没有错误。 -
因为在FreeRTOS中,会有中断服务函数的配置,如下图中FreeRTOSConfig.h文件的中断服务函数宏定义。
所以需要在工程中打开stm32f10x_it.c文件,注释掉下面的中断服务函数,以防重定义。
然后在工程项目的stm32f10x_it.c中,修改如下函数。
8. 修改Public文件下的SysTick.c文件,直接使用下载链接里配置好的SysTick.c文件。
- 测试移植,将以下代码放置入main函数中,点击编译,无错误。
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define LED1_TASK_PRIO 2
//任务堆栈大小
#define LED1_STK_SIZE 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);/*******************************************************************************- 函 数 名 : main- 函数功能 : 主函数- 输 入 : 无- 输 出 : 无
*******************************************************************************/
int main()
{SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4LED_Init();USART1_Init(115200);//创建开始任务xTaskCreate((TaskFunction_t )start_task, //任务函数(const char* )"start_task", //任务名称(uint16_t )START_STK_SIZE, //任务堆栈大小(void* )NULL, //传递给任务函数的参数(UBaseType_t )START_TASK_PRIO, //任务优先级(TaskHandle_t* )&StartTask_Handler); //任务句柄 vTaskStartScheduler(); //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区//创建LED1任务xTaskCreate((TaskFunction_t )led1_task,(const char* )"led1_task", (uint16_t )LED1_STK_SIZE, (void* )NULL,(UBaseType_t )LED1_TASK_PRIO,(TaskHandle_t* )&LED1Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}//LED1任务函数
void led1_task(void *pvParameters)
{while(1){LED1=0;vTaskDelay(200);LED1=1;vTaskDelay(800);}
}
工程链接
提取码:asdf
参考视频:FreeRTOS实时操作系统–基于STM32