FreeRTOS移植步骤

2023-12-13 12:45:29

一、FreeRTOS源码下载

FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions

二、FreeRTOS源码介绍

(1)?FreeRTOS源码打开

?

(2)?FreeRTOS文件夹打开

(3)Soutce文件夹打开

(4)portable文件夹打开

三、FreeRTOS的移植过程

(1)新建一个FreeRTOS的文件夹

(2)将 FreeRTOS内核源码的 Source 文件夹下的所有文件添加到工程的 FreeRTOS 文件夹中

(3)打开基础工程 ,新建两个文件分组 ,分别为FreeRTOS_CORE和FreeRTOS_PORT

(4)?FreeRTOS_CORE 存放 所有的 FreeRTOS 的内核 C 源文件croutine.c,event_groups.c,list.c,queue.c,stream_buffer.c,tasks.c,timers.c

(5)FreeRTOS_PORT 存放 FreeRTOS 内核的移植文件,heap_x.c 和 port.c

  • FreeRTOS/portable/MemMang 下有五个 C 源文件,这五个 C 源文件对应了五种 FreeRTOS 提供的内存管理算法,博主使用heap_4.c。
  • port.c 文件的路径在FreeRTOS/portable/RVDS 。port.c 是 FreeRTOS 这个软件与 MCU 这个硬件连接的桥梁。?FreeRTOS 针对不同的 MCU 提供了不同的 port.c 文件。例如STM32F1? 系列,就使用ARM_CM3下的port.c

(6)?添加 FreeRTOS 源码的头文件路径。其中一个头文件路径就是 FreeRTOS/include,另外一个头文件路径为 port.c 文件的路径

(7)添加 FreeRTOSConfig.h ?文件并添加头文件路径。获取途径:FreeRTOS官方历程或者正点原子移植工程等

四、编译看是否移植成功

????????出现? .\output\Project.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and gd32f30x_it.o).错误。这个错误的原因是SVC_Handler函数在多个地方被定义,所以我们需要将gd32f30x_it.o里面的SVC_Handler函数屏蔽。再次编译,没有错误

五、添加任务代码

? ? ? ? 添加代码的原因是为了近一步确定是否移植成功

#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); 

//创建开始任务
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(); //进入临界区
	while(1)
	{
		
	}
    taskEXIT_CRITICAL();            //退出临界区
}

六、FreeRTOS纯净版移植前后对比

移植前
croutine.c
event_groups.c
list.c
queue.c
task.c
timers.c

heap_1.c
heap_2.c
heap_3.c
heap_4.c
heap_5.c

ARM_CA9
ARM_CM0
ARM_CM3
ARM_CM4_MPU
ARM_CM4F
ARM_CM7
ARM7_LPC21xx

移植后
croutine.c
event_groups.c
list.c
queue.c
task.c
timers.c

heap_4.c(内存管理算法)

ARM_CM4F(ARM4内核)


?

文章来源:https://blog.csdn.net/m0_61973119/article/details/134963282
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。