本文將介紹如何避免這些隱藏但常見的錯誤,並介紹幾種幫助工程師在PCB複製軟件中發現隱藏錯誤的科技。 大多數軟體發展項目依賴於程式碼檢查、結構測試和功能測試的組合來識別軟件缺陷。 雖然這些傳統科技非常重要,可以發現大多數軟件問題,但它們無法檢測當今複雜系統中的許多常見錯誤。
結構測試或白盒測試可以有效地發現邏輯, 控制流, 程式碼中的計算和數據錯誤. This test requires a complete overview of the internal workings of the software (hence the term "white box" or "glass box") in order to understand the details of the software structure. 它檢查每個條件運算式, 數學運算, 輸入和輸出. 由於需要測試的細節很多, 結構測試一次檢查一個軟件單元, 通常是函數或類.
程式碼審查還使用與實現缺陷和潜在問題相同的複雜科技來發現問題. 像白盒測試, 通常對軟件的每個單元進行審查, 因為有效的審查過程需要集中和詳細的檢查.
不同於回顧和白盒測試, 功能測試或黑盒測試假設對軟件的實現一無所知. 它測試由受控輸入驅動的輸出. 功能測試由測試人員或開發人員編寫的測試程式組成, 指定與一組特定程式輸入相對應的預期程式輸出. 測試運行後, 測試儀將實際輸出與預期輸出進行比較,以發現問題. 黑盒測試可以有效地發現未滿足的需求, 介面問題, 效能問題, 以及程式最常用函數中的錯誤.
雖然結合這些科技可以發現隱藏在特定軟件程式中的大多數錯誤, 它們也有局限性. 程式碼審查和白盒測試一次只針對程式碼的一小部分, 忽略系統的其餘部分. 黑盒測試通常將系統視為一個整體, 忽略實現細節. 一些重要的問題只能通過關注它們在整個系統中相互作用的細節來發現; 傳統方法無法可靠地識別這些問題. 必須對軟件系統進行整體檢查,以找出特定問題的具體原因. 因為通常不可能徹底分析程式中的每個細節及其與程式碼所有其他部分的互動, 分析應針對計畫中已知會導致問題的特定方面.
This article will explore three potential problem areas:
* stack overflow
* Race conditions
* deadlock
Readers can read the second part of this article online, which will explore the following issues:
* Timing issues
* Reentrant conditions
All of the above problems are quite common in systems that use multi-task real-time design technology.
stack overflow
The processor uses the stack to store temporary variables, 將參數傳遞給被調用函數, 保存線程“狀態”, 等等. If the system does not use virtual memory (in other words, it cannot transfer memory pages to disk to free up memory space for other uses), 當產品出廠時,煙囪將固定在產品的尺寸上. 如果由於某種原因堆棧超出了程式師分配的範圍, 該計畫將變得不確定. 這種不穩定性可能導致嚴重的系統故障. 因此, 必須確保系統在最壞的情况下能够分配足够的堆棧.
確保從不發生堆疊溢位的唯一方法是分析程式碼, 確定在各種可能的條件下程式的最大堆棧使用量, 然後檢查是否分配了足够的堆棧. 該測試不太可能觸發暫態輸入的特定組合,並在系統中造成最壞情况.
The concept of stack depth analysis is relatively simple:
1. 為每個獨立線程創建調用樹.
2. 確定調用樹中每個函數的堆棧使用情况.
3. 檢查每個調用樹,以確定從樹的根到外部“葉”的哪個調用路徑最需要堆棧.
4. 添加每個獨立線程調用樹的最大堆棧使用率.
5. Determine the maximum stack usage of each interrupt service routine (ISR) in each interrupt priority level and calculate the total. 然而, 如果ISR本身沒有堆棧並使用中斷線程的堆棧, ISR使用的最大堆棧數應添加到每個線程的堆棧中.
6. 對於每個優先順序, 添加用於在中斷發生時保存處理器狀態的堆棧數.
7. 如果使用RTOS, add the maximum number of stacks required for the internal use of the RTOS itself (different from the system call caused by the application code, which is included in step 2).
此外, 有兩件事需要考慮. 第一, 僅從高階語言原始程式碼構建的調用樹可能不完整. 大多數編譯器使用運行時庫來優化常見的計算任務, 例如大值整數的乘法和除法, 浮點運算, 等. 這些調用僅在編譯器生成的組合語言中可見. 運行時庫函數本身可能會使用大量堆棧空間, 它們必須包括在分析中. If you are using the C++ language, all the following types of functions (methods) must also be included in the call tree: structurers, 析構器, 重載運算子, 複製結構, 和轉換函數. 還必須解析所有函數指針, 它們調用的函數包含在分析中.