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

嵌入式系统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.dtcms.com/a/347988.html

相关文章:

  • SpringBoot的学生学习笔记共享系统设计与实现
  • 鸿蒙中应用闪屏解决方案
  • 从Android到鸿蒙:一场本应无缝的转型-优雅草卓伊凡
  • Flink 实时加购数据“维表补全”实战:从 Kafka 到 HBase 再到 Redis 的完整链路
  • 设计模式:工厂模式
  • 3.4 磁盘存储器 (答案见原书 P194)
  • STM32H723Zx OCTO-SPI(OSPI) 读写 W25Q64
  • fastmcp 客服端远程MCP服务调用;多工具 MCP服务情景案例;集成fastapi服务
  • Vue.js 核心机制深度学习笔记
  • 阿里云 OSS 前端直传实战:表单上传 + Policy 模式详解
  • 基于魔搭社区与阿里云百炼的云端 RAG 私有知识问答系统实现
  • GHOST 小巧方便的 WinXP !
  • 华为网路设备学习-30(BGP协议 五)Community、
  • 【重学MySQL】八十八、8.0版本核心新特性全解析
  • 质量管理与项目管理学习-初识1
  • ThinkPHP8学习篇(四):请求和响应
  • 基于FPGA的情绪感知系统设计方案:心理健康监测应用(一)
  • centos搭建gitlab服务器
  • 【R语言】R语言中 rbind() 与 merge() 的区别详解
  • 【企业标准开发框架 01】全局异常处理+自定义异常类
  • JAVA限流方法
  • System.IO.Pipelines 与“零拷贝”:在 .NET 打造高吞吐二进制 RPC
  • 【SpringBoot集成篇】SpringBoot 深度集成 Elasticsearch 搜索引擎指南
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十五)网格布局
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十三)菜单、右键菜单
  • 【JavaEE】了解synchronized
  • 大数据毕业设计选题推荐-基于大数据的丙型肝炎患者数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序
  • 基于stm32汽车雨刮器控制系统设计
  • Java基础第3天总结(面向对象)