大多數軟件開發人員都接受過某種教育或培訓,其他人則是自學成才。但真正的編程學習是通過實踐經驗和知識交流。在編程過程中,他們會遇到有用的技術,或者在代碼審查期間從同事那里獲得建議。即使是非常有經驗的程序員也會不時收到寶貴的提示。因此,傳遞自己的經驗是非常有價值的。本文給嵌入式開發人員五個有用的建議:
使用后將指針設置為NULL
指針是語言中非常有用和強大的功能。但它們會導致錯誤。一個常見的錯誤是代碼使用的指針值無效。例如,如果它指的是一個已動態分配但已被放棄的內存。使用無效指針可能會產生負面影響,這種影響只有在長時間后才會變得明顯,因此很難發現。如果在使用后常規地將指針設置為NULL,則稍后的錯誤使用將導致立即發生錯誤,很容易進行本地化。
程序員使用C中的“int”表示無符號數據
在C語言中,int數據類型幾乎是標準的。事實上,在最初的語言定義中,它是函數的默認返回數據類型(應該是無效的,但后來才出現)。大多數C程序員傾向于選擇int作為變量,除非數據類型明顯不適合。他們真的應該選擇無符號,因為無符號的數據比有符號的數據多。最好仔細查看需要存儲的值范圍。它是未簽名還是已簽名?你需要8位、16位、32位或更多位嗎?令人驚訝的是,時間/日期計數器經常被簽名,導致Y2K錯誤。
謹防過度完美
軟件何時準備就緒?顯而易見的答案是,如果它提供了所有指定的函數而沒有已知的錯誤。有許多情況會危及完工:許多嵌入式開發工程師都是完美主義者,他們總是看到事情,他們可以“改進”自己的代碼。如果沒有盡可能多的關心和監督,一個項目可能會在他們手中變得糟糕。另一種不太明顯的情況是,代碼是為特定目的或項目編寫的,然后在其他地方重復使用。“建立在經驗基礎上”非常容易。“并在重用之前改進代碼。如果不小心,這將成為版本管理的噩夢。
事件標志或信號是在RTOS上發送簡單邏輯信息的最有效方式
現代RTOS,就像我們自己的Nucleus RTOS一樣,包含多種功能。由于這樣的操作系統是可擴展的,開發人員可以選擇要使用的功能,而不會因為代碼大小而丟失未使用的功能。在任何多線程設計中,任務間通信都很重要。因此,應提供各種功能,并應仔細選擇。如果一個任務只需要為另一個任務標記一個事件,那么最簡單的通信方法——事件標志或信號——可能是最有效的選擇。
遞歸代碼看起來很優雅,但很危險
許多數學過程可以用遞歸函數來描述,即用直接或間接調用自己的函數來描述。這可能是解決使用最少代碼的問題的一種看似優雅的方式。下面是一個簡單的例子:
void printbase(int number, int base)
{
if (number >= base)
{
printbase(number/base, base);
}
printf("%X", number%base);
}
你明白這段代碼的作用嗎?答案很可能是“不”。這也是應該避免這種技術的原因之一。嵌入式開發人員清楚代碼的含義對于進一步的軟件維護至關重要。此外,遞歸函數非常密集地使用堆棧,這可能會使堆棧失控。堆棧溢出是非常細微的錯誤,需要進行本地化。