代碼使用MDK5編譯,uvison5.23.0.0編譯,C99mode。發生一個奇怪的現象:
全域變數device_info[200]={0};
臨時區域變數 uint32_t tp1 = 0xFFEEDDC1;
將這個32bit的區域變數直接保存到陣列device_info前4個位元組,有兩種方法。
方法1:
因為device_info就是指向陣列第一個位元組的指標,等于&device_info[0],所以將該指標強制轉換為uint32_t*型別,
然后通過新指標直接修改device_info[0-3] 4個位元組。
*((uint32_t*)device_info) = tp1;
方法2:
反過來,因為tp1是一個32bit數,在記憶體里占據4個位元組,&tp1就是指向該32bit數的第一個位元組的地址。
所以,將tp1的指標強制轉換為uint8_t*格式,然后依次指標+1和地址+1,就可以將tp的值保存到device_info[0-3]。
device_info[0] = *((uint8_t*)(&tp1));
device_info[1] = *(((uint8_t*)(&tp1))+1);
device_info[2] = *(((uint8_t*)(&tp1))+2);
device_info[3] = *(((uint8_t*)(&tp1))+3);
以上兩種方法在windows編譯器下,均可正常實作。但是在MDK編譯后,運行到STM32里,發現只有方法2可行。
使用方法1運行 *((uint32_t*)device_info) = tp1 這條陳述句后,單片機會死機。
百思不得其解,請教高手指點,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/90726.html
標籤:單片機/工控
