打印
[RISC-V MCU 应用开发]

升级嵌入式RISC-V编译器

[复制链接]
3845|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

ch32v103c8t6的板子使用的是MounRiver Studio工具开发,这个工具的集成度还是不错的,但是里面的项目模板有点“简单”。看来要详细研究芯片的工作原理有点懵逼。所以就花了些时间来研究,发现该工具集成的是xpack出品的gnu risc-v工具和调试器OpenOCD。下载了xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip这个最新版本的工具。辛辛苦苦的一番配置,结果很是悲剧:MounRiver的IDE无法下载程序了,于是只好卸了重装吧,经过几番折腾的成果就是了解到MounRiver的工具的makefile文件在哪里了。

看到了吧就是这里啦,就是每个项目的obj目录。

赶忙将下载的文件xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip解压,把文件的主目录命名为F:\RVGCC。openocd的目录也考到这个目录下l,make工具也是拷贝到这个目录。下面的操作都是基于这个目录的。

首先,设置目录路径

  • set PATH=%PATH%;F:\RVGCC\bin;F:\RVGCC\BTools\bin;F:\RVGCC\OpenOCD\bin

使用测试一下环境是否正确。

  • riscv-none-embed-gcc --vserion

二、找到项目目录路径

  • cd F:\MounRiver\MounRiver_Studio\workspace\gcctest\obj

三、编译

  • make clean
  • make -j8 all

先清除一下,项目在编译。

编译时出现了警告,我没有理会。有点草率了,将程序烧写到芯片后,能够正常运行。这时我就误认为升级成功了,还发了一篇帖子“炫耀一下”。结果被打脸啦啦!

后来,我就进行了外部中断的实验,结果这个编译器编译的程序就出问题啦。程序看着一切正常,但是只能中断一次。马上去帖子里说明道歉。

后来我有点不服气,尤其是看到

  • void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
  • void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
  • void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));


啥意思:“interrupt("WCH-Interrupt-fast")难道还是特制的编译器吗!”。按道理说不可能吧!是不是在”装神弄鬼“这个就不知道了。

随后,通过反汇编对比

  • //新版编译汇编程序
  •   2e:        40b2                        lw        ra,12(sp)
  •   30:        0141                        addi        sp,sp,16
  •   32:        8082                        ret
  • //专用版编译汇编程序
  •   1c:        4505                        li        a0,1
  •   1e:        00000097                  auipc        ra,0x0
  •   22:        000080e7                  jalr        ra # 1e <.LVL1+0x2>
  • 00000026 <.L4>:
  •   }
  • }
  •   26:        30200073                  mret


果然是中断的返回指令有问题,新版的指令是ret,专版是mret

这下明白了,原来是新版的程序不认识“interrupt("WCH-Interrupt-fast")这个属性造成的。后来找到了GUN的说明。

https://gcc.gnu.org/onlinedocs/gcc/RISC-V-Function-Attributes.html#RISC-V-Function-Attributes

这个说明中明确了该属性: Permissible values for this parameter are

  • user
,
  • supervisor
, and
  • machine
. If there is no parameter, then it defaults to
  • machine
.
  • void NMI_Handler(void) __attribute__((interrupt("machine")));
  • void HardFault_Handler(void) __attribute__((interrupt("machine")));
  • void EXTI0_IRQHandler(void) __attribute__((interrupt("machine")));


然后编译测试,呵呵反正是一切正常。后来又测试其它程序也正常。

那为什么不是user或supervisor呢?应该user, supervisor是用在具有MMU的机器里的吧。接着就进行了测试,果然不行而且中断后马上死机。

虽然升级成功但是心里真的很别扭。为什么国内的公司非要装神弄鬼的呢?而且这个芯片的资料很是粗糙,开发手册是用与ARM的体系合起来的。难道就不能彻底的测试一下写个完整的文档吗?说实话我真没有勇气把产品直接改到国产芯片上来的。如果出问题了可能老板家就彻底翻不了身了。


使用特权

评论回复

相关帖子

沙发
Taoyukai| | 2021-1-27 10:45 | 只看该作者
沁恒的V103中断是增加了硬件压栈出栈,所以在原生的工具链上进行了优化,通用的工具链是无法识别这个中断函数的吧

使用特权

评论回复
板凳
xdqfc| | 2021-1-28 11:15 | 只看该作者
折腾这个编译器干什么啊,原厂的IDE不香吗?

使用特权

评论回复
地板
发呆二极管| | 2021-1-29 03:44 | 只看该作者
就好像出个产品加个**一样的意思,改了属性是想显得自己有独特之处吧,和别人的不一样

使用特权

评论回复
5
Lbsonggz| | 2021-2-15 10:08 | 只看该作者
还是通用的好用

使用特权

评论回复
6
RISCVLAR| | 2021-2-21 11:40 | 只看该作者
CH32V103中断具有硬件压栈出栈的功能,通用工具链编译时无法识别并启用硬件压栈出栈的功能。当在中断函数后面加 __attribute__((interrupt("machine"))) ,或者不加任何属性时,编译器只会把这个编译成普通的中断函数,还会进行软件的压栈出栈的操作,不能发挥CH32V103硬件压栈出栈的优势 。

只有在中断函数后面增加__attribute__((interrupt("WCH-Interrupt-fast"))),并配合沁恒修改的工具链,方可启用中断硬件压栈出栈,增加运行效率。
如下图反编译结果,左边未启用硬件压栈出栈(软件进行压栈出栈),右边启用硬件压栈出栈


使用特权

评论回复
7
明天真的好| | 2021-2-23 16:20 | 只看该作者
RISC-V怎么查看汇编指令呢?

使用特权

评论回复
8
copower| | 2021-3-21 16:40 | 只看该作者
本帖最后由 copower 于 2021-3-21 18:16 编辑

楼主有空出个VS Code玩CH32V103的教程啊,主要是自己修改makefile文件对MounRiver Studio不起作用,无论你如何修改MounRiver Studio都会强制改回IDE设置选项防止出错。这导致使用者不够自由。
另外楼主知道如何使用命令行调用MounRiver目录下工具给芯片下载固件吗?不喜欢总是打开IDE,想用其他编辑器直接添加命令行指令实现。

这样试了下不行。
openocd -f wch-riscv.cfg -f firmware-recovery.tcl -c "flash_part ch32v103 LED.bin"

使用特权

评论回复
9
mutable| | 2021-6-21 14:09 | 只看该作者
整挺好,折腾出名堂来,就没白折腾

使用特权

评论回复
10
两只袜子|  楼主 | 2021-6-21 16:14 | 只看该作者
mutable 发表于 2021-6-21 14:09
整挺好,折腾出名堂来,就没白折腾

谢谢支持啊老铁

使用特权

评论回复
11
两只袜子|  楼主 | 2021-6-21 16:15 | 只看该作者

哈哈哈,是滴

使用特权

评论回复
12
两只袜子|  楼主 | 2021-6-21 16:16 | 只看该作者
xdqfc 发表于 2021-1-28 11:15
折腾这个编译器干什么啊,原厂的IDE不香吗?

哈哈,就喜欢折腾

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1881

主题

6432

帖子

8

粉丝