關於ARM和儲存空間地址線錯位串連詳解

來源:互聯網
上載者:User

 

    首先,SST39VF16 FLASH是16位的,也就是以兩個位元組(半字)為最小操作單位的。也就是說你在FLASH地址上給0x00000,則它給出的資料是第一個16位的半字;在FLASH地址上給0x00001,它給出的是第二個16位的半字;在FLASH地址上給0x00002,它給出的是第三個16位的半字。。。但ARM的地址是以位元組編址的,它可以以位元組單位來讀取或者寫外設。
    假設我們要讀取FLASH的第一個[color=#FF0000]位元組[/color],LDRB R0,[R1];將R1內容寫0x00000,這個時候ARM執行的是這樣的操作:
1、送出地址0x00000
2、在D0-D15上讀取資料
3、將讀到的16位元據的[color=#FF0000]低[/color]8位給R0低8位(高24位為0)

    假設我們要讀取FLASH的第二個[color=#FF0000]位元組[/color],LDRB R0,[R1];將R1內容寫0x00001,
這個時候ARM執行的是這樣的操作:
1、送出地址ox00001
2、在D0-D15上讀取資料
3、將讀到的16位元據的[color=#FF0000]高[/color]8位給R0的低8位(高24位為0)

    從上面的操作可以看到,如果我們一一對應的將ARM和FLASH得地址串連,那麼我們想讀FLASH的第2個位元組的話,就沒有辦法讀到了。因為你地址給0x00001,FLASH就在資料線上給的是第3個位元組和第4個位元組的資料,並將高8位(FLASH的第4個位元組)給R0;如果你給的地址是0x00000的話,ARM的理解就是將資料線D0-D15的低8位給R0,顯然這個16位的資料是FLASH的第1個位元組和第2個位元組的資料,低8位指的就是第一個自己的資料。顯然怎麼也讀不到FLASH的第2個資料。
    我們既要遵循ARM的規則,又要讓FLASH給我們正確的資料。你自己想應該怎麼辦?很簡單,把ARM給的地址最低位剪掉,把剩下的給FLASH。要讀第2個位元組,還是送0x00001,但是最後的1被剪掉了,FLASH得到的地址是ox00000,顯然給出的資料是第1個和第二個位元組。而ARM覺得送出的地址是0x00001啊,應該把高地址給R0啊,即把第2個位元組給了R0。就是一個“欺上瞞下”的過程。
     這是我看了http://www.100ask.net/showtopic-308.aspx這裡的文章和查閱資料理解以後寫的,給大家分享一下。。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.