超详细的FreeRTOS移植全教程——基于srm32 - 杰杰IoT - 博客园 (cnblogs.com)

源码下载
FreeRTOS - Free RTOS Source Code Downloads, the official FreeRTOS zip file release download

复制源文件
在工程文件夹下新建文件夹命名为freeRTOS,在FreeRTOSv202112.00\FreeRTOS\Source文件夹中复制 .c 文件到src中,复制include文件夹到freeRTOS文件夹下。

portable文件夹主要存放不同架构特定的代码。这里使用keil,因此复制RVDS文件夹及其中的ARM_CM4F文件夹。MemMang是内存管理,也要复制进去。

完成后文件架构如下。

└───freeRTOS
    ├───include
    ├───port
    │   ├───MemMang
    │   └───RVDS
    │       ├───ARM_CM4F
    └───src

新建工程
如图,将.c文件加入工程,这里使用heap_4管理内存。相关文件在MemMang中。

FreeRTOSConfig.h是自己新建的配置文件,可以从demo里复制。这里是我使用的相关配置

FreeRTOSConfig.h
然后引入相关文件

修改中断
freeRTOS接管了如下三个关键中断

#define vPortSVCHandler    SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

然后新建一个任务,在主函数中启动

 /* 创建任务句柄 */
static TaskHandle_t 测试rtos = NULL;

static void 测试rtos(void* pvParameters)
{    
    while (1)
    {
      DEBUG("测试RTOS\r\n");
      vTaskDelay(1000);
//      vTaskDelete(AppTask2_Handle);
    }
}
/**
 *******************************************************************************
 ** \brief  Main function of project
 **
 ** \param  None
 **
 ** \retval int32_t return value, if needed
 **
 ******************************************************************************/
int32_t main(void)
{
    ClkInit();
    CLK_GetClockFreq(&stcClkFreq);
    UsartInit();
    SysvarInit();
    /* Initialize Clock */
    BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */


   /* 创建AppTaskCreate任务 */
  xReturn = xTaskCreate((TaskFunction_t )测试rtos,  /* 任务入口函数 */
                        (const char*    )"测试rtos",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTask_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* 启动任务,开启调度 */
  else
    return -1;
    while (1)
    {
    }
}