当前位置: 首页 > ops >正文

嵌入式系统bringup通用流程

文章目录

  • 一、前言
  • 二、目标
  • 三、linux系统核心组件
  • 四、bringup流程
    • 1. 编译框架适配
    • 2. 固件打包
    • 3. flash驱动适配
    • 4. 启动问题调试
    • 5. 业务进程适配
    • 6. 关键驱动适配
    • 7. 里程碑
  • 五、技巧

一、前言

本人作为一个嵌入式工程师,负责过多款新机新的芯片平台的适配,从事过路由器和摄像头方面的bringup工作,以这两个产品为例,总结下嵌入式设备通用的bringup思路。

二、目标

bringup也叫冒烟适配,指新方案初期快速适配核心业务,达到可调试状态,以及解决阻塞点,以便其他同事可并行展开工作。比如

产品类别bringup目标
路由器有线通,无线起来,AP可接入AC。
摄像头能够出流,IPC可接入NVR。

根据你的产品业务类型,分析你的核心目标。

  • 时间要求

bringup通常要求时间非常紧迫,通常要在1周内完成,所以需要提升紧迫感。

三、linux系统核心组件

本文针对linux系统做bringup,所以需要了解一下linux的启动流程和核心组件:

preloader (供应商提供、ATF、BL)、uboot、kernel、rootfs、启动脚本、核心业务进程。

主要分为:

linux启动问题(通用) + 核心业务适配。

linux启动的目标是能够进入linux的串口,可执行调试命令,可具备的调试手段:

1)固件烧录方式调试

2)网络可通,tftp/nfs 通过网络更新进程的方式。

  • 核心业务分析

1)路由器:管理进程启动正常、有线驱动正常、无线驱动适配。

2)摄像头:管理进程启动正常,摄像头驱动适配。

四、bringup流程

1. 编译框架适配

供应商sdk合入核心驱动、内核、uboot代码,合入我司的编译框架(通常不会直接使用供应商的sdk编译,那样就是纯turnkey方案了)比如路由器行业通常是openwrt sdk,将供应商的代码copy到我司维护的sdk中进行编译。而其他行业供应商的sdk和目标编译框架往往差的很远,有的公司则是采用内核和uboot使用供应商的sdk进行编译和定制化,然后将产物维护的sdk中,进行打包固件,这样做法的是能够快速bringup,跳过内核等编译的风险和问题解决。

这里注意最小化SDK编译,专注于核心进程,其他进程等可先不编译。

2. 固件打包

编译出uboot、kernel、rootfs后,打包成一个固件,这里通常需要适配机型的配置,如分区划分等处理。这里重点提一下rootfs制作,通常编译框架中是已有的,通常需要适配的是将libc、so等进行copy。

3. flash驱动适配

固件打包完,上板烧录验证前,确认是否能够正常启动,需要先确认flash驱动是否适配。

4. 启动问题调试

  • uboot引导内核

主要适配点:

1)读分区表信息。(可先写死)

2)固件校验(可跳过)

4)加载kernel到指定的内存地址

5)使用bootm 跳转到内核。

6)bootargs适配。(确认是否需要传递分区表信息,其他参数一般使用供应商提供的即可)

  • 内核启动问题解决

具体问题具体解决了,内核启动都是通用的流程,主要有3点可能出问题

1)flash驱动未适配

2)分区表未适配,找不到rootfs

3)rootfs文件系统格式不对或者打包有问题,导致rootfs mount不上

  • 启动脚本处理

启动脚本,一些ko插入、文件系统mount等,具体问题具体分析。可以修改inittab,快速跳过这些脚本处理,进入串口命令行调试。

5. 业务进程适配

解决业务进程启动执行问题,IPC可接入NVR,AP可接入AC等。

6. 关键驱动适配

路由器:有线驱动、无线驱动适配,有线可tftp进行网络调试,无线可接入STA。

IPC:摄像头驱动适配,可出流,可在NVR或者APP上查看采集的视频。

至此bringup工作就完成了,可开展其他业务适配和问题解决了。

7. 里程碑

在这里插入图片描述

五、技巧

1)跳过大法,跳过一切可以跳过的。专注于启动与核心业务。

2)最小化编译,最小化sdk编译和处理。

3)卡点分析,哪些是阻塞点,阻塞其他人开展工作的要优先解决。

4)严格的时间计划和目标导向,拆解里程碑,不能有严重的延期,控制在最多2到3天的延期范围。

5)一般硬件较晚回来,使用demo板或者基础机型进行调试。

http://www.xdnf.cn/news/18614.html

相关文章:

  • halcon(一)一维码解码
  • 目标检测数据集 第007期-基于yolo标注格式的茶叶病害检测数据集(含免费分享)
  • MATLAB 入门:从变量定义到基础绘图的完整上手指南
  • 05-ArkUI界面开发
  • 前端漏洞(上)- CSRF漏洞
  • C++ Core Guidelines: 最佳实践与深入解析
  • .net9 解析 jwt 详解
  • Go语言 Hello World 实例
  • RabbitMQ--消费端异常处理与 Spring Retry
  • 2025最新ncm转MP3,网易云ncm转mp3格式,ncm转mp3工具!
  • ThinkPHP8学习篇(四):请求和响应
  • VSCode无权访问扩展市场
  • 【数据结构】-5- 顺序表 (下)
  • 【JavaEE】了解synchronized
  • Java 基础学习总结(211)—— Apache Commons ValidationUtils:让参数校验从 “体力活“ 变 “优雅事“
  • 电动车运行原理与最新人工智能驾驶技术在电动车上的应用展望:从基础动力系统到L5级完全自动驾驶的技术深度解析
  • 大语言模型的自动驾驶 LMDrive/DriveVLM-Dual
  • Kubernetes部署Prometheus+Grafana 监控系统NFS存储方案
  • Spark04-MLib library01-机器学习的介绍
  • Spring创建的方式
  • 在 Ubuntu 24.04 或 22.04 LTS 服务器上安装、配置和使用 Fail2ban
  • 【LLM】DeepSeek-V3.1-Think模型相关细节
  • Android - 用Scrcpy 将手机投屏到Windows电脑上
  • MySQL学习记录-基础知识及SQL语句
  • SSRF的学习笔记
  • React useState 全面深入解析
  • 6.2 el-menu
  • Axure RP 9的安装
  • 如何让FastAPI在百万级任务处理中依然游刃有余?
  • Postman参数类型、功能、用途及 后端接口接收详解【接口调试工具】