專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

MSP430中內(nèi)存分配不連續(xù)的問題

作者:佚名   來源:學(xué)會(huì)珍惜LW的博客   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月28日   【字體:

      今天發(fā)現(xiàn)了一個(gè)挺奇怪的問題,就是在430的RAM中,想給連續(xù)的內(nèi)存地址分配一個(gè)char型和一個(gè)int型變量時(shí),兩個(gè)變量之間的地址會(huì)跳一個(gè)。具體情況看下圖。

 



           從上圖可以看到,第一根紅線表面一個(gè)unsigned char型變量的值為108,地址為0x472A,占一個(gè)字節(jié);緊接著下一個(gè)為unsigned char型變量,其值為2,地址為0x472C,占兩個(gè)字節(jié)。那0x472B這個(gè)地址哪兒去了呢?我們可以看到,在存一個(gè)char型變量,后面接一個(gè)int型變量時(shí),中間會(huì)有一個(gè)地址被跳過去;

        類似的情況還出現(xiàn)在char型變量后面存一個(gè)long int型變量時(shí),但是int型變量和long int型變量連續(xù)存,或者單獨(dú)的char型變量連續(xù)存,以及單獨(dú)的int或long int連續(xù)存時(shí),均不存在這個(gè)問題。

        這個(gè)挺奇怪的……這對(duì)于SD卡參數(shù)的解析會(huì)有很大影響?赡苁歉幾g器有關(guān),這里我用的是CCS V5.4。等找到解決方案之后,再在后文補(bǔ)上。

 

**********************************************************************************************************

         晚上請(qǐng)教了znFAT群里的“少數(shù)派”大哥之后,獲得了問題的答案,很開心~這里與大家分享一下。

       出現(xiàn)這個(gè)問題的原因是結(jié)構(gòu)體的對(duì)齊問題。簡單地說,就是char型變量的地址是任意的;但是int型變量由于要占2個(gè)字節(jié),為了提高CPU的訪問速度,所以其首地址必須要為偶數(shù);long int型占4個(gè)字節(jié),其首地址必須要為4的倍數(shù)。

       關(guān)于這個(gè)問題再具體的講解,我摘錄了david0421的博文“單片機(jī)結(jié)構(gòu)體內(nèi)存的分配 ”中的一段話,他博文的原始地址在http://bibber.blog.sohu.com/230549556.html。

博文如下:

什么是字節(jié)對(duì)齊
     一個(gè)變量占用 n 個(gè)字節(jié),則該變量的起始地址必須能夠被 n 整除,即: 存放起始地址 % n = 0, 對(duì)于結(jié)構(gòu)體而言,這個(gè) n 取其成員種的數(shù)據(jù)類型占空間的值最大的那個(gè)。
為什么要字節(jié)對(duì)齊
    內(nèi)存空間是按照字節(jié)來劃分的,從理論上說對(duì)內(nèi)存空間的訪問可以從任何地址開始,但是在實(shí)際上不同架構(gòu)的CPU為了提高訪問內(nèi)存的速度,就規(guī)定了對(duì)于某些類型的數(shù)據(jù)只能從特定的起始位置開始訪問。這樣就決定了各種數(shù)據(jù)類型只能按照相應(yīng)的規(guī)則在內(nèi)存空間中存放,而不能一個(gè)接一個(gè)的順序排列。

    舉個(gè)例子,比如有些平臺(tái)訪問內(nèi)存地址都從偶數(shù)地址開始,對(duì)于一個(gè)int型(假設(shè)32位系統(tǒng)),如果從偶數(shù)地址開始的地方存放,這樣一個(gè)讀周期就可以讀出這個(gè)int數(shù)據(jù),但是如果從奇數(shù)地址開始的地址存放,就需要兩個(gè)讀周期,并對(duì)兩次讀出的結(jié)果的高低字節(jié)進(jìn)行拼湊才能得到這個(gè)int數(shù)據(jù),這樣明顯降低了讀取的效率。

          根據(jù)這個(gè)原理,我利用CCS在MSP430F6638上做了一個(gè)簡單的測試。

        首先定義了兩個(gè)char型變量和一個(gè)int型變量,其內(nèi)存分配如下如所示。我們可以看到,此時(shí)int型變量的首地址為偶數(shù),內(nèi)存分配是連續(xù)的。



           然后我只定義一個(gè)char型變量和一個(gè)int型變量,其內(nèi)存分配如下圖所示,我們可以看到,不連續(xù)了。因?yàn)閕nt型變量的首地址必須問偶數(shù),所以跳了一個(gè)字節(jié)。



           感謝“少數(shù)派”大哥的點(diǎn)撥~

關(guān)閉窗口