嵌入式軟體中的斷言應該分成三個級別,而不是僅有啟用和關閉兩種。1、啟用斷言並列印可讀資訊;2、啟用斷言並列印**位址、3、關閉斷言。
原文:mingdu.zhengatgmaildotcom
斷言可以幫助開發人員在軟體開發過程中比較容易地發現軟體缺陷。典型的做法是在開發過程中啟用斷言,而在最終發布時關閉斷言。
對於嵌入式軟體而言,可能在軟體開發的後期就不得不關閉斷言,因為嵌入式系統的記憶體資源是非常有限的,而啟用斷言會占用相當可觀的rom資源,當嵌入式軟體開發進行到後期時,所有的功能**整合以後這些功能**基本上用光了rom資源,已經沒有rom資源可以啟用斷言(除非在開發時使用的是比最終發布的硬體具有更多rom資源的硬體)。
還有人建議永遠都不要關閉斷言,即使是發布的版本也不要關閉斷言。對於c/c++這樣的僅有極少執行時檢查特性的語言而言,斷言還是一種簡單有效的執行時檢查機制。另外,少量的軟體缺陷可能仍然殘留在系統中,斷言仍然可以檢測出這些殘留的缺陷並報告。發布時關閉斷言,當發現問題時重新啟用斷言進行檢查,這樣的做法對於時間相關的**而言可能是不可重現的,因為啟用斷言後程式的執行時間是與關閉斷言時不相同的。這是建議總是保留斷言的另乙個原因,為了執行時間上的一致性。
一方面,嵌入式系統的rom資源是有限的,增加rom資源意味著增加成本;另一方面,斷言應該盡可能地保留以便能檢測錯誤。嵌入式系統開發過程總是充斥著矛盾。
解決這個矛盾的辦法是減少斷言所占用的rom資源量。斷言巨集通常會列印一些可讀資訊,例如產生斷言的檔名和行號以及斷言條件等,這些可讀資訊可以非常快速地幫助開發人員定位發生斷言的位置。這些可讀資訊基本上是字串常量,占用大量rom資源的正是這些字串常量。如果用**位址來代替這些可讀字串,那麼就可以節省大量的rom資源,代價是開發人員必須通過一些工具(例如addr2line)來定位產生問題的**,而不是直觀地看到問題所在之處。
由此可見,斷言應該分成三個級別,而不是僅有啟用和關閉兩種。
啟用斷言並列印可讀資訊,可讀資訊可以幫助開發人員快速定位問題,因此有條件列印可讀資訊的情況下還是應該列印可讀資訊,這可以提高開發效率的。
啟動斷言並列印**位址,在發布版本中以及rom資源十分緊張的情況下使用這種方式,一方面可以繼續檢測錯誤,另一方面盡可能節省資源。
關閉斷言。
在除錯階段,希望斷言失敗時可以立即進入除錯模式,源**偵錯程式將當前**停留在斷言失敗處。為了達到這個目的,可以在斷言實現中加入斷點指令,一旦斷言失敗就會執行到斷點指令,繼而進入除錯模式。
//#define zmd_assert_en_file_line
//#define zmd_assert_en_pc
#define zmd_assert_en_bkpt
//#define zmd_assert_en
#if defined(zmd_assert_en_file_line)
#define zmd_assert(c) \
if(!(c)) \
}#elif defined(zmd_assert_en_pc)
__attribute__
(( always_inline )
)static
inline uint32_t __get_pc
(void
)#define zmd_assert(c) \
if(!(c)) \
}#elif defined(zmd_assert_en_bkpt)
#define zmd_assert_bkpt() __asm volatile ("bkpt 0")
#define zmd_assert(c) \
if(!(c)) \
}#elif defined(zmd_assert_en)
#define zmd_assert(c) \
if(!(c)) \
}#else
#define zmd_assert(c)
#endif
對嵌入式的一點認識
有人說嵌入式是啥,不就是微控制器麼。嵌入式還真沒這麼 膚淺 下面是我了解的一些關於嵌入式的知識。嵌入式是什麼,簡單來說,嵌入式是在已有的硬體平台上移植作業系統。那麼問題又來了,為什麼要移植作業系統呢?根據我所學的知識,我覺得有以下幾點好處 1.提高軟體的移植性。傳統微控制器對軟體和硬體耦合度要求很高...
學習嵌入式linux開發的一點建議
對於是應該學嵌入式linux應用開發呢,還是系統開發,又或者是驅動開發呢?希望下面的內容能給我們這些初學者有幫助。僅供參考 一 程式設計比較熟悉,只關心系統移植,應該學什麼?1 系統移植的方法 2 製作bootloader 3 編譯除錯核心 4 定製檔案系統 即 嵌入式linux系統開發 二 程式設...
一點一滴做好嵌入式2
微控制器內外部ram 下面主要講小晶元,即連mcu都算不上的一些小晶元。晶元基本都包括其內部的ram 外部ram eeprom flash 等 flash 程式儲存器,其有擦寫壽命,而且小晶元的flash擦寫壽命都不高,所有在程式中 最好不要隨意的去擦寫。不過有些資料需要掉電不丟失,而操作次數不多的...