项目简介
兆易创新推出的基于开源指令集架构 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移植完成。
相关资源下载
请下载附件查看详情
附件:
(注:由于从21ic下载的这份代码,这位大佬应该是验证过了才发的,只是我的工程搞不定需要重新移一下,所以FreeRTOSConfig.h这个已经配好不用配置了,有就可以了。其它跟平台无关的文件也不用动,有兴趣的同学可以深入研究,配置自己需要的RTOS功能。)