STM32F4的sct文件理解


原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以下為摘抄:

一:什么時候使用scatter file:

1、存在復雜的地址映射:例如代碼和數據需要分開存放在多個區域。

2、存在多個存儲器類型:包含Flash, ROM, SDRAM,快速SRAM。我們根據代碼與數據的特性把他們發在不同的存儲器中,比如中斷處理部分放在快速SRAM內部來提高響應速度,而把不常用到的代 碼放到速度比較慢的Flash內。

3、函數的地址固定定位:可以利用Scatter file實現把某個函數放在固定地址,而不管其應用程序是否已經改變或重新編譯。

4、利用符號確定堆和堆棧。

5、內存映射的IO:利用scatter file可以實現把某個數據段放在精確的地址處。因此對於嵌入式系統來說scatter file是必不可少的,因為嵌入式系統采用了ROM, RAM和內存映射的IO。

分散加載文件(即scatter file后綴為.scf)是一個文本文件,通過編寫一個分散加載文件來指定ARM連接器在生成映像文件時如何分配RO,RW,ZI等數據的存放地址。如果不用SCATTER文件指定,那么ARM連接器會按照默認的方式來生成映像文件,一般情況下我們是不需要使用分散加載文件的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我現在的板子是STM32F429,外接了SDRAM,NandFlash,我想用sct文件的主要原因是要用到了nandflash,想把yaffs移植上去,但yaffs里面有大量的malloc,STM32F429的片內sram不足以完成這些malloc,故想到把堆放到SDRAM里面去,因此我的sct文件如下:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region  加載域,起始地址是0x08000000,大小是0x00100000
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address 執行地址,就是鏈接地址
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
}

ARM_LIB_HEAP 0xC0000000 0x80000 { ; 指定堆棧地址
RW_HEAP 0xC0000000 0x80000 {  
.ANY (HEAP)
}
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

分析下面這個sct文件

ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000         #堆開始於0x20100000這個地址,長度是正值,說明向高地址增長,大小是(0x100000-0x8000)
{
}

ARM_LIB_STACK 0x20200000 EMPTY - 0x8000                     #EMPTY后面的長度是負值,則表示0x20200000是這個執行區的結束地址,換句話說就是棧的起始地址是0x20200000,地址向下增長,大小是0x8000,那么結束地址就是(0x20200000-0x8000)
{
}

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再看下面這個復雜點的sct文件:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}

RW_IRAM_DATA 0x20000000 0x00030000 { ; RW data                                                                                                   #所有+RW,+ZI段的數據全部放在0x20000000這里,分配的大小是0x00030000,但這個空間不一定會用完,從下面的定義來看,真正的大小可以用

.ANY (+RW +ZI)                                                                                                                                                                  #ImageLimit(RW_IRAM_DATA)來表示,這是在編譯的時候就決定了的
}

ARM_LIB_STACK 0x20030000 EMPTY -(0x20030000 - ImageLimit(RW_IRAM_DATA)) ; Stack region growing down    #沒找到ImageLimit(RW_IRAM_DATA)的含義,猜測是程序編譯出來的所有(+RW,+ZI)段的大小,這個大小在編譯的時候就可以確定,這里只引用其值
{ }                                                                                                                                                                                          # 相當於RW數據是從0x20000000開始運行,地址向上增長,而棧的起始地址是從0x20030000地址開始,往下增長,RW和棧共用0x30000空間的

                                                                            

RW_ERAM 0xD0000000 0x00800000 { ;Extern SDRAM                                                                                                     #將main.c編譯時RW/ZI段所以的內容放到片外SDRAM起始地址0xD0000000的地方,大小是0x00800000,;類似上面,這個空間不一定會用完
main.o(+RW +ZI)
}

ARM_LIB_HEAP +0 EMPTY (0xD0800000 - ImageLimit(RW_ERAM)) ; Heap region growing up                                      #分配堆的空間,起始地址是從前一個執行區偏移0字節開始,這個地址其實就是0xD0000000+ImageLimit(RW_ERAM),長度為正值,
{ }                                                                                                                                                                                           #因此地址向上增長,說白了就是main函數運行起來所使用的內存之外的所以內存全部分配給了堆
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM