更现代的嵌入式开发工具?面向多平台的全集成 RISC-V IDE – MounRiver Studio II 上手体验

最近一段时间都在用沁恒家的 MCU 开发一些小玩具,例如 CH32V003、CH585 等。之前开发的项目,工程和工具链都是使用的 Visual Studio Code + PlatformIO 插件来管理的,整体用起来也还算方便。

前段时间发现沁恒发布新版本的 MounrRiver Studio II框架换为了 Visual Studio Code,另外更重要的是,除了 Windows/Linux 系统外,还支持 macOS 操作系统 啦~这不得赶紧下载体验一番。我也在网上搜索了一下,本身 MCU 厂商提供 IDE 的就不多,基于 Visual Studio Code 开发并且集成全套 RISC-V 工具链就更少了,不得不说沁恒在开发者生态的建设上还是花了功夫的。

这次就拿之前开发过的基于 CH32V003 的 UVLED 紫外固化灯固件项目,来试试新 MounrRiver Studio II 好不好用~

PS. 为了打字方便 MounrRiver Studio II 后面都缩写成 MRS2 了 😃。

下面会从界面、迁移工程、烧录、调试几个方面体验一下 MRS2 的功能。

整体界面

MRS2 虽然是基于 Visual Studio Code 构建的,但是界面上还是做了相当多的定制,并不是和 Visual Studio Code 完全一样。

mounriver-studio-experience-2s

在 MRS2 中,增加了顶部工具栏,将常用操作都放在了这个工具栏中,例如构建工程、下载固件到 MCU、调试固件等,在需要使用这些功能时,不用费劲地在菜单里找来找去了。

另外在左侧的资源管理器也定制过了,能更清晰的展示一个 MCU 固件工程的项目结构。

PS. 现在 MRS2 还集成了 WCH 芯片样品申请入口 😃,就在主界面右下角,可以一键到达官网填表申请 MCU 样品,之前申请了几个 CH582 芯片和开发板,还是挺方便的。

新建工程

作为沁恒自家开发的 IDE,对自家青稞 RISC-V 系列 MCU 的支持肯定相当到位了,在新建工程里,可以直接看到 WCH 全系列 MCU 的列表,也可直接根据系列名称筛选,例如我常用的 CH32V003,直接用 003 筛选就可以了。

mounriver-studio-experience-3

另外在新建工程时,对于资源更丰富一些的 MCU,还可以选择不同的系统框架,CH32V003 只能使用 NoneOS,但是 CH32V103 就可以使用 FreeRTOS、HamonyOS、RT-Thread 等各种系统框架了,这对于要构建复杂 MCU 应用的项目来说,还是方便很多的。

mounriver-studio-experience-4

这里就新建一个 CH32V003 + NoneOS 项目,把之前做的智能紫外线固化灯项目迁移过来尝试一下。

迁移 UVLED 项目

如果之前是使用 MounRiver Studio I 开发的工程,在 MRS2 里面也是直接打开的,兼容性方面还不错。

不过我这里因为老 macOS 工程结构的原因,选择复制文件来迁移 UVLED 项目。过程相当简单,直接把所有项目代码文件复制到新工程的 User 目录中,再把自动生成的 main.c 删掉就可以了,一把梭~

mounriver-studio-experience-5

给项目增加 C++ 编译支持

然后就碰到问题了,编译输出竟然说找不到 main.o,项目模板里面是 C 项目,难道是 MRS2 不支持 C++ 项目吗?

mounriver-studio-experience-6

在找了沁恒的支持后,发现需要在状态栏里切换一下项目类型:

mounriver-studio-experience-7

切换成 C++ 项目,就可以正确识别 cpp 文件开始编译了。

mounriver-studio-experience-8

好了继续去下一关。

修改 C++ 标准为 C++17

因为之前在使用 PlatformIO 时就直接用了 C++,而且平时写 C++ 项目时也直接用了 C++17 标准相关的语法,没想到在这里编译时也出现问题了。

mounriver-studio-experience-9

有一段结构体数组的初始化编译不过,具体的代码如下:

mounriver-studio-experience-10

这个好找,在 工程属性 设置中,将 GNU RISC-V Cross C++ Compiler 中的 Language standard 修改为 GNU ISO 2017 C++ (-std=gnu++17) 就可以了。

mounriver-studio-experience-11

去除重复符号

胜利在望了,UVLED 项目的主要代码都可以编译通过,进入链接阶段了,这个时候报了个重复符号的错误:

mounriver-studio-experience-12

这个就简单了,之前的项目中,已经定义了中断相关的处理函数,在 MRS2 创建新的项目时,也创建了对应的中断处理函数,就在 ch32v00x_it.c 这个文件中,所以导致了两边符号重复定义的问题。

mounriver-studio-experience-13

反正原来的中断处理也没有写代码,只要把原来项目代码中的中断处理函数都注释掉就可以了。

编译成功

一番操作之后,终于把 UVLED 项目编译成功了。

mounriver-studio-experience-14

接下来可以开始烧录固件了。

编译结果分析

哦,顺便发现了 MounRiver Studio 里面也带了个类似 PlatformIO Inspect 的功能,叫“编译结果分析”,可以详细查看编译出来的固件 Flash、RAM 使用量,以及各种符号的占用空间大小。

mounriver-studio-experience-19

这样就可以在 Flash 或 RAM 不够用时,明确裁剪的方向了。

固件烧录

固件烧录就比较简单了,MounRiver Studio II 已经集成了烧录工具链,在工程属性的下载设置里,也可以直接对 WCH-LinkE 进行检测和设置。

mounriver-studio-experience-15

对于 CH32V003 来说,需要将 WCH-LinkE 的模式设置为 RISC-V,这个在设置里可以直接操作。

最后将 WCH-LinkE 连接到 PCB 上的 SWDIO,点击下载就可以完成固件的烧录了。

mounriver-studio-experience-16

这整个烧录体验还是相当丝滑的。

仿真调试

之前使用 PlatformIO 开发 UVLED 的时候,在调试固件时都是使用串口输出调试信息来 debug,但是有些时候代码写得不完善,并不会走到输出调试信息那一行,直接就抓瞎了。

我没有去深入研究过,可能 PlatformIO 可能也支持仿真调试?但是本身配置工作就比较麻烦了。

一键调试

在 MRS2 里面就方便很多了,直接 F5 一键进入调试模式,随意下断点、看堆栈、看变量,有了使用 Visual Studio 开发桌面端应用的感觉。

mounriver-studio-experience-17

在进入调试后,可以直接针对具体的代码行加断点,同步看被调试固件的源代码、反汇编代码、局部变量、全局变量、函数调用栈等信息,这相对于使用串口来调试,简直就是鸟枪换炮了 😃。

下面就是直接单步执行到了 I2C 初始化的代码,可以清晰看到调用栈是 main => OLED_init => I2C_start。之前就是在调试 I2C 读取数据过程中花了很大功夫,要是早点能使用这样的方式来调试,应该效率会高很多。

mounriver-studio-experience-18

semihosting

另外 MounRiver Studio 还有个 semihosting 功能,可以直接将 MCU 固件代码中的 printf 重定向到 MounRiver Studio 的控制台中,这样在调试的时候如果用了串口,也不需要额外的硬件的。

最简单的情况下,只需要 WCH-LinkE 连接 V3、GND、SWDIO 三根线就可以搞定一个单片机的开发、测试、调试了 🤩。

semihosting 功能可以在调试配置中打开:

mounriver-studio-experience-20

可以看到固件代码中的 printf,直接输出到了 MounRiverStudio 的 调试控制台,这样在调试的时候,就不用开好几个软件、连接额外的串口调试器了。

mounriver-studio-experience-21

在线异常追踪调试

另外还发现 MRS2 有个在线异常追踪调试的功能,可以实现不复位进入调试状态

在实际的嵌入式产品使用场景中,有部分代码异常运行现象只会在特定的软硬件环境下偶现。此时如果采用常规的在线仿真调试手段,需要先复位芯片再进入调试模式,从而导致多次重试都无法复现之前的异常现象,极大降低了此类问题的处理效率。

通过 MRS2 的在线异常追踪调试功能,可以通过GDB指令,获取芯片当前变量、寄存器、Flash、调用栈内容,不需要复位 MCU 就可以直接进入调试状态,这个时候就能看到异常发生那一刻的 MCU 的各种现场数据了,包括现场的调用堆栈、变量等信息,还可以 dump 内存,都免去了先复现问题的过程,排查问题效率也会高很多。

mounriver-studio-experience-22s

我这里测试的时候并没有发生异常,但是还是可以直接捕获了正在执行的现场,如果有异常的话,就可以使用这里的堆栈、数据来排查问题了。

远程源码级、目标代码级调试

另外,MRS2 还支持远程调试功能,通过近、远端 MRS2 中运行的远程协助模块将近端(调试方)编译生成的目标文件、调试指令等加密发送至远端(被调试方),再自动调用远端连接的 WCH-LinkE 硬件调试器与芯片通信,完成各项单步操作,并将单步调试执行结果回显到近端。

MRS2 也支持远程目标代码级调试:近端用户将修改后编译生成的目标文件远程下载到目标芯片,然后根据远端回显的芯片运行时打印信息来调整近端源码,再重复上述下载、查看回显信息过程,直到确定最终的代码内容。

这个功能听起来以后找技术支持就更方便了,可以直接现场 debug 😃。

不过在 macOS 版本里没有找到这个功能,没办法实际体验,尝试用用户反馈咨询了官方,没想到还真收到回复说 macOS 后续版本就会支持,期待一下,等新版本发布了再尝试看看。

mounriver-studio-experience-23

其他功能

另外对于 Visual Studio Code 本身对于 C、C++ 项目的分析功能就不多赘述了,像什么代码跳转、自动完成、大纲等能力,那都是基本操作了。

和 PlatformIO 功能对比

PlatformIO 作为一个通用的嵌入式开发插件,主要使用的场景还是那些没有自家 IDE 的单片机产品,以及可以对多种单片机的框架集中进行管理。

但是如果是针对青稞 RISC-V 系列 MCU 进行开发的话,我觉得使用 MounrRiver Studio II 应该是更优选择了。

使用 MounrRiver Studio II 优势 :

  • 内嵌了 WCH MCU 的各种库、框架,并且支持自动更新
  • 基于 Visual Studio Code 开发,编码功能强大
  • 集成了下载、调试工具,无需额外安装
  • 可以一键进入调试模式,无需额外配置

参考资料

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>