嵌入式往往沒有作業系統支撐,或者因為有作業系統支撐,但因為種種的限制,作業系統提供的功能少得可憐。所以,很多**不能像pc程式設計那樣天馬行空,任意馳騁。
今天就聊聊記憶體分配的問題,記憶體碎片,可能大家都不陌生。然而在嵌入式系統裡,最怕的就是記憶體碎片,也是系統穩定的頭號殺手。我曾經做了乙個專案,系統中有很多的malloc和free,尺寸不一,從60多個位元組到64kb的不等。使用一款rtos作為支撐。當時我有兩個選擇,乙個是使用c 系統庫的malloc和free,另外乙個是使用作業系統提供的固定記憶體分配。我們系統的設計要求要能穩定執行3個月以上。實際上連續執行6天左右就宕機了。
各種問題都懷疑過,最後定為在記憶體分配上,其實就是長時間,大量的記憶體分配後,系統的記憶體變得零散而無法連續。雖有大空間,但卻無法分配連續的空間。當有大空間申請時,只能是宕機完蛋。
為了使系統達到原先的設計需求,我們在pc機上模擬了整個硬體,將嵌入式**在 pc機上跑起來,並過載了malloc和free,做了個複雜的統計程式。統計系統的記憶體行為。執行了若干天以後,將資料提取出來分析,
雖然申請的記憶體5 花八門,還是有些規律,我們把100個位元組以下的歸為一類,512b的歸為一類,1kb的歸為一類,2kb歸為一類,64kb一下歸為一類。統計出每類的數量,在原先的基礎上加上30%的餘量。做成固定記憶體申請,使得系統穩定連續執行的時間大大加長。嵌入式就這樣,不怕方法原始,就怕效能不達要求。
記憶體溢位問題,記憶體溢位問題嵌入式系統比pc系統更可怕! 往往是沒有察覺的就溢位了。都很難想到,尤其是c/c++的初學者,對指標不熟悉,查都沒法查。由於pc系統有mmu,記憶體發生嚴重的越界時,有mmu的保護,不會產生嚴重的災難後果。而嵌入式往往沒有mmu,差別很大,系統**都被破壞了還能跑。只是只有上帝和那個cpu才知道跑得是什麼。我們來看看這段**:
char *strcpy(char *dest, const char * src)
*dest = '\0';
return (dest); }
這個**是乙個字串拷貝的**,pc機這樣寫,基本上就可以了。但嵌入式要提防一件事情,那就是 src真的以'\0'結束的。要不是得話,那就悲劇了。到什麼時候能結束,呵呵,只有上帝老人家才知道。這段**僥倖能跑完成的話,估計也別想程式能正常的跑了。因為dest指向的記憶體區域都被破壞的差不多了。為了和標準c/c++的庫相容,還真的沒什麼好辦法,所以這個問題只能留給程式設計師自己檢查。
相同的,
memcpy( dest, src, n);
記憶體拷貝同樣的問題,要提防n傳遞個負值進去。這個是拷貝多少個位元組,負值被強制型別轉換成正的。變成乙個很大的正數,造成dest之後的記憶體全部被破壞……
嵌入式裡的記憶體指標必須做嚴格的檢查才能使用,記憶體的尺寸也必須進行嚴格的除錯。不然的話,悲劇是很難避免的。如乙個函式指標,雖然在嵌入式裡賦了個null,0。若是arm的話,連個異常錯誤都沒有,直接復位了,因為呼叫這個函式指標即便是讓**從0開始執行。而0是arm上電後執行的第一條**的位置。在arm7上尤其如此。
這種悲劇比pc上悲情多了,mmu 定然給乙個無定義指令的錯誤。引起程式設計師的重視。在嵌入式裡,全部都留給了程式設計師去尋找了。
記憶體溢位發生在任何乙個不經意的時刻,你給整個前後臺的系統(或作業系統)分配了多大的堆?多大的棧?在通常情況下系統的呼叫深度是多少(最大是多少),占用多少棧?光看程式的功能正確還不夠,還需要統計這些引數。不然,只要有乙個地方有溢位。對系統都是致命的。嵌入式系統要求系統連續工作時間長,穩定性可靠性要求苛刻。是需要一些時間仔細的磨這些系統的。
程式設計的複雜性
不要以為我上面寫的東西不是 稍微調整下細節,這串 是可以在電腦上真實跑起來的,是不是特別簡單啊?你還敢說自己不懂程式設計麼?還會懼怕程式設計麼?但是也不要把程式設計想的太簡單了,上面的程式表達的只是乙個十分粗略的做飯過程,或者說乙個做飯的思路,真正要把做飯的程式實現出來,還要考慮很多的問題,比如如何...
嵌入式系統的複雜性推動了對介面標準的發展
二十年前,用於系統建模 影象和訊號處理的嵌入式實時處理通常使用按比例縮小的超級計算機體系結構,以並行對稱拓撲互連的相同處理器的同質陣列。這些架構的程式設計解決方案最初是分散的,通常使用硬體 商或微處理器專用軟體層來處理處理元件之間的通訊。隨著時間的推移,對可移植性的需求推動了新開放標準的發展。例如,...
簡化根本複雜性,消除偶發複雜性
根本複雜性 essential complexity 指的是問題與生俱來的,無法避免的困難。比如,協調全國的空中交通就是乙個 天生的 複雜問題,必須實時跟蹤每架飛機的位置 包括飛行高度 航速 航向和目的地,才能預防空中和地面上的衝突。像天氣驟變這樣的情況會令航班計畫全盤失效,航班時刻表必須適應不斷變...