1、概述
1.1、RISCV mcu
近日半导体供应商兆易创新推出了一款基于开源指令集架构 RISC-V 的通用单片机,据称这是全球首个基于 RISC-V 内核的 32 位通用单片机。该 GD32VF103 MCU 工作主频达108M。GD32V 采用的 RISC-V内核,支持标准 JTAG 接口及 RISC-V 调试,支持 RISC-V 标准的编译工具链,以及 Linux/Windows 下开发工具,支持FreeRTOS等主流嵌入式系统;RISC-V或将未来可期。
1.2、FreeRTOS
我们先来看一下2019嵌入式市场分析报告(RTOS部分)
捕获1.PNG 捕获2.PNG
可以明显看到,不管是当前使用还是接下来一年要使用的,FreeRTOS都是名列前茅的。且现在的ARM上使用也是非常多,各种介绍也是遍地都是这里不过多介绍,开源免费,怎么用都香~~~~,现在的微控制器这么强大不上系统或许不好发挥应有的性能。
2、FreeRTOS移植系统(1)
常规情况下,我们都是去FreeRTOS官网danger个源码包下来,移植最重要的Source文件夹,根据官方Demo 文件夹里面的对应例程移植修改。具体看看这个
而这时候,我也去danger了两个下来,发现在旧的版本中没有支持RISCV的内容;而在FreeRTOS V10.2.0发布里增加RISC-V和M33内核芯片支持,在系统文件包下也有了RISC-V的文件夹身影。这时候再去找找Demo文件,发现确实有:
捕获3.PNG
但当前的支持还不够完善,看了这三个文件的demo内容跟我使用的板子差距还是大了一些,不想麻烦就只能另外寻找看还有没有合适的。在谷歌、GitHub、百度搜搜了几下,还真发现了一个大佬移植的源码包直接挂在了21IC那里,简单粗暴只有一个标题和附件(原址:gd32vf103在NucleiStudio上的freertos工程),非常感谢这位无私奉献的大佬,全网只找到这一个。三下五除二把它danger下来再说。。。
3、FreeRTOS移植系统(2)
由于下载的这个包刚好是基于NucleiStudio的,在我的电脑上装的是NS 2019版的可以直接导入并编译,(NS IDE的快速入门请看官网:下载、安装、新建工程、导入工程、编译等)。结果编译: Build Failed. 16 errors, 0 warnings. (took 173ms)
事情总是那么不尽人意,看来还是我太年轻了。出错一堆,估计是自己的某些配置上出问题,让我想起了Error 154:~~~what?  我的代码只有50行怎么出错在154,真是让人想得掉头发。经过各种修改添加头文件路径后又出现了“三无”。无警告无错误无响应~~~~飘了
4、FreeRTOS移植系统(3)
算了 不去浪费那个时间,还是按照惯例去移植一次看看;
4.1、新建一个完整可用的工程,越简单越好。新建的教程挺多这里就不在细说,一个完整可用的工程界面如下:
QQ图片20191228172414.png
4.2、在现有工程的基础之上添加相应的文件,拷贝FreeRTOS到根目录下,可以利用右上角的搜索,搜一下FreeRTOSConfig.h文件在不在里面,这个文件重要,不然编译出错推挤成山。步骤如下:
QQ图片20191228173708.png
4.3、回到NucleiStudio编程界面,更新添加的文件
QQ图片20191228174351.png
4.4、点击编译,一般会出错~~~~,系统移植常见的文件,其实大部分是找不到头文件,找不到宏定义这些,接下来就添加头文件,为了方便,直接把FreeRTOS相关的目录都添加了,方便日后不用编译一次出错又去改。
QQ图片20191228174655.png
点击project ---> porperties出现如下配置页面。配置添加好头文件路径后点击Apply and close保存退出即可
QQ图片20191228175647.png
4.5、继续编译,又出错~~~
QQ图片20191228180707.png
这时候得回原来下载的包去找宏定义在哪里了,经过一翻搜寻,发现定义在\RISCV\drivers路径下的n200_eclic.h文件中,如下:
QQ图片20191228181230.png
4.6、将这三个文件宏  复制到  我们的工程相应的目录下  的    相应H文件里,继续编译。终于0警告0错误。看来离成功不远了
4.7、在main.c中引入头文件开始写测试代码,如下:
  • #include "gd32vf103.h"
  • #include "gd32vf103v_eval.h"
  • #include "systick.h"
  • #include <stdio.h>
  • #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  \r\n",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();
  • }
  • 复制代码
    4.8、编译运行,效果如下:
    QQ图片20191228190918.png QQ图片20191228192318.png
    5、自此:在官方评估板:GD32VF103VBT6-EVAL 的 FreeRTOS移植体验完成。
    注:由于从21ic下载的这份代码,这位大佬应该是验证过了才发的,只是我的工程搞不定需要重新移一下,所以FreeRTOSConfig.h这个已经配好不用配置了,有就可以了。其它跟平台无关的文件也不用动。本次只是在RISCV上的体验,不过多介绍配置方面的,有兴趣的同学可以深入研究,配置自己需要的RTOS功能。
    1移植的工程代码和下载的代码包.zip (2.14 MB, 下载次数: 34)
    全部回复 3
    • 39 主题
    • 149 帖子
    • 807 积分
    身份:LV3 中级技术员
    E币:529
    收藏下
    • 0 主题
    • 1 帖子
    • 233 积分
    身份:LV1 技术小白
    E币:223
    MARK,有空试验一下
    • 0 主题
    • 2 帖子
    • 108 积分
    身份:LV1 技术小白
    E币:97
    谢谢大佬分享,太有用了,感动到流泪~
    回复楼主
    您需要登录后才可以评论 登录 立即注册