ARM开发流程LDS相关解惑

最近在学习ARM CPU软硬件开发,对于软件代码执行的入口地址以及软件代码在SRAM中的位置分布有些疑惑,特将学习过程记录一下。

1. 程序入口地址

对于ARM CPU,异常向量表的地址是固定的,通常位于 0x00000000 或 0xFFFF0000。在这种情况下,无法在软件中随意更改异常向量表的入口地址。但是可以在链接脚本中设置代码和数据的位置,以便与固定的异常向量表地址兼容。此处不讨论个别CPU可以通过内部寄存器配置exception vector table起始地址的情况。

例如,软件可能需要将代码和数据放置在内存中的特定位置,以避免与异常向量表的地址冲突。

c 复制代码
MEMORY
{
  VECTOR_ROM (rx) : ORIGIN = 0xFFFF0000, LENGTH = 0x100
  /* Other memory regions */
}

SECTIONS
{
  .vectors :
  {
    . = ORIGIN(VECTOR_ROM);
    KEEP(*(.vectors))
    . = ALIGN(4);
  } > VECTOR_ROM
  /* Other sections */
}

在这个例子中,.vectors段被指定到地址0xFFFF0000。需要根据项目的具体需求和处理器的内存布局来调整这些值。

2. 代码位置分布

软件编译时,某些关键的程序想放在ITCM,其他不太关键的程序放在外部总线上SRAM,如何实现呢?

可以通过链接脚本和属性/修饰符在 C 或 C++ 代码中实现这一目标。链接脚本用于控制特定代码段和数据段的放置位置,而属性/修饰符可以标记特定的函数或数据,指示编译器和链接器将它们放置在特定的内存区域。

以下是一个例子,展示了如何执行这些操作。

  • 链接脚本
    可以使用链接脚本来分配内存区域并将特定的代码和数据段放置在那里。例如:
c 复制代码
MEMORY
{
  ITCM (rwx)      : ORIGIN = 0x00000000, LENGTH = 64K
  EXTERNAL_MEMORY (rwx) : ORIGIN = 0x60000000, LENGTH = 1M
}

SECTIONS
{
  .itcm_code :
  {
    . = ALIGN(4);
    *(.itcm_code)
    . = ALIGN(4);
  } > ITCM

  .text :
  {
    . = ALIGN(4);
    *(.text)
    . = ALIGN(4);
  } > EXTERNAL_MEMORY
  /* Other sections */
}

在这个例子中,我们定义了两个内存区域:ITCM 和 EXTERNAL_MEMORY,并在 SECTIONS 部分中使用它们。

  • 属性/修饰符
    可以使用属性/修饰符在 C 或 C++ 代码中标记函数,告诉编译器和链接器将它们放置在特定的段和内存区域。
c 复制代码
__attribute__((section(".itcm_code"))) void criticalFunction(void)
{
  // Critical code here
}

void normalFunction(void)
{
  // Non-critical code here
}

在这个例子中,criticalFunction 函数被标记为位于 .itcm_code 段,该段在链接脚本中被分配到 ITCM 区域。normalFunction 没有特定的标记,因此将默认放置在 .text 段和 EXTERNAL_MEMORY 区域。

通过组合使用链接脚本和属性/修饰符,可以控制特定代码和数据的放置位置,满足在 ITCM 和外部内存之间分配代码的需求。

相关推荐
eSIM物联工厂7 小时前
物联网系统中OLED屏主流驱动方案详解
c语言·arm开发·嵌入式硬件·物联网·硬件工程·开源软件·iot
weixin_4243810013 小时前
ARM V8 A32常用指令集
java·开发语言·arm开发
飞奔的屎壳郎18 小时前
[EBPF] 实时捕获DM数据库是否存在SQL阻塞
arm开发·数据库·sql
Tlog嵌入式1 天前
蓝桥杯【物联网】零基础到国奖之路:十二. TIM
arm开发·stm32·单片机·物联网·学习·蓝桥杯·iot
TeYiToKu1 天前
笔记整理—内核!启动!—linux应用编程、网络编程部分(6)随机数与proc文件系统
linux·c语言·arm开发·笔记·嵌入式硬件
Q8343158192 天前
SSC338D/SSC338Q CA7*2+IPU5M/Multi-sensorISP: HDR/3DNR
arm开发·图像处理·人工智能·音视频·信号处理·视频编解码
胖虎江2 天前
ARM(Day 2)
arm开发
Liii4033 天前
【ARM】SOC的多核启动流程详解
arm开发·soc
晓晓暮雨潇潇3 天前
【Zynq从零开始】汇总导航
arm开发·fpga开发·zynq开发·soc开发
北京青翼科技3 天前
基于VITA57.1标准的4通道2.8GSPS 16位JESD204B接口DAC播放子卡
arm开发·图像处理·fpga开发·信号处理·嵌入式实时数据库