FreeRTOS的移植

  1. 在工程模版里新建FreeRTOS的文件夹
    在这里插入图片描述
  2. 将FreeRTOSv9.0.0文件夹下的\FreeRTOS\Source里的文件,复制到刚刚创建的FreeRTOS文件夹中。

在这里插入图片描述

  1. 在FreeRTOS\portable的文件夹下,使用Keil环境时,只使用Keil、MemMang、RVDS文件,可以删除其他的文件夹,节省空间。

在这里插入图片描述

  1. 打开工程,添加工程文件,新建Groups,名称FreeRTOS_core,点击添加文件,添加文件如下图。
    在这里插入图片描述
    在这里插入图片描述
    继续新建Groups,名称FreeRTOS_port,添加文件FreeRTOS\portable\MemMang目录下的heap_4.c内存管理文件。
    这里使用的是M3内核的单片机,继续添加文件FreeRTOS\portable\RVDS\ARM_CM3目录下的port.c文件。在这里插入图片描述
    点击ok,完成添加。

  2. 点击魔术棒->C/C+±>IncludePaths,添加文件目录如下图。

在这里插入图片描述

  1. 在FreeRTOSv9.0.0文件夹里,FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下,复制FreeRTOSConfig.h文件。 粘贴到工程目录的User文件夹下。
    为了方便配置和移植,直接使用下载链接里重新注释过配置好的FreeRTOSConfig.h文件
    在这里插入图片描述 打开工程,编译,此时应该没有错误。

  2. 因为在FreeRTOS中,会有中断服务函数的配置,如下图中FreeRTOSConfig.h文件的中断服务函数宏定义。

所以需要在工程中打开stm32f10x_it.c文件,注释掉下面的中断服务函数,以防重定义。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后在工程项目的stm32f10x_it.c中,修改如下函数。

在这里插入图片描述在这里插入图片描述
8. 修改Public文件下的SysTick.c文件,直接使用下载链接里配置好的SysTick.c文件

  1. 测试移植,将以下代码放置入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);//设置系统中断优先级分组4
 LED_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

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值