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;