[C 的那些眉角]迴圈陷阱—那些讓你 debug 到懷疑人生的邊界條件

寫 application 的迴圈出包,頂多程式 crash、重開就好。但在 firmware 的世界裡,一個迴圈的邊界條件沒處理好,輕則硬體不回應,重則系統直接掛死,debug 工具接上去什麼都看不到,只能對著 oscilloscope 發呆。

這篇整理的都是我這幾年踩過的坑,有些當下真的找很久,事後回頭看都覺得自己蠢。但這就是 firmware 的日常吧。


🔥 硬體暫存器輪詢:你以為它會回來,但它不會

這大概是 firmware 新手最容易中招的地方。輪詢一個硬體暫存器,等某個 bit 被設起來:

// ❌ 經典死法
while (!(REG_STATUS & STATUS_READY));

看起來很直覺對吧?但問題是——如果硬體永遠不 ready 呢?

閱讀全文

[C 的那些眉角]整數溢位比你想的更常見

有一個 bug,我在 code review 的時候無意間看到,
當下覺得「這不會有問題吧」,
但仔細算了一下,發現真的會出問題。

uint16_t a = 60000;
uint16_t b = 10000;
uint16_t sum = a + b; // 你覺得 sum 是多少?

答案不是 70000。

uint16_t 最大值是 65535,
70000 超過了,發生溢位,
sum 實際上是 70000 - 65536 = 4464

程式繼續跑,用著這個錯誤的值,
後續的計算全部都錯了,
但不會 crash,不會有任何警告。

這就是整數溢位的恐怖之處。

閱讀全文