Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >系统启动时间优化方案--基于米尔MYD-YG2LX开发板

系统启动时间优化方案--基于米尔MYD-YG2LX开发板

原创
作者头像
用户10591265
发布于 2025-05-09 11:15:42
发布于 2025-05-09 11:15:42
7300
代码可运行
举报
文章被收录于专栏:米尔电子米尔电子
运行总次数:0
代码可运行

1.概述

MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A55@1.2GHz+Cortex-M33@200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内存控制器、千兆以太网控制器、USB、CAN、SD卡、MIPI-CSI等外设接口,在工业、医疗、电力等行业都得到广泛的应用。

米尔基于瑞萨RZ/G2L开发板
米尔基于瑞萨RZ/G2L开发板

本文主要介绍基于MYD-YG2LX开发板进行系统启动时间优化的调试案例,一般启动方式有去掉常规uboot,直接使用SPL加载内核和保留常规uboot加载内核的方式,MYD-YG2LX目前使用的是保留常规uboot的方法启动,启动时间20s+,接下来介绍的主要包括TFA、Uboot、Kernel文件系统时间优化。

2.硬件资源

  • USB-TTL调试串口线一根
  • MYD-YG2LX开发板一块
  • 12V电源适配器一个

3.软件资源

  • Linux虚拟机
  • 米尔提供的SDK交叉工具链
  • Linux5.10.83

4.环境准备

进行调试之前,需要安装好Linux虚拟机等相关开发环境,具体可以参考《MYD-YG2LX_Linux软件开发指南》的2.0章节。

5.启动时间优化

5.1.1. TFA优化

TFA引导启动的log主要有以下,如果我们认为不是太美观,可以到TFA源码中使用grep命令去搜索关键的信息打印,然后把相关的打印去掉,这可能需要花点功夫去寻找。

例如(grep -rn “BL2:”)搜索到关键的文件(以下图示只是其中的一个地方),然后屏蔽即可。

另外,需要检查源码下面的这个寄存器有没有设置,有则忽略,没有则需要打开,这样会减少系统在启动中的时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void cpu_cpg_setup(void)
{
while ((mmio_read_32(CPG_CLKSTATUS) & CLKSTATUS_DIVPL1_STS) != 0x00000000);
mmio_write_32(CPG_PL1_DDIV, PL1_DDIV_DIVPL1_SET_WEN | PL1_DDIV_DIVPL1_SET_1_1);
while ((mmio_read_32(CPG_CLKSTATUS) & CLKSTATUS_DIVPL1_STS) != 0x00000000);
}
void cpg_early_setup(void)
{
  cpu_cpg_setup();
cpg_ctrl_clkrst(&early_setup_tbl[0], ARRAY_SIZE(early_setup_tbl));
}

最后编译TFA以及更新即可。

5.1.2. Uboot优化

正常的启动log如下,我们需要对这部分进行优化,优化可以从下面3个点出发。

  • 裁剪uboot,减少uboot大小。

MYD-YG2LX平台的2G DDR配置文件在configs/myc-rzg2l_defconfig,1G DDR的配置文件在configs/myc-rzg2l_ddr1gb_defconfig,可以在这个配置文件中屏蔽掉一些自己不需要的功能,这个需要根据实际情况删除不需要的功能,例如:

  • 移除bootdelay的倒计时时间

bootdelay一般默认都是2-3s,移除可以直接修改include/configs/myc-rzg2l.h文件,例如:

  • 关闭uboot的打印log

关闭uboot相关的日志打印,可以到uboot的源码路径下搜索关键的信息,然后进行屏蔽即可(以下图示只是其中的一个地方),例如:

最后编译与更新uboot即可。

5.1.3. Kernel优化

Kernel典型的修改主要有以下:

  • 简单:通过在 cmdline 中添加 quiet 来减少控制台消息
  • 适度:通过移除驱动程序、文件系统、子系统来精简内核,从减少内核解压或加载的时间
  • 适度:通过移除未使用的硬件接口精简设备树
  • 棘手:开始优化行为不良的驱动程序,这是一个相对复杂和困难的任务。优化驱动程序可以提高其性能、稳定性和兼容性,从而改善系统的整体表现。然而,如果驱动程序的行为不良,例如出现崩溃、卡顿或冲突等问题,那么进行优化就会变得更加棘手和挑战。这需要深入分析和修复驱动程序的问题,调整其代码和算法,以使其更加高效和可靠。
  • 使用Bootgraph分析内核启动的调用时间,移除花费时间长的驱动和优化需要使用的驱动

总之优化还算是一项蛮复杂的项目,我们此次主要从以下几点优化:

  • 去掉kernel的打印等级,需要到内核源码下屏蔽掉log属性和到uboot源码下把log等级升高,内核修改如下:

Uboot修改如下:

  • 关掉kernel不需要的一些外设资源,缩小内核大小(需要根据自己的情况来进行修改)

可以到设备树中屏蔽掉一些不需要的接口和到内核配置文件中屏蔽掉一些不需要的驱动配置,例如:

  • 使用Bootgraph分析内核启动的调用时间,移除花费时间长的驱动和优化需要使用的驱动。

首先需要在uboot加上时间戳和init debug调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setenv bootargs 'rw rootwait earlycon root=/dev/mmcblk0p2 printk.time=1 initcall_debug=1'

然后启动内核,采集启动log,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dmesg > boot-kernel.log

返回内核源码目录,进入内核源码scripts目录,只需下面命令,生成直观图形,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./bootgraph.pl boot-kernel.log > boot-kernel.svg

然后打开boot.svg查看花费时间最大的驱动调用,没用的就关闭,需要用的就优化。

最后编译以及更新内核即可。

5.1.4. 文件系统优化

MYD-YG2LX的文件系统是基于yocto构建的,关于yocto如何构建可以参考《MYD-YG2LX_Linux软件开发指南》的3.0章节。

文件系统主要使用下面这3个命令就可以找到花费时间最多的服务,然后可以根据实际情况优化。当然也可以把所有的服务以图形的形式表现出来,这样更加直观,采用systemd-analyze plot > boot.svg 可以把每个服务启动顺序和消耗时间显示出来,针对这些服务,移除掉不需要的或者调整服务之间的启动顺序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl list-unit-files --state=enabled #查看所有开机自启的服务
systemd-analyze blame #查看服务的初始化时间
systemd-analyze critical-chain #查看启动花费时间最多的

5.1.5. 启动测试

经过以上的优化后可以打包一个sd卡刷机包并刷到板子的emmc,关于如何打包可以参考《MYD-YG2LX_Linux软件开发指南》的4.3章节,最后再启动测试,执行systemd-analyze即可看到启动时间,效果如下:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原型模式(Prototype)
原型模式(Prototype) 原型模式(Prototype) 意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。 应用:Java/C#中的Clonable和IClonable接口
Florian
2018/02/05
5940
原型模式(Prototype)
面向对象设计模式--原型模式详解+实际应用(Java)
原型模式解决从1到N个对象的生成,不负责生成第一个对象实例。原型模式可以通过直接复制内存的方式生成一个新的对象实例,与原有的对象实例的内容都相同,它省去了通过构造函数生成对象实例的步骤,省去了每个属性的赋值逻辑。如果构造函数中没有任何逻辑,则new方法要比clone方法快;但是,只要构造函数中有一点点逻辑,则clone方法就要比new快很多了,而且还没有考虑对象的内部属性进行赋值的逻辑时间。
飞天葫芦侠
2023/03/23
15.5K0
面向对象设计模式--原型模式详解+实际应用(Java)
设计模式之八(原型模式)
ConcretePrototype1,ConcretePrototype2具体原型类,实现一个克隆自身的操作
aehyok
2018/09/11
2810
设计模式之八(原型模式)
【设计模式】—— 原型模式Prototype
  模式意图   由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了。通过原型模式就可以通过拷贝函数clone一个原有的对象,给现在的对象使用,从而创建更多的同类型的对象
用户1154259
2018/01/18
5270
【设计模式】—— 原型模式Prototype
设计模式之原型模式(Prototype 模式)
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
海盗船长
2021/12/07
3980
设计模式之原型模式(Prototype 模式)
设计模式 -- 原型模式
这里的复制指深复制 关于深浅复制传送门 深复制就是开辟新内存实现真正的内存复制 浅复制, 只复制指针, 堆内存不变.
xy_ss
2023/11/22
1720
设计模式 -- 原型模式
设计模式——原型模式
设计模式——原型模式
Java架构师必看
2021/05/14
3210
设计模式——原型模式
[设计模式]原型模式
根据给定的文章内容,撰写摘要总结。
静默虚空
2018/01/05
5780
[设计模式]原型模式
Python 设计模式—原型模式
浅拷贝(Shallow Copy):指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。 浅拷贝会拷贝对象内容及其内容的引用或者子对象的引用,但不会拷贝引用的内容和子对象本身。
Wu_Candy
2022/07/04
2410
原型模式
概念: 是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的原型。 原型模式的拷贝:分为"浅拷贝"和"深拷贝"。(这个和我们理解的拷贝是一样的) 浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象. 深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制. 组成 原型模式涉及到三个角色: (1)客户(Client)角色:客户类提出创建对象的请求。 (2)抽象原型(Prototype)
xiangzhihong
2018/02/05
5390
原型模式
大牧絮叨设计模式:原型模式
原型模式(Prototype)[GOF95]是一种对象的创建模式,通过给定一个参考的原型对象来指定要创建的对象的类型及数据,然后复制该对象创建更多的相同对象的方式完成对象的构建过程。
大牧莫邪
2019/07/23
3860
大牧絮叨设计模式:原型模式
设计模式——原型模式
设计模式中,单例模式应该是大家最为熟悉的了,那如果我们需要对一个对象进行多次复制的话,大家会用什么呢?这就要用到今天要讲的原型模式了。
健程之道
2019/11/02
4340
重温设计模式 --- 原型模式
原型模式是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。
Niuery Diary
2023/10/22
1860
重温设计模式 --- 原型模式
【地铁上的设计模式】--创建型模式:原型模式
原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象。该模式基于一个原型对象,通过克隆来创建新的对象,避免了创建过程中的复杂配置。原型模式分为浅拷贝和深拷贝两种类型,浅拷贝只复制对象的基本类型数据和引用类型的引用,而深拷贝则复制了整个对象,包括对象内部的引用类型。原型模式适用于需要创建大量相似对象的场景,可以提高代码复用性,减少对象创建的开销。
喵叔
2023/04/28
1780
【设计模式 06】原型模式
原型模式是通过复制已有对象来快速创建新对象的方法,它适用于创建那些实例化很慢的对象,比如数据库连接对象,在创建好这样的对象后,我们可以缓存一份,下次需要这种对象时,我们可以直接返回一个该对象的拷贝。
JuneBao
2022/10/26
1750
设计模式(四)原型模式Prototype(创建型)
通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象。这个指定的对象可被称为“原型”对象,也就是通过复制原型对象来得到更多同类型的对象。即原型设计模式。在php的很多模板库,都用到clone。如smarty等。
黄规速
2022/04/14
2660
设计模式(四)原型模式Prototype(创建型)
Java 设计模式系列(6) —— 原型模式
当拷贝对象时,拷贝的对象只包含简单的数据类型,或不可变对象时,就直接将这些字段复制到新对象中 但是如果拷贝对象中包含引用对象时,只拷贝引用对象的地址而不拷贝整个被引用的对象被称为浅拷贝,如果新开辟一块内存区域,将整个引用对象都拷贝一份,我们称之为深拷贝。
求和小熊猫
2021/01/06
2900
PHP设计模式之原型模式
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。
硬核项目经理
2019/08/30
5340
PHP设计模式之原型模式
04.原型模式设计思想
本文详细介绍了原型模式的设计思想,包括其定义、应用场景、实现原理及优缺点。通过邮件复制的例子,阐述了原型模式如何通过克隆现有对象来创建新对象,从而提高性能和减少代码复杂度。文章还对比了原型模式与工厂模式的区别,并讨论了深克隆和浅克隆的实现方式。最后,总结了原型模式在特定场景下的应用价值和局限性。
杨充
2024/10/22
1340
JAVA设计模式4:谈谈原型模式在JAVA实战开发中的应用
本文讲解了 Java 设计模式中的原型模式,并给出了样例代码,原型模式的主要目的是通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程。
Designer 小郑
2024/05/26
2100
JAVA设计模式4:谈谈原型模式在JAVA实战开发中的应用
相关推荐
原型模式(Prototype)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验