韋東山嵌入式第一期學習筆記DAY 11 13 4

2021-09-25 05:10:13 字數 2766 閱讀 6371

一、課程內容:

摘要:本節課主要講解了將之前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...