如何在RK3588平台上快速启动Linux系统

Linux强大的功能、卓越的硬件兼容性、优秀的模块化设计,使其不仅在服务器和非x86桌面系统中占据主导地位,在嵌入式系统领域也越来越被广泛应用,而某些嵌入式设备对系统的响应速率要求很高,包含两方面的需求,一方面是指设备上电或复位快速启动系统;另一方面要求设备启动后,系统能对外部事件作出快速反应。

Linux作为宏内核系统,其实时性比不上VxWorks/VRTX/uCos等微内核系统,不过全球有无数开发人员在孜孜不倦地为提高Linux系统的实时性贡献代码,已有RTLinux、双内核系统等优化方案,望获Linux的攻城狮们也提出了自己的实时性优化改造方案,并在加紧垒码实现中,待有实际成果再给大家分享。

快速启动对于嵌入式应用的重要性也不言而喻,就像快速反应部队,必须在受到攻击前整装完毕予以还击;一旦遭受意外干扰卡壳宕机,能在看门狗的驱使下快速重启。近期,望获Linux在瑞芯微的RK3588平台上尝试实现了快速启动Linux系统功能,从上电到登录耗时约1秒,其中包含厂家的bootstrap二进制代码时间。

Linux系统启动包括三个阶段,Bootloader(BIOS)、Linux kernel、Linux app(命令脚本),最后进入登录界面。后两个阶段相对比较好优化,第二阶段我们把kernel配置裁剪到尽量小,关闭图形输出、静默串口打印输出、关闭启动阶段不必用的外设;第三阶段基于busybox制作小型根文件系统,尽量简化启动脚本。最难的是第一阶段的优化。

我们在RK3588平台上使用uboot作为Bootloader,在以前的arm、mc68k、powerpc、mips或者dsp平台中,其Bootloader比如:uboot、redboot、ppcboot、cfe、pmon、bios(TI)的所有代码都是开源并充分足够的,也就是说系统启动第一阶段的代码我们都是可以修改简化的,对这些代码越熟悉,就能越彻底优化bootloader,更加缩短启动时间,我们甚至可以自己写一段简单的初始化代码,然后直接启动Linux 系统(这个我们十多年前在自制的龙芯2F开发板上已经实现),但是,ARMv7/v8之后加入了安全启动机制,光有uboot并不足以启动系统,在uboot之前以及内核启动多核的过程中还需要运行厂家提供的ATF(ARM Trust Firmware)代码,完整的ATF包括BL1/BL2(SPL)/BL31/BL32(OPTEE)/BL33(uboot/uefi),其中SPL和uboot整合在统一的uboot源码中,编译uboot时可以选择编译spl,而BL1/BL31/BL32厂家通常只提供二进制文件以及将其与uboot链接到一起的工具,这使优化Bootloader变得很困难。

带ATF系统的正常启动流程是BL1->BL2(SPL)->BL31->BL32(OPTEE)->BL33(uboot)->Linux kernel->app,基于此,最理想的优化方式:BL1直接启动kernel,因没有BL1源码而无法实现;其次:从SPL直接跳转到kernel,我们做了很多尝试,均告失败。SPL运行在EL3级别,kernel运行在EL1级别,SPL本身没有从EL3切换到EL1,这个工作由BL31完成,每一款芯片切换级别的具体方法都不一样,在RK3588芯片手册中没找到切换操作以及相关寄存器说明,咨询厂家也不提供技术支撑,这种情况下我们只能摸黑一点一点尝试跳过BL31、BL32、BL33,反复试验后确认只能跳过BL33(uboot)阶段,BL1/BL31/BL32等二进制阶段都跳不过去。

为了完整跳过uboot,尽量缩短启动时间,我们又花了不少时间对spl和kernel源码做了修改,最终在RK3588平台上实现了1秒快速启动Linux系统。

### 在 RK3588 平台上进行 Python 系统封装和运行 #### 安装必要的依赖项 为了确保能够在 RK3588 上顺利运行 Python 应用程序,首先需要安装一系列基础工具和支持库。这不仅限于 Python 解释器本身,还包括编译环境和其他可能被使用的扩展模块。 对于基于 Debian 或 Ubuntu 的 Linux 发行版来说,可以利用 `apt` 包管理器来完成这一过程: ```bash sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-pip python3-setuptools python3-wheel git make gcc g++ cmake pkg-config libssl-dev zlib1g-dev libncurses5-dev libbz2-dev libreadline-dev libffi-dev curl wget vim htop tmux screen tree jq -y ``` 上述命令会更新现有软件包并安装一组常用的开发工具和 Python 开发所需的基础库[^1]。 #### 获取并配置 Python 源码 如果希望使用特定版本的 Python 而不是系统默认提供的版本,则可以从官方源获取最新稳定发布的 tarball 文件,并按照说明文档中的指导来进行本地化定制化的编译与安装工作。 访问 [Python 下载页面](https://www.python.org/downloads/) 找到想要下载的目标版本链接地址,接着通过如下方式将其部署至目标设备上: ```bash cd /usr/src/ sudo wget https://www.python.org/ftp/python/X.X.X/Python-X.X.X.tgz # 将 X.X.X 替换成具体版本号 sudo tar xzf Python-X.X.X.tgz cd Python-X.X.X/ ./configure --enable-optimizations --with-lto --prefix=/opt/pythonX.X # 设置合适的前缀路径 make altinstall # 使用 altinstall 可防止覆盖系统的默认 python 版本 ``` 这里需要注意的是,在 Rockchip 提供的标准固件环境中,默认情况下并没有预装过高版本的 Python 解释器,因此建议采用这种方式自行构建适合项目需求的最佳实践方案。 #### 创建虚拟环境以隔离不同项目的依赖关系 当多个应用程序共存时,为了避免它们之间因第三方库的不同而引发冲突问题,推荐为每一个独立的应用创建专属的工作区——即所谓的“虚拟环境”。这样做的好处是可以针对各个应用单独管理各自的 pip 包集合而不影响全局设置或其他项目。 假设已经完成了前面提到的新版 Python 编译安装步骤,现在就可以很方便地借助新解释器自带的支持特性快速搭建起这样的沙盒空间了: ```bash /opt/pythonX.X/bin/python3 -m venv myproject_venv # 生成名为 'myproject_venv' 的目录作为新的 VE 根节点 source ./myproject_venv/bin/activate # 启动当前 shell session 中对该 VE 的支持状态 pip install --upgrade pip # 升级内部 PIP 工具链以便更好地兼容后续操作 deactivate # 结束本次交互式的 VE 使用场景返回正常模式 ``` 每次进入该工程之前都需要重复激活指令,这样才能保证所执行的所有 PyPI 包加载行为都限定在此范围内发生而不是污染到了其他地方。 #### 整合 NPU 支持功能 考虑到 RK3588 自带强大的神经网络处理单元 (Neural Processing Unit),为了让 Python 程序能够充分利用这部分硬件加速能力,还需要额外引入由芯片厂商提供的专用接口文件 `librknn_api.so` 来桥接高层 API 和底层驱动层之间的通信渠道[^2]。 通常做法是在项目的 setup.py 或 requirements.txt 文档里指定此类 CFFI 绑定形式的外部资源位置,或者干脆直接将共享对象拷贝进 site-packages 子目录下让 import 机制自动识别出来即可满足基本调用诉求。 #### 实现 YOLOv5 推理流程适配 最后一步则是围绕着具体的 AI 计算任务展开讨论,比如怎样把流行的物体检测框架移植过来并在嵌入式平台上高效运作起来?根据先前分享过的经验贴士可知,关键在于理解模型预期接收的数据格式及其对应的转换逻辑[^3]。 对于YOLOv5而言,这意味着要准备好符合其输入尺寸规格(通常是640x640像素)的图像样本集,并编写相应的预处理器负责调整原始素材使之匹配算法要求;与此同时还要设计好后置解析环节用于提取预测框坐标信息以及其他有用元数据字段,从而形成完整的端到端解决方案链条。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值