我只是對AVR架構如何管理將導致常規桌面程序崩潰的錯誤感到好奇。我說的是邏輯錯誤,例如未定義的數學問題。例如除以0並得到負數的平方根。起初,我期望通過給AVR芯片一個錯誤來返回0。但是我運行了這個程序:
void setup(){Serial.begin(9600);} void loop(){int x = 0; int p = 50; int結果;結果= p / x; Serial.println(結果); result = sqrt(-10); delay(1000); Serial.println(result); delay(10000);}
並獲得以下輸出:
42949672950
在此之後,我感到非常困惑。為什麼 result
變量取一個 unsigned long
的最大值?自從我聲明了 int
以來,微控制器必須為此變量專用2個字節的動態內存,但是顯然,它設法以某種方式設法獲得了額外的2個字節來存儲數據。這是否意味著AVR芯片可以破壞其他存儲器位置中的數據,同時為剛剛被饋入未定義變量的變量分配新數據?好的,也許AVR芯片只是將任何數學上的廢話都設置為4294967295。但是在獲得-10的平方根的示例中,我們沒有看到該值變為0。這些錯誤的保護措施。另外,我嘗試運行上面的程序,但對 result
使用了 byte
變量,而不是 int
。
void setup(){Serial.begin(9600);} void loop(){int x = 0; int p = 50; int result; result = p / x; Serial.println(result); result = sqrt( -10); delay(1000); Serial.println(result); delay(10000);}
,結果是相同的。因此,有一些關於AVR中錯誤管理的文檔,因為在開發過程中了解這一點很重要。
P.S。一切都在arduino nano上的真實Atmega 328p芯片上運行。