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
三、编译
先清除一下,项目在编译。
编译时出现了警告,我没有理会。有点草率了,将程序烧写到芯片后,能够正常运行。这时我就误认为升级成功了,还发了一篇帖子“炫耀一下”。结果被打脸啦啦!
后来,我就进行了外部中断的实验,结果这个编译器编译的程序就出问题啦。程序看着一切正常,但是只能中断一次。马上去帖子里说明道歉。 后来我有点不服气,尤其是看到 - 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 , , and . If there is no parameter, then it defaults to .
- 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的体系合起来的。难道就不能彻底的测试一下写个完整的文档吗?说实话我真没有勇气把产品直接改到国产芯片上来的。如果出问题了可能老板家就彻底翻不了身了。
|