今天發現了一個挺奇怪的問題,就是在430的RAM中,想給連續的內存地址分配一個char型和一個int型變量時,兩個變量之間的地址會跳一個。具體情況看下圖。

從上圖可以看到,第一根紅線表面一個unsigned char型變量的值為108,地址為0x472A,占一個字節;緊接著下一個為unsigned char型變量,其值為2,地址為0x472C,占兩個字節。那0x472B這個地址哪兒去了呢?我們可以看到,在存一個char型變量,后面接一個int型變量時,中間會有一個地址被跳過去;
類似的情況還出現在char型變量后面存一個long int型變量時,但是int型變量和long int型變量連續存,或者單獨的char型變量連續存,以及單獨的int或long int連續存時,均不存在這個問題。
這個挺奇怪的……這對于SD卡參數的解析會有很大影響?赡苁歉幾g器有關,這里我用的是CCS V5.4。等找到解決方案之后,再在后文補上。
**********************************************************************************************************
晚上請教了znFAT群里的“少數派”大哥之后,獲得了問題的答案,很開心~這里與大家分享一下。
出現這個問題的原因是結構體的對齊問題。簡單地說,就是char型變量的地址是任意的;但是int型變量由于要占2個字節,為了提高CPU的訪問速度,所以其首地址必須要為偶數;long int型占4個字節,其首地址必須要為4的倍數。
關于這個問題再具體的講解,我摘錄了david0421的博文“單片機結構體內存的分配 ”中的一段話,他博文的原始地址在http://bibber.blog.sohu.com/230549556.html。
博文如下:
什么是字節對齊
一個變量占用 n 個字節,則該變量的起始地址必須能夠被 n 整除,即: 存放起始地址 % n = 0, 對于結構體而言,這個 n 取其成員種的數據類型占空間的值最大的那個。
為什么要字節對齊
內存空間是按照字節來劃分的,從理論上說對內存空間的訪問可以從任何地址開始,但是在實際上不同架構的CPU為了提高訪問內存的速度,就規定了對于某些類型的數據只能從特定的起始位置開始訪問。這樣就決定了各種數據類型只能按照相應的規則在內存空間中存放,而不能一個接一個的順序排列。
舉個例子,比如有些平臺訪問內存地址都從偶數地址開始,對于一個int型(假設32位系統),如果從偶數地址開始的地方存放,這樣一個讀周期就可以讀出這個int數據,但是如果從奇數地址開始的地址存放,就需要兩個讀周期,并對兩次讀出的結果的高低字節進行拼湊才能得到這個int數據,這樣明顯降低了讀取的效率。
根據這個原理,我利用CCS在MSP430F6638上做了一個簡單的測試。
首先定義了兩個char型變量和一個int型變量,其內存分配如下如所示。我們可以看到,此時int型變量的首地址為偶數,內存分配是連續的。

然后我只定義一個char型變量和一個int型變量,其內存分配如下圖所示,我們可以看到,不連續了。因為int型變量的首地址必須問偶數,所以跳了一個字節。

感謝“少數派”大哥的點撥~