嵌入式軟體開發,函式是不是盡量避免呼叫層次太深?

時間 2021-05-31 18:26:19

1樓:彩虹六號

嵌入式範圍太大,你給512MB RAM跑著Linux的i.mx寫程式算嵌入式,你給只有256Byte RAM連棧都是硬體棧的PIC16寫程式也算嵌入式,能一樣麼

2樓:by wang

上學時,用的德州儀器的dsp應該是c2000還是啥,官方樣例都是巨集呼叫,其實也就是直接inline,每個巨集也就是函式,它們的輸入輸出其實都是預先定義好的全域性結構體,沒有任何動態分配記憶體的操作,當編譯好後,就可以看到每個定義的變數被放在記憶體裡的具體那個位置。

實際上是可以函式呼叫的,不過要把輸入和返回都要出入棧一次。不過一般在連rtos都不用的場景下,那效能應該就差的很,總是執行的函式基本就只有寫成巨集了。

基本能上了作業系統就別太擔心底層的問題,畢竟已經站在一定的基礎上了。

3樓:知之為知之不知瞎白話

只是呼叫函式的話,沒什麼問題的。不影響效能。

不過,嵌入式軟體都會計算棧用量的。函式太多用量會超。

標準點的嵌入式系統,應該設計乙個統一的抽象層,盡量避免隨意增加棧用量。

C語言有個設計思想,行數較少的函式應盡量使用巨集。

C++裡也說小規模函式盡量使用Inline。

4樓:Mimosa

程式執行過程就是不斷呼叫函式的過程,除非特殊情況,一般函式呼叫時間消耗不大。當然,如果要精益求精,如何呼叫函式還是有一定技巧。

呼叫函式可能遇到的乙個致命問題,是記憶體溢位,尤其在進行函式迭代時,這與程式要執行的環境有很大關係,主要取決於記憶體大小、程序空間設定、作業系統型別等。如果是在桌面作業系統下執行,現在記憶體都比較大,函式之間相互呼叫,不太可能會造成記憶體溢位,函式的迭代呼叫則需要注意。如果函式體內變數不多(比如整數變數1、2個),函式迭代深度可達數千層,甚至可能1萬層都不會記憶體溢位,但是再大了,就可能出現記憶體溢位。

5樓:凌志輝

1、link選項有堆疊保留大小設定,可以改大。只要你不巢狀無窮深而導致棧溢位。特別是遞迴函式呼叫,遞迴層級有限制,不是無窮深的。

2、主要還是易讀性,為後續維護人員減輕難度。

6樓:傳統的幻想書屋

你如果看過c++標準庫原始碼,你可以看到裡面的函式各種只有一行兩行的,按這個標準算基本全是函式呼叫,要按呼叫棧找好多層才能看到底。但是人家效率依然高,因為這些函式絕大部分都會在開優化之後被inline掉。

不過你是嵌入式,那我建議你先開個優化看下彙編看看編譯器的優化能力,如果不怎麼樣那你就別寫那麼多函式,嵌入式編譯器做的人本來就少,水平參差不齊。如果能做到基本都inline掉,那你多寫幾個函式反而是好事。

7樓:Xi Yang

這種優化應當以profile結果為基準,而不是自己腦補什麼東西有多大代價。

其次,如果你寫了inline,那麼編譯器通常會優化這件事情。不過你的嵌入式系統的編譯器如果很弱,那就不知道了。

按我的經驗,除非在資料處理多重迴圈的最內層,否則函式呼叫的時間代價根本不是事。

8樓:你看那銳雯

函式呼叫是有呼叫棧的,巢狀太多有可能發生棧溢位!棧溢位的問題發生了現象很詭異不是大神都定位不到原因所以好點公司或者有經驗的碼農都會去限制呼叫層次

再次編輯,不知道樓主是裸機開發還是基於linux,如果是基於linux開發,是使用者態還是核心態,使用者態和核心態的棧大小是不一樣的。

當然從別的角度考慮例如效率,這個我覺得影響好像不太大

外行想學嵌入式軟體開發最快需要多久?

王小蔥 嵌入式開發是乙個入門門檻相對較高的方向。首先,你需要學c需要,需要學的很深的那種。其次,系統程式設計得懂,Unix高階程式設計得刷幾遍吧。網路程式設計也得看一看。然後是硬體知識。挑一款晶元,把它的datasheet走一遍。然後是linux核心。然後是驅動。走完一邊,感覺有一種入門的感覺吧。 ...

現在是嵌入式軟體開發,是否要轉行

光錐之外 先給自己找幾個要轉行的理由,首先問問自己是不是真的熱愛這個行業,自己在做這份工作的時候有沒有興奮感和激情,以及成就感,如果這些都沒有,可以考慮轉行了。其次就是薪酬待遇,發展前景,當然這個和你的能力有很大關係,如果連續換幾份工作,薪酬都沒有太大變化,覺得能力提公升又遇到了天花板,那可以考慮轉...

嵌入式軟體開發和計算機視覺哪個方向更好一點?

折花sama 如果學校平台好,實驗室經費充足配置顯示卡,有信心髮頂會,sci的話,選cv,以後可以找大廠的cv演算法崗,學校平台一般的話還是嵌入式吧 普通人還是嵌入式,就業面廣,工資還行。cv就大佬工資無上限,普通人工資就一般還要膽戰心驚生怕裁員。還是努力加強自己建設,學的牢固點都好說,總之一句話,...