Skip to content

Mac 原生編譯瑞芯微與地瓜機器人平臺 ​

在 Apple Silicon Mac 上,用 arm64 原生容器全量編譯 Rockchip RV1126B 與 D-Robotics S100P 兩套嵌入式 SDK。 kernel 編譯提速 4~7 倍,amd64/x86 原路徑零破壞,兩平臺均已燒錄上板驗證。

成果 ​

指標說明
~7×S100P kernel:63.5 → 9.1 min(gcc 整數密集負載下 Rosetta 損耗遠超估算)
~4.1×RV1126B kernel:1217s → 293s(-j14 高並行攤薄了單核損耗,提升倍數低於 S100P)
全鏈路S100P:mcu / kernel / deb-all / 完整映象 ✓;RV1126B:kernel / buildroot / recovery / update.img / AMP RISC-V MCU ✓
零破壞x86 Linux 原生、Mac+Rosetta、Mac arm64 原生三套並存,同一命令切換

總覽:怎麼跑起來的 ​

平臺切換隻是一個環境變數,預設仍是 amd64(同事 x86 主機零影響):

平臺命令
RV1126BRV1126B_BUILD_PLATFORM=linux/arm64 scripts/docker/build.sh kernel
S100PS100_BUILD_PLATFORM=linux/arm64 west s100-build kernel

兩道入場關卡 ​

血淚前提

沒有「區分大小寫卷」這個前提,後面一切皆空——核心 netfilter 成對檔案會被 macOS 靜默合併。

核心突破一:官方根本不給 aarch64 宿主工具鏈 ​

適配的中心難題:SDK 硬編碼 aarch64-none-linux-gnu-* 字首,但 ARM/Linaro 從來不釋出 aarch64 宿主的這個工具鏈。

配套小修(都因 GCC 11.4 比舊工具鏈嚴格):

現象根因對策
RV1126B get_toolchain 直接 exit 1「aarch64 宿主編 aarch64 目標」分支沒人寫補 native 分支返回 shim 字首
rtl8733bu 驅動編譯報錯CONFIG_WERROR=y + GCC 11 加強的 -Wmisleading-indentationnative 下追加 KCFLAGS=-Wno-error

核心突破二:rkbin 是 x86-only,但只卡在打包 ​

另外實測澄清了一個交接誤傳:check-sdk 根本沒有 arch 檢查(只查 FSTYPE 白名單 + 工具存在性),arm64 容器直接能過——真正的 x86-only 只有 rkbin。

S100P 全鏈路 ​

關卡坑修法
deb-all依賴 rootfs sysroot,裸跑直接掛先 image-prepare(下載 samplefs 2.5GB)
image-preparetar --same-owner 在 virtiofs 被拒(容器 root 實為 uid 501)檢測 virtiofs 跳過 owner 修正
打映象mkfs.ext4 -d 對 symlink 報 ENOENT(1.46 太老)編譯 e2fsprogs 1.47 + -E no_copy_xattrs
首啟擴容失敗1.47 預設開 orphan_file,板端 1.46 不識別mke2fs 加 -O ^orphan_file
adb 起不來見下面「三層斷案」fix_rootfs_ld_path() 落進映象

adb 斷案:-ENODEV 不是驅動缺補丁 ​

RV1126B 全鏈路 ​

AMP MCU 五連坑(RISC-V 韌體編通記) ​

編譯查不出的坑

AMP 共享記憶體地址在 link.lds / ITS / DTS / 三處原始碼裡各硬編碼一次——改佈局必須 6 處同步,錯位只能上板才發現。

buildroot 的坑 ​

坑修法
Go 1.4 bootstrap 不支援 aarch64換預編譯 Go 1.19 作 stage1
sources.buildroot.net 國內 ~1KB/s大包手動下載放 dl/
rkaiq 的 j2s 宿主工具硬編碼 x86 標誌(-m64 等)直接刪掉(本就冗餘)
rsync --exclude 'rockdev/' 誤傷打包工具目錄改頂層錨定 '/rockdev/'

燒錄:兩家各一套機制 ​

RV1126B(Rockchip)S100P(D-Robotics)
工具upgrade_tool / rkdeveloptoolHorizon fastboot(flash_all.sh -m all)
進下載模式adb reboot loader,等 5-18s 列舉(Vid 0x2207)序列埠連發 Ctrl+C 打斷 0 延遲 autoboot → Hobot$ → fastboot 0
關鍵細節mac 版工具需 unzip + chmod\x03 必須 ~100ms 間隔逐個發;10ms 連發會淹沒 U-Boot 輸入緩衝反而失敗

工具鏈分發:重要的工具,自己託管一份 ​

換機、換同事、上游連結失效都不怕——構建時自動補齊,實測公網 24 MB/s。

踩坑速查 ​

現象根因修法
kernel 成對檔案丟失APFS 大小寫不敏感區分大小寫卷
check-sdk 報 ext4virtiofs 不在白名單Docker 卷構建
容器 apt 代理 refused容器內 127.0.0.1 是容器自己代理寫 host.docker.internal
"no name for user ID 501"Mac uid 無容器使用者Dockerfile ARG 動態建使用者
docker build 拉 metadata 超時auth.docker.io 需代理僅給 metadata 設代理,apt 走直連
改了原始碼重跑仍報舊錯buildroot .stamp_extracted 門控rm -rf output/*/build/<pkg>-*
adb 多臺報 more than one兩臺板子並存ANDROID_SERIAL=<序列号> 指定
這篇裡有不清楚的地方,或者想聊類似的東西?私訊我 →