我正在开展一个大学项目,我正在从头开始为Atmel SAM7S256微控制器编写软件.这比我之前使用的其他MCU更深入,因为这次需要了解链接器脚本和汇编语言.
我一直在仔细审查SAM7S芯片的示例项目,以便完全了解如何从头开始SAM7/ARM项目.一个明显的例子是米罗萨梅克的"建筑裸机ARM系统的GNU"教程发现这里(其中在该问题的代码是从).我也花了很多时间从sourceware.org阅读链接器和汇编程序文档.
我很高兴我在大多数情况下理解以下链接器脚本.只有一件涉及到位置计数器的东西对我来说没有意义.以下是上述教程提供的链接描述文件:
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_vectors)
MEMORY { /* memory map of AT91SAM7S64 */
ROM (rx) : ORIGIN = 0x00100000, LENGTH = 64k
RAM (rwx) : ORIGIN = 0x00200000, LENGTH = 16k
}
/* The sizes of the stacks used by the application. NOTE: you need to adjust */
C_STACK_SIZE = 512;
IRQ_STACK_SIZE = 0;
FIQ_STACK_SIZE = 0;
SVC_STACK_SIZE = 0;
ABT_STACK_SIZE = 0;
UND_STACK_SIZE = 0;
/* The size of the heap used by …Run Code Online (Sandbox Code Playgroud) 我正在编程一个ARM Cortex-R4,我有一些二进制文件,我想从TCRAM执行它们,只是为了看看性能是否足够好.
我知道我必须编写一个函数来将二进制文件复制到RAM(可以使用链接器脚本完成,并且知道二进制文件的大小).但他们怎么会跑?
想象一下:第一个二进制文件有func1(),func2(),func3()和func4().我将整个模块复制到TCRAM,如何在那里调用函数?我必须使用指向该特定功能的函数指针?如果func4()调用func2()和func3()怎么办?如果我没弄错的话,他们会指向闪存中的代码片段.这是否意味着我必须重写那些功能?使用完全函数指针?我被告知只有链接器脚本足以完成所有这些,我不必担心任何事情,但我仍然不明白它是如何工作的.
我正在编写ARM CPU的启动代码.没有内部RAM,但是有1GB的DDRAM连接到CPU,在初始化之前无法直接访问.代码存储在闪存中,初始化RAM,然后将自身和数据段复制到RAM并继续执行.我的计划是:
#define REG_BASE_BOOTUP 0xD0000000
#define INTER_REGS_BASE REG_BASE_BOOTUP
#define SDRAM_FTDLL_REG_DEFAULT_LEFT 0x887000
#define DRAM_BASE 0x0
#define SDRAM_FTDLL_CONFIG_LEFT_REG (DRAM_BASE+ 0x1484)
... //a lot of registers
void sdram_init() __attribute__((section(".text_sdram_init")));
void ram_init()
{
static volatile unsigned int* const sdram_ftdll_config_left_reg = (unsigned int*)(INTER_REGS_BASE + SDRAM_FTDLL_CONFIG_LEFT_REG);
... //a lot of registers assignments
*sdram_ftdll_config_left_reg = SDRAM_FTDLL_REG_DEFAULT_LEFT;
}
Run Code Online (Sandbox Code Playgroud)
目前我的程序工作不正常,因为寄存器值最终被链接到RAM,并且在程序尝试访问它们时,只有闪存可用.
我怎么能改变我的链接器脚本或我的程序,以便这些值在闪存中的地址?有没有办法在文本段中包含这些值?
实际上,当它们在文件范围内声明时,那些定义的值是全局数据还是静态数据?
编辑:
目标文件与以下链接描述文件链接:
MEMORY
{
RAM (rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM (rx) : ORIGIN = 0x007f1000, LENGTH = 60K
VECTOR (rx) : ORIGIN = …Run Code Online (Sandbox Code Playgroud)