我正在嵌入式系统(Stellaris Launchpad)上工作,并编写了一个简单的OS(作为一个业余项目)。使用的工具链是gcc-none-eabi。
我的下一步是习惯MPU,以允许内核阻止用户程序更改特定数据。我有一堆C文件,我将它们分为两部分:内核和其他部分。我有以下链接脚本开始:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
}
SECTIONS
{
.text :
{
_text = .;
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
_etext = .;
} > FLASH
.data : /*AT(ADDR(.text) + SIZEOF(.text))*/ /*contains initialized data*/
{
_data = .;
*(vtable)
*(.data*)
_edata = .;
} > SRAM AT > FLASH
.bss : AT (ADDR(.data) + SIZEOF(.data)) /*contains unitialized data (should be set to all zero's)*/
{
_bss = .;
*(.bss*)
*(COMMON)
_ebss = .;
_start_heap = .;
} > SRAM
_stack_top = ORIGIN(SRAM) + LENGTH(SRAM) - 1; /*The starting point of the stack, at the very bottom of the RAM*/
}
在阅读了链接描述文件之后,我知道可以用文件名替换星号,从而开始将Flash分成多个部分。例如,我将创建一个.kernel.bss部分,并将所有内核目标文件而不是该部分中的星星。我剩下的唯一问题是内核不是一个文件,而是很多文件。并可能会添加,删除文件等。那么我该怎么做?如何更改链接程序脚本,以便将动态的第一组文件映射到第一位置,将动态的第二组文件映射到第二位置?
您知道可以指定将哪些文件用作节的输入吗?我们将其用于将内核和应用程序代码分为快速的内部闪存和较慢的外部闪存,如下所示:
.kernel_text :
{
build/kernel/*.o (.text*) /*text section from files in build/kernel*/
} > INT_FLASH
.app_text:
{
build/app/*.o(.text*)
} > EXT_FLASH
第4.6.4节可能会有所帮助,(更详细地描述输入节)https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/sections.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句