GD32/STM32 FreeRTOS移植教程

【GD32】FreeRtos移植以及使用方法

移植过程概述

​ (1)下载FreeRtos源码包

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

​ (2)将源文件添加至工程

​ (3)将GD32中的三个中断交由FreeRtos接管

​ (4)配置管理FreeRTOS.h文件

​ (5)FreeRtos基本使用方法

FreeRtos源码包

源码包结构

1.Demo中存放的是各种开发环境以及芯片的演示程序,

2.Source文件夹存放的是FreeRtos的源代码文件。


include文件夹:内核通用头文件

portable文件夹:编译器+处理器适配文件

其他大部分为内核通用源文件:

​ croutine.c 内核通用源文件,用于实现携程

​ event_groups 内核通用源文件,用于实现事件组,属于可选文件

​ list.c 内核通用源文件,用于实现链表数据结构,是必须参加编译的文件

​ queue.c 内核通用源文件,用于实现IPC队列,是必须参加编译的文件

​ stream_buffer.c 内核通用源文件,用于实现数据流缓冲,属于可选文件

​ tasks.c 内核通用源文件,用于实现多任务,是必须参加编译的文件

​ timers.c 内核通用源文件,用于实现软件定时器,属于可选文件

代码移植

1.为了减少裁剪的过程和方便后面拓展功能,将内核通用源文件全部加入到工程中。

2.在portable文件夹中选择


这里以使用KEIL为例,需要使用到的文件夹包括Keil、MemMang和RVDS,实际上keil里面也没有东西,这里只是说明使用keil平台。

MemMang里面是堆内存管理文件使用时根据需要进行移植,不同的heap有不同的特性,我们通常选用的heap_4,一个堆内存池的方案。

RVDS中存放的是处理器适配文件port.c,例如我们使用的GDF303是Cortex-M4架构,所以移植ARM_CM4F中的port.c文件。

实践操作

​ 创建工程模板,我们这里介绍FreeRtos的移植过程所以省略工程模板的创建。

1、创建文件夹

在工程文件夹中创建一个文件夹用来存放FreeRtos的源文件。

将前面所说的内核通用代码、内存管理和适配文件复制过来,为了让思路更加清晰,将FREERTOS文件夹下再创建三个文件夹

CORE里面存放内核通用代码,下面再创建两个文件夹用来存放头文件和源文件

将source中的七个源文件,放入到SRC中,如下所示几个文件

再将头文件放入到INC中,这里的头文件来自FreeRtos源码中的include


然后移植内存管理文件,在源码包中portable目录下

内存管理文件

选择堆内存管理方案,创建一个内存池

把这个文件放入到我们创建的MEM文件夹中。
然后就是移植RVDS里面的文件,同样在protable下面

根据自己芯片所使用的架构进行选择

把这里面的源文件以及头文件加入到创建的PORT文件夹中。

知道我们需要移植的三部分就可以快速将需要的文件移植过来,内核源文件、内存管理文件、适配文件。当然最后还有一个文件需要我们从另外的地方移植过来,也是必须移植的文件,只有这个文件是不包含在include里面的,它是一个FreeRtos的配置文件。这个文件我们去源码包里面,他所提供的例程中复制一个过来。

在Demo里面找一个工程

因为我使用的是GD32F303然后使用keil平台,所以我找一个STM32的Keil工程

将里面的FreeRtosConfig.h文件复制出来,放入到我们刚才创建的CORE文件夹的INC中

这里我们就将需要的文件移植过来了。

2.KEIL工程中添加文件

按照我们刚才分类的方式,再工程里面创建三个文件夹,并将文件夹下面对应的文件添加到工程中

将头文件的路径包含进去

到这里已经可以成功编译了,但是要正常跑起来的话还需要将几个中断函数交由FreeRtos。

3.中断重定位

SVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。

这几个中断函数无论是在STM32还是GD32中的gd32f303x_it.c中以及写定义好的,但是这几个函数的定义与FreeRtos中定义的不同,所以我们还需要将这几个函数更换成FreeRtos中使用的函数。

将上面三个函数注释以后,我们打开FreeRTOS.h,然后加入这三个宏定义。

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

编译完成后可以正常可以创建任务,并正常运行。

创建任务并启动任务调度
#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>
#include <string.h>

#define LED1_TASK_PRIO    ( tskIDLE_PRIORITY + 2 )
void LED1_task(void * pvParameters);
void led_flash(uint32_t time_ms);

void init_task_create(void)
{
	xTaskCreate(LED1_task, "LED1", configMINIMAL_STACK_SIZE, NULL, LED1_TASK_PRIO, NULL);
	/* start scheduler */
    vTaskStartScheduler();
}

void LED1_task(void * pvParameters)
{
	while(1) {
		led_flash(500);
	}
}

到这里移植完成可以正常使用,移植的关键就在于三部分代码的移植和FreeRtosConfig.h的移植,还有中断的修改。

物联沃分享整理
物联沃-IOTWORD物联网 » GD32/STM32 FreeRTOS移植教程

发表评论