一、課程內容:
摘要:本節課主要講解了將之前start.s中的strb,ldrb(單位元組操作)換成str,ldr(4位元組操作)減少硬體的訪問次數和align函式實現的**4位元組對齊;
1、問:是怎麼減少硬體訪問次數從而優化strb的?
答:使用strb,ldrb若操作16位元組資料硬體總共訪問32次;
改進完成後訪問12次
2、問:一次操作4位元組時怎麼選擇想要的位元組?
答:
dqm資料遮蔽訊號,若要1個位元組,則傳送四次dqm遮蔽掉不要的3個位元組。從而最終只寫sdram的乙個位元組
3、問:如何實現**4位元組對齊?
答:用align(4);
二、學習要點:無
三、**:
鏈結指令碼
sections
.rodata :
.data 0x30000000 :at(0x800)
. = align(4);
bss_start = .;
.bss :
bss_end =.;
}
start.s
.text
.global _start
_start:
/* 關閉看門狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */
/* locktime(0x4c000000) = 0xffffffff */
ldr r0, =0x4c000000
ldr r1, =0xffffffff
str r1, [r0]
/* clkdivn(0x4c000014) = 0x5, tfclk:thclk:tpclk = 1:4:8 */
ldr r0, =0x4c000014
ldr r1, =0x5
str r1, [r0]
/* 設定cpu工作於非同步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //r1_nf:or:r1_ia
mcr p15,0,r0,c1,c0,0
/* 設定mpllcon(0x4c000004) = (92<<12)|(1<<4)|(1<<0)
* m = mdiv+8 = 92+8=100
* p = pdiv+2 = 1+2 = 3
* s = sdiv = 1
* fclk = 2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400m
*/ldr r0, =0x4c000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]
/* 一旦設定pll, 就會鎖定lock time直到pll輸出穩定
* 然後cpu工作於新的頻率fclk
*//* 設定記憶體: sp 棧 */
/* 分辨是nor/nand啟動
* 寫0到0位址, 再讀出來
* 如果得到0, 表示0位址上的內容被修改了, 它對應ram, 這就是nand啟動
* 否則就是nor啟動
*/mov r1, #0
ldr r0, [r1] /* 讀出原來的值備份 */
str r1, [r1] /* 0->[0] */
ldr r2, [r1] /* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是nand啟動 */
ldr sp, =0x40000000+4096 /* 先假設是nor啟動 */
moveq sp, #4096 /* nand啟動 */
streq r0, [r1] /* 恢復原來的值 */
bl sdram_init
/*重定位data段*/
ldr r1, =data_load_addr/*data段在bin檔案中的位址,載入位址*/
ldr r2, =data_start/*data段在重定位位址,執行時的位址*/
ldr r3, =data_end/*data段結束時的位址*/
cpy:
ldr r4,[r1]
str r4,[r2]
add r1,r1,#4
add r2,r2,#4
cmp r2,r3
bne cpy
/*清除bss段*/
ldr r0,=bss_start
ldr r1,=bss_end
mov r2,#0
clean:
str r2,[r0]
add r0,r0,#4
cmp r0,r1
bne clean
bl main
halt:
b halt
韋東山嵌入式第一期學習筆記DAY 11 13 5
一 課程內容 摘要 本節課講解了整體的 重定位與位置無關碼,其中重點和難點是位置無關碼。實現第二種方法的 重定位 在第二節課講的第乙個 實現的功能,是分段重定位的,本節講的是整體形式的鏈結指令碼。1 問 位置無關碼怎麼理解?很關鍵,一開始沒理解!答 位置無關碼說白了就是相對跳轉指令與絕對跳轉指令的關...
韋東山嵌入式第一期學習筆記DAY 19 17 6
一 課程內容 完善上節課的程式,實現設定4.3寸lcd的引數與,第一步 設定lcd顯示屏的引數 第二步 寫乙個註冊函式,用於註冊不同型號的lcd顯示器 define lcd num 10 static p lcd params p array lcd lcd num static p lcd par...
韋東山嵌入式第一期學習筆記DAY 19 17 7
一 課程內容 概述 本節課完善了之前的程式bug,並且讓顯示器顯示全屏紅 綠 藍三種顏色。1 新建lcd test.c 1 首先lcd test函式要獲得lcd顯示器的引數,比如x,y的畫素等等。所以要構建乙個獲得引數的函式,在上一層中。void get lcd params unsigned in...