arm linux gcc 裸機程式開發(一)

2021-06-28 10:27:35 字數 3322 閱讀 5751

概述與sdram執行

按照友善之臂說明書,安裝好arm-linux-gcc4.4.3,我的編譯器目錄是/home/sun/study/crosstools/4.4.3/ ,我所用的開發環境為linux發行版 ubuntu10.10。

二. 啟動**問題[cpp]view plain

copy

_text_base:  

.word   text_base  

.globl lowlevel_init  

lowlevel_init:  

/* memory control configuration */

/* make r0 relative the current location so that it */

/* reads smrdata out of flash rather than memory ! */

ldr     r0, =smrdata    @取smadata的絕對位址  

ldr r1, _text_base  @text_base = 0x33f80000 所以r1 = 0x33f80000  

sub r0, r0, r1        

ldr r1, =bwscon /* bus width status controller */

add     r2, r0, #13*4  

0:  

ldr     r3, [r0], #4  

str     r3, [r1], #4  

cmp     r2, r0  

bne     0b  

/* everything is fine now */

mov pc, lr  

.ltorg  

/* the literal pools origin */

smrdata:  

.word (0+(b1_bwscon<<4)+(b2_bwscon<<8)+(b3_bwscon<<12)+(b4_bwscon<<16)+(b5_bwscon<<20)+(b6_bwscon<<24)+(b7_bwscon<<28))  

.word ((b0_tacs<<13)+(b0_tcos<<11)+(b0_tacc<<8)+(b0_tcoh<<6)+(b0_tah<<4)+(b0_tacp<<2)+(b0_pmc))  

.word ((b1_tacs<<13)+(b1_tcos<<11)+(b1_tacc<<8)+(b1_tcoh<<6)+(b1_tah<<4)+(b1_tacp<<2)+(b1_pmc))  

.word ((b2_tacs<<13)+(b2_tcos<<11)+(b2_tacc<<8)+(b2_tcoh<<6)+(b2_tah<<4)+(b2_tacp<<2)+(b2_pmc))  

.word ((b3_tacs<<13)+(b3_tcos<<11)+(b3_tacc<<8)+(b3_tcoh<<6)+(b3_tah<<4)+(b3_tacp<<2)+(b3_pmc))  

.word ((b4_tacs<<13)+(b4_tcos<<11)+(b4_tacc<<8)+(b4_tcoh<<6)+(b4_tah<<4)+(b4_tacp<<2)+(b4_pmc))  

.word ((b5_tacs<<13)+(b5_tcos<<11)+(b5_tacc<<8)+(b5_tcoh<<6)+(b5_tah<<4)+(b5_tacp<<2)+(b5_pmc))  

.word ((b6_mt<<15)+(b6_trcd<<2)+(b6_scan))  

.word ((b7_mt<<15)+(b7_trcd<<2)+(b7_scan))  

.word ((refen<<23)+(trefmd<<22)+(trp<<20)+(trc<<18)+(tchr<<16)+refcnt)  

.word 0x32  

.word 0x30  

.word 0x30  

[cpp]view plain

copy

_text_base:  

.word   0x33f80000  

.globl lowlevel_init  

lowlevel_init:  

/* memory control configuration */

/* make r0 relative the current location so that it */

/* reads smrdata out of flash rather than memory ! */

ldr     r0, =smrdata           @取smrdata的絕對位址  

ldr r1, =lowlevel_init     @取lowlevel_init的絕對位址  

sub r0, r0, r1             @相減之後,r0裡儲存的是smrdata相對與lowlevel_init標號的偏移  

/* r3 <- current position of code */

add     r0, r0, r3             @加上偏移之後就是smrdata的真實位址  

ldr r1, =bwscon /* bus width status controller */

add     r2, r0, #13*4  

以上修改之後u-boot就可以在記憶體中執行了,我們的啟動**也可以在記憶體中執行了。這個修改是友善之臂u-boot移植文件修改的,我感覺這樣做有點羅嗦了,直接乙個adr r0,smrdata就可以取到他的相對位址,事實證明的確是這樣。所以這段程式就是這樣了:

[cpp]view plain

copy

lowlevel_init:  

adr     r0, smrdata             

ldr r1, =bwscon /* bus width status controller */

add     r2, r0, #13*4  

接下來就寫乙個小小的測試程式,驗證一下。就像程式設計師每次學習新語言時,第乙個跑的程式都是hello world!一樣,我們搞嵌入式的每次在新的架構上執行的都是流水燈。以下是流水燈的程式:

[cpp]view plain

copy

//延時函式

void delay(int a)    

int main(void)  

//返回

for (i=0;i<3;i++)   

}   

}  

注:編譯成功後的**在我的資源裡:  

nand flash裸機程式

開發板 mini2440 nand flash k9f2g08u0b2,56m arm處理器裸機開發實戰 機制而非策略 知識點梳理 頁的絕對位址與相對位址 在nand.c中有乙個函式void rdnf2sdram 它的功能是將nand flah的內容複製到sdram,如下 nand flash的頁讀...

uarts裸機程式

硬體平台 jz2440 實現功能 向串列埠軟體實現輸出putchar函式 start.s 設定堆疊,關閉看門狗,初始化時鐘,初始化sdram init.c 初始化函式 uart.c 初始化串列埠暫存器 uart.h main.c start.s原始碼 extern main text global ...

Nand Flash 裸機程式

硬體平台 jz2440 實現功能 初始化 nand flash 和 sdram,並將 從 nand flash 拷貝到 sdram。start.s 上電初始化 nand 與sdram nand.c nand flash 初始化函式 sdram.c sdram 初始化函式 leds.c led 閃爍 ...