项目简介

兆易创新推出的基于开源指令集架构 RISC-V 的32位通用MCU,支持标准 JTAG 接口及 RISC-V 调试,支持 RISC-V 标准的编译工具链,以及 Linux/Windows 下开发工具,支持FreeRTOS等主流嵌入式系统。

我们先来看一下2019嵌入式市场分析报告(RTOS部分)

可以看出, 在榜单中FreeRTOS是名列前茅的,广泛应用在市场主流的微控制器上,下面给大家详解怎样把FreeRTOS移植到RISC-V MCU上。

项目详情

1、FreeRTOS移植系统(1)

首先到FreeRTOS官网下载资源包,移植最重要的Source文件夹,根据官方Demo 文件夹里面的对应例程移植修改。在此,发现旧的版本中没有支持RISCV的内容;而在FreeRTOS V10.2.0发布里增加RISC-V和M33内核芯片支持,在系统文件包下也有了RISC-V的文件夹身影。这时候再去找找Demo文件,发现确实有:

但当前的支持还不够完善,看了这三个文件的demo内容跟我使用的板子差距还是大了一些,不想麻烦就只能另外寻找看还有没有合适的。在谷歌、GitHub、百度搜索,还真发现了一个大佬移植的源码包直接挂在了21IC那里,简单粗暴只有一个标题和附件(原址:gd32vf103在NucleiStudio上的freertos工程),非常感谢这位无私奉献的大佬。

2、FreeRTOS移植系统(2)

由于下载的这个包刚好是基于NucleiStudio的,在我的电脑上装的是NS 2019版的可以直接导入并编译,(NS IDE的快速入门请看官网:下载、安装、新建工程、导入工程、编译等)。结果编译: Build Failed. 16 errors, 0 warnings. (took 173ms)

事情总是那么不尽人意,看来还是我太年轻了。出错一堆,估计是自己的某些配置上出问题,让我想起了Error 154:~~~what? 我的代码只有50行怎么出错在154,真是让人想得掉头发。经过各种修改添加头文件路径后又出现了“三无”。无警告无错误无响应~~~~飘了

3、FreeRTOS移植系统(3)

算了 不去浪费那个时间,还是按照惯例去移植一次看看;

3.1、新建一个完整可用的工程,越简单越好。新建的教程挺多这里就不在细说,一个完整可用的工程界面如下:

3.2、在现有工程的基础之上添加相应的文件,拷贝FreeRTOS到根目录下,可以利用右上角的搜索,搜一下FreeRTOSConfig.h文件在不在里面,这个文件很重要,不然编译出错堆积如山,步骤如下:

3.3、回到NucleiStudio编程界面,更新添加的文件

3.4、点击编译,一般会出错~~~~,系统移植常见的现象,其实大部分是找不到头文件,找不到宏定义这些,接下来就添加头文件,为了方便,直接把FreeRTOS相关的目录都添加了,方便日后不用编译一次出错又去改。

点击project ---> porperties出现如下配置页面。配置添加好头文件路径后点击Apply and close保存退出即可

3.5、继续编译,又出错~~~

这时候得回原来下载的包去找宏定义在哪里了,经过一翻搜寻,发现定义在RISCVdrivers路径下的n200_eclic.h文件中,如下:

3.6、将这三个文件宏 复制到 我们的工程相应的目录下的相应H文件里,继续编译。终于0警告0错误。看来离成功不远了

3.7、在main.c中引入头文件开始写测试代码,如下:

#include "gd32vf103.h"

#include "gd32vf103v_eval.h"

#include "systick.h"

#include

#include "FreeRTOS.h" //引入rtos

#include "task.h"

#define TASK1_TASK_PRIO 2 //任务优先级

#define TASK1_STK_SIZE 128 //堆栈大小

TaskHandle_t Task1Task_Handler; //任务句柄

void task1_task(void *pvParameters); //任务函数

#define TASK2_TASK_PRIO 3

#define TASK2_STK_SIZE 128

TaskHandle_t Task2Task_Handler;

void task2_task(void *pvParameters);

#define TASK3_TASK_PRIO 4

#define TASK3_STK_SIZE 256

TaskHandle_t Task3Task_Handler;

void task3_task(void *pvParameters);

extern void vPortSetupTimer();

void task1_task(void *pvParameters)

{

while(1)

{

gd_eval_led_on(LED2);

vTaskDelay(100);

gd_eval_led_off(LED2);

vTaskDelay(100);

}

}

void task2_task(void *pvParameters)

{

while(1)

{

gd_eval_led_off(LED3);

vTaskDelay(500);

gd_eval_led_on(LED3);

vTaskDelay(500);

}

}

void task3_task(void *pvParameters)

{

uint16_t uMark=0;

while(1)

{

printf("FreeRTOS Run ---> %d rn",uMark);

if(100 == uMark++)

{

uMark = 0;

}

//gd_eval_led_toggle(LED1);

vTaskDelay(1000);

}

}

/*!

brief main function

param[in] none

param[out] none

retval none

*/

int main(void)

{

gd_eval_led_init(LED1);

gd_eval_led_init(LED2);

gd_eval_led_init(LED3);

gd_eval_com_init(EVAL_COM0); //com0 115200

vPortSetupTimer();

xTaskCreate((TaskFunction_t )task1_task,

(const char* )"task1_task",

(uint16_t )TASK1_STK_SIZE,

(void* )NULL,

(UBaseType_t )TASK1_TASK_PRIO,

(TaskHandle_t* )&Task1Task_Handler);

xTaskCreate((TaskFunction_t )task2_task,

(const char* )"task2_task",

(uint16_t )TASK2_STK_SIZE,

(void* )NULL,

(UBaseType_t )TASK2_TASK_PRIO,

(TaskHandle_t* )&Task2Task_Handler);

xTaskCreate((TaskFunction_t )task3_task,

(const char* )"task3_task",

(uint16_t )TASK3_STK_SIZE,

(void* )NULL,

(UBaseType_t )TASK3_TASK_PRIO,

(TaskHandle_t* )&Task3Task_Handler);

vTaskStartScheduler();

}

项目实操效果

编译运行,效果如下:

自此:在官方评估板:GD32VF103VBT6-EVAL 的 FreeRTOS移植完成。

相关资源下载

请下载附件查看详情

附件:

移植的工程代码和下载的代码包.zip

(注:由于从21ic下载的这份代码,这位大佬应该是验证过了才发的,只是我的工程搞不定需要重新移一下,所以FreeRTOSConfig.h这个已经配好不用配置了,有就可以了。其它跟平台无关的文件也不用动,有兴趣的同学可以深入研究,配置自己需要的RTOS功能。)


展开阅读全文