jszszzy 发表于 2022-3-18 12:43

Lichee RV 86 PANEL评测(3)——WSL单系统下搭建交叉编译链

<div class='showpostmsg'># Lichee RV 86 PANEL评测(3)——WSL单系统下搭建交叉编译链

## 为什么要下载交叉编译工具?

PC机上的编译工具链为gcc、 ld、 objcopy、 objdump等,它们编译出来的程序在x86平台上运行。要编译出能在ARM平台上运行的程序,必须使用[交叉编译](https://so.csdn.net/so/search?q=交叉编译&spm=1001.2101.3001.7020)工具arm-linux-gcc、arm-linux-ld等。

嵌入式产品开发流程中,通常有两个关键的步骤,编译源码与烧写固件。源码编译需要先准备 好编译环境,而固件烧写则需要厂家提供专用烧写工具。

一个典型的嵌入式开发环境包括本地开发主机和目标硬件板:

- 本地开发主机作为编译服务器,需要提供linux操作环境,建立交叉编译环境,为软件开发提供 代码更新下载,代码交叉编译服务。
- 本地开发主机通过串口或USB与目标硬件板连接,可将编译后的镜像文件烧写到目标硬件板, 并调试系统或应用程序。

## 如何使用WSL来配置编译工具?

不知道为什么目前还没修好。



在Tina SDK中带有完整的编译工具链,在如下路径:

```shell
tina/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702
```

但是可以先单独下载工具链嘛:

反正我Tina也没下载下来,不妨先用Debian来试一试。

单独下载编译工具链地址:

(http://netstorage.allwinnertech.com:5000/sharing/b8mBL1xWa)

下载后放到Linux环境中解压:

```shell
tar -zxvf riscv64-glibc-gcc-thead_20200702.tar.gz
```

但是问题来了,我该如何下载到我的**wsl**下呢??

很简单!很离谱!

你直接就可以在**linux**下访问**windos**的文件夹并且操作!

是不是很离谱!

在WSL下你可以看到windos下的每个盘符:

```shell
jszszzy@LAPTOP-74GAR8S9:~$ cd /mnt/
jszszzy@LAPTOP-74GAR8S9:/mnt$ ls
cdef
```

直接使用cp将压缩包拷贝过去。

```shell
jszszzy@LAPTOP-74GAR8S9:~/Lichee_RV/tools$ cp /mnt/d/Embedded/LicheeRV/tools/riscv64-linux-x86_64-20210329.tar.gz /home/jszszzy/Lichee_RV/tools
```

然后执行命令解压:

```shell
jszszzy@LAPTOP-74GAR8S9:~/Lichee_RV/tools$ tar -zxvf riscv64-linux-x86_64-20210329.tar.gz
```

然后就是漫长的解压过程,等待完成以后工具链就配置完成了。

## 如何使用WSL来编写代码?

首先我们先来写一个代码看看:



你当然可以在Windos下编写,编写完成以后送去WSL编译。

上文讲述了WSL可以直接访问Linux,那么Windos如何访WSL下的文件呢?

只需要一行命令即可:

```shell
explorer.exe .
```

直接就可以在windos的文件浏览器里操作WSL的文件。




让我们把编写好的文件复制过去。(这里只是演示一下,实际上我是在WSL下直接vim 复制过去的)



## 如何使用WSL来编译代码?

交叉编译是指在我们的PC机上编译可以在开发板上运行的可执行程序文件,因为是在上位机上编译,然后在不同体系结构的开发板上跑,所以叫交叉编译。

直接使用编译器生成编译文件即可:

```shell
jszszzy@LAPTOP-74GAR8S9:~/Lichee_RV/tools$ bin/riscv64-unknown-linux-gnu-gcc -o hello_word helloworld.c
```

这段命令的意思是使用*`riscv64-unknown-linux-gnu-gcc`*编译器 生成`hello_word`可执行文件。

生成完以后我就要考虑一个问题?如何把代码下载过去呢?

目前来看86 panel并不支持全志官方的ADB下载方式。

不过没关系,我们还有附赠的USB转接器

直接插上优盘:


**需要注意的是你U盘的文件系统需要Debian支持,这里我直接把他格式化成FAT32,100%支持!**

使用命令打开WSL编译下的目录:

```
jszszzy@LAPTOP-74GAR8S9:~/Lichee_RV/tools$ explorer.exe .
```

直接拖拽到U盘即可。

将U盘插入到**86PANEL**,需要挂载一下:

```shell
sipeed@sipeed:~$ sudo mount /dev/sda1/mnt/usb
EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem
EXT4-fs (sda1): mounted filesystem without journal. Opts: (null)
sipeed@sipeed:~$ sunxi-ehci 4200000.ehci1-controller: ehci_irq: highsped device disconnect
sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device connec
usb 1-1: USB disconnect, device number 2
blk_update_request: I/O error, dev sda, sector 2056 op 0x1:(WRITE) flas 0x3000 phys_seg 4 prio class 0
Buffer I/O error on dev sda1, logical block 1, lost async page write
Buffer I/O error on dev sda1, logical block 2, lost async page write
Buffer I/O error on dev sda1, logical block 3, lost async page write
Buffer I/O error on dev sda1, logical block 4, lost async page write
sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device disconect
sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device connec
usb 1-1: new high-speed USB device number 3 using sunxi-ehci
usb 1-1: device descriptor read/64, error -71
usb-storage 1-1:1.0: USB Mass Storage device detected
sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device disconect
scsi host1: usb-storage 1-1:1.0
usb 1-1: USB disconnect, device number 3
sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device connec
usb 1-1: new high-speed USB device number 4 using sunxi-ehci
usb-storage 1-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 1-1:1.0
scsi 1:0:0:0: Direct-Access   GenericSTORAGE DEVICE   0272 PQ: 0 ASI: 0
sd 1:0:0:0: 122138624 512-byte logical blocks: (62.5 GB/58.2 GiB
sd 1:0:0:0: Write Protect is off
sd 1:0:0:0: Mode Sense: 0b 00 00 08
sd 1:0:0:0: No Caching mode page found
sd 1:0:0:0: Assuming drive cache: write through
sdb: sdb1
sd 1:0:0:0: Attached SCSI removable disk
```

插入后会提示你盘符,这里需要手动挂载一下:

```shell
sipeed@sipeed:~$ sudo mount /dev/sdb1/mnt/usb
```

转到u盘目录可以看到我们编译的文件:

```
sipeed@sipeed:~$ cd /mnt/usb
sipeed@sipeed:/mnt/usb$ ls
hello_word'System Volume Information'
```

赋予执行权限:

```shell
sipeed@sipeed:/mnt/usb$ chmod +x hello_word
```

执行一下:

```shell
sipeed@sipeed:/mnt/usb$ ./hello_word
-bash: ./hello_word: No such file or directory
sipeed@sipeed:/mnt/usb$ ./hello_word
-bash: ./hello_word: No such file or directory
```

发现执行不了!!!??

```shell
sipeed@sipeed:/mnt/usb$ ls -a
.   ..   hello_word'System Volume Information'
```

发现确实存在啊。

使用ldd查看一下连接情况:

```shell
sipeed@sipeed:~$ ldd hello_word
      linux-vdso.so.1 (0x0000003fd543c000)
      libc.so.6 => /lib/riscv64-linux-gnu/libc.so.6 (0x0000003fd531e000)
      /lib/ld-linux-riscv64xthead-lp64d.so.1 => /lib/ld-linux-riscv64-lp64d.so.1 (00000003fd543e000)
```

感觉连接没有问题,我现在还没有找到问题在哪里,没办法只能静态编译再来一次了。

```shell
jszszzy@LAPTOP-74GAR8S9:~/Lichee_RV/tools$ bin/riscv64-unknown-linux-gnu-gcc-o hello_statichelloworld.c -static
```

最后成功运行:

```shell
sipeed@sipeed:/mnt/usb$ ./hello_static
Hello NeZha
```

目前这个问题还没有解决希望大佬指导一下。</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: Lichee RV 86 PANEL评测(3)——WSL单系统下搭建交叉编译链