嵌入式系統的啟動速度因裝置的效能和**的質量而異,但總體而言,從消費者的角度考慮,系統的啟動速度肯定是越快越好。因此,對嵌入式系統進行效能優化,加快裝置的啟動時間為專案後期必須進行的一項工作。需要注意的是:嵌入式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 減少載入的動態庫的數量
2 優化載入動態庫時的搜尋路徑a) 使用dlopen,將啟動時不需要的動態庫延後載入
b) 將一些動態庫改為靜態庫
優點:- 減少了載入動態庫的數量
- 在與其他動態庫合併之後,動態庫內部的函式之間不必再進行動態鏈結、符號查詢,從而提高速度
缺點:- 該動態庫如果被多個動態庫或程序所依賴的話,那麼該動態庫將被複製多份合併到新的動態庫中,導致整體的檔案大小增加,占用更多的flash。
- 失去了動態庫原有的**段記憶體共享,因此可能會導致記憶體使用上的增加
如果做了之前的工作仍然無法滿足程序啟動速度的要求,那就從程序的排程上下功夫,可以: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 通訊協議及程式設計技術 這...