eCos記憶體布局檔案詳細介紹

來源:互聯網
上載者:User

移植eCos時,對其記憶體布局檔案內容比較疑惑,特別不理解其中“SECTIONS”部分的含義。為理解eCos記憶體布局檔案中的內容,特此研究了一翻,這裡我以eCos中stm3210e評估板ROM啟動方式對應的記憶體布局檔案為例進行說明。

eCos的記憶體布局(the Memory Layout)檔案,由ldi檔案及其標頭檔組成,描述了目標板的儲存空間設計和定義了連結器指令碼輸出段(section)。一般情況 下,針對每種啟動方式(startup type),eCos中的模板都提供了對應的記憶體布局檔案。當建立自己的模板時,需要在CDL檔案中為每種啟動方式匹配對應的記憶體布局檔案。

stm3210e評估板ROM啟動方式對應的記憶體布局檔案

記憶體布局檔案在此目錄下:ecos/packages/hal/cortexm/stm32/stm3210e_eval/current/include/pkgconf,由ldi和h兩檔案組成。

mlt_cortexm_stm3210e_eval_rom.h檔案的代碼如下:

// eCos memory layout#ifndef __ASSEMBLER__#include <cyg/infra/cyg_type.h>#include <stddef.h>#endif#define CYGMEM_REGION_sram (0x20000000)#define CYGMEM_REGION_sram_SIZE (0x00010000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE)#define CYGMEM_REGION_sram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)#define CYGMEM_REGION_flash (0x08000000)#define CYGMEM_REGION_flash_SIZE (0x00080000)#define CYGMEM_REGION_flash_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)#define CYGMEM_REGION_ram (0x68000000)#define CYGMEM_REGION_ram_SIZE (0x00100000)#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)#define CYGMEM_REGION_rom (0x64000000)#define CYGMEM_REGION_rom_SIZE (0x01000000)#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R)#ifndef __ASSEMBLER__extern char CYG_LABEL_NAME (__heap1) [];#endif#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1))#define CYGMEM_SECTION_heap1_SIZE (CYGMEM_REGION_ram+CYGMEM_REGION_ram_SIZE - (size_t) CYG_LABEL_NAME (__heap1))

這是記憶體布局檔案的標頭檔,主要是定義了相關儲存空間的地址及其大小,供其它源檔案包含。

mlt_cortexm_stm3210e_eval_rom.ldi檔案的代碼如下:

// eCos memory layout#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.inc>MEMORY{    sram  : ORIGIN = 0x20000000, LENGTH = 0x00010000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE    flash : ORIGIN = 0x08000000, LENGTH = 0x00080000    rom   : ORIGIN = 0x64000000, LENGTH = 0x01000000    ram   : ORIGIN = 0x68000000, LENGTH = 0x00100000}SECTIONS{    SECTIONS_BEGIN    SECTION_rom_vectors (flash, 0x08000000, LMA_EQ_VMA)    SECTION_RELOCS (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_text (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_fini (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_rodata (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_rodata1 (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_fixup (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_gcc_except_table (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_eh_frame (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_got (flash, ALIGN (0x8), LMA_EQ_VMA)    SECTION_sram (sram, 0x20000400, FOLLOWING (.got))    SECTION_data (ram, 0x68000000, FOLLOWING (.sram))    SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA)    CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);    SECTIONS_END}hal_vsr_table = 0x20000000;hal_virtual_vector_table = hal_vsr_table + 128*4;hal_startup_stack = 0x20000000 + 1024*64;

這是記憶體布局檔案的ldi檔案,由2部分組成:MEMORY和SECTIONS。 MEMORY部分定義了目標板上儲存空間的配置(儲存區的地址和大小),這部分應該不難理解,難理解的是第2部分。

理解SECTIONS部分

SECTIONS部分,描述了連結器指令碼輸出段(section)的定義,大括弧裡面的語句都是一些宏調用。這些宏定義於:ecos/packages/hal/cortexm/arch/current/src/cortexm.ld檔案中。由於不同架構的處理器有不同的連結器輸出段(section),因此每種架構處理器對有對應的*.ld檔案,如ARM處理器則有arm.ld檔案。這ld檔案是連結器的指令檔,當編譯eCos時,最終會產生target.ld(還記得在哪裡嗎?),作為應用程式的連結指令碼。

cortexm.ld檔案,是連結指令碼,由連結器命令語言群組成。關於連結器命令語言,我們可以只需有所瞭解,如:它裡面定義的程式入口:ENTRY(reset_vector)。可從本博下載從網路上收集的連結器指令碼文檔知識,:http://velep.com/downloads?did=9

這裡介紹下SECTIONS部分這些宏定義的參數。

  1. The memory region in which the section will finally reside.
  2. The final address ( VMA ) of the section. This is expressed using one of the following forms:
    n
    at the absolute address specified by the unsigned integer  n
    ALIGN ( n)
    following the final location of the previous section with alignment to the next  n-byte boundary
  3. The initial address (LMA) of the section. This is expressed using one of the following forms:
    LMA_EQ_VMA
    the LMA equals the VMA (no relocation)
    AT ( n)
    at the absolute address specified by the unsigned integer  n
    FOLLOWING (. name)
    following the initial location of section  name

上面是引用eCos英文手冊中的解釋,之所以不翻譯,是因為我覺得英文更能正確表達這些宏參數的意思。

關於段(section)

正如上面所說,不同架構的處理器其連結器指令碼中的段(section)名稱和定義有所不同。這裡列出我對其中一些段的理解(具體參考處理器對應的GCC手冊):

  • SECTION_text:放置程式碼的段;
  • SECTION_data:初始化資料區段;
  • SECTION_bss: 未初始化資料區段;

參考資料

  • http://ecos.sourceware.org/docs-3.0/user-guide/modifying-the-memory-layout.html
  • http://sourceware.org/ml/ecos-discuss/2006-09/msg00081.html
  • http://blog.21ic.com/user1/1575/archives/2005/4090.html
» 文章出處:
reille blog , 除非特別聲明,均為原創作品,轉載請註明出處 » 本文地址:
http://velep.com/archives/579.html 推薦閱讀相關文章:
  • stm32移植ecos #11,使用自己的模板(Template)
  • stm32移植ecos #10,移植ecos並成功運行helloworld程式,燒寫到內部flash直接運行helloworld程式
  • stm32移植ecos #9,移植ecos並成功運行helloworld程式,使用redboot引導運行記憶體中的helloworld程式
  • stm32移植ecos #8,移植ecos並成功運行helloworld程式,編譯連結產生helloworld程式
  • stm32移植ecos #7,移植ecos並成功運行helloworld程式,配置編譯產生靜態連結庫檔案
  • stm32移植ecos #6,redboot的疑問和問題,redboot是必需的嗎?
  • stm32移植ecos #5,移植redboot(ROM啟動方式)下篇
  • stm32移植ecos #4,移植redboot(ROM啟動方式)上篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.