一、重定向
對于程序而言,我們需要理解兩個概念,一是程序當前所處的地址,即程序在運行時,所處的當前地址;二是程序的鏈接地址,即程序運行時應該位于的運行地址。編譯程序時,可以指定程序的鏈接地址。對于Tiny4412而言,啟動時只會從MMC/sd等啟動設備中拷貝前16K的代碼到IRAM中,那么當我們的程序超過16K怎么辦?那就需要我們在前16K的代碼中將整個程序完完整整地拷貝到DRAM等其他更大存儲空間,然后再跳轉到DRAM中繼續運行我們的代碼,這個拷貝然后跳轉的過程就叫重定位。
本章中我們主要學習如何重定位,但是并不會涉如何使用到DRAM,而是簡單地將代碼從IRAM的0x02020010處拷貝到IRAM的0x02028000處,然后跳轉到0x02028000處繼續運行我們的代碼。
二、程序說明
完整代碼見目錄5_link_0x8000,該目錄下的代碼與上一章的代碼的差別在于start.S和使用了
鏈接腳本link.lds,我們首先分析link.lds。
1. link.lds
什么是鏈接腳本?鏈接腳本就是程序鏈接時的參考文件,其主要目的是描述如何把輸入文件中的段(SECTION)映射到輸出文件中,并控制輸出文件的存儲布局。鏈接腳本的基本命令式SECTIONS命令,一個SECTIONS命令內部包含一個或多個段,段(SECTION)是鏈接腳本的基本單元,它表示輸入文件中的某個段是如何放置的。
鏈接腳本的標準格式如下:
SECTIONS
{
sections-command
sections-command
}
下面我們配合link.lds進行具體講解:
SECTIONS
{
. = 0x02028000;
.text : {
start.o
* (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.bss)
}
bss_end = .;
}
1) 在鏈接腳本中,單獨的點號(.)代表了當前位置,. =0x02028000;表示程序的鏈接地址是00x02028000;
2) link.lds中的.text 、 .data 、 .bss分別是text段、data段、bss段的段名(這些段名并不是固定的,是可以隨便起的)。.text 段包含的內容是start.o 和其余代碼中所有的text段;.data段包含的內容是代碼中所有的data段;.bss段包含的內容是代碼中所有的bss段。
3) bss_start和bss_end保存的是bss段的起始地址和結束地址,在start.S中會被用到。
下面解釋一下什么是data、text、bss段:
1) data段:數據段(datasegment)通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬于靜態內存分配。
2) text段:代碼段通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀,某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。
3) bss段:指用來存放程序中未初始化的全局變量的一塊內存區域。BSS是英文BlockStarted by Symbol的簡稱。當我們的程序有全局變量是,它是放在bss段的,由于全局變量默認初始值都是0,所有我們需要手動清bss段。
2. start.S
在start.S中,我們初始化時鐘后,增加了3個步驟:
第一步重定位,代碼如下:
// _start當前所位于的地址
adr r0, _start
// _start的鏈接地址
ldr r1, =_start
ldr r2, =bss_start
cmp r0, r1
beq clean_bss
copy_loop:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
bne copy_loop
首先需要知道的是,adr指令獲取的值是代碼當前位于的地址,而ldr指令獲取的值是代碼的鏈接地址。再來看代碼,代碼里首先獲得_start標號的當前地址(即0x02020010),然后獲取_start標號的鏈接地址(即0x02028000),因為bin文件中不需要保存bss段,所有拷貝的代碼長度為bss_start的運行地址-_start的運行地址,使用copy_loop進行拷貝。
第二步清bss,代碼如下:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0, r1
beq run_on_dram
mov r2, #0
clear_loop:
str r2, [r0], #4
cmp r0, r1
bne clear_loop
首先獲得bss段的起始地址(即bss_start),然后獲得bss段的結束地址(即bss_end),最后使用clear_loop將bss段所位于的內存清0,bss_start和bss_end的定義位于link.lds。
第三步跳轉,代碼如下:
run_on_dram:
ldr pc, =main
由于ldr 指令獲取的是main函數的鏈接地址,所以執行ldrpc, =main 后,程序就跳轉到
0x02020000+main函數的offset的地址處了。
三、完整的燒寫過程
已將SD卡插入電腦,假設Linux識別了SD卡,其識別號為sdb。執行下面命令:
# chmod 777 –R 5_link_0x8000
# cd 5_link_0x8000
# make
# cd sd_fuse
# make
# ./ fast_fuse /dev/sdb
四、上電實驗
將sd卡插入Tiny4412中,選擇sd卡啟動,然后上電,可以看到以下現象:
LED正常閃爍,該現象與前面章節的代碼的運行效果一模一樣,但是程序的運行過程卻有了很大的區別。通過本章的學習,我們已經知道了如何對代碼進行重定位,這為我們下一章節將代碼重定位到DRAM奠定了基礎。
上一篇:Tiny4412 開發板 編譯環境搭建【轉】
下一篇:tiny4412 裸機程序 七、重定位代碼到DRAM
推薦閱讀
史海拾趣
在電子行業的浪潮中,ETEQ Microsystems Inc于XXXX年應運而生,創始人帶著對微型電子技術的深厚理解和遠見,立志打造一家具有創新精神的芯片設計企業。初創期,公司面臨資金短缺、人才匱乏和市場競爭激烈的挑戰。然而,通過精心研發的幾款高性能低功耗芯片,ETEQ Microsystems Inc迅速在市場上打開了局面,贏得了合作伙伴的認可。
隨著電子產品的不斷小型化和集成化,兆欣面臨著越來越大的技術挑戰。然而,他們并沒有退縮,反而加大了研發投入。經過無數次試驗和改進,兆欣成功開發出全自動薄型功率電感,這一產品在市場上引起了廣泛關注。同時,他們還針對USB3.0的市場趨勢,預計導入相關對應產品,為公司的未來發展奠定了堅實基礎。
兆欣深知品質和服務對于企業發展的重要性。他們始終堅持高品質的生產標準,確保每一件產品都符合客戶的期望。同時,兆欣還提供了周到的售前咨詢和售后服務,為客戶提供了全方位的支持。這種以客戶為中心的經營理念贏得了客戶的廣泛贊譽和信任。
隨著市場的不斷擴張和競爭的加劇,Eurohm Resistors始終堅持品質至上的原則。公司建立了嚴格的質量控制體系,從原材料采購到生產流程,再到成品檢驗,每一個環節都嚴格把關。這種對品質的堅守不僅贏得了客戶的信任,也為公司贏得了良好的口碑。
面對數字化浪潮的沖擊,Eurohm Resistors公司積極擁抱數字化轉型。公司建立了完善的數字化管理系統,實現了生產、銷售、服務等各個環節的數字化管理。通過數據分析和智能化決策,公司能夠更準確地把握市場變化和客戶需求,提高運營效率和市場競爭力。
ConnectBlue公司成立于2000年,當時正值無線通信技術快速發展的時期。公司創始人憑借對無線技術的深刻理解和市場需求的敏銳洞察,決定專注于無線系統的研發和生產。起初,公司面臨資金緊張和技術難題,但創始團隊憑借堅韌不拔的精神,克服了一個又一個困難,成功開發出了一系列具有競爭力的無線模塊產品。
美國商務部公布,已授予五家在中國企業美國對華技術出口的“合法終端用戶”(VEU)地位,其中有四家是芯片制造商。美國商務部工業與安全局宣布的這五家企業是:應用材料中國公司、波音公司旗下合資企業Boeing Hexcel AVIC I、中芯國際集成電路制造有 ...… 查看全部問答∨ |
|
重新寫下,急!有能提供1mA電流的芯片嗎?精度在1%(10uA)即可!! 我要給測量低溫的電阻提供1mA的電流,然后測量其電壓確定當前溫度電流大于1mA太多的話, 測量低溫的電阻會發熱,電阻特性就變了,測不準低溫,所以最好有能準確提供1mA電流的芯片… 查看全部問答∨ |
|
為什么我的串口通信程序只能接收幾個字節,接收幾十個字節時就接收不正確了! 我接收幾個字節時都能正確接收,現在要接收30多個字節,這時就接收不了! 有誰遇到過類似的問題???到底什么原因阿?幫幫我!謝謝 ! 波特率:38400 bps 起始位:1 ...… 查看全部問答∨ |
哪位高人知道,在Windows Mobile 6.0 SDK環境下,如何用DirectShow 和 DirectDraw 使用overl 哪位高人知道,在Windows Mobile 6.0 SDK環境下,如何用DirectShow 和 DirectDraw 使用overlay2開發camera應用程序。謝謝了?!? 查看全部問答∨ |
在運動障礙性疾病(Movement Disorders)中,帕金森?。≒arkinson Disease,PD)以肌張力增高、運動減少為主要臨床特征,因首先由英國人帕金木(Janes Parkinson)于1817年描述而得名。據不完全統計,目前我國約為120~130萬帕金森病患者,而全世界 ...… 查看全部問答∨ |
3250開發板鏈接劃卡鍵盤有問題,請解惑 劃卡鍵盤為大元752u。在Ubuntu及XP 下均能正常使用,在開發板上只亮燈,鍵盤不反應。在Ubuntu下設備號如下:linux:/dev/input/by-id$ lsusb-413c_2003-event-kbd設備ID等相 ...… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 11:22 編輯 已收到《運算放大器噪聲優化手冊》實在是一本不可多得的好書,其從不同角度不同應用中解析不同噪聲對運放電路造成的不同影響,每章小結更是清晰的列明本章要點,如更進一步鞏固知識還有相關習題,本書 ...… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 11:11 編輯 1、本章較為簡單易懂,主要介紹了三種噪聲測量儀器真均方根數字萬用表、示波器、頻譜分析儀。真均方根數字萬用表:將輸入電壓數字化,收集上千個采樣點,然后用數字方法計算均方根值。示波器:可以顯 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 傳統晶體管的極限!臺積電3nm N3P已量產
- 分析師稱H20出口管制毫無意義:對中國AI發展影響不大