下一個功率所以,我有這個鏈接腳本:鏈接腳本:對齊節兩個
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會向我吐口水並嘲笑我。
有沒有辦法讓這個鏈接腳本總是對齊到下一個功能?
你確定嗎:**這個MPU只能工作在內存部分,大小爲2 **的大小?你在編程哪個MPU? – LPs
我使用的是Stellaris LM4F120H5QR微控制器,您可以在其數據手冊的第187頁找到該信息,其中說明區域大小計算爲2 ^(SIZE + 1),其中大小是需要寫入的5位寄存器你自己。所以你只能寫出2的冪的大小。 – Cheiron