我平时的开发都是在 linux 下进行的,这也是我第一次学习 RISC-V 处理器。所以就想从头开始学习了。搭建编译环境,主要就是一个编译工具链 riscv64-unknown-elf-gcc。工具链的源码。整个拉取下来的文件大概有 3G 大小,编译后有效的有 1.6G┗─╼[~/red_misc/riscv-gnu-toolchain (master)]
▸du -sh ../riscv_tools_mul
1.6G ../riscv_tools_mul
记得配置 ./configure --enable-multilib工具链的时候选择 --enable-multilib 使能 32bit 的支持。
其他如果拉取 submodule 慢的时候,可以更换下 submodule 的源,如果拉取完可以通过 git submodule 查看[~/red_misc/riscv-gnu-toolchain (master)]
▸ git submodule
57dfc2c4d51e770ed3f617e5d1456d1e2bacf3f0 qemu (v4.0.0-1854-g57dfc2c4d5)
2cb5c79dad39dd438fb0f7372ac04cf5aa2a7db7 riscv-binutils (heads/riscv-binutils-2.35)
4ea498a8e1fafeb568530d84db1880066478c86b riscv-dejagnu (heads/riscv-dejagnu-1.6)
+4e3d3e40726e1b68bf52fa205c68495124ea60b8 riscv-gcc (heads/master)
63a44e5923c859e99d3a8799fa8132b49a135241 riscv-gdb (remotes/origin/fsf-gdb-10.1-with-sim)
7395b0964db9cc4dd544926414960e9a16842180 riscv-glibc (heads/riscv-glibc-2.29)
415fdd4279b85eeec9d54775ce13c5c412451e08 riscv-newlib (newlib-4.1.0)
接下去就是编译了 make -j,我是用服务器编译的,30 分钟左右。
编译完成后就是移动到笔记本电脑上,当时出现了一个错误,我记录了下来▸ make
cc applications/main.c
/opt/riscv_tools/bin/../libexec/gcc/riscv64-unknown-elf/10.0.1/cc1: error while loading shared libraries: libmpfr.so.4: cannot open shared object file:
No such file or directory
make: *** [/home/yangyongsheng/just4github/riscv_codes/ab32vg1-ab-prougen/rt-thread/tools/rtthread.mk:100: /home/yangyongsheng/just4github/riscv_codes/
ab32vg1-ab-prougen/build/bsp/applications/main.o] Error 1
(原因是因为在编译工具链的服务器上使用的是 libmpfr.so.4,笔记上使用的是 libmpfr.so.6,将服务器对应版本的 libmpfr.so.4 复制到笔记上就可以正常运行了,如果是因为电脑上没有安装对应的库文件,那么安装对应的的库文件)
▸ sudo dnf install mpfr-devel (如果是缺少该库,安装 mpfr 库文件, 针对 fedora)编译代码,第一次编译出现了 adc 的一些函数报错的问题,是因为没有链接一个 libhal.a 的库,因为是测试我取消了 adc 模块,就可以编译通过了。cc rt-thread/src/object.c
cc rt-thread/src/scheduler.c
cc rt-thread/src/signal.c
cc rt-thread/src/thread.c
cc rt-thread/src/timer.c
cc libcpu/cpu/context_gcc.S
cc libraries/hal_libraries/bmsis/source/startup.S
------------------------------------------------
link rtthread.elf
------------------------------------------------
text data bss dec hex filename
156814 0 40288 197102 301ee rtthread.elf
到这里生成的只是 rtthread.bin 文件,但是 AB32VG1 支持 dcf 文件,这个文件怎么生成的呢?
我从 makefile.targets 文件中逐渐看出来了点眉目riscv32-elf-xmaker -b rtthread.xm
riscv32-elf-xmaker -b download.xm
继续跟踪,找到 rtthread.xm 文件▸ cat rtthread.xm
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: rtthread.xm
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ make(dcf_buf, header.bin, rtthread.bin);
2 │ save(dcf_buf, rtthread.dcf);
再结合刚才的工具 riscv32-elf-xmaker.exe 可以猜测是 riscv32-elf-xmaker 通过读取 xm 文件生成对应的 dcf 文件。
我将 header.bin rtthread.xm rtthread.bin download.xm (这个应该不是必须的)这四个文件以及 riscv32-elf-xmaker.exe 工具复制到一台 win10 的电脑下载程序,最开始发现 uart0 也就是单线串口没有打印,目前也没有深究,因为那个是单线串口 linux 的支持不太友好,并且我自己是想用双线串口,方便在 linux 下调试的。修改了部分代码,放开了 UART1 的发送功能,修改波特率 115200, linux ckermit 调试起来目前正常。[I/I2C] I2C bus [i2c1] registered
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build Mar 16 2021
2006 - 2021 Copyright by rt-thread team
Hello, world
msh />lis
list_fd
list_device
list_timer
list_mempool
list_memheap
list_msgqueue
list_mailbox
list_mutex
list_event
list_sem
list_thread
msh />list_de
list_device
msh />list_device
device type ref count
-------- -------------------- ----------
rtc RTC 0
t4pwm Miscellaneous Device 0
sound0 Sound Device 0
wdt Miscellaneous Device 0
i2c1 I2C Bus 0
timer1 Timer Device 0
uart1 Character Device 2
uart0 Character Device 0
pin Miscellaneous Device 0
msh />
我 fork 了一份 greedyhao 大佬的仓库,iysheng/ab32vg1-ab-prougen。创建了一个 RTC 分支,用来完成自己申请的 RTC 测试任务,其中有我自己记录的代码注释 :smile:。