本例項將開啟mmu, 將虛擬位址0xa0000000~0xa00010000對映到 實體地址 0x56000000~0x56100000,這樣就可以通過操作位址0xa0000050,0xa0000054來控制3個led的亮滅。
head.s
.text
.global _start
_start:
ldr sp, =4096 @ 設定棧指標,呼叫c函式之前要設好棧
bl disable_watchdog @ 關watch dog ,否者cpu會不斷重啟
bl memsetup @ 設定儲存控制器以使用sdram
bl copy_2th_to_sdram @ 把第二部分code複製到sdram
bl create_page_table @ 設定頁表
bl mmu_init @ 啟動mmu
ldr sp, =0xb4000000 @ 重設棧指標,指向sdram頂端,這裡使用的是虛擬位址
ldr pc, =0xb0004000 @ 第二部分程式執行位址
halt_loop:
b halt_loop
init.c
#define wtcon (*(volatile unsigned long *)0x53000000) /*關門狗暫存器位址*/
#define mem_ctl_base 0x48000000 /*儲存控制器暫存器起始位址*/
void disable_watchdog(void)
void memsetup(void)
; int i = 0;
volatile unsigned long *p = (volatile unsigned long *)mem_ctl_base;
for(; i<13; i++)
p[i] = mem_cfg_val[i];
}void copy_2th_to_sdram(void)
}/*mmu define*/
#define mmu_full_access (3<<10) /*bit11:10 0b11 , 允許讀寫*/
#define mmu_domain (0<<5) /*bit8:5 0, 0 domain*/
#define mmu_special (1<<4) /*bit4 必須為1*/
#define mmu_cacheable (1<<3) /*bit3 cached*/
#define mmu_bufferable (1<<2) /*bit2 bufferd*/
#define mmu_section 2 /*1: 粗頁表 , 2:段頁表 ,3: 細頁表*/
#define mmu_secdesc (mmu_full_access | mmu_domain | mmu_special | mmu_section)
#define mmu_secdesc_wb (mmu_full_access | mmu_domain | mmu_special | mmu_section | mmu_cacheable | mmu_bufferable)
#define mmu_section_size 0x00100000
void create_page_table(void) }
void mmu_init(void)
led.c
/********************
@goal: sdram
@method:
@date: 2018/06/09
@auto:alon
*********************/
#define gpfcon (*(unsigned long *)0xa0000050) /*實體地址是 0x56000050*/
#define gpfdat (*(unsigned long *)0xa0000054) /*實體地址是 0x56000054*/
static inline void delay(unsigned int i)
int main()
return 0;
}
mmu.lds
sections
second 0xb0004000 : at(2048)
}
2048是指程式的載入位址,即在stepping stone裡的儲存位置,從2048開始。
0xb0004000是指第二段程式的執行位址。
makefile
objs := head.o init.o led.o
mmu.bin: $(objs)
arm-linux-ld -tmmu.lds -o mmu_elf $^
arm-linux-objcopy -o binary -s mmu_elf $@
arm-linux-objdump -d -m arm mmu_elf > mmu.dis
%.o:%.c
arm-linux-gcc -wall -o2 -c -o $@ $<
%.o:%.s
arm-linux-gcc -wall -o2 -c -o $@ $<
clean:
rm -f mmu.bin mmu_elf mmu.dis *.o
OpenJTAG除錯S3C2440裸板程式
0x00 懵逼 當你寫好的初始化 head.s和鏈結指令碼uart.lds共同編譯出來的 bin,燒錄到nandflash中的時候,發現串列埠輸出一片空白,這時你的想法是什麼,砸電腦還是幹點其他有用的事?還是老實的搭建除錯環境吧,上篇講過如何除錯原始碼級的 但若是初始化 有問題,譬如sdram拷貝出...
S3C2440裸板程式之第乙個程式
一.編寫 實現點亮乙個led 1.匯程式設計序 led on.s 目標 點亮乙個led 功能 gpf4 輸出低電平 text global start start ldr r0,0x56000050 gpfcon 暫存器 mov r1,0x00000100 9 8 01 設定gpf4為輸出功能 st...
S3C2440彙編中斷程式
雖然現在c語言已經成為主流力量,但是我還是非常喜歡用彙編寫 的高效率,高速度是有天獨厚的,但我更喜歡他那種 指哪打哪 的高透明。265m的ram任你主宰,想把那句話放在哪,就放在哪。這種任性你懂嗎?學習中斷程式兩大感悟 自己卡住的地方 2,位址切記不要寫錯。我就是在這裡卡了將近一天時間。s3c244...