在嵌入式軟體中使用斷言的一點想法

2021-07-02 23:32:16 字數 1972 閱讀 9645

嵌入式軟體中的斷言應該分成三個級別,而不是僅有啟用和關閉兩種。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擦寫壽命都不高,所有在程式中 最好不要隨意的去擦寫。不過有些資料需要掉電不丟失,而操作次數不多的...