在前面介紹exynos4412芯片啟動過程時,我們知道:一上電,exynos4412首先執行固化在iROM中的代碼,iROM首先設置程序運行環境(比如關看門狗、關中斷、關MMU、設置棧、設置棧、啟動PLL等),然后根據OM引腳確定啟動設備(NAND Flash/SD卡/其他),把BL1從里面讀出存入iRAM的0x02021400地址處,然后開始啟動BL1;BL1從SD卡適當的位置讀入14K字節的數據,存在iRAM地址0x02023400處,所以BL2不能大于(14K–4) 字節,這里引出了為什么寫這一節的原因:如果我們的程序很大,大于14K怎么辦?
運行地址和鏈接地址:
運行地址是程序當前所處的地址,即程序在運行時,所處的當前地址。
鏈接地址是程序的鏈接地址,即程序運行時應該位于的運行地址。編譯程序時,可以在鏈接腳本中指定程序的鏈接地址。
對于tiny4412而言,前面我們已經說過:啟動時BL1只會從sd等啟動設備中拷貝14K的代碼到iRAM中,那么當我們的程序超過14K怎么辦?那就需要我們在前14K的代碼中將整個程序完完整整地拷貝到LPDDR等其他更大存儲空間,然后再跳轉到LPDDR中繼續運行我們的代碼,這個拷貝然后跳轉的過程就叫重定位。
本章中講解學習如何重定位,但是并不會涉如何使用到LPDDR,而是簡單地將代碼從iRAM的0x02023400處拷貝到iRAM的0x02026400處,然后跳轉到0x02026400處繼續運行我們的代碼。
程序文件介紹:
1.start.S文件內容介紹:
.text
.global _start
_start:
//關閉看門狗;關于看門狗的設置可以查看Spec 1357頁
ldr r0, =0x10060000 //將0x10060000數字保存到R0寄存器中
mov r1, #0x0 //將0x0數字保存到R1寄存器中
str r1, [r0] //將R1寄存器中的數字(0)保存到R0寄存器數字表示的地址中
//重定位整個代碼到0x0202_6400地址處;這個地址位于iRAM里面
adr r0, _start //將_start標號(程序的開始地址)位于iRAM里的實際地址保存到R0寄存器中;也是開始拷貝程序的地址
ldr r1, =_start //獲取鏈接地址;也就是想將程序運行的地址;將拷貝的程序從這個地址開始保存
ldr r2, =bss_start //將鏈接地址中的bss_start標識地址保存到R1寄存器中;也是拷貝程序結束的地址;R1-R2的大小也就是要
//重定位代碼的大小
cmp r1, r2 //比較兩個地址是否相等,如果相等在直接去清除bss段即可;
beq clear_bss //跳轉到清零bss處
reload_loop:
ldr r3, [r0], #4 //將R0數字表示地址處的數據加載到R3寄存器中;并將R0+4
str r3, [r1], #4 //將R3中的數據保存到R1寄存器數字表示的地址中,并將R1+4
cmp r1, r2
bne reload_loop //循環拷貝
clear_bss: //將bss段清零
ldr r0, =bss_start //將bss段的開始地址保存到R0寄存器
ldr r1, =bss_end //將bss段的結束地址保存到R1寄存器
mov r2 ,#0x0 //將0數字保存到R2寄存器中
cmp r0, r1 //如果相等則表示bss清零完畢,跳轉執行點亮LED
beq run_address
clear_loop:
str r2, [r0], #4 //將0保存到R0寄存器地址,并將R0+4
cmp r0, r1
bne clear_loop //如果不相等則表示沒有清零完成
run_address: //點亮LED燈
ldr sp, =0x02027400 //設置棧
ldr pc, =main //使用絕對跳轉指令
//bl main
halt_loop: //死循環
b halt_loop
程序中已經做了詳細的注釋,這里就不再詳細介紹。
2.main.c文件詳細介紹:
//定義兩個宏,方便操作使用到的寄存器
#define GPM4_CON (*(volatile int *)0x110002E0)
#define GPM4_DAT (*(volatile int *)0x110002E4)
int main()
{
//設置GPM4_0引腳為輸出
GPM4_CON &= ~0xFF; //GPM4CON寄存器的低8位清零
GPM4_CON |= 0x11; //GPM4CON寄存器的bit0/4置1,設置為輸出引腳
//設置GPM4_0引腳為低電平
GPM4_DAT &= ~0x3; //GPM4DAT寄存器bit0/1清零,輸出低電平
return 0;
}
程序中已經做了詳細的介紹,這里不再介紹。
3.鏈接腳本:
SECTIONS {
. = 0x02026400; /* 鏈接地址 */
. = ALIGN(4);
.text :
{
*(.text)
}
. = ALIGN(4);
.rodata :
{
*(.rodata)
}
. = ALIGN(4);
.data :
{
*(.data)
}
. = ALIGN(4);
bss_start = .; /* bss段的開始位置 */
.bss :
{
*(.bss) *(.COMMON)
}
bss_end = .; /* bss段的結束位置 */
}
鏈接腳本的內容很簡單,起始地址是0x02026400,并獲取了bss段的起始和結束地址。
按照前面文章講解的編譯和燒寫命令,將程序燒寫到SD卡中,設置SD卡啟動,觀察現象,發現LED1/2被點亮。說明程序重定位成功。
完畢!
上一篇:tiny4412裸機程序之位置無關碼
下一篇:tiny4412開發板的串口介紹與操作
推薦閱讀
史海拾趣
Herrmann Kg憑借其卓越的產品質量和專業的服務,贏得了全球眾多領先客戶的信賴。例如,CUSTOMCELLS?作為一家全球領先的客戶專用鋰電池開發商,在生產過程中采用了Herrmann Kg的超聲波焊接系統,有效降低了廢品率,提高了生產效率。這種深度合作不僅展示了Herrmann Kg在電池制造領域的專業能力,也進一步鞏固了其在全球市場中的地位。通過不斷滿足客戶的特定需求,Herrmann Kg在電子及其他相關行業中樹立了良好的口碑。
為了進一步擴大市場份額,Global Specialties積極實施全球化戰略。公司通過與國際分銷商和代理商的合作,將產品銷往全球各地。同時,公司還參加了多個國際性的電子展會和論壇,與來自世界各地的客戶和合作伙伴進行交流和合作。這些舉措不僅提升了Global Specialties的品牌知名度,還為公司帶來了更多的國際合作機會和客戶資源。通過這些努力,Global Specialties逐漸發展成為一家具有全球影響力的電子測試與測量公司。
為了進一步擴大市場份額,Global Specialties積極實施全球化戰略。公司通過與國際分銷商和代理商的合作,將產品銷往全球各地。同時,公司還參加了多個國際性的電子展會和論壇,與來自世界各地的客戶和合作伙伴進行交流和合作。這些舉措不僅提升了Global Specialties的品牌知名度,還為公司帶來了更多的國際合作機會和客戶資源。通過這些努力,Global Specialties逐漸發展成為一家具有全球影響力的電子測試與測量公司。
隨著電子行業的快速發展和變革,Codeco面臨著新的挑戰和機遇。為了應對這些變革,公司及時調整戰略,加大在人工智能、物聯網等領域的投入。通過與高校、研究機構的合作,Codeco不斷吸收新的技術和理念,推出了一系列符合市場需求的創新產品。這些舉措使得Codeco在行業中保持了領先地位。
隨著電子行業的不斷發展和變革,DLK公司也面臨著轉型升級的壓力。為了適應市場需求的變化,DLK公司開始加快轉型升級的步伐。一方面,公司加強了對新能源汽車、物聯網等新興領域的研究和開發;另一方面,公司積極探索智能制造、工業互聯網等新技術在連接器生產中的應用。通過轉型升級,DLK公司不僅提高了生產效率和產品質量,而且增強了企業的競爭力和可持續發展能力。
Astro Tool Corp公司初創時,面臨著電子制造行業激烈的競爭環境。然而,公司創始人憑借其在精密工具制造領域的深厚技術背景,帶領團隊研發出了一款具有高精度和高穩定性的電子制造工具,成功吸引了業內眾多客戶的關注。這款產品不僅提高了生產效率,還降低了制造成本,迅速在市場上占據了一席之地。公司借此機會,不斷擴大生產規模,逐步在電子制造工具市場建立起自己的地位。
我最近在一個18MHZ的正弦波振蕩器,采用6M晶體振蕩器鎖相倍頻的方法,但要求輸出幅度恒定,即自動電平控制電路,請各位大蝦指點下怎么設計,謝了另外,還想問下,我這個倍頻方案行不?我是第一次做這方面的項目,呵呵,請指教… 查看全部問答∨ |
|
(2)倒車雷達方案------——LED 數碼管、LCD 液晶、語音、可視攝像、無線等方案 我們可以為客戶提供整套解決方案設計的原理圖、PCB 圖、BOM 單、生產調試說明、單個功能電路等,提供針對不同產品形態軟件服務方案。 客戶可以直接進入試產,避免長時間的技術研發、調試生產的風險。 2. 產品形態 2.1 數碼管顯示倒車雷達 ...… 查看全部問答∨ |
請問 有什么可以轉換并口的 東東嗎(是不是用PCI的并口卡 可以當并口下載程序)?? 或者是 ATMEL 系列單片機的串口下載線 (宇宙的串口 下載線 不明確) 我的電腦沒有并口 只有串口 現在用STC系列單片機燒程序 發現極不穩定 以至于現在 ...… 查看全部問答∨ |
我用AD8030運放做了下面這個低通濾波器,焊接好板后接上芯片,發現芯片很燙手。電源輸入,電路焊接都沒有問題,芯片引腳也接對了。我認為是電流輸入過大。可是實在找不出問題出在哪里。請各位看看,幫我分析分析。 由于不懂直接發圖片,只能做個下 ...… 查看全部問答∨ |
我只知道有關jtag的那個bank的vccio是要接電源的 內核也要加電,但是不是那個bank的呢 要加電么,內核也喲加電么,這個一直沒弄懂,還要不用的userio 怎么辦呢 弱弱的問下。。。… 查看全部問答∨ |
求嵌入式ARM學習群,特別是s3c2410學習板的QQ群或個人前輩 本人正在做關于三星arm9 s3c2410學習板的實驗,但發現很困難,在搭建linux平臺時不知道如何入手,出錯也無從查起,求前輩指點,感激萬分,或者如果有學習小組的Q群的更好,謝謝… 查看全部問答∨ |
|
www.z2comm.com 招聘軟件工程師,目標人群為應屆畢業生或有一年到兩年編碼經驗的程序員 基本要求: 軟件基礎扎實 熟悉C語言 有一定的開發能力,能開發千行代碼數量級的軟件模塊 有志于做嵌入式軟件開發 具備以下能力更好: 具備硬件 ...… 查看全部問答∨ |
請各位幫幫忙: PENTIUM的CPU,從系統加電,到VXWORKS初始化完成,也就是進入usrAppInit入口的時間需兩分鐘左右,實在太長了。如何縮短這部分時間呢? 萬分感謝!… 查看全部問答∨ |