关于Linux启动时间,相信很多应用上都有要求。
优化前,需要明确目标和目前的状况,即
(1)目标启动时间:一般以系统上电到Linux命令行提示登陆为前后界限,或者从上电到应用程序运行,或者是上电到显示QT界面,目标启动时间为多少秒为目标。
(2)目前系统启动时间的情况: 这是优化必须做的工作。必需知道目前启动时间为多少秒,通过多种方式,比如UART输出前加时间打印来确定启动过程中哪些部分的初始化,或哪些部分读写flash最占用时间,以便优化时有的放矢。
如何优化?
首先,使用excel表格,列出如下信息:
- 目标启动时间
- 系统中必须的外设
- 优化前测试的前5大比较占时间的部分,如外设或flash读写操作: 如何通过在UART打印信息前加时间信息,可以参考processors.wiki.ti.com/.../Sitara_Linux_Training:_Boot_Time_Reduction
其次, 针对第一步的分析进行优化,基本的思想是精简系统和解决瓶颈。
由于TI sdk包中linux源码是针对多种EVM板的。简单来说,即一套软件需要支持包括GPEVM, Starterkit, Beaglebone, Beaglebone Black, ICE, IDK等多种EVM板。
所以也不能理解,其代码冗余性比价高。而客户在具体应用时,所需要的系统应用是固定的,所以需要去掉不需要的外设初始化,及用于兼容多种EVM而添加的代码。
在此,
(1)去掉不需要的外设初始化代码
该部分设计SPL, U-BOOT, linux三部分, 目标很明确,主要
SPL: u-boot\board\ti\am335x\board.c中void s_init(void)函数
void am33xx_spl_board_init(void)函数
U-boot: u-boot\include\conifgs\am335x_evm.h 通过对宏的设置去掉某些外设的初始化
Linux, 可通过menuconfig进行
上述部分可以参考www.deyisupport.com/.../52550.aspx
(2)去除为兼容多种EVM而添加的冗余设计
- I2C及读EEPROM程序:为了兼容多种EVM,TI在没种EVM上都设计了一个EEPROM,启动时通过I2C读取EEPROM的内容进行判断是哪一种EVM,然后调用相关的板级配置结构体。可以去除该部分的I2C配置及读EEPROM的操作。
- PMU配置及调用程序:部分客户不需要PMU进行电容管理,当然也使用的非PMU,所以可以对u-boot和linux的该部分进行去除。