一儲存暫存器的性質:
儲存管理器負責管理2440的所有記憶體裝置,2440的位址線addr0~addr26,即最大執行定址2^27=128m空間。 cpu通過8根片選訊號ngcs0~ngcs7,控制bank0~bank7,每個bank大小為128m,這樣就實現了須知1g位址空間。
2440是32位的cpu,位址空間應該為4gb,除以上1gb空間用來連線外設外,還有一部分是cpu內部暫存器的位址,剩下的位址空間沒有使用,暫存器空間的位址是0x48000000~0x5fffffff 。
不同的bank可以接不同的外設裝置,2440對多允許接入8個外設。cpu定址時,向記憶體管理器傳送位址,記憶體管理器負責訪問不同的外設。 下圖為開發板上所接的外設:
2440外接sdram以後,當cpu想要訪問0x3000 0000處位址的資料時:
cpu執行的程式為
move r1 ,#0x3000 0000;
ldr r0 ,[r1];
儲存管理器能夠根據硬體具體的配置資訊來決定如何對硬體進行訪問。想要訪問乙個晶元時,有哪些配置資訊?
1.位址線
2.資料寬度(8/16/32位)
3.時鐘/頻率
4.晶元相關的特性:(對於sdram的定址由行位址(多少位?)、列位址、bank決定(多少位?多少個bank?))
第1種相當於將位址左移了2位,乘以了4,第2相當於將位址值左移了一位,乘以了2倍。
二儲存暫存器的使用-訪問sdram
對於sram,可以直接讀寫,但sdram不同的是位址分為列、行、bank,且需要不斷地重新整理。
1.對於啟動檔案head.s:
.equ mem_ctl_base, 0x48000000
.equ sdram_base, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 關閉watchdog,否則cpu會不斷重啟
bl memsetup @ 設定儲存控制器
bl copy_steppingstone_to_sdram @ 複製**到sdram中
ldr pc, =on_sdram@ 從片內記憶體跳到sdram中繼續執行,上電後預設的是從0位址開始執行,在此句之前,由於位置無關碼,程式在片內記憶體中順序執行(為什麼此句能夠跳轉過去,是由於makefile改了鏈結位址,位址值是從0x30000000開始計數,on_sdram=0x30000000+10,則pc=0x30000010,在sdram中)
on_sdram:
ldr sp, =0x34000000 @ 設定堆疊
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往watchdog暫存器寫0即可
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr @ 返回
copy_steppingstone_to_sdram:
@ 將steppingstone(片內記憶體)的4k資料全部複製到sdram中去
@ steppingstone起始位址為0x00000000,sdram中起始位址為0x30000000
mov r1, #0 // 片內記憶體位址從0開始的
ldr r2, =sdram_base
mov r3, #4*1024
1:
ldr r4, [r1],#4 @ 從steppingstone讀取4位元組的資料,並讓源位址加4
str r4, [r2],#4 @ 將此4位元組的資料複製到sdram中,並讓目地位址加4
cmp r1, r3 @ 判斷是否完成:源位址等於steppingstone的未位址?
bne 1b @ 若沒有複製完,繼續
mov pc, lr @ 返回
memsetup:
@ 設定儲存控制器以便使用sdram等外設
mov r1, #mem_ctl_base @ 儲存控制器的13個暫存器的開始位址
adrl r2, mem_cfg_val @ 這13個值的起始儲存位址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 讀取設定值,並讓r2加4
str r4, [r1], #4 @ 將此值寫入暫存器,並讓r1加4
cmp r1, r3 @ 判斷是否設定完所有13個暫存器
bne 1b @ 若沒有寫成,繼續
mov pc, lr @ 返回
.align 4
mem_cfg_val:
@ 儲存控制器13個暫存器的設定值
.long 0x22011110 @ bwscon
.long 0x00000700 @ bankcon0
.long 0x00000700 @ bankcon1
.long 0x00000700 @ bankcon2
.long 0x00000700 @ bankcon3
.long 0x00000700 @ bankcon4
.long 0x00000700 @ bankcon5
.long 0x00018005 @ bankcon6
.long 0x00018005 @ bankcon7
.long 0x008c07a3 @ refresh
.long 0x000000b1 @ banksize
.long 0x00000030 @ mrsrb6
.long 0x00000030 @ mrsrb7
2.main函式,和上一章led的一樣沒變
3.makefile
sdram.bin : head.s leds.c
arm-linux-gcc -c -o head.o head.s
arm-linux-gcc -c -o leds.o leds.c
arm-linux-ld -ttext 0x30000000 head.o leds.o -o sdram_elf//鏈結位址改為sdram的位址,表示程式正常執行時從位址0x30000000(sdram)處開始執行
arm-linux-objcopy -o binary -s sdram_elf sdram.bin
arm-linux-objdump -d -m arm sdram_elf > sdram.dis
clean:
rm -f sdram.dis sdram.bin sdram_elf *.o
以上函式實現的功能是將上一章的led程式燒寫到nand flash以後,在啟動檔案裡通過設定相應的暫存器來初始化儲存控制器,並將自動從nand flash拷入片內記憶體的**從片內記憶體拷入到sdram中,然後從sdram中開始執行程式 。
儲存管理器
cpu配置儲存管理器 cpu讀操作發命令給儲存管理器,儲存管理器根據配置讀取資料 nand flash啟動方式,開機片內sram拷貝nand flash前4k執行,在這4k的程式裡需要完成sram sdram跳轉 s3c2440有8個bank,即8個片選訊號,直連可以接8個記憶體類外設 sdram,...
儲存管理器基礎知識
一 框架 想訪問乙個晶元,需要哪些條件 1.位址線 2.資料線 8 16 32 資料寬度 3.時鐘 頻率 我們看到cpu上整合了乙個儲存管理器,外圍的儲存裝置都接在這個儲存管理器上。cpu負責發出命令,其它的一切工作都交給了儲存管理器。那麼儲存管理器是如何來管理這些外設的呢?首先位址空間被分為8個b...
布局管理器 網格袋布局管理器
網格袋布局管理器中的約束條件constrains中有如下字段需要設定 1 constrains.gridx和constrains.gridy 這兩個欄位僅用於指定元件的起始網格座標。2 constrains.gridwidth和constrains.gridheight 這兩個字段用於指定元件所佔網...