【发布时间】:2020-11-20 11:15:32
【问题描述】:
问题定义: 在 AVR 微控制器中需要有两部分代码,一个是固定的,始终存在并且不会(经常)更改,另一个是临时的,即(不那么)经常被替换或附加。挑战在于让瞬态代码能够调用函数并访问固定函数的全局变量——反之亦然。
很明显,固定代码应该有特殊的方法来访问瞬态代码——比如在 RAM 中计算函数指针并只使用它们来调用瞬态代码过程。
对于反向调用,我正在考虑将瞬态代码与固定代码的现有 .elf 文件链接。
我正在使用 avr-gcc 工具链(如在 ubuntu 20.20 中),gcc 版本 5.4.0
我已经尝试过什么:
-
在构建固定代码时添加“-shared”作为链接参数——AVR 似乎不支持(链接器报告错误)。
-
添加 '-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 块用于冲突目的。