一、编译环境
我的编译环境为WSL2,Ubuntu24.04。

计划在WSL上交叉编译可执行文件,传输到Milk-V Duo S 开发板上执行。
二、下载源码
首先从github下载官方的代码:
git clone https://github.com/milkv-duo/duo-examples.git
三、配置环境
前章下载的仅仅是源码,没有交叉编译工具host-tool,需要进入duo-examples/文件夹执行source envsetup.sh命令下载交叉编译器。
首先选择目标SoC。

因为Milk-V Duo S 开发板的是SG2000,所以选择2,之后选择Arch,因为之前刷机的是ARM版的固件,所以这次还是ARM64。
配置好后,会下载交叉编译工具。
root@DeepThink:~/duo-examples/host-tools/gcc$ ls
gcc-linaro-6.3.1-2017.05-x86_64_aarch64-elf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf riscv64-elf-x86_64 riscv64-linux-x86_64
gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu riscv64-linux-musl-x86_64
配置环境后,实际用到的gcc是gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu。
四、编译源码
选择了demo里面的点灯,需要针对Milk-V Duo S 开发板修改初始化代码:
#include <stdio.h>
#include <unistd.h>
#include <wiringx.h>
int main() {
int DUO_LED = 0;
if(wiringXSetup("milkv_duos", NULL) == -1) {
wiringXGC();
return 1;
}
if(wiringXValidGPIO(DUO_LED) != 0) {
printf("Invalid GPIO %d\n", DUO_LED);
}
pinMode(DUO_LED, PINMODE_OUTPUT);
while(1) {
printf("Duo LED GPIO (wiringX) %d: High\n", DUO_LED);
digitalWrite(DUO_LED, HIGH);
sleep(1);
printf("Duo LED GPIO (wiringX) %d: Low\n", DUO_LED);
digitalWrite(DUO_LED, LOW);
sleep(1);
}
return 0;
}
修改完后,make之,得到可执行文件,看看是不是AARCH64的:
root@DeepThink:~/duo-examples/blink$ file blink
blink: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=a1aec1153fdddf64d28fc3a55290343ad93669b0, with debug_info, not stripped
五、执行测试
将可执行文件从WSL拷贝出来,再传输至Milk-V Duo S 开发板,直接拖拽即可,并修改可执行程序。

可以看见日志打印LED GPIO的电平高低。
最后来一个视频。