threadx 模块在 运行 时间内分配模块数据部分

threadx module allocating module data section in run time

我看到加载 threadx 模块时,数据部分是在 运行 时间内从字节池(在 _txm_module_manager_internal_load)分配的。

  1. 有没有办法预先定义(在模块序言等中)模块数据所在的位置?

  2. 模块代码如何知道其全局变量的位置?编译器无法知道它们的地址,因为数据的位置是在 运行 时间确定的(我想在程序集移植的某个地方有一些数据部分的相对地址,该地址会随着访问全局变量的每个模块而变化通过它,但我对arm assembly不是很熟悉自己找到它)。

  1. 每个模块的数据位置在run-time确定。这是为了允许多次加载同一模块,每个实例在不同位置都有单独的数据。

  2. 全局变量位于数据区。这些模块被编译为位置无关代码和位置无关数据。加载模块时,模块启动代码会提供数据的加载地址。具体实现方式因架构和编译器而异。

@Andrés 回答正确,但我想补充一些信息。您必须使用与位置无关的代码和数据构建模块(例如,如果使用 ARM 编译器,则使用 ROPI 和 RWPI 选项)。 GCC 选项如下所示(我将位置独立性所需的相关编译器选项加粗):

arm-none-eabi-gcc -c -g -mcpu=cortex-m4 **-fpie -fno-plt -mpic-data-is-text-relative -msingle-pic-base** txm_module_preamble.s

如果您还有其他问题,请告诉我们。