【问题标题】:Linking additional code for the microcontroller (AVR) against already existing code将微控制器 (AVR) 的附加代码与现有代码相链接
【发布时间】:2020-11-20 11:15:32
【问题描述】:

问题定义: 在 AVR 微控制器中需要有两部分代码,一个是固定的,始终存在并且不会(经常)更改,另一个是临时的,即(不那么)经常被替换或附加。挑战在于让瞬态代码能够调用函数并访问固定函数的全局变量——反之亦然。

很明显,固定代码应该有特殊的方法来访问瞬态代码——比如在 RAM 中计算函数指针并只使用它们来调用瞬态代码过程。

对于反向调用,我正在考虑将瞬态代码与固定代码的现有 .elf 文件链接。

我正在使用 avr-gcc 工具链(如在 ubuntu 20.20 中),gcc 版本 5.4.0

我已经尝试过什么:

  1. 在构建固定代码时添加“-shared”作为链接参数——AVR 似乎不支持(链接器报告错误)。

  2. 添加 '-Wl,--export-dynamic' 作为链接参数 - 它似乎被忽略了,elf 中没有出现 .dynsym 部分。

在固定的代码精灵中仍然有一个 .symtab 部分——可以以某种方式用来链接它吗?

注意:我对“固定”和“瞬态”代码的划分与某些 AVR 微控制器的引导区域无关,引导只是我在这里不关心的事情。

注2:问题与this one 非常相似,但对需求给出了明确的解释。

【问题讨论】:

  • Optiboot 引导加载程序提供了一个由应用程序调用的函数。参见 optiboot.h:github.com/Optiboot/optiboot/blob/master/optiboot/examples/… 和 optiboot 源代码
  • 不要尝试使用动态库,这对于具有操作系统的实际 PC 来说是一件很奇怪的事情。你应该能够在 AVR 上做你想做的事,但是有很多小问题需要解决,解决这些问题可能需要你熟悉 AVR 程序集、你的 C 编译器和你的链接器。您需要方法来确定哪个内存地址包含您要调用的函数,并且您必须确保程序中的函数不会尝试将相同的 RAM 块用于冲突目的。

标签: c linker avr elf avr-gcc


【解决方案1】:

您必须忘记所有大型计算机知识。 8 位 AVR 是 timy 微控制器。代码必须静态链接。没有其他办法。

【讨论】:

  • 但如果您有地址(在已知位置的向量表中),您可以在闪存中的任何位置调用函数
  • @Juraj 它是 ARM 等大型 uC 的选择。
  • 我的意思是经典的 AVR ATmega
  • @Juraj 它是微型 8 位 uC。
  • 我不进行假设或理论化。我做到了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多