嵌入式開發(fā)中使用C語言的常見誤區(qū)
用單片機予借,針對的都是特定的mcu,資源非常少匈庭,而字符串處理、數據字符格式轉換等函數浑劳,在C語言標準庫中均通過堆(heap)中建立臨時空間來實現(xiàn)阱持;為了節(jié)約資源,在C用于單片機開發(fā)時呀洲,連接的是一個簡化的mini庫紊选,對動態(tài)空間申請的檢查、回收管理均是不完備的道逗,容易引起運行時錯誤兵罢,而且也沒足夠資源來進行運行時的錯誤處理。最為致命的是這些錯誤是運行時出現(xiàn)而不是編譯時出現(xiàn)滓窍!而且不知何時出現(xiàn)卖词。
因此在單片機上以下功能能不用盡量不用:
- 動態(tài)變量的申請和釋放:malloc 和free:空間不夠時,少量的可以重復使用一些變量空間吏夯;大量的可改用固定數組自己重復使用這些空間就可以了此蜈。除非能預見可能出現(xiàn)的所有情況,否則頻繁申請空間和釋放噪生,系統(tǒng)一定會崩潰冲杀!
- 和字符串相關的函數抱怔,包含printf够吩,sprintf等砍聊,因為C語言字符串處理使用了動態(tài)內存,而且資源不足桨嫁,對于你少量的格式轉換植兰,自己寫個程序來實現(xiàn),這樣連接時就不會把這部分代碼連接到目標代碼中璃吧,既可以使代碼短小運行速度快楣导,也可以避免一些錯誤,當有問題時也容易查錯畜挨。還有并非所以C編譯器都支持這些函數筒繁,有時需要自己寫點東西,如stdin stdout stderr(在avr 和stm32中都要自己重定向這三個函數)巴元;不用這些函數毡咏,你源代碼的可移植性就增強了。
- 少用浮點運算务冕;浮點運算得不多血当,如果需要在輸出的時間涉及小數幻赚,可以輸出時轉換一下禀忆,只要哪怕有一處使用浮點數臊旭,連接時就要連接整個浮點運輸庫,代碼增大很多箩退。
- 慎用迭代算法离熏,這通常出現(xiàn)在排序算法中,還有運行時計算表達式戴涝,這對于單片機來說堆棧很小滋戳,一不留神就出界了。
- 少用函數指針啥刻。這類高級的應用是C語言的特色奸鸯,但這類應用中要是還包括傳遞參數,甚至不同類型的參數可帽,要是有錯很難查娄涩。
- 對初學者,少用指針變量映跟,因為一不小心指向的就不是你想要的空間了蓄拣。