日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] cmd文件是編譯完成之后鏈接各個(gè)目標(biāo)文件時(shí),用來指示各個(gè)數(shù)據(jù)、符號等是如何劃分到各個(gè)段,以及每個(gè)段所使用的存儲空間的。許多筒子對cmd文件有畏難情緒,不容易理解各個(gè)段的含義,特別是在程序編譯沒有問題,但是在

 cmd文件是編譯完成之后鏈接各個(gè)目標(biāo)文件時(shí),用來指示各個(gè)數(shù)據(jù)、符號等是如何劃分到各個(gè)段,以及每個(gè)段所使用的存儲空間的。許多筒子對cmd文件有畏難情緒,不容易理解各個(gè)段的含義,特別是在程序編譯沒有問題,但是在鏈接生成可執(zhí)行的.out遇到錯(cuò)誤時(shí)更容易手足無措,所以我們就來詳細(xì)解讀一下cmd文件的具體含義。

C28x的編譯器把存儲空間劃分為兩個(gè)部分進(jìn)行管理,包括:

1. 程序存儲空間:包含可執(zhí)行的代碼,初始化的記錄和switch-case使用的表。

2. 數(shù)據(jù)存儲空間:包含外部變量,靜態(tài)變量以及系統(tǒng)的棧;一般情況下,各個(gè)寄存器對應(yīng)的存儲空間也歸類在數(shù)據(jù)空間里。

為了方便管理,不同種類的代碼、變量等往往又被分別分配到不同的段(section)之中,然后對存儲空間的劃分就變成了對段的地址分配問題了。例如,在下面的代碼中,就規(guī)定了.text這個(gè)段會存放在RAM中Page0下面的RAML1中,RAML1的起始地址是0x009000,長度是0x001000。

MEMORY

{

/* 省略不在此顯示的代碼 */

PAGE 0 :

RAML1 : origin = 0x009000, length = 0x001000

RAML2 : origin = 0x00A000, length = 0x001000

/* 省略不在此顯示的代碼 */

SECTIONS

{

/* 省略不在此顯示的代碼 */

.text : > RAML1, PAGE = 0

/* 省略不在此顯示的代碼 */

一般情況下,我們的代碼不會大到無法存儲,但是也有可能因?yàn)榇a特別多導(dǎo)致無法存儲,產(chǎn)生.text的實(shí)際大小是size xxx,但是RAML1的size只有yyy這樣的鏈接錯(cuò)誤,以至于無法生成輸出文件。此時(shí)我們可以把上面對應(yīng)的RAML1的長度,即length增大,使得.text段所分配的地址空間變多。但是RAML1地址空間擴(kuò)大之后,擠占了RAML2的空間,導(dǎo)致地址重疊,此時(shí)RAML2的起始位置要后移,其長度也要相應(yīng)地縮減,才能不產(chǎn)生地址覆蓋錯(cuò)誤;修改之后可以為:

RAML1 : origin = 0x009000, length = 0x001500

RAML2 : origin = 0x00A500, length = 0x000500

還有一個(gè)解決方法則是把.text給分配到其它更長的地址空間里去;如果沒有現(xiàn)成的地址范圍比較長的段,也可以合并現(xiàn)有的段,修改方法比如把RAML2刪除,把它的地址全部合并到RAML1中去,而.text還是分配在RAML1,就沒有問題了。刪除RAML2的時(shí)候要注意,它在沒有被任何段使用的情況下才能操作,否則編譯、鏈接的時(shí)候又提示其它的段找不到對應(yīng)的存儲單元了。

下面我們就解釋一下各個(gè)段的含義:

一.初始化的段

其中包含了數(shù)據(jù)和可執(zhí)行代碼,通常情況下是只讀的。它們包括:

1 .cinit和.pinit

包含了初始化變量和常量所用的表格,是只讀的。

C28x .cinit被限制在16bit范圍內(nèi),即低64K范圍。

2 .const

包含了字符串常量、字符串文字、選擇表以及使用const關(guān)鍵字定義(但是不包括volatile類型,并假設(shè)使用小內(nèi)存模型)的只讀型變量。

3 .econst

包含了字符串常量,以及使用far關(guān)鍵字定義的全局變量和靜態(tài)變量。

4 .switch

存放switch-case指令所使用的選擇表。

5 .text

通常是只讀的,包含所有可執(zhí)行的代碼,以及編譯器編譯產(chǎn)生的常量。

二.無初始化的段

無初始化的段雖然不會被初始化,但是仍然需要在存儲單元(一般是RAM)中保留相關(guān)的地址空間。它們包括:

1 .bss

為全局和靜態(tài)變量保留存儲空間。在啟動或者程序加載的時(shí)候,C/C++的啟動程序會把.cinit段中的數(shù)據(jù)(一般存放在ROM中)復(fù)制到.bss段中。

2 .ebss

為far關(guān)鍵字定義(僅適用于C代碼)的全局和靜態(tài)變量保留存儲空間。在啟動或者程序加載的時(shí)候,C/C++的啟動程序會把.cinit段中的數(shù)據(jù)(一般存放在ROM中)復(fù)制到.ebss段中。

3 .stack

默認(rèn)情況下,棧(stack)保存在.stack段中(參考boot.asm),這個(gè)段用來為棧保留存儲空間。棧(stack)的作用主要有:

1) 保留存儲空間用于存儲傳遞給函數(shù)的參數(shù);

2) 為局部變量分配相關(guān)的地址空間;

3) 保存處理器的狀態(tài);

4) 保存函數(shù)的返回地址;

5) 保存某些臨時(shí)變量的值。

需要注意的是,.stack段只能使用低64K地址的數(shù)據(jù)存儲單元,因?yàn)镃PU的SP寄存器是16位的,它無法讀取超過64K的地址范圍。此外,編譯器無法檢查棧的溢出錯(cuò)誤(除非我們自己編寫某些代碼來檢測),這將導(dǎo)致錯(cuò)誤的輸出結(jié)果,所以要為棧分配一個(gè)相對較大的存儲空間,它的默認(rèn)值是1K字。改變棧的大小的操作可以通過編譯器選項(xiàng)--stack_size來完成。

4 .sysmem

為動態(tài)內(nèi)存分配保留存儲空間,從而為malloc,calloc,realloc和 new等動態(tài)內(nèi)存分配程序服務(wù)。如果這幾個(gè)動態(tài)內(nèi)存管理函數(shù)沒有在C/C++代碼中用到的話,則不需要?jiǎng)?chuàng)建.sysmem段。

此外,我們經(jīng)常提到“堆棧”,在這里我們只講了棧,那堆(heap)是干啥的呢?堆就是是用來做動態(tài)內(nèi)存分配的,因?yàn)樵贒SP上RAM資源仍然是相對寶貴的,所以堆占用的存儲空間不能無限擴(kuò)展,對于near關(guān)鍵字修飾的堆,其占用的地址空間最大只能到32K字;對于far關(guān)鍵字修飾的堆,它使用的存儲空間由編譯器自動設(shè)置,默認(rèn)只有1K字。

5 .esysmem

為far malloc函數(shù)分配動態(tài)存儲空間。如果沒有用到這個(gè)函數(shù),則編譯器不會自動創(chuàng)建.esysmem段。

對于匯編器,它會自動創(chuàng)建.text, .bss和.data三個(gè)段。我們可以使用#pragma CODE_SECTION和#pragma DATA_SECTION來創(chuàng)建更多的段。

默認(rèn)情況下,各個(gè)段所分配的存儲空間配置如下(可根據(jù)需要進(jìn)行更改):

最后,以一個(gè)ADC寄存器對應(yīng)的內(nèi)存地址分配的例子,來看看完成的cmd文件是如何完成的(事實(shí)上所有寄存器的內(nèi)存地址分配在TI的外設(shè)和頭文件包中已經(jīng)幫我們做好了,這里是個(gè)演示)。

首先,在使用寄存器(或者自定義的變量)的頭文件或者源程序里,為寄存器(或者自定義的變量)指定一個(gè)自定義的段:

#ifdef __cplusplus

#pragma DATA_SECTION("AdcRegsFile")

#else

#pragma DATA_SECTION(AdcRegs,"AdcRegsFile");

#endif

volatile struct ADC_REGS AdcRegs; //使得結(jié)構(gòu)體被分配在指定的段中

然后,在cmd文件中,在SECTIONS下把AdcRegsFile這個(gè)段分配到ADC這塊內(nèi)存區(qū)域中,并在MEMORY中定義ADC這塊內(nèi)存區(qū)域的起始位置和長度。

MEMORY

{

PAGE 0: /* Program Memory */

/* 省略不相關(guān)內(nèi)容的顯示 */

PAGE 1: /* Data Memory */

/* 省略不相關(guān)內(nèi)容的顯示 */

ADC : origin = 0x007100, length = 0x000020 /* ADC registers */

/* 省略不相關(guān)內(nèi)容的顯示 */

}

SECTIONS

{

/* 省略不相關(guān)內(nèi)容的顯示 */

AdcRegsFile : > ADC, PAGE = 1

/* 省略不相關(guān)內(nèi)容的顯示 */

}

以上是一個(gè)自定義段并制定內(nèi)存區(qū)域的完整例子。如果不需要這樣的自定義,則可以不去管它,使用現(xiàn)有的,比如某個(gè)例子中可以使用的cmd文件就可以了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

工業(yè)自動化、醫(yī)療電子及精密測試領(lǐng)域,微弱信號的精準(zhǔn)采集與處理是系統(tǒng)性能的核心挑戰(zhàn)。以24位Σ-Δ ADC為核心的高精度數(shù)據(jù)轉(zhuǎn)換系統(tǒng),結(jié)合激光修調(diào)電阻陣列的微弱信號調(diào)節(jié)器,通過動態(tài)元件匹配(DEM)技術(shù)與激光微納加工工藝的...

關(guān)鍵字: ADC 動態(tài)元件匹配

2025年7月8日,致力于亞太地區(qū)市場的國際領(lǐng)先半導(dǎo)體元器件分銷商---大聯(lián)大控股宣布,其旗下品佳推出基于微芯科技(Microchip)dsPIC33CK256MP506主控MCU的3.3KW雙向圖騰柱PFC逆變電源方案...

關(guān)鍵字: 電源 MCU ADC

納祥科技在原來的基礎(chǔ)上更新了一款高性能音頻I2S 114DB ADC,它能夠以高達(dá)192kHz的采樣率,執(zhí)行立體聲模擬到數(shù)字轉(zhuǎn)換,最高支持24位串行值,并具備114dB動態(tài)范圍,-100dB THD+N,功能可覆蓋CS5...

關(guān)鍵字: 納祥科技 ADC 國產(chǎn)芯片

最新 DSC 器件配備專用外設(shè),適用于數(shù)據(jù)中心電源及其他復(fù)雜實(shí)時(shí)系統(tǒng)

關(guān)鍵字: PWM 分辨率 ADC 數(shù)字信號控制器

在電子系統(tǒng)設(shè)計(jì)中,模數(shù)轉(zhuǎn)換器(ADC)的前端輸入配置是至關(guān)重要的環(huán)節(jié),它直接關(guān)系到信號采集的精度、穩(wěn)定性和可靠性。ADC前端輸入配置的選擇不僅需要考慮信號的特性、系統(tǒng)的需求,還需要兼顧成本、功耗以及實(shí)現(xiàn)的復(fù)雜度。

關(guān)鍵字: ADC 電源

便攜式血糖儀作為糖尿病管理的核心工具,其信號鏈性能直接影響檢測精度與用戶體驗(yàn)。隨著超小型ADC(模數(shù)轉(zhuǎn)換器)技術(shù)的突破,通過優(yōu)化信號鏈設(shè)計(jì)可顯著提升血糖儀的靈敏度、功耗與集成度。本文以凌力爾特(Linear Techno...

關(guān)鍵字: ADC 便攜式血糖儀

在工業(yè)自動化領(lǐng)域,工業(yè)信號調(diào)節(jié)器作為核心硬件設(shè)備,承擔(dān)著信號采集、轉(zhuǎn)換、傳輸與隔離的關(guān)鍵任務(wù)。其硬件設(shè)計(jì)需兼顧信號精度、抗干擾能力、實(shí)時(shí)性與安全性,尤其需重點(diǎn)優(yōu)化信號調(diào)理電路、模數(shù)/數(shù)模轉(zhuǎn)換(ADC/DAC)模塊以及隔離...

關(guān)鍵字: ADC DAC 隔離模塊

上海2025年3月27日 /美通社/ -- 邁威生物(688062.SH),一家全產(chǎn)業(yè)鏈布局的創(chuàng)新型生物制藥公司,與英矽智能,一家由生成式人工智能驅(qū)動的生物醫(yī)藥科技公司宣布達(dá)成戰(zhàn)略合作,基于雙方各自在 ADC 研發(fā)和人工...

關(guān)鍵字: ADC AI 人工智能 智能驅(qū)動

在現(xiàn)代工業(yè)與信息化社會,電源系統(tǒng)的穩(wěn)定性和可靠性對于各種設(shè)備的正常運(yùn)行至關(guān)重要。為了實(shí)現(xiàn)對電源系統(tǒng)的有效管理和維護(hù),設(shè)計(jì)一個(gè)具有遠(yuǎn)程監(jiān)控功能的電源系統(tǒng)顯得尤為重要。本文將詳細(xì)介紹一個(gè)通過網(wǎng)絡(luò)(如Ethernet或Wi-F...

關(guān)鍵字: 電源系統(tǒng) 遠(yuǎn)程監(jiān)控 ADC

在現(xiàn)實(shí)生活中,我們面對的信號大多為連續(xù)信號。然而,數(shù)字信號處理技術(shù)已取得了顯著進(jìn)展,因此,我們常常需要將連續(xù)信號轉(zhuǎn)換為數(shù)字信號,以便在計(jì)算機(jī)或FPGA等設(shè)備上進(jìn)行數(shù)字處理。ADC與DAC恰好扮演了這一角色,它們是模擬連續(xù)...

關(guān)鍵字: ADC DAC
關(guān)閉