本文主要介绍在KEIL环境下移植FreeRTOS实时操作系统到GD32芯片上,采用的是较为稳定的FreeRTOSv9.0.0版本和GD32F3x0芯片作为例子。
一、源码下载
方式一:FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net
方式二:GitHub - FreeRTOS/FreeRTOS at V9.0.0
二、源码目录结构
三、移植过程
3.1 工程文件移植
在原有的单片机工程下新建一个FreeRTOS文件夹,用于存放FreeRTOS源码文件,并且建立三个子文件夹
将源文件对应复制到右边工程目录下
至此,使用到的FreeRTOS源码已经移植到自己的单片机工程,下面是配置keil工程
3.2 keil工程配置
建立工程分组,分别将需要的.c和.h文件添加进来,并且配置对应的文件路径
3.3代码配置
修改gd32f3x0_it.c文件,需要注释SVC_Handler()、PendSV_Handler()这两个函数,再把xPortSysTickHandler()函数接口添加进来即可。
//void SVC_Handler(void)
//{
//}
//void PendSV_Handler(void)
//{
//}
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif /* INCLUDE_xTaskGetSchedulerState */
}
有关FreeRTOSConfig.h文件,先用demo例程的配置,后续需要再去添加相关的宏定义
至此,GD32移植FreeRTOS所有步骤已经完成,下面是验证。
四、代码验证
#include "FreeRTOS.h"
#include "task.h"
int64_t task_flag[3] = {0};
void DebugTask0(void * pvParameters)
{
while(1)
{
task_flag[0]++;
vTaskDelay(10);
}
}
void DebugTask1(void * pvParameters)
{
while(1)
{
task_flag[1]++;
vTaskDelay(10);
}
}
void DebugTask2(void * pvParameters)
{
while(1)
{
task_flag[2]++;
vTaskDelay(10);
}
}
int main(void)
{
GpioConfiguration();
SystickConfiguration(1000);
MAIN_POWER_ON();
CTRL_3V3_ON();
taskENTER_CRITICAL();
xTaskCreate(DebugTask0, "DebugTask0",128,NULL,3,NULL);
xTaskCreate(DebugTask1, "DebugTask1",128,NULL,3,NULL);
xTaskCreate(DebugTask2, "DebugTask2",128,NULL,3,NULL);
taskEXIT_CRITICAL();
vTaskStartScheduler();
while(1)
{
}
}