外觀
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 主機零影響):
| 平臺 | 命令 |
|---|---|
| RV1126B | RV1126B_BUILD_PLATFORM=linux/arm64 scripts/docker/build.sh kernel |
| S100P | S100_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-indentation | native 下追加 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-prepare | tar --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 / rkdeveloptool | Horizon 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 報 ext4 | virtiofs 不在白名單 | 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=<序列号> 指定 |