在前面,我們使用匯編程序來實(shí)現(xiàn)了重定位和清bss段,本節(jié)我們將使用C語言,實(shí)現(xiàn)重定位和清除bss段。
1.打開start.S把原來的匯編代碼刪除改為調(diào)用C函數(shù)
/* 重定位text, rodata, data段整個(gè)程序 */
mov r1, #0
ldr r2, =_start /* 第1條指令運(yùn)行時(shí)的地址 */
ldr r3, =__bss_start /* bss段的起始地址 */
cpy:
ldr r4, [r1]
str r4, [r2]
add r1, r1, #4
add r2, r2, #4
cmp r2, r3
ble cpy
/* 清除BSS段 */
ldr r1, =__bss_start
ldr r2, =_end
mov r3, #0
clean:
str r3, [r1]
add r1, r1, #4
cmp r1, r2
ble clean
改為:
/* 重定位text, rodata, data段整個(gè)程序 */
mov r0, #0
ldr r1, =_start /* 第1條指令運(yùn)行時(shí)的地址 */
ldr r2, =__bss_start /* bss段的起始地址 */
sub r2, r2, r1 /*長度*/
bl copy2sdram /* src, dest, len */
/* 清除BSS段 */
ldr r0, =__bss_start
ldr r1, =_end
bl clean_bss /* start, end */
1、在init.c 實(shí)現(xiàn)如上兩個(gè)C函數(shù)
void copy2sdram(volatile unsigned int *src, volatile unsigned int *dest, unsigned int len) /* src, dest, len */
{
unsigned int i = 0;
while (i < len)
{
*dest++ = *src++;
i += 4;
}
}
void clean_bss(volatile unsigned int *start, volatile unsigned int *end) /* start, end */
{
while (start <= end)
{
*start++ = 0;
}
}
匯編中,為C語言傳入的參數(shù),依次就是R1、R2、R3。
編譯,燒寫運(yùn)行沒有問題。
我們假設(shè)不想?yún)R編傳入?yún)?shù),而是C語言直接取參數(shù)。
1、修改start.S 跳轉(zhuǎn)到C函數(shù)不需要任何參數(shù)
bl sdram_init
//bl sdram_init2 /* 用到有初始值的數(shù)組, 不是位置無關(guān)碼 */
/* 重定位text, rodata, data段整個(gè)程序 */
bl copy2sdram
/* 清除BSS段 */
bl clean_bss
2、修改鏈接腳本,讓__code_start 等于當(dāng)前地址,也就是這里的0x30000000
SECTIONS
{
. = 0x30000000;
__code_start = .; //定義__code_start地址位當(dāng)前地址
. = ALIGN(4);
.text :
{
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) *(.COMMON) }
_end = .;
}
3、修改init.c 用函數(shù)來獲取參數(shù)
void copy2sdram(void)
{
/* 要從lds文件中獲得 __code_start, __bss_start
* 然后從0地址把數(shù)據(jù)復(fù)制到__code_start
*/
extern int __code_start, __bss_start;//聲明外部變量
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
while (dest < end)
{
*dest++ = *src++;
}
}
void clean_bss(void)
{
/* 要從lds文件中獲得 __bss_start, _end
*/
extern int _end, __bss_start;
volatile unsigned int *start = (volatile unsigned int *)&__bss_start;
volatile unsigned int *end = (volatile unsigned int *)&_end;
while (start <= end)
{
*start++ = 0;
}
}
編譯燒寫運(yùn)行 ,沒有問題。
總結(jié):
C函數(shù)怎么使用lds文件總的變量abc?
1、在C函數(shù)中聲明改變量為extern外部變量類型,比如extern int abc;
2、使用時(shí),要取址,比如:int *p = &abc;//p的只即為lds文件中abc的值
匯編文件中可以直接使用外部鏈接腳本中的變量,但C函數(shù)中要加上取址符號。
解釋一下原因:
C函數(shù)中,定義一個(gè)全局變量int g_i;程序中必然有4字節(jié)的空間留出來給這個(gè)變量g_i
假如我們的lds文件中有很多變量
lds{
a1 = ;
a2 = ;
a3 = ;
...
}
如果我們C程序只用到幾個(gè)變量,完全沒必要全部存儲lds里面的所有變量,C程序是不保存lds中的變量的。
對于萬一要用到的變量,編譯程序時(shí),有一個(gè)symbol table符號表:
如何使用symbol table符號表?
1、對于常規(guī)變量g_i,得到里面的值,使用&g_i得到addr;
2、為了保持代碼的一致,對于lds中的a1,使用&a1得到里面的值;
結(jié)論:
1、C程序中不保存lds文件中的變量,lds再大也不影響;
2、借助symbol table保存lds的變量,使用時(shí)加上”&”得到它的值,鏈接腳本的變量要在C程序中聲明為外部變量,任何類型都可以;
上一篇:S3c2440代碼重定位詳解5---代碼重定位與位置無關(guān)碼
下一篇:S3c2440ARM異常與中斷體系詳解1---概念引入與處理流程
推薦閱讀
史海拾趣
Chip Technologies Inc自成立以來,一直致力于芯片技術(shù)的研發(fā)與創(chuàng)新。在某一年,公司成功研發(fā)出一款具有劃時(shí)代意義的芯片,這款芯片在功耗、性能及集成度等方面均達(dá)到了行業(yè)領(lǐng)先水平。這一技術(shù)突破迅速贏得了市場的認(rèn)可,公司訂單量激增,業(yè)績大幅提升。隨著技術(shù)的不斷迭代與完善,Chip Technologies Inc逐漸在電子行業(yè)樹立起了技術(shù)領(lǐng)先的形象,并成功吸引了眾多投資者的關(guān)注。
隨著全球化趨勢的加速推進(jìn),Cableform Inc公司開始實(shí)施全球化戰(zhàn)略。公司在全球范圍內(nèi)設(shè)立了多個(gè)分支機(jī)構(gòu)和研發(fā)中心,加強(qiáng)了與國際同行的合作與交流。同時(shí),公司還積極參與國際展覽和技術(shù)研討會等活動,展示了其最新的技術(shù)成果和產(chǎn)品應(yīng)用。這些舉措不僅提升了公司在國際市場的知名度和影響力,也為公司的長期發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
這五個(gè)故事雖然是虛構(gòu)的,但它們反映了Cableform Inc公司可能經(jīng)歷的一些重要發(fā)展階段和關(guān)鍵事件。當(dāng)然,實(shí)際的發(fā)展過程可能更加復(fù)雜和多變,但無論如何,這些故事都展現(xiàn)了公司在電子行業(yè)中的堅(jiān)韌不拔和不斷進(jìn)取的精神。
在市場競爭日益激烈的情況下,E-San Electronic Co Ltd積極尋求市場拓展的新策略。公司通過與國內(nèi)外知名企業(yè)的合作,成功進(jìn)入了國際市場。同時(shí),公司還加大了對新興市場的開拓力度,通過參加各種國際展會和商務(wù)活動,提升了品牌知名度和影響力。此外,公司還積極探索線上線下相結(jié)合的銷售模式,通過電商平臺和社交媒體等新興渠道拓展銷售渠道。
FINISAR在光模塊領(lǐng)域取得了多項(xiàng)重要技術(shù)創(chuàng)新和突破。例如,公司在1992年推出了首個(gè)850nm的千兆多模光纖光收發(fā)模塊,隨后在1995年推出了帶數(shù)字診斷功能的光收發(fā)模塊,這些創(chuàng)新產(chǎn)品極大地推動了光通信技術(shù)的發(fā)展。此外,F(xiàn)INISAR還不斷推出新產(chǎn)品以滿足市場需求,如SFP光模塊、CWDM GBIC光模塊等,這些產(chǎn)品均獲得了市場的廣泛認(rèn)可。
為了拓展業(yè)務(wù)范圍和提升品牌影響力,CQR SECURITY公司開始實(shí)施國際化戰(zhàn)略。公司積極開拓海外市場,與多個(gè)國家的電子企業(yè)建立了合作關(guān)系。同時(shí),CQR還加強(qiáng)了與國際安全組織的交流與合作,共同推動全球網(wǎng)絡(luò)安全水平的提升。通過國際化戰(zhàn)略的成功實(shí)施,CQR不僅拓展了業(yè)務(wù)版圖,還提升了自身的技術(shù)水平和國際競爭力。
在20世紀(jì)80年代初,隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,對于高性能、低功耗的半導(dǎo)體器件需求日益增長。在這樣的背景下,一家名為“先進(jìn)微電子”(Advanced Micro Devices, AMD)的公司開始專注于CMOS技術(shù)的研發(fā)。AMD的工程師們通過不斷的實(shí)驗(yàn)和優(yōu)化,成功推出了首款高性能CMOS處理器,這款處理器以其卓越的性能和穩(wěn)定性迅速獲得了市場的認(rèn)可。隨著技術(shù)的不斷進(jìn)步,AMD在CMOS領(lǐng)域持續(xù)創(chuàng)新,逐步發(fā)展成為全球知名的半導(dǎo)體企業(yè)。
Wince 5.0 奇怪死機(jī)問題,大家?guī)兔Ψ治鲆幌隆?/a> mmsp20,wince 5.0系統(tǒng),7寸液晶,帶觸模。 在播放器的界面下,點(diǎn)擊空白的地方(非功能按鈕)。 連續(xù)點(diǎn)擊1~3小時(shí)后,系統(tǒng)全死了。(大概0.5秒點(diǎn)一次) 在點(diǎn)擊屏蔽時(shí)播放會停頓一下。 請大家?guī)兔Ψ治鲆幌率鞘裁丛颍俊? 查看全部問答∨ |
|
SerialPort可以在WINCE平臺上應(yīng)用嗎? .NET Compact Framework 2.0 里面的SerialPort類在WINCE下讀取串口時(shí)出錯(cuò). 錯(cuò)誤信息: 端口COM1不存在. 疑惑: 1.SerialPort不可以在WINCE平臺上應(yīng)用嗎? 2.設(shè)備(NEC POKER)不支持COM口? 3.能提供些在WINCE下讀取串口的資料嗎? 謝謝!… 查看全部問答∨ |
一、簡介 異常:也就是意外突發(fā)事件,該請求來自外面,來自片上外設(shè)秒外擴(kuò)的外設(shè)。 可是說是異步的。 中斷:是因內(nèi)核活動產(chǎn)生的,如在執(zhí)行命令和訪問存儲器時(shí)產(chǎn)生。應(yīng)是同步。 Corter-M3的異常響應(yīng)系統(tǒng),支持眾多的系統(tǒng)異常和外部 ...… 查看全部問答∨ |
剛剛下了3.3.0版本的標(biāo)準(zhǔn)外設(shè)庫,啟動文件中這樣寫的 Select the corresponding startup file depending of the used device: - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_l ...… 查看全部問答∨ |
想請教一下,運(yùn)放用雙電源供電時(shí),有沒有必要設(shè)計(jì)輸出電壓精度較高的對稱電源,我在書上看到這樣有助于減少輸入失調(diào)電壓。后來我又在網(wǎng)上查了點(diǎn)資料,也看到有很多電源并不是對稱的,有的甚至相差很大,請問這是什么原因?… 查看全部問答∨ |
找了一天了,是在找不出來哪兒錯(cuò)了,我是看天狼星編程的,沒辦法了,只能求助各位大神了。大家有空就請幫幫忙吧,糾結(jié)死我了 溫度傳感器正常,我用開發(fā)板的hex文件試過。 #include<reg52.h>#define uint unsigned int #define uchar unsigned ...… 查看全部問答∨ |
|
zigbee學(xué)習(xí)筆記---Channel、PANID、發(fā)射功率及其它參數(shù) 現(xiàn)對z-stack里幾個(gè)網(wǎng)絡(luò)參數(shù)的設(shè)置以及如何獲取總結(jié)一下。信道配置:Zigbee在3個(gè)頻段定義了27個(gè)物理信道:868MHz頻段中定義了1個(gè)20Kb/s信道,915MHz頻段中定義了10個(gè)40Kb/s信道,信道間隔為2MHz,2.4GHz頻段上定義了16個(gè)250Kb/s信道,信道間隔為5MHz ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌穩(wěn)居微控制器領(lǐng)域榜首,鞏固其在全球車用半導(dǎo)體市場的領(lǐng)導(dǎo)地位
- 迅為imx6ull開發(fā)板使用c語言調(diào)用shell命令控制led燈
- 迅為IMX8MM開發(fā)板Android編譯環(huán)境搭建
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的使用
- 迅為ITOP4412開發(fā)板Qt界面添加圖片
- 迅為IMX6開發(fā)板OTA遠(yuǎn)程升級-SWUpdata概述和使用
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的搭建
- 迅為IMX6開發(fā)板Buildroot文件系統(tǒng)4G撥號上網(wǎng)工具測試
- 實(shí)驗(yàn)分享丨迅為IMX6ULL開發(fā)板點(diǎn)亮第一個(gè)led燈
- 英飛凌穩(wěn)居微控制器領(lǐng)域榜首,鞏固其在全球車用半導(dǎo)體市場的領(lǐng)導(dǎo)地位
- 自動駕駛算法迭代升級,智能汽車如何突破L4級技術(shù)瓶頸
- 域控制器 —— 下一代智能汽車電子軟件體系的關(guān)鍵元素
- Altera Agilex?? 7 M 系列FPGA正式量產(chǎn),提供行業(yè)領(lǐng)先的內(nèi)存帶寬
- 如何幫助提高混合動力汽車電動汽車電池?cái)嚅_系統(tǒng)的安全性和效率
- 使用理想二極管控制器的汽車應(yīng)用冗余電
- 電動汽車電子系統(tǒng)架構(gòu)
- 如何為汽車電子設(shè)備選擇合適的電容器
- 電動汽車快充、慢充、低壓充電以及制動能量詳解
- 基于CAN總線的電動汽車電源管理通信系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
- 基于Android Automotive OS 的Cerence Drive對話式AI平臺已經(jīng)上市
- 西安聯(lián)乘攜手紫光展銳聯(lián)合發(fā)布基于8910FV LTE Cat 1平臺的前裝車載解決方案
- 孚能330Wh/kg新電池,有多厲害?怎么做到的?
- 大容量電池往110kWh發(fā)展
- IAIC中國芯應(yīng)用創(chuàng)新設(shè)計(jì)大賽正式啟動——芯賦能 新生態(tài)
- 優(yōu)必選Alpha Ebot上線 教育機(jī)器人邁向智能時(shí)代
- 法律“機(jī)器人”提供24小時(shí)免費(fèi)咨詢
- 智能化轉(zhuǎn)型:中國工業(yè)機(jī)器人市場都將維持高速增長態(tài)勢
- 2018年中國65家機(jī)器人產(chǎn)業(yè)園布局與規(guī)劃匯總盤點(diǎn)
- 逆變器過冬靠什么
- 【TI薦課】#滿足工業(yè)應(yīng)用中的低靜態(tài)電流需求的寬輸入 DC/DC 轉(zhuǎn)換器#
- 鑒于開始提的問題可能太幼稚,現(xiàn)在請前輩們指導(dǎo)一點(diǎn)干貨
- 填問卷抽好禮:深度挖掘工業(yè)設(shè)計(jì)的痛點(diǎn)和難點(diǎn)!TI 工業(yè)月,靈感不設(shè)限!
- 大聲哭嚎跪求wince觸摸屏驅(qū)動開發(fā)資料!
- MC509 3G 模塊串口使用問題
- 430脈沖輸出
- PCI主模式傳輸需要用到主板上的DMA嗎?
- 為1953年產(chǎn)Biennophone增加MP3功能
- 平衡放大器的優(yōu)點(diǎn)
- 關(guān)于lwip的httpd.c的問題