【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
编译完成后可以正常可以创建任务,并正常运行。文章来源:https://www.toymoban.com/news/detail-807971.html
创建任务并启动任务调度
#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的移植,还有中断的修改。文章来源地址https://www.toymoban.com/news/detail-807971.html
到了这里,关于【GD32/STM32】FreeRtos移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!