手把手教你用Spiffo开发板搭建最小Linux系统(附全志H618避坑指南)
手把手教你用Spiffo开发板搭建最小Linux系统附全志H618避坑指南在嵌入式开发领域构建定制化的最小Linux系统是每个开发者必须掌握的技能。不同于使用厂商预制的系统镜像从零开始搭建系统不仅能让你深入理解Linux启动流程还能根据项目需求进行精准定制。本文将基于Spiffo开发板搭载全志H618芯片带你完整走过从bootloader配置到根文件系统部署的全过程特别针对该芯片的常见陷阱提供解决方案。1. 开发环境准备与工具链配置工欲善其事必先利其器。在开始构建系统前我们需要搭建一个高效的交叉编译环境。全志H618作为64位ARM Cortex-A53架构处理器需要特定的工具链支持# 推荐使用Linaro官方工具链 wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz环境变量配置是新手常踩的坑正确的设置方式应该是# 编辑bashrc文件 vim ~/.bashrc # 添加以下内容路径根据实际解压位置调整 export PATH$PATH:/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin export CROSS_COMPILEaarch64-linux-gnu- export ARCHarm64注意全志H618对gcc版本较敏感建议使用7.x版本以避免内核编译时的指令集兼容性问题验证工具链是否生效aarch64-linux-gnu-gcc --version # 应输出类似以下信息 # aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.02. U-Boot移植与全志H618特殊配置U-Boot作为系统启动的第一道关卡在全志H618上需要特别注意以下几个关键点2.1 源码获取与基础配置git clone https://github.com/u-boot/u-boot.git cd u-boot # 使用orangepi-zero3配置同H618芯片 make orangepi_zero3_defconfig全志H618特有的配置项配置项推荐值说明CONFIG_SUNXI_GPIOy必须启用GPIO驱动CONFIG_MMC_SUNXIySD/MMC控制器支持CONFIG_USB_EHCI_HCDyUSB主机控制器CONFIG_SYS_CLK_FREQ816000000CPU时钟频率设置2.2 ATFARM Trusted Firmware集成全志芯片需要额外集成ATF安全固件git clone https://github.com/ARM-software/arm-trusted-firmware.git cd arm-trusted-firmware make CROSS_COMPILEaarch64-linux-gnu- PLATsun50i_h616 DEBUG1 bl31 cp build/sun50i_h616/debug/bl31.bin ../u-boot/编译U-Boot时需指定BL31参数cd ../u-boot make BL31bl31.bin CROSS_COMPILEaarch64-linux-gnu-常见问题若出现BL31: Invalid entry point错误通常是因为ATF版本与U-Boot不匹配建议使用u-boot源码中推荐的ATF版本3. Linux内核裁剪与优化3.1 内核源码获取与基础配置wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.30.tar.xz tar -xvf linux-6.1.30.tar.xz cd linux-6.1.30 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- defconfig全志H618必备驱动模块DRM_SUN8I_DW_HDMI: HDMI显示输出SUN8I_EMAC: 以太网驱动SUNXI_RSB: 外设总线PHY_SUN4I_USB: USB PHY控制3.2 内核裁剪技巧通过menuconfig界面make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- menuconfig进行配置时使用/键搜索功能快速定位配置项按空格键循环切换选中状态[*]编译进内核[M]编译为模块[ ]不编译全志H618特有的配置路径Device Drivers → Character devices → Serial drivers → SUNXI UART# 编译命令示例启用多线程加速 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j$(nproc)4. 根文件系统构建与部署4.1 选择适合的文件系统对于嵌入式系统推荐以下几种方案类型优点缺点适用场景BusyBox极小10MB功能有限极简环境Buildroot可定制性强配置复杂中等规模项目Debian软件生态丰富体积较大100MB全功能系统4.2 使用BusyBox构建最小系统wget https# 1. 题目 #### [93. 复原 IP 地址](https://leetcode-cn.com/problems/restore-ip-addresses/) 难度中等842 **有效 IP 地址** 正好由四个整数每个整数位于 0 到 255 之间组成且不能含有前导 0整数之间用 . 分隔。 - 例如0.1.2.201 和 192.168.1.1 是 **有效** IP 地址但是 0.011.255.245、192.168.1.312 和 192.1681.1 是 **无效** IP 地址。 给定一个只包含数字的字符串 s 用以表示一个 IP 地址返回所有可能的**有效 IP 地址**这些地址可以通过在 s 中插入 . 来形成。你 **不能** 重新排序或删除 s 中的任何数字。你可以按 **任何** 顺序返回答案。 **示例 1**输入s 25525511135 输出[255.255.11.135,255.255.111.35]**示例 2**输入s 0000 输出[0.0.0.0]**示例 3**输入s 101023 输出[1.0.10.23,1.0.102.3,10.1.0.23,10.10.2.3,101.0.2.3]**提示** - 1 s.length 20 - s 仅由数字组成 # 2. 题解 # 3. code c class Solution { public: vectorstring ans; bool isValid(const string s, int start, int end) { if (start end) return false; if (s[start] 0 start ! end) { return false; } int num 0; for (int i start; i end; i) { if (s[i] 9 || s[i] 0) { return false; } num num * 10 (s[i] - 0); if (num 255) { return false; } } return true; } void backtracking(string s, int idx, int pointNum) { if (pointNum 3) { if (isValid(s, idx, s.size() - 1)) { ans.push_back(s); } return; } for (int i idx; i s.size(); i) { if (isValid(s, idx, i)) { s.insert(s.begin() i 1, .); pointNum; backtracking(s, i 2, pointNum); pointNum--; s.erase(s.begin() i 1); } else { break; } } return; } vectorstring restoreIpAddresses(string s) { if (s.size() 4 || s.size() 12) return ans; backtracking(s, 0, 0); return ans; } };4. 心得回溯法注意终止条件以及插入和删除的位置。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429467.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!