在看IAP升級時,看了下官方的例程,還參考了戰艦板原子的例程。。在其中發現官方例程中都是把uint8_t類型數組直接強轉爲uint32_t類型然後字編程寫入flash,在原子的例程有一個移位的操作,把兩個uint8_t移位成uint16_t然後半字編程。。(在實際編程中按字編程的內部操作也是按照按半字編程進行的)。。。開始百思不得其解。。具體例程中截圖如下
官方例程:
原子例程:
以前一直對數組格式的類型轉換理解錯誤,一直以爲只是單純的內存中地址相應的擴大或縮小沒理解到大小端的問題。。理解錯誤了內存中存儲以及大小端問題。。自己實際做了個測試。發現強制類型轉換跟原子的移位效果是一樣的。。
究其原因,認爲是在內存中存儲的大小端問題。。
實驗:定義兩個變量然後強制類型轉換
uint8_t chartest[2] = {0x01,0x02};
uint16_t shorttest;
強制轉換:
while(1)
{
shorttest = *(uint16_t *)chartest;
}
在keil中查看shorttest的值:
與移位的操作,結果一樣
分析強制類型轉換:
ARM是小端處理器。char a[2],在內存中從低到高存放a[0]→a[1]→。。要把這兩個char類型轉換爲short類型數值。。這兩個char類型數在內存中的位置不變,在轉換時按照低字節在低位的小端存儲方式來轉,,,就是a[1]在高8位a[0]在低8位。。。。