相关疑难解决方法(0)

了解GNU链接器脚本的位置计数器

我正在开展一个大学项目,我正在从头开始为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)

embedded linker arm gnu linker-scripts

15
推荐指数
2
解决办法
8782
查看次数

如何在ARM体系结构上从RAM运行代码

我正在编程一个ARM Cortex-R4,我有一些二进制文件,我想从TCRAM执行它们,只是为了看看性能是否足够好.

我知道我必须编写一个函数来将二进制文件复制到RAM(可以使用链接器脚本完成,并且知道二进制文件的大小).但他们怎么会跑?

想象一下:第一个二进制文件有func1(),func2(),func3()和func4().我将整个模块复制到TCRAM,如何在那里调用函数?我必须使用指向该特定功能的函数指针?如果func4()调用func2()和func3()怎么办?如果我没弄错的话,他们会指向闪存中的代码片段.这是否意味着我必须重写那些功能?使用完全函数指针?我被告知只有链接器脚本足以完成所有这些,我不必担心任何事情,但我仍然不明白它是如何工作的.

arm

8
推荐指数
2
解决办法
1万
查看次数

在RAM初始化之前使用#defined值

我正在编写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)

c arm linker-scripts c-preprocessor

6
推荐指数
1
解决办法
340
查看次数

标签 统计

arm ×3

linker-scripts ×2

c ×1

c-preprocessor ×1

embedded ×1

gnu ×1

linker ×1