链接描述文件是否总是确定将代码放置在什么地址上

时间:2019-05-24 15:24:59

标签: embedded microcontroller loader linker-scripts atmelstudio

我大部分时间都在使用诸如Atmel Studio之类的工具和IDE为微控制器进行开发,并从幕后进行了抽象。

假设在这种情况下,我们直接从flash执行代码,在嵌入式系统中就是这种情况。

当我们开发应用程序并使用芯片供应商提供的工具将其闪存到微控制器时,加载程序/闪存程序是否确定将在内存中的哪个物理地址进行闪存?

我知道链接器脚本定义了应将.data和.txt之类的不同部分放置在何处的内存偏移量,难道这实际上最终确定了所有内容应在mcu flash中的哪个地址处存储吗? >

现在让我们说,我发现闪存中根本没有使用的一部分,并且希望在其中放置其他内容(甚至是另一个应用程序),我是否要修改链接描述文件,创建一个新的链接描述文件或如何编写到这个特定的位置?我还没有完全掌握这一点。

2 个答案:

答案 0 :(得分:1)

您的想法通常是正确的。链接描述文件无非是带有专门语言的文件,该文件传达有关内存及其应如何使用的某些信息,它决定了程序在内存中的布局。一些链接器也会通过命令行选项接受此类内存规范。

关于您的特定问题,是的,您可以通过修改第二个链接程序的脚本(尤其是程序映像的起始地址)来编写另一个占用不同内存地址(不同于第一个内存地址)的固件。当然,这并没有说明这两个固件将如何运行或通信。这些是单独的问题。您还需要了解MCU的闪存可擦除页面边界,以便将第二张图像放置在其他可擦除页面边界中。

在某些固件下载器/编程器中,您还可以指定与固件映像中指定的起始偏移量不同的起始偏移量。这与链接程序脚本过程是分开的。有一些用途。例如,您的固件可以构建为从SRAM运行,而不是直接从闪存运行。因此,在固件下载时,需要将其移至闪存位置,并且在运行时,将使用某种机制将代码从闪存复制到程序实际运行的SRAM。还有其他情况。

答案 1 :(得分:0)

您询问是否应该修改或创建新的链接描述文件。我会要求您修改令人兴奋的链接描述文件。我发现它们有时会很广泛。为什么只修改几行就扔掉已经存在的内容。

微控制器更改链接描述文件的一些非常常见的情况是:

  1. 在第一个Flash扇区中添加引导加载程序,而实际程序在更高的扇区中启动。
  2. 添加专门用于存储应用程序生成的数据的扇区。
  3. 使用专用扇区作为配置参数。

让我们以第一个示例为例,说明如何将固件写入不同的闪存扇区。重要的是要知道,对于本示例,引导程序和实际应用程序是两个单独的项目,每个项目都有自己的编译配置或makefile。每个项目也都有自己的链接描述文件。列出了两个文件的下面部分:

引导程序:

/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 16K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

应用程序:

/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x0800C000, LENGTH = (1M - 16K)
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

请不要在FLASH中定义不同。引导加载程序闪存默认情况下启动。为引导加载程序分配的大小为16K。需要注意的重要一点是,示例芯片的总闪存大小为1M。从应用程序项目的闪存大小可以看出这一点。但是我们不允许为应用程序提供完整的1M,因为我们当然需要通过为引导加载程序分配的大小来减小它。您还可以看到它不是从同一地址开始的。它的偏移量为0xC000,即16k。

在运行和调试应用程序代码之前,您还必须做两件事:

  1. 定义代码的向量表偏移量。这是编译器和链接器知道代码在内存中的位置所必需的。这是我对这部分知识缺乏的地方,所以任何知道的人都请详细说明。
  2. 如果您想调试应用程序,则还必须告诉调试器从哪里开始。 Atollic通过链接脚本执行此操作。记得几年前,Atmel Studio在编程窗口中提供了一个选项,您可以在其中设置偏移量。

最后一点:当您执行某项链接时,最好坚持使用芯片的闪存扇区。通常,您只能删除整个扇区。将代码的下一部分放在下一个扇区的开头,使工作更加轻松。

给出的示例基于Atollic TrueSTUDIO为STM32F4xx芯片针对STM32生成的链接器文件。编译是使用ARM gcc工具链完成的。