车载Android操作系统快速倒车启动技术研究

时间:2023-04-29 13:42:03 公文范文 来源:网友投稿

汽车厂商的车载系统正逐步淘汰WINCE系统而采用Andorid系统[3]。一般车载倒车系统在启动后3 s内,倒车影像与轨迹规划功能启动,倒车进程准备就绪,但车载Android系统的启动速度慢,一般需要数十秒才能完成启动,如果用户在Android系统启动过程中需要倒车,倒车系统将无法及时显示倒车影像,影响倒车的安全性和用户体验。目前,常用解决方法是采用休眠技术和提升硬件性能,上述方法在一定程度上提高了系统的启动速度,但在应用中仍存在一定局限性。

1.2 Android系统启动流程

为了更好地优化Android系统的启动时间,需详细分析车载Android系统的启动过程,Android系统的启动大致分为3个部分[4],Android设备的启动过程如图1所示。

Step1:BootLoader程序,完成相关硬件的初始化配置工作,加载Linux内核,然后跳转到Linux内核起始地址执行[5]。

Step2:Linux内核,内核初始化,加载相关驱动模块,加载文件系统模块,启动用户层的祖父进程Init进程。

Step3:Init进程,用户空间上的第一个程序,是用户层所有进程的祖父进程。Init进程主要任务一是挂载目录,比如/sys、/dev、/proc,二是解析脚本配置文件Init.rc,根据Init.rc文件配置孵化出其他进程,其中就包括倒车进程。

Step4:倒车进程,倒车进程负责监测倒车信号,获取倒车摄像头视频流,刷新视频流到framebuffer显示。

2 系统快速启动优化

2.1 系统启动速度的主要影响因素

分析并确定系统启动的主要延时因素是优化启动速度的关键,本文使用PrintkTimes、CPU定时器、KernelFunctionTrace、示波器和LinuxTraceToolkit等工具测量系统启动时间,在实际测量中发现,BootLoader模式检测、BootLoader拷贝Linux内核和根文件系统镜像、设备驱动初始化、文件系统初始化、根文件系统建立、Linux内核log输出和LPJ值计算耗时较多。上述启动进程的耗时因素主要有以下几个方面。

(1)bootloader模式检测:bootloader每次启动都需检测是否进recovery模式,bootloader首先挂载磁盘上的cache分区,cache分区采用ext4格式存储文件,挂载文件需一定时间,然后读取cache分区中的是否进入恢复出厂设置模式的文件,如果文件存在则进入恢复出厂设置,否则正常启动。

(2)bootloader拷贝镜像:嵌入式Linux系统的内核以压缩形式存储在NAND Flash中,启动前需压缩Linux内核,从根文件系统镜像读取到内存中并解压,然后CPU指针指向内核的入口地址,开始执行内核镜像代码,拷贝内核镜像花费了大量时间。

(3)设备驱动初始化:Linux内核支持大量总线和设备驱动,Linux启动时会对Linux内核的所有设备进行初始化,如果硬件系统中没有某些设备,但驱动仍会初始化,且驱动的初始化过程是串行执行。多数驱动的初始化函数中包含休眠函数,内核执行休眠函数时不会调度到其他驱动继续执行,而是在休眠函数处执行死循环,浪费了大量启动时间。

(4)文件系统初始化:Linux内核支持ext2、ext3、ext4、fat32、fat16、NTFS等多种文件系统,文件系统本身代码量庞大,初始化耗费了大量时间。

(5)根文件系统建立:Linux启動完成后,需要挂载根文件系统,挂载完成后,Linux内核会依次上报设备节点信息给Ueventd进程,Ueventd进程根据上报的主次设备号建立设备节点,全部设备节点建立完成耗费了大量的时间。

(6)Linux内核日志输出:Linux系统启动时一般使用串口打印系统的启动日志信息,打印速度由串口的速度决定。串口速度一般较慢,并且启动信息一般较多,耗时较长。

(7)LPJ值计算:Linux启动时,会运行Calibrate_delay函数计算LPJ值,LPJ值是一个衡量CPU处理速度的基准,通过执行一定次数的周期为1jiffy的循环来确定其数值,在Linux内核中运行Calibrate_delay函数计算LPJ值一般会耗时几百毫秒。

2.2 系统快速启动优化设计

(1)针对BootLoader模式检测:Android系统检测是否进入恢复出厂设置的原始方式是询问挂载文件系统,本方案将是否进人恢复出厂设置模式的标识存放在NAND中某一个固定的地址,BootLoader模式检测时无需访问挂载文件系统,直接读取固定地址是否有标识信息,同时将BootLoader中支持文件系统的代码裁剪掉,加快代码执行速度。

(2)针对BootLoader拷贝镜像:提高存储Linux内核和根文件系统镜像的NAND的总线速度,同时使用直接内存存取(Direct Memory Access,DMA)方式读取镜像。DMA方式完全由硬件控制信息传送[6],通过使用DMA方式读取镜像可以使CPU预先处理BootLoader的其他任务。通过优化驱动,裁剪Linux内核体积,精简文件系统等减少Linux内核编译后的体积。将根文件系统镜像直接编译到Linux内核,减少根文件系统的拷贝时间。

(3)针对设备驱动初始化:Linux内核在启动过程中耗时最长的是初始化各种总线驱动,设备驱动。根据Android车载系统的工作特点,在内核中删除不必要的驱动程序[7],如PS2鼠标、键盘、SATA硬盘、有线网卡等。Linux内核在启动过程中是单线程加载驱动,且很多驱动的初始化函数中包含休眠函数,实际这个休眠函数不是休眠,而是在死循环,所以引入多线程初始化驱动技术,将驱动的初始化函数放入工作队列的下半部分,当Linux系统在执行驱动初始化函数过程中遇到休眠函数时,CPU将会调度到工作队列的下半部实现并行初始化。

(4)针对文件系统初始化:根据Android车载系统的特点,裁剪掉不需要的文件系统,如NTFS、EXT3、EXT2、FAT16等文件系统,只保留FAT32和EXT4这两种最常用的文件系统,节省初始化文件系统的时间。

(5)针对根文件系统建立:Linux内核启动完成后,最先执行的是INIT进程,通过在INIT进程中直接调用MKMOD命令手动建立设备节点,然后INIT进程启动倒车进程,使倒车进程可以立即工作,节省设备节点建立的时间。

(6)针对Linux内核日志输出:在Linux内核启动参数中加入“queit”参数,降低Linux内核的启动级别,待系统启动完成后,可以使用dmesg命令查看启动日志,节省了Linux内核日志的输出时间。

(7)针对LPJ值计算:在Linux内核中硬编码LPJ值,通过查看优化前的启动日志,查到“Calibrating delay loop****BogoMPIS”信息中LPJ值,然后在Linux内核代码中硬编码LPJ值,删除计算LPJ值的Calibrate_delay( )函数,节省LPJ值的计算时间。

3 实验结果

表1为系统启动各个流程的所需时间。由表1可知,采用本文的优化方案后,Android车载倒车系统的启动速度有明显改善,从15.62 s减少到1.76 s。通过分析表格可以看出,在不改变原有软硬件架构的情况下,通过优化系统启动过程的各个部分,主要延时进行了有效消除,达到了设计目的。

4 结语

本文提出的基于优化bootloader、linux内核、ramdisk的Android车载倒车系统快速启动方案,从bootloader模式检测、内核镜像拷贝、设备驱动初始化、文件系统初始化、根文件系统建立、内核log输出、硬编码LPJ值等方面提出优化方法,实现了Android车载倒车系统的应用。该方案降低了复杂度,提升了可靠度,节省了成本,提高了扩展性,具有较高的应用价值。

参 考 文 献

[1]段红祥,孙棣华,刘卫宁,等. 基于内核启动优化的嵌入式Linux快速启动方案[J]. 计算机工程与设计,2009,30(1):16-18.

[2]李妍,沈勇,陆贞姣. 面向汽车应用的Linux系统启动性能测试与改进[J]. 电子技术,2013(8):111-115.

[3]马胜,江冰,谢剑锋. 基于Android的可视倒车系统设计[J]. 微处理机,2013,34(5):41-45.

[4]金智义,张戟. 嵌入式Android系统的启动研究[J]. 佳木斯大学学报(自然科学版),2011,29(4):521-523.

[5]周继才. 基于Android平台的Bootloader系统设计与启动性能优化[D]. 重庆:重庆邮电大学,2013.

[6]谭平,王小平. ArmLinux下DMA数据同步传输机制及实现[J]. 无线互联科技,2013(2):154-155.

[7]张国明. 嵌入式Linux驱动程序分析与改进[D]. 长春:长春理工大学,2007.

[8]史巧硕,范东月,柴欣,等. 嵌入式Linux根文件系统的构建与分析[J]. 计算机测量与控制,2015,23(2):656-659.

[责任编辑:钟声贤]

推荐访问:倒车 技术研究 操作系统 快速 启动