如何避免這些隱藏但常見的軟件缺陷錯誤 PCB設計 過程, 並介紹了幾種科技,以幫助工程師在 PCB複製板 (www.印刷電路板.net) software. 大多數軟體發展項目依賴於程式碼檢查的組合, 識別軟件缺陷的結構測試和功能測試. 雖然這些傳統科技非常重要,可以發現大多數軟件問題, 它們無法檢測當今複雜系統中的許多常見錯誤.
結構測試或白盒測試可以有效地發現程式碼中的邏輯、控制流、計算和數據錯誤。 該測試需要概述軟件的內部工作(囙此命名為“白盒”或“玻璃盒”),以便瞭解軟件結構的細節。 它檢查每個條件運算式、數學運算、輸入和輸出。 由於需要測試許多細節,結構測試一次檢查一個軟件單元,通常是一個函數或類。
程式碼審查也使用與實現缺陷和潜在問題發現相同的複雜科技。 與白盒測試一樣,通常對軟件的每個單元進行審查,因為有效的審查過程需要集中和詳細的檢查。
與審查和白盒測試不同,功能測試或黑盒測試假設對軟件的實現一無所知。 它測試由受控輸入驅動的輸出。 功能測試由測試人員或開發人員編寫的測試程式組成。 它們指定了與一組特定程式輸入相對應的預期程式輸出。 測試運行後,測試人員將實際輸出與預期輸出進行比較,以發現問題。 黑盒測試可以有效地發現程式最常用功能中未滿足的需求、介面問題、效能問題和錯誤。
雖然結合這些科技可以發現隱藏在特定軟件程式中的大多數錯誤,但它們也有局限性。 程式碼審查和白盒測試一次只針對一小部分程式碼,而忽略了系統的其餘部分。 黑盒測試通常將系統視為一個整體,忽略了實現細節。 一些重要的問題只能通過關注它們在整個系統中相互作用的細節來發現; 傳統方法無法可靠地識別這些問題。 必須對軟件系統進行整體檢查,以找出特定問題的具體原因。 由於通常不可能徹底分析程式中的每個細節及其與程式碼所有其他部分的互動,囙此分析應針對已知會導致問題的程式的特定方面。
本文將探討3個潜在問題領域:
*堆疊溢位
*競爭條件
*鎖死
讀者可以線上閱讀本文的第二部分,其中將探討以下問題:
*時間安排問題
*可重入條件
以上所有問題在使用多工實时設計科技的系統中都很常見。
堆疊溢位
處理器使用堆棧存儲臨時變數,將參數傳遞給被調用的函數,保存線程的“狀態”,等等。 如果系統不使用虛擬記憶體(換句話說,它無法將記憶體頁傳輸到磁片以釋放記憶體空間用於其他用途),則堆棧將在出廠時固定為產品的大小。 如果由於某種原因堆棧超出了程式師分配的範圍,程式將變得不確定。 這種不穩定性可能導致嚴重的系統故障。 囙此,重要的是確保系統在最壞的情况下能够分配足够的堆棧。
確保從不發生堆疊溢位的唯一方法是分析程式碼,確定在所有可能的情况下程式的最大堆棧使用率,然後檢查是否分配了足够的堆棧。 該測試不太可能觸發暫態輸入的特定組合,並在系統中造成最壞情况。
堆棧深度分析的概念相對簡單:
1、為每個獨立線程創建一個調用樹。
2、確定調用樹中每個函數的堆棧使用情况。
3.檢查每個調用樹,以確定從樹的根到外部“葉”的哪個調用路徑需要最多堆棧。
4、添加每個獨立線程調用樹的最大堆棧使用率。
5.確定每個中斷優先順序中每個中斷服務常式(ISR)的最大堆棧使用量,並計算總數。 但是,如果ISR本身沒有堆棧並使用中斷線程的堆棧,則ISR使用的最大堆棧數應添加到每個線程的堆棧中。
6. 對於中的每個優先順序 PCB佈局 和設計, 添加用於在中斷發生時保存處理器狀態的堆棧數.
7、如果您使用的是RTOS,請添加RTOS本身內部使用所需的最大堆棧數(不同於由應用程序程式碼引起的系統調用,該調用包含在步驟2中)。
此外,還有兩件重要的事情需要考慮。 首先,僅從高階語言原始程式碼構建的調用樹可能不完整。 大多數編譯器使用運行時庫來優化常見的計算任務,例如大值整數的乘法和除法、浮點運算等。這些調用僅在編譯器生成的組合語言中可見。 運行時庫函數本身可能會使用大量堆棧空間,它們必須包含在分析中。 如果您使用的是C++語言,那麼調用樹中還必須包括以下所有類型的函數(方法):結構器、析構函數、重載運算子、複製結構和轉換函數。 所有函數指針也必須被解析,它們調用的函數都包含在分析中。