天天看點

全志平台lichee啟動時間優化1. 前言2.統計核心耗時子產品3. 降低列印等級4. 修改printk5. 改善VIN相機子產品6. 修改boot_clk7. 去除網絡驅動子產品8. SPI單線改雙線

1. 前言

全志平台預設的SDK系統啟動+相機出圖的時間較長,普遍是十幾秒,使用體驗較差; 這裡嘗試通過一些方法優化整體啟動時間

2.統計核心耗時子產品

打開這個宏initial_debug,每個驅動的初始化起始時間和結束時間都列印出來了。有了這個時間,基本就可以确定哪些部分需要優化了。 我的做法是隻關注耗時10000us以上的驅動。

全志平台lichee啟動時間優化1. 前言2.統計核心耗時子產品3. 降低列印等級4. 修改printk5. 改善VIN相機子產品6. 修改boot_clk7. 去除網絡驅動子產品8. SPI單線改雙線

根據上面統計,可根據使用場景的需求, 嘗試可以關閉相應不需要的子產品

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;
           

繼續閱讀