在 RISC-V 芯片 GD32V 上运行 RT-Thread

GD32VF103 开发板

去年九月份的时候 RT-Thread 的 Andy Chen 组织定做了一块 GD32V 开发板,托 Andy 的福,我也搭车买了一块。

这块开发板小巧精美,供电、烧录、调试信息打印都是通过一个 Type-C USB 接口进行,更重要的是它所搭载的主控芯片 GD32VF103 是一颗采用 RISC-V 内核设计的 MCU,这对于对 RISC-V 感兴趣的同学来说,具有十足的吸引力。

GD32VF103 系列 SOC 是兆易创新与芯来科技合作,基于 RISC-V 架构设计的一款面向 IOT 领域的 MCU,主频最高 108 MHZ,根据定位差异,片内 Flash 16~128 KB,片上 SRAM 8~32 KB。

在定制这块板子的时候,陈老大为我们选了 Flash 和 SRAM 容量最大的那颗,所以在选择上大家不用纠结。

更加难能可贵的是兆易开放了完整的用户手册,有 500 多页。这颗芯片采用的 RISC-V 内核是芯来科技设计的,代号 Bumblebee,芯来科技也开放了一份关于 Bumblebee 的指令架构手册,详细描述了这颗芯片采用的 RISC-V 指令集、内核特权架构、中断异常、Timer 以及低功耗相关的机制,总的来说,用这颗芯片来做 RISC-V 相关的研究学习,还是很合适的。

SDK

随开发板配套了一份 RT-Thread Nano SDK,里面还包含有开发板的原理图和简单的使用手册以及代码烧写工具 GigaDevice MCU ISP Programmer ,整套 SDK 可以在 https://realthread.cowtransfer.com/s/8350a2c039b740 下载。

由于当时为了让大家尽快拿到开发板,所以仓促中板子上的 JTAG 口留下了一点小瑕疵——如果要连 JTAG 的话,需要做一点小修改,这个在开发板原理图《GD32VF_EVB_V1_20190901》中有说明。

参考配套文档《GD32VF使用说明_20190919》 即可完成 RT-Thread 代码的编译,然后根据该文档描述的固件烧录方法,按着板子的 BOOT0 按键,再按 RESET 按键使板子进入烧写模式,然后通过GigaDevice MCU ISP Programmer 烧录固件到板子上。

需要注意的是,板子烧录固件是通过板子上的 UART 转 USB 烧写的,烧录时串口波特率需要设置为 256000,系统启动后,RT-Thread 也通过这个 UART 打印调试信息,打印调试信息的波特率为 115200,注意不要搞错了。

另外,同一时刻,串口调试工具和 GigaDevice MCU ISP Programmer 烧录软件,只有一个能占用串口,所以在烧录固件之前要记得关闭串口调试工具,否则有可能会无法正常进入烧录模式。

运行 RT-Thread mainline

如果是做产品的话,使用芯片供应商提供的 SDK 是最靠谱的,如果是学习研究的话,我一向喜欢尝试最新的代码,所以 RT-Thread mainline 是一定要试一试的。

安装 ENV 工具 和 risc-v toolchain

RT-Thread 支持 Windows 和 Linux 两种编译开发环境,这里我打算在 Windows 下编译开发,所以需要先去 RT-Thread 官网下载一个 ENV 工具:https://www.rt-thread.org/page/download.html

工具下载下来后解压到任何你喜欢的地方,但是记住路径里面不要有中文字符,双击 env.exe 可执行程序就可以启动进入命令行模式,还可以通过右键把它添加到 Windows 的开始工具栏。

关于 ENV 的详细使用说明可以参考《Env用户手册》和 《RT-Thread 编程指南》,这两份文档在 RT-Thread 官网都可以下载:https://www.rt-thread.org/document/site/

我发现工具里面默认只带了 arm_gcc 的 toolchain,这里要编译 RISC-V,所以还需要下载 RISC-V 的 toolchain,RISC-V 官方的 toolchain 在 Github 上,地址如下:https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases

选择对应的版本,下载后解压到 ENV 工具的 /tools/gnu_gcc/risc-v/目录下。

为了能在 ENV 命令行里面认到 riscv-none-embed-gcc 相关的命令,还需要做如下修改:

即在 env 的 tools/ConEmu/ConEmu/CmdInit.cmd 文件里重新设置 RTT_EXEC_PATH 环境变量,把原来的 arm_gcc 路径替换成刚才下载的 risc-v toolchain 的安装路径。

我查阅了前面提到的两份RT-Thread 文档和官网论坛上关于 ENV 的常见问题问答贴,没找到关于在 ENV 里面添加 命令的修改说明,所以上面这个修改方法是我尝试出来的,不一定科学,如果有人知道更科学的修改方法,请告诉我。

当然,前面的 SDK 包里也提供了 env 和 risc-v toolchain,但是在这里我想用最新的工具和代码从头开始尝试下整个过程。

修改 RT-Thread mainline 代码

RT-Thread 的官方代码托管在 Github 上,可以通过 git 下载:

 git clone https://github.com/RT-Thread/rt-thread.git

其实 RT-Thread mainline 已经支持了 GD32VF103 ,不过对应的开发板是 GigaDevice 官方的 gd32vf103-eval。

这块开发板和我手上的开发板有个很重要的区别——这块开发板上面有贴一颗外部高速晶振,而我手上的板子没有贴,芯片是依靠内部的 8M RC 振荡时钟工作的,内部振荡时钟的精度要低一些,但是对于不使用以太网的场合,基本是够用的。

所以在系统时钟配置部分需要做如下修改:

即把 __SYSTEM_CLOCK_108M_PLL_IRC8M 这个宏打开, __SYSTEM_CLOCK_108M_PLL_HXTAL 这个宏屏蔽。

我们板子上有带 三个 LED、所以水流灯这种经典项目必须加上:

bsp/gd32vf103v-eval/applications/main.c 文件的 main 函数中加入如下内容:

 rt_kprintf("Hello GD32VF103VBT6! build %s %srn", __DATE__, __TIME__);​// gpio clkrcu_periph_clock_enable(RCU_GPIOE);// gpio initgpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_3);gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_4);gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_5);​while (1){gpio_bit_reset(GPIOE, GPIO_PIN_3);rt_thread_mdelay(300);​gpio_bit_reset(GPIOE, GPIO_PIN_4);rt_thread_mdelay(300);​gpio_bit_reset(GPIOE, GPIO_PIN_5);rt_thread_mdelay(300);​gpio_bit_set(GPIOE, GPIO_PIN_3);rt_thread_mdelay(30);​gpio_bit_set(GPIOE, GPIO_PIN_4);rt_thread_mdelay(30);​gpio_bit_set(GPIOE, GPIO_PIN_5);rt_thread_mdelay(30);}​

修改后的代码我推送到了Gitee 上,如果有同学感兴趣,可以直接 clone 下来 have a try:

 git clone https://gitee.com/andyshrk/rt-thread.git

编译

打开 ENV 工具,进入 RT-Thread 源码的 /bsp/gd32vf103v-eva/ 目录下运行 scons 命令进行编译:

编译成功会生成 rtthread.bin 文件,参考提到的文档使用 GigaDevice MCU ISP Programmer 烧写到开发板上。

系统成功启动后在串口中会看到如下打印,并且板子上的 3 个 LED 灯会轮流闪烁:

这个 warning 似乎是因为某个堆栈设置的太小了,等我后面具体看下代码再处理掉。

这篇文章中提到的各种文档大家可以在前面陈老大提供的下载链接中下载,同时我整理补充了一份放在某盘上备用,感兴趣的同学可以在公众号

网页链接​mp.weixin.qq.com

后台发送关键字 gd32v 获取下载链接。

linux下调试thread 类_在 RISC-V 芯片 GD32V 上运行 RT-Thread相关推荐

  1. Linux下调试器工作原理

    Linux下调试器工作原理之一-基础篇 介绍关于Linux下的调试器实现的主要组成部分--ptrace系统调用.本文中出现的代码都在32位的Ubuntu系统上开发.请注意,这里出现的代码是同平台紧密相 ...

  2. linux下调试core dump方式汇总,工作必备技能

    缘起 调试,是开发流程中一个非常重要的环节.每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者. 从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志 ...

  3. linux下qt静态编译_自由出土文物的空间_百度空间

    linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...

  4. 嵌入式linux液晶显示中文,嵌入式系统Linux下液晶显示的实现_徐喆.pdf

    嵌入式系统Linux下液晶显示的实现_徐喆 显 嵌入式系统 下液晶 示的实现 徐 品 刘 单 殊 华 北 工业大 电子信 与控 工程 院 北 京 学 息 学 京 产 器 于 司 , 摘 要 介绍了嵌入 ...

  5. linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...

    当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...

  6. linux代码windows能跑吗,能不能帮忙改一下下面这些代码,原来是在windows系统上运行的,要让它能在linux上终端跑。该如何处理...

    当前位置:我的异常网» C语言 » 能不能帮忙改一下下面这些代码,原来是在windows系 能不能帮忙改一下下面这些代码,原来是在windows系统上运行的,要让它能在linux上终端跑.该如何处理 ...

  7. bios设置识别linux硬盘,linux下如何查看硬盘插在主板那个SATA接口上?梅捷主板SY-A77M3+ bios设置 咋设置啊...

    在上一篇文章中,小编为您详细介绍了关于<联想的主板是哪的?修改技嘉主板bios安装联想win7 64位>相关知识.本篇中小编将再为您讲解标题linux下如何查看硬盘插在主板那个SATA接口 ...

  8. linux下调试thread 类_linux下GDB调试

    linux下GDB是一个非常强大的调试工具,但是他不像vs一样具有强大的图形界面,基本都靠命令来进行调试,对于新手来说也算是个坎.下面就跟大家一起探究一下gdb这个强大的调试工具. 1.开启core ...

  9. linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法

    新手写了一个 hello world 小脚本,如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢? 这是 Linux / Unix 系统管理员或新用户最常问的问题 ...

最新文章

  1. Redis 配置文件
  2. Numpy自定义dtype的一个使用误区
  3. 124 Binary Tree Maximum Path Sum
  4. Axure8.0深入一点(篇)
  5. 【NGINX+PHP7.3+MYSQL】安装指南
  6. 安装linux后win7引导程序,安装Windows7+Ubuntu+CentOS三系统之后的引导问题
  7. jquery checkbox 选中、改变状态、change 和 click 事件
  8. 360手机助手游戏怎么实名认证 360手机助手下载的游戏怎么关了悬浮窗
  9. IDEA 工具使用报错总结
  10. PhpStorm 中切换PHP版本
  11. cc java区别_cC和C++和java的问题有啥区别?
  12. hyperledger fabric 节点数限制 最大
  13. 适配器模式和代理模式的区别
  14. 前沿科技分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
  15. Gap Statistic算法详解
  16. TI毫米波雷达开发中软件版本的说明
  17. 业务与信令-第5章VoLTE原理
  18. UC浏览器下载的视频有k0或key.key或者0.key文件 破解加密将零散的视频合并一个mp4
  19. JS字符串过滤数字_过滤大写数字
  20. html播放韰 寸 频,js根据文字获取首字母案例,直接复制在html中即可查看效果

热门文章

  1. (转)性能分析之-- JAVA Thread Dump 分析综述
  2. TypeError: Cannot red property 'style' of null 错误解决
  3. bailian 2754八皇后
  4. IIS下的FTP使用
  5. .Net里一个用于驱动摄像头的类
  6. Java中从Orcle里取出数据时,为什么提示“无效的列索引”
  7. shell脚本的两种执行方式区别举例
  8. 机器学习导论(张志华):核定义
  9. R语言:ggplot2
  10. CUDA内存类型memory