嵌入式linux-u-boot优化

BeagleBoneBlack的U-Boot是如何引导系统的 bootcmd中的命令就是出现“Hit any key to stop autoboot”提示后,不按任意键,会自动运行的命令。 bootargs是传递给Linux内核的参数。 run是运行环境变量中的命令,bootcmd中包含run命令。 阅读详情

1.去掉启动时的按键等待

U-boot 启动的时候出现一个 Hit any key to stopautoboot 不爽,干吗要停上1秒?虽然可以通过设置参数bootdelay=0来关掉这个延时,但这样做了以后就再也进不去U-boot了,更烦。检查代码,发现是在main.c函数intabortboot(int bootdelay)来干这个活的,好吧,改掉它

static __inline__ intabortboot(int bootdelay)
    {
       int abort = 0;
       char inputkey;

    if(tstc())
       { 
           inputkey =getc(); 
           abort = (inputkey == 'u');

    }
       #ifdef CONFIG_SILENT_CONSOLE
         if (abort)
              gd->flags&= ~GD_FLG_SILENT;
       #endif
       return abort;
   }

这样,就不需要等待了,如果想进入U-boot,就在上电的时候按住u吧,把它改成一个固定的键而不是任意键,因为串口线很容易受到干扰,如果是任意键的话,运行时即使不想进去有时也会进入U-boot的命令行。 

2.去掉网卡的初始化

每次上电,U-boot都会初始化网卡,其实这根本不需要,把配置文件中

#defineCONFIG_MII   1

去掉,启动时就不会初始化了,需要使用TFTP时,它会自动初始化,又节省了3.4秒的启动时间。

3.智能读取OSImage

U-boot 通过nand read 来读取OSImage,通常为了避免麻烦,我们设置的读取长度要比实际OS长度长一些,多读的那部分纯粹是浪费CPU时间,能不能精确判断读取长度呢,当然可以,为了不影响系统的正常功能,扩展一个nandread.os 指令来读取,修改方法如下:

在 nand_read_options_t里面添加一个成员 int is_os_img

在函数 int do_nand(cmd_tbl_t* cmdtp, int flag, int argc, char *argv[])

修改读操作的判断语句,添加 !strcmp(s,".os"),然后设置opts.is_os_img = !strcmp(s, ".os");大概修改后结果参考第7步代码。

 
  最后,在函数intnand_read_opts(nand_info_t *meminfo, const nand_read_options_t*opts)中修改

代码,检测如果opts->is_os_img == 1并且是第一次读取(2024B)之后,检查度取得结果是否是OSImage,如果是更新需要读取的长度,否则,也不需要再往下读了,直接返回错误就可以了嵌入式Linux启动优化手记2 <wbr>U-boot优化
            image_header_t  *hdr = (image_header_t*)buffer;    
             if(image_check_magic(hdr) &&image_check_hcrc (hdr))
             {
                size_t ossz= uimage_to_cpu(hdr->ih_size);//+image_get_header_size();
                imglen =ossz + + image_get_header_size();
                printf("##Find valid OS image, at 0x%x, Size: %d Bytes = %d KB\n",
                     (unsigned int)mtdoffset, ossz,ossz/1024);
             }
             else
             {
               printf("Invalid OS image at 0x%x\n", (unsignedint)mtdoffset);
                return-1;
             }

4.去掉OS Image内存复制过程

使用 nand read 读取OS Image后,U-boot 使用 bootm 指令来启动Linux,检查其实现代码

int do_bootm (cmd_tbl_t*cmdtp, int flag, int argc, char *argv[])

发现他会把已经读取到内存中的OS Image在复制到一个指定的位置,OS Image 中的头部参数,这个值一般是固定的,本系统使用的是 0x70008000, 如果在 nandread 时读到的内存位置恰好合适,就可以省掉这些毫秒数了,做法如下:

nand read.os 0x70007FC00x100000 0x500000

(其中 0x70007FC0 =0x70008000 - sizeof(sizeof(image_header_t)))

然后在内存复制的地方(函数do_bootm中),加入修改,跳过内存复制

    switch(comp) {
    caseIH_COMP_NONE:
       if(load_start == (ulong)os_hdr) {
          printf("   XIP %s ... ",type_name);
       } else{
          if(load_start != os_data)//位置不匹配,依然移动,否则就跳过此部
         {
             printf("   Loading %s ... ",type_name);
             memmove_wd((void *)load_start, (void *)os_data, os_len,CHUNKSZ);
            puts("OK\n");
         }
       }
       load_end =load_start + os_len;

对于我们的Kernel,修改后大小是1.4M,省去这个搬移过程,节省了大约800ms的时间

5.减少内存初始化的时间

在U-boot 初始化时,在start_armboot 函数中,多次使用到了memset函数,其中最耗时的是在mem_malloc_init函数中调用memset 初始化 512K内存的调用,检查U-boot1.3.4对memset的实现,发现是最简单的字节复制,把它改为按32bits复制的方式,这些memset调用所花费的时间立即从202ms减少到了45ms

修改方法,再 string.c中,找到memset函数,修改其实现(代码是从U-boot 2011.12 中复制过来的嵌入式Linux启动优化手记2 <wbr>U-boot优化)

void * memset(void *s,int c,size_t count)
    {
       unsigned long *sl = (unsigned long *) s;
       unsigned long cl = 0;
       char *s8;
       int i;
  
       if ( ((ulong)s& (sizeof(*sl) - 1)) == 0) {
          for (i = 0; i <sizeof(*sl); i++) {
             cl<<= 8;
             cl |= c & 0xff;
          }
          while (count>= sizeof(*sl)) {
             *sl++ = cl;
             count -= sizeof(*sl);
          }
       }
   
       s8 = (char *)sl;
       while (count--)
          *s8++ = c;
       return s;
    }

6.减少NAND初始化时间
    每次 U-boot启动,发现NAND初始化需要大约3秒的时间,仔细追踪发现,在nand_base.c文件中nand_scan函数的最后一步returnthis->scan_bbt(mtd);最花费时间,这个scan_bbt扫描整个NAND并检查坏块,重建坏块表,在启动过程中,这个耗时的操作毫无意义,去掉这一步,让nand_scan函数直接返回0就可以了。

7.添加Yaffs2支持

从网上各位前辈的论述中,都发现YAFFS比JFFS2要快,也决定测试一下,从YAFFS网站下载最新的代码,按照说明加入到Linux中,重新编译内核,让内核支持YAFFS2(按照默认的选项就可以了),弄一个空的分区,格式化成YAFFS2格式,感觉的确比较快,把ROOTFS复制到这个分区,然后修改Linux启动参数让它把YAFFS2分区当作根分区启动,发现果然快了不少,初始化和挂载根分区仅需要370ms,比JFFS2的速度快多了,决定就采用YAFFS2作为根文件系统了。自己在u-boot中添加对yaffs2image的支持

说起来容易,真正做起来还是很麻烦的,总是不能把yaffs2的image烧写成功,不知道是Image不正确还是Uboot没改对,折腾了几天也没搞定,最后终于发现了一个第三方的工具

http://code.google.com/p/yaffs2utils/

下载,编译,制作Image,验证,OK,把新工具生成的IMAGE与YAFFS2自带的工具对照,发现YAFFS2自带的工具生成的IMAGE不正确,晕死。

重新修改UBoot,改了很少一部份代码,就可以了。

依然是在函数do_nand中修改,添加一个扩展nand write.y 指令来写入Image:

按照惯例,YAFFS2的第一个块不使用,留给文件系统自己使用,在 nand_write_options_t 里面添加一个成员 intskip_first_block;

在函数 int do_nand(cmd_tbl_t* cmdtp, int flag, int argc, char *argv[])

修改读写操作的判断语句,添加 !strcmp(s,".y"),然后设置opts.is_os_img = !strcmp(s, ".os");大概修改后结果如下(红色部分)

   s = strchr(cmd, '.');
       if (s !=NULL && (!strcmp(s, ".jffs2") ||!strcmp(s, ".e") || !strcmp(s, ".i") || !strcmp(s, ".os") || !strcmp(s,".y")))    {
          if (read){
            
            nand_read_options_t opts;
            memset(&opts, 0, sizeof(opts));
            opts.buffer    =(u_char*) addr;
            opts.length    =size;
            opts.offset    =off;
             opts.readoob= 0;//remove this function.
            opts.is_os_img = !strcmp(s,".os");
            opts.quiet     = quiet;
             ret =nand_read_opts(nand, &opts);
            //printf("call nand_read_opts buffer %lu len %lu offset %d off, ret%d\n", addr, size, off, ret);
          } else{
            
            nand_write_options_t opts;
            memset(&opts, 0, sizeof(opts));
            opts.buffer    =(u_char*) addr;
            opts.length    =size;
          

uboot设置固定按键停止 uboot设置固定按键停止boot 阅读详情

相关推荐

自定义组合按键进入Uboot

uboot源码中提供的进入uboot命令行的方式为输入任意键。这样有一个隐患,当串口信号有干扰时,系统会将干扰信号识别为任意键而进入uboot,从而无法正常引导操作系统,这样对产品将是灾难性的影响。 解决或者规避该问题的方法之一是将任意键改为组合键减小异常几率,当然归根结底还是要从硬件的角度避免干扰信号的产生。修改方法:不同版本需要修改的文件不一样,可能是common/autoboot.c或者co

Happiness is a form of courage。 1万+

嵌入式Linux--U-Boot(二)基本命令使用

目录一、进入UBoot命令行模式二、命令help命令信息查询命令1、bdinfo命令2、printenv命令3、version命令环境变量操作命令1、修改环境变量使用格式2、新建环境变量3、删除环境变量内存操作命令 一、进入UBoot命令行模式  上电以后,出现 Hit any key to stop autoboot: 0就按下任意键,出现=>符号就进入命令行模式了,如下: U-Boot 2016.03 (Dec 12 2020 - 13:19:46 +0800) CPU: Freescal

似水流年 5417

嵌入式Linux启动优化实战:从U-Boot到应用的全链路加速

在嵌入式系统开发中,启动时间是衡量产品性能与用户体验的关键指标之一。其核心原理在于系统从上电到应用就绪的完整引导流程,涉及Bootloader、内核与文件系统等多个组件的协同工作。通过深度优化这一流程,能够显著提升系统响应速度,这对于工控、物联网等实时性要求高的场景具有重要技术价值。常见的优化手段包括裁剪非必要驱动、调整内核配置、精简启动脚本等工程实践。本文以全志T113平台为例,聚焦于U-Boot配置与内核裁剪等热词,详细解析如何通过系统级调优实现启动时间的有效压缩,为嵌入式开发者提供一套可落地的加速方案

weixin_28723109的博客 588

11_Uboot启动流程_3

run_main_loop函数详解run_main_loop函数详解uboot启动以后会进入3秒倒计时如果在3秒倒计时结束之前按下按下回车键那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能就是由run_main_loop函数来完成的。run_main_loop函数定义在文件common/board r.c中函数内容如下:第759行和第760行是个死循环, "for(;;

Yuanghxb的博客 1781

Vivado中Zynq-7000嵌入式Linux启动优化快速理解

深入探讨Vivado环境下Zynq-7000嵌入式Linux的启动流程,通过关键配置与裁剪策略提升系统启动速度,结合vivado工具链实现高效部署,适用于需要快速响应的嵌入式应用场景。

weixin_42511832的博客 995

RK3588 Linux启动优化至亚秒级全链路剖析

本文深入探讨RK3588平台Linux系统启动加速技术,涵盖从BL1/ATF安全固件、U-Boot剪裁到内核精简化等全链路优化方案,实现从上电到用户脚本800ms内完成的实战经验。​​文末提供完整解决方案获取方式​​。由于在 ARMv6 之后引入了 TrustZone 模块, 目前市面上 ARMv7 和 ARMv8 之后的系统都会包含了该模块, 这个模块由 BL1 启动, 且在 ATF(ARM Trust Firmware) 固件中, 既安全世界中引导到 BL33 (UBOOT)的系统。

韩若明溪 1777

嵌入式Linux启动优化手记2 U-boot优化

既然不能使用新的U-boot,那就优化一点是一点,慢慢干吧。 1.去掉启动时的按键等待 U-boot 启动的时候出现一个 Hit any key to stop autoboot 不爽,干吗要停上1秒?虽然可以通过设置参数bootdelay=0来关掉这个延时,但这样做了以后就再也进不去U-boot了,更烦。检查代码,发现是在main.c函数int abortboot(int bootdelay

流水mpc 3708

告别Petalinux:手把手打造ZynqMP极速启动链(u-boot/kernel/rootfs)

本文详细介绍了如何手动构建ZynqMP极速启动链,包括u-boot深度定制、Linux内核裁剪与性能调优、根文件系统构建及系统集成优化。通过告别Petalinux,开发者可获得完全自主控制的启动流程,显著提升编译速度和系统性能,适用于需要深度定制和高效率的嵌入式开发场景。

soda5的博客 987

嵌入式Linux U-Boot移植实战:从源码结构到启动优化全流程

Bootloader是嵌入式系统上电后运行的第一段代码,负责初始化DDR、时钟、串口等关键硬件,并加载操作系统内核。其核心原理是通过SPL(Secondary Program Loader)分阶段完成DDR初始化,再将内核镜像从存储介质搬运至内存并跳转执行。在嵌入式Linux开发中,U-Boot移植是连接硬件与内核的关键技术环节,直接影响系统启动可靠性与性能。典型应用场景包括新板卡Bring-up、定制硬件适配、产品快速原型验证及量产烧录。移植过程涉及defconfig配置、设备树适配、DDR参数调优、存储

weixin_29165465的博客 4

Linux系统启动优化:从U-Boot到用户空间的加速策略——并行启动与延迟加载

在嵌入式系统中,启动时间直接影响用户体验和系统响应能力。本文从硬件上电到用户空间应用就绪,系统性地剖析Linux启动全流程的优化策略,涵盖U-Boot Falcon Mode、内核裁剪、Initramfs精简、systemd并行启动与延迟加载等关键技术,通过实测数据展示各优化手段的效果,并提供可直接落地的配置代码与决策指南。优化层面核心技术典型收益实施难度U-BootFalcon Mode、禁用输出、精简功能2-3s中Kernel裁剪、异步probe、命令行优化0.5-1s中。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1万+

【Cadence】stb仿真和ac仿真——以一个简单的全差分反相放大器仿真为例

最近在补一些仿真方法学的问题,以及一些一直以来都有点模糊的概念,简单记录一下。搭建一个以两个CMOS反相器构成的全差分放大器(28nm工艺,PMOS和NMOS尺寸一致)激励的设置方便共模和差模仿真用同一个TB(这里有一个问题:这个放大器需要在开环下仿真还是闭环下?哪些放大器应用在开环,哪些闭环?这种应用场景不同会导致需要仿真得到开环还是闭环增益,或者环路增益?(我知道放大器在设计的时候肯定都是闭环应用的多,但是什么时候没必要闭环应用?光验证ac和stb仿真是否一样的话有必要有回路吗?

weixin_44951108的博客 5万+

嵌入式 Linux 快速开机冷启动优化:从 U-Boot 裁剪到 Busybox 极速 1.5 秒拉起实战

在车载数字仪表盘(如汽车通电后必须在 2 秒内显示倒车后视影像)、工业机器人急停控制器、智能门锁以及各类对有着严苛法规限制的嵌入式 Linux 设备中,开机速度直接决定了产品的用户体验与安全合规认证。这种“老爷车”式的启动速度在工业应急与车载领域是绝对无法容忍的。构建一套涵盖以及的全链路极限开机加速战法。能够在四核 ARM Cortex-A55 硬件平台上,实现。

qq_42431428的博客 321

滤波算法-呼吸心跳信号检测方法(四)

呼吸心跳信号检测系列文章:信号滤波处理

yjh_2019的博客 6268

嵌入式 linux启动时间优化

嵌入式 Linux 启动时间优化 2015年11月6日星期五 有些应用对系统启动时间有着特殊的要求。在很多场合下,这些系统并不需要针对所有任务立即就位,但是针对某些关键任务(例如接收以太网命令或者显示用户界面)则必须能够应对。该博文将提供一些方法和简单的步骤,在 ...

weixin_43138570的博客 1685

SWAT模型参数太多搞不定?一篇讲清如何用SWAT-CUP筛选关键敏感参数(含结果图解读)

本文详细解析了如何使用SWAT-CUP进行参数敏感性分析,帮助水文模型初学者从上百个参数中筛选出关键敏感参数。通过实际案例和结果图解读,介绍了敏感性分析的核心价值、SWAT-CUP结果界面解读方法以及参数筛选的四步实战法,显著提升模型调试效率。文章还提供了典型问题排查手册,解决敏感参数与文献不一致、率定后模型变差等常见问题。

weixin_30385925的博客 320

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

嵌入式Linux Boot启动优化方案

嵌入式Linux Boot启动优化方案摘要 本方案提出"硬件升级+软件精简+流程并行"的综合优化策略,从四个层面缩短嵌入式Linux系统启动时间: 硬件层:选用高速内存(eMMC/DDR4)、优化外存工作模式、配置芯片最高时钟频率 U-Boot层:消除启动延时、关闭冗余校验、精简镜像并优化加载方式 内核层:裁剪未使用模块、关闭调试功能、优化启动参数和压缩算法 用户空间:轻量化文件系统、并行启动服务、延迟加载非核心应用 优化需配合trace-cmd等工具分析瓶颈,注意区分调试/量产版本,并

xwb1040885790的博客 503

基于单片机控制的开关电源设计

采用开关电源技术和MCU模块,凭借可靠性高、易于调适的特点,可以更高效地发挥出二者的优势,从而实现更好的组合。stm32的起动模式是通过Boot0和Boot1两个管脚的高低电平来决定的,当stm32被供电之后,这两个管脚的电平。在 VCC上,键盘的一头(列线)被连接到 VCC上,而在“0”的编程输出中,则用来进。,在开关管打开的情况下,由输入电力供给电流,感应装置存储   Buck变换器是一种非隔离式的电压转换器[10]整流电路对输入电压进行整流,再经过滤波电路,即Dc电压是直流/直流变换器的直流输入。

QQ1694456187的博客 2308

嵌入式Linux裁剪优化启动速度与资源占用

本文详解如何通过裁剪U-Boot、内核与根文件系统,将嵌入式Linux启动时间从5秒压缩至680ms,存储占用降至8MB以下。涵盖启动流程优化、BusyBox精简系统构建、静态编译与压缩算法选择等关键技术,适用于物联网与工业控制场景。

weixin_33628677的博客 518

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1904

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5548

Linux 嵌入式启动以及优化

Linux 嵌入式启动以及优化 以前写了一篇Linux PC启动过程的日记,最近项目中,想优化一下启动过程,减少启动时间.因此研究了我们项目的启动全过程. 第一步: BootLoader -- U boot 1 在cpu/arm926ejs/start.s中 a) b reset ; //jump to reset b) set cpsr ;svc mode ,disable I...

编程资料大全 149

基于ESP32 蓝牙游戏手柄设计

介绍使用 ESP32 并通过 BLE 通信的 设计手持游戏手柄,包含原理图与代码

DT程序员的博客 2163

嵌入式Linux-启动时间优化

由于物联网项目中需要对设备的启动时间有快速启动的要求,目前的节点嵌入式linux启动时间是28秒左右,现在有了一点自由的时间,决定对这个东西的启动速度做一下优化,看看能提高多少.   把过程记录以下,供以后学习使用。   系统主要配置:    ZYNQ:zc7010     u-boot:2014.2    OS:Linux 2014.2    编译器:gcc4.2.0 20070413 (Cod...

微微一笑 3559

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux 嵌入式启动优化

以前写了一篇Linux PC启动过程的日记,最近项目中,想优化一下启动过程,减少启动时间.因此研究了我们项目的启动全过程. 第一步: BootLoader -- U boot   1 在cpu/arm926ejs/start.s中    a) b reset ; //jump to reset    b) set cpsr ;svc mode ,disable I,F in

zhanzheng520的专栏 790

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 嵌入式Linux-启动时间优化
下一篇: Linux---如何判定大小端
linux_0416
博客等级 码龄9年 79粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值