嵌入式系統的效能優化

2021-07-08 18:09:34 字數 3883 閱讀 1873

嵌入式系統的啟動速度因裝置的效能和**的質量而異,但總體而言,從消費者的角度考慮,系統的啟動速度肯定是越快越好。因此,對嵌入式系統進行效能優化,加快裝置的啟動時間為專案後期必須進行的一項工作。需要注意的是:嵌入式linux裝置的優化不是一蹴而就的,而是乙個不斷優化,不斷改進的過程。

現將自己掌握的嵌入式裝置的效能優化策略進行總結,如有不對的地方,還望批評指正。

裝置啟動的快慢目前還沒有乙個統一的標準。在專案中一般按照客戶的標準。

對於開發人員來說,評價裝置的效能一般是通過在**中增加log的方式。這種方式具有以下幾點優點:

精確度高。

通常能夠精確到毫秒。有特殊需求的情況下,可以精確到毫秒,比如使用gettimeofday函式。

靈活性強。

可以測出**中任意部分的**執行所耗費的時間。

在嵌入式裝置中,匯入裝置啟動時間過長,效能低下的原因一般包括如下幾個方面:

硬體的原因

硬體的原因一般指的是裝置的cpu及flash效能。如果**的運算量很大,礙於cpu和flash的效能,會導致cpu過於繁忙。有些裝置礙於成本的原因,flash太小,很多東西都需要壓縮存放,那麼在裝置啟動過程中,解壓也需要一定的時間。

程式的原因

**需要進行大量的io操作,比如讀寫檔案,記憶體訪問等等,cpu更多的時候處於等待狀態。而有些**,由於編寫的原因,導師各個程序之間相互等待,cpu利用率低下,制約了裝置的效能。

優化並不能盲目的優化,盲目追求效能,還要統籌考慮。一般要遵循以下原則:

等效性原則

優化前後的**實現的功能要完全一致

有效性原則

優化後的**一定要比原先的**執行速度快活著占用儲存空間小,或者二者兼有,否則就是毫無意義的優化

經濟性原則

很多**效能低下的部分原因也是由於硬體效能的限制,比如將檔案壓縮存放以節約儲存成本。優化要在現有的條件下考慮,不要以更換儲存空間的大小來換取解壓的時間。優化要付出較小的代價,很多程式設計師在做優化的時候,抱怨裝置的效能有限,要求提高裝置的效能,這樣只能是本末倒置。

此處提出的優化的方法主要是從**的角度考慮,不包括公升級硬體。

絕大多數的嵌入式裝置都會使用busybox作為實現linux命令的工具,因此busybox提供了乙個比較完善的環境,可以適用於任何小的嵌入式系統。

busybox 是乙個整合了一百多個最常用linux命令和工具的軟體。busybox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更複雜的工具,例grep、find、mount以及telnet。有些人將busybox稱為linux工具裡的瑞士軍刀。簡單的說busybox就好像是個大工具箱,它整合壓縮了linux的許多任務具和命令,也包含了android系統的自帶的shell。

busybox包含三種型別的命令:

系統將呼叫fork建立子程序,然後執行busybox中相應的功能,在執行完畢後,返回控制給父程序。

它相當於builts-in,只是執行busybox的內部函式,不必建立子程序,所以其效率極高。
basename,cat,dirname,echo,false,hostid,length,logname,mkdir,pwd,rm,rmdir,deq,sleep,sync,touch,true,usleep,whoami,yes
awk,chgrp,chmod,chown,cp,cut,dd,find,hexdump,ln,soort,test,xargs......
所以優化shell指令碼的策略一般有:

1. 去掉無用的指令碼

2. 盡可能的使用busybox內部的命令

3. 盡量不要使用管道pipe

4. 減少管道中的命令數目

5. 盡量不要使用·

程序的啟動過程如下:

1 搜尋其所依賴的動態庫

2 載入動態庫

3 初始化動態庫

4 初始化程序

5 將程式的控制權移交給main函式

要加快的程序的啟動速度,可以從以下幾方面入手:

1 減少載入的動態庫的數量

a) 使用dlopen,將啟動時不需要的動態庫延後載入

b) 將一些動態庫改為靜態庫

優點:- 減少了載入動態庫的數量

- 在與其他動態庫合併之後,動態庫內部的函式之間不必再進行動態鏈結、符號查詢,從而提高速度

缺點:- 該動態庫如果被多個動態庫或程序所依賴的話,那麼該動態庫將被複製多份合併到新的動態庫中,導致整體的檔案大小增加,占用更多的flash。

- 失去了動態庫原有的**段記憶體共享,因此可能會導致記憶體使用上的增加

2 優化載入動態庫時的搜尋路徑

a) 設定ld_hwcap_mask,禁掉一些不用的硬體特性

b) 將所有的動態庫都放在乙個目錄下,並且將目錄放在ld_library_path的開始

c) 不能放在乙個目錄的,在程序中加入-rpath選項,指定搜尋路徑

如果做了之前的工作仍然無法滿足程序啟動速度的要求,那就從程序的排程上下功夫,可以:

preload程序

void sigcont( int unused)

int main(int argc, char** argv)

迴圈語句的優化

#將分支語句提到迴圈的外面的例子

for (i=nloop; i>0; i--)

#改為:

if (n == 1)

}else }

######

######

######

######

######

######

######

######

######

######

######

######

######

######

######

######

######

######

## 展開迴圈語句的例子

#方式1

for (n = 0; n < 1024*1024; n++)

#方式2

for (n = 0; n < 1024*512; n++)

#方式3

for (n = 0; n < 1024*256; n++)

#以上三種方法,方式三所用的時間最短,效率最高

函式引數優化

減少區域性變數的個數

當函式內部暫存器變數多於12個時,並不意味著只是將前面的12個臨時變數分配暫存器,之後的臨時變數都是通過棧記憶體來操作。

檔案操作的優化

執行緒的優化

記憶體操作的優化

記憶體訪問流程

+ cpu試圖訪問一塊記憶體

+ cpu首先確認該記憶體是否已經被載入到cache中

+ 如果載入到cache中,則直接在cache中定位

+ 如果未載入到cache中,則通過cpu和記憶體直接的位址匯流排,向記憶體傳送位址的高27位位址

+ 當記憶體收到高27位位址後,利用sdram的突發交換模式,將連續的32個位元組傳送給cpu的cache,填充乙個快取行

+ cpu可以通過位址的高27位來定位cache的快取行,利用位址的低5位定位到快取行中具體的位元組

調整程序的優先順序

嵌入式Linux 系統優化

1.嵌入式linux介紹 嵌入式系統的關鍵特性是處理特定的任務,因此工程師能對其進行優化,以降低產品的體積和成本,提公升可靠性和效能。比起發行版的linux 系統,嵌入式linux 以linux 為藍本,進行了大規模的裁剪,只保留目標平台需要用到的東西。其保留了linux 的開放性,並且也具體嵌入式...

嵌入式Linux實時效能優化

1 引言 分析了linux的實時性,針對其在實時應用中的技術障礙,在參考了與此相關研究基礎上,從三方面提出了改善linux實時效能的改進措施。為提高嵌入式應用響應時間精度,提出兩種細化linux時鐘粒度方法 為增強系統核心對實時任務的響應能力,採用插入搶占點和修改核心法增強linux核心的可搶占性 ...

嵌入式系統

嵌入式開發的相關領域 搞嵌入式若能熟悉嵌入式應用的一些主要領域,這樣的人更受企業歡迎。主要的相關 領域包括 a 數字影象壓縮技術 這是嵌入式最重要最熱門的應用領域之一,主要是應掌握mpeg 編譯碼演算法和技術,如 pda 高精電視 機頂盒等都涉及mpeg高速解碼問 題。b 通訊協議及程式設計技術 這...