以下技术在盈鹏飞嵌入式的A40I/T3核心板(CoM-X40I)和主控板(SBC-X40I)上经过验证,欢迎 交流! CoM-X40I核心板和SBC-X40I主板见下图:
1. 前言
全志平台默认的SDK系统启动+相机出图的时间较长,普遍是十几秒,使用体验较差; 这里尝试通过一些方法优化整体启动时间
2.统计内核耗时模块
打开这个宏initial_debug,每个驱动的初始化起始时间和结束时间都打印出来了。有了这个时间,基本就可以确定哪些部分需要优化了。 我的做法是只关注耗时10000us以上的驱动。
根据上面统计,可根据使用场景的需求, 尝试可以关闭相应不需要的模块
3. 降低打印等级
开发过程中往往会把系统的打印等级设置为最高,而实际上发布出的固件是不需要这么的打印等级的,可以修改 lichee\tools\pack\chips\sun8iw11p1\configs\default\env_nor.cf文件中的loglevel减少打印等级到4. (时间明显减少)
4. 修改printk
尽量去掉printk对时间测量的影响,可以调整kernel/printk.c中的DEFAULT_CONSOLE_LOGLEVEL宏,把级别较低的信息去掉改成5之后, 【没什么明显减少时间】
5. 改善VIN相机模块
vin摄像头时间占用最多,编译成模块, 放在应用程序中加载可以加快初始化时间
6. 修改boot_clk
dram_clk这里可以尝试提升CPU运行时钟
dram_clk = 792 dram_type = 3 dram_zq = 0x3b3bfb dram_odt_en = 0x1 dram_para1 = 0x10E410E4 dram_para2 = 0x0 dram_mr0 = 0x1c70 dram_mr1 = 0x40 dram_mr2 = 0x18 dram_mr3 = 0x2 dram_tpr0 = 0x0047194f dram_tpr1 = 0x01b1a94b dram_tpr2 = 0x00061043 dram_tpr3 = 0xB4787896 dram_tpr4 = 0x0 dram_tpr5 = 0x0 dram_tpr6 = 0x0 dram_tpr7 = 0x1e08a1e0 dram_tpr8 = 0x0 dram_tpr9 = 0 dram_tpr10 = 0x0003 dram_tpr11 = 0x33330000 dram_tpr12 = 0x00007777 dram_tpr13 = 0x40929D0
7. 去除网络驱动模块
由于使用场景未使用网络模块; 和BT,WLAN,相关的模块都可以去除
WLAN和BT在menuconfig取消之后还有,只有把Network support中的wrieless取消掉之后,就可以彻底取消掉了
8. SPI单线改双线
由于系统启动阶段,会通过SPI协议从flash中将内核拷贝到ddr; 这里也会占用一部分时间,统计大概是1s左右; 默认SPI协议是使用单线模式; 可以尝试将SPI协议修改成双线模式
开启方法:
-
.make ARCH
=arm menuconfig
-
-->Device Drivers
-
-->Memory Technology Device (MTD) support
-
-->Self-contained MTD device drivers
-
-->[*] Use Dual Mode Read OPCode
另外还需要找原厂提供修改patch
还需要修改dma读写字节数
另外,可以通过修改spi-sunxi.c中sunxi_spi_config_dma_rx函数中 dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; dma_conf.src_maxburst = 1; dma_conf.dst_maxburst = 1; (默认) 例如改为: dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; dma_conf.src_maxburst = 1; dma_conf.dst_maxburst = 1; 或者 dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; dma_conf.src_maxburst = 2; dma_conf.dst_maxburst = 2;