2015-04-07 14 views
2

下一個功率所以,我有這個鏈接腳本:鏈接腳本:對齊節兩個

MEMORY 
{ 
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 
} 
SECTIONS 
{ 
    .kernel.text : 
    { 
     _kernel_text = .; 
     KEEP(kernel.a(.isr_vector)) 
     KEEP(kernel.a(_sbrk)) 
     kernel.a(.text*) 
     kernel.a(.rodata*) 
     _kernel_etext = .; 
     _kernel_flash_data = ALIGN(0x4); 
    } > FLASH 

    .kernel.data : /*AT(ADDR(.text) + SIZEOF(.text))*/ /*contains initialized data*/ 
    { 
     _kernel_data = .; 
     kernel.a(vtable) 
     kernel.a(.data*) 
     _kernel_edata = .; 
    } > SRAM AT > FLASH 

    .kernel.bss : 
    { 
     _kernel_bss = .; 
     kernel.a(.bss*) 
     kernel.a(COMMON) 
     _kernel_ebss = .; 
    } > SRAM 

    .core.text : ALIGN(0x1000) 
    { 
     _core_text = .; 
     core.a(.text*) 
     core.a(.rodata*) 
     _core_etext = .; 
     _core_flash_data = ALIGN(0x4); 
    } > FLASH 
/* There is lots more, but this is the interesting part */ 
} 

並讓專注於閃存。 Flash從0x0開始,首先將整個kernel.text寫入它,然後將kernel.data寫入它。我想要一個MPU來保護這個內存區域。這個MPU只能在2個冪的存儲器區段上工作。我希望閃存(數據+文本)中的整個內核部分由MPU在單個區域內進行保護,因此我需要它的總大小爲2的冪。現在,.core.text上的align命令將爲我執行此操作。我知道.kernel.text + .kernel.data = 3960字節長,所以我想對齊2^12 = 4096 = 0x1000。現在我可以在單個區域下從0x0到0x1000進行保護,並在單個MPU區域內保護內核。派對!

但是該項目還沒有完成,代碼將被添加,所以我們可能會跨越這個邊界。第一次這不是問題:內存將與下一個4096屏障對齊,即8192和2^13。但在此之後,記憶將與12288相符,這不是兩次冪,所以我的MPU會向我吐口水並嘲笑我。

有沒有辦法讓這個鏈接腳本總是對齊到下一個功能?

+0

你確定嗎:**這個MPU只能工作在內存部分,大小爲2 **的大小?你在編程哪個MPU? – LPs

+0

我使用的是Stellaris LM4F120H5QR微控制器,您可以在其數據手冊的第187頁找到該信息,其中說明區域大小計算爲2 ^(SIZE + 1),其中大小是需要寫入的5位寄存器你自己。所以你只能寫出2的冪的大小。 – Cheiron

回答

2

謝天謝地,GNU ld爲這樣的實例提供了一個便捷的log2ceil()函數。簡單地寫下你的鏈接描述文件如下:

/* ... */ 
_flash_text_data_end_aligned = (2 << LOG2CEIL(_etext + SIZEOF(.data))); 
/* ... */ 
.core.text: ALIGN(_flash_text_data_end_aligned) 
/* ... */