娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年09月10日(星期二)

正在發(fā)生

2021年09月10日 | S3c2440代碼重定位詳解6---重定位清除BSS段的C函數(shù)實(shí)現(xiàn)

發(fā)布者:腦電狂潮 來源: eefocus關(guān)鍵字:S3c2440  代碼重定位  C函數(shù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

在前面,我們使用匯編程序來實(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程序中聲明為外部變量,任何類型都可以;

關(guān)鍵字:S3c2440  代碼重定位  C函數(shù) 引用地址:S3c2440代碼重定位詳解6---重定位清除BSS段的C函數(shù)實(shí)現(xiàn)

上一篇:S3c2440代碼重定位詳解5---代碼重定位與位置無關(guān)碼
下一篇:S3c2440ARM異常與中斷體系詳解1---概念引入與處理流程

推薦閱讀

本例程測試STOP_RTC模式的真實(shí)功耗,主程序如下:int main(void){ while(1) { HAL_Delay(5000); Target.HAL.Rtc.EnterStopRtcMode(); Target.HAL.SystemClock.SetMode(2); }} 系統(tǒng)進(jìn)入主循環(huán)后,先進(jìn)行5秒延時(shí),然后進(jìn)入低功耗模式,低功耗模式設(shè)置的RTC時(shí)間為4秒,4秒過后退出低功耗模式,重新進(jìn)行時(shí)鐘設(shè)置。 在進(jìn)入main函數(shù)之...
儒卓力(Rutronik Elektronische Bauelemente GmbH)和中國臺灣聲學(xué)元件制造商志豐電子簽訂全球分銷協(xié)議。該協(xié)議涵蓋志豐電子的所有產(chǎn)品,并已生效。 志豐電子在電信、汽車、安全和安保、智能家居、醫(yī)療技術(shù)、工業(yè)和消費(fèi)產(chǎn)品等各個(gè)關(guān)鍵領(lǐng)域提供聲學(xué)組件及支持。該公司擁有全面廣泛的產(chǎn)品系列,可讓客戶選擇從帶或不帶電子元件的壓磁蜂鳴器到微型揚(yáng)聲器和...
眾所周知,顯微外科手術(shù)往往伴隨著極大的風(fēng)險(xiǎn),需要醫(yī)生極其精細(xì)且復(fù)雜的操作,如此還是難免意外的發(fā)生。為了避免出現(xiàn)更多的意外,科學(xué)家們希望可以制造出機(jī)器人來替代一部分需要人手的工作,減輕醫(yī)生的負(fù)擔(dān),也保證手術(shù)的安全與穩(wěn)定。從而來自索尼集團(tuán)和哈佛大學(xué)的研究者們 (Hiroyuki Suzuki和Robert J. Wood) 基于折紙結(jié)構(gòu)研發(fā)了一款超輕便,高...
技術(shù)發(fā)展迅猛的今天,汽車相關(guān)技術(shù)在不斷革新,從傳統(tǒng)燃油到現(xiàn)如今的新能源,汽車品類也越來越豐富,人們對于汽車的安全性、舒適性等都提出了更高的要求。在整車系統(tǒng)中,遍布汽車內(nèi)部的線束對整車來說很重要,今天我們就線束生產(chǎn)加工及線束線纜測試進(jìn)行介紹。汽車線束線纜生產(chǎn)加工流程線束生產(chǎn)加工制作流程分為以下幾部分:裁線→脫外皮→刷線→扭線→沾錫...

史海拾趣

問答坊 | AI 解惑

原理圖

有 哪位高手能給我單片機(jī)下載模塊的原理圖以及和80c51的接線圖?…

查看全部問答∨

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下讀取串口的資料嗎? 謝謝!…

查看全部問答∨

LM3s8962體驗(yàn)之八……異常與中斷

一、簡介 異常:也就是意外突發(fā)事件,該請求來自外面,來自片上外設(shè)秒外擴(kuò)的外設(shè)。    可是說是異步的。 中斷:是因內(nèi)核活動產(chǎn)生的,如在執(zhí)行命令和訪問存儲器時(shí)產(chǎn)生。應(yīng)是同步。 Corter-M3的異常響應(yīng)系統(tǒng),支持眾多的系統(tǒng)異常和外部 ...…

查看全部問答∨

stm32f103vb屬于哪個(gè)產(chǎn)品線?

剛剛下了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 ...…

查看全部問答∨

關(guān)于運(yùn)放電源的問題

想請教一下,運(yùn)放用雙電源供電時(shí),有沒有必要設(shè)計(jì)輸出電壓精度較高的對稱電源,我在書上看到這樣有助于減少輸入失調(diào)電壓。后來我又在網(wǎng)上查了點(diǎn)資料,也看到有很多電源并不是對稱的,有的甚至相差很大,請問這是什么原因?…

查看全部問答∨

新手學(xué)習(xí)之溫度傳感器程序

找了一天了,是在找不出來哪兒錯(cuò)了,我是看天狼星編程的,沒辦法了,只能求助各位大神了。大家有空就請幫幫忙吧,糾結(jié)死我了 溫度傳感器正常,我用開發(fā)板的hex文件試過。 #include<reg52.h>#define uint unsigned int #define uchar unsigned ...…

查看全部問答∨

pcb設(shè)計(jì)

我想請問一下,學(xué)習(xí)PCB布線需要看哪些書?現(xiàn)在的公司一般用什么軟件制板?…

查看全部問答∨

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 ...…

查看全部問答∨

ok335xd原理圖

ok335xd核心板原理圖 ok335xd底板原理圖…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 北流市| 汉源县| 常德市| 博爱县| 大田县| 攀枝花市| 宜良县| 泸溪县| 西乌珠穆沁旗| 济宁市| 象山县| 玛多县| 凤山市| 宜丰县| 荔浦县| 龙口市| 尚义县| 珠海市| 三原县| 永嘉县| 金溪县| 青州市| 明光市| 汶川县| 丘北县| 丰台区| 平顶山市| 临潭县| 黑山县| 广东省| 东兰县| 金塔县| 清苑县| 阜阳市| 黑山县| 历史| 柳河县| 东海县| 资源县| 舞钢市| 孝义市|