gpt4 book ai didi

c - 应用多个 __attribute__ 时 map 文件中缺少变量

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:29 25 4
gpt4 key购买 nike

使用来自 https://launchpad.net/gcc-arm-embedded 的 arm-none-eabi 工具链将“C”ARM Cortex M3 项目从 IAR Embedded 工作台移植到 GCC在 Windows 平台上。

有一个全局变量提供了一个可重新分配的中断 vector 表,需要以特定对齐方式定位并且不需要从“C”启动初始化,这在 IAR 代码中是通过强制它实现的使用 IAR 特定指令的硬编码内存位置如下(请注意,变量不需要需要被强制到任何特定位置,重要的是对齐)

#pragma location=ADDR_VECTOR_TABLE
static __no_init isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

我试图通过在链接描述文件中定义一个名为“.noinit”的 RAM 部分并使用 __attribute__ 指令将我的变量放在“.noinit”部分(所以它不会默认为“.bss”)并强制对齐如下:

static __attribute__((section (".noinit"), aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

然而,尽管构建看起来已经完成,但在生成的映射文件中没有 vector_table 的迹象(还不能将二进制文件加载到目标上并进行尝试)。

有趣的是,两个 __attribute__ 指令中的任何一个在单独使用时似乎都按预期工作,

static __attribute__((section (".noinit")) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

导致 vector_table 出现在 map 文件的“.noinit”部分,而

static __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL]; 

导致 vector_table 出现在“.bss”部分,并符合请求的对齐方式。

尝试分别指定两个指令,如下所示:

static __attribute__((section (".noinit"))) __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

但这并没有什么不同。

有什么想法吗?

最佳答案

Ran objdump -x 并且 vector_table 无论如何都存在于目标文件中。我看到的差异似乎与 vector_table 是否声明为静态有关。当放置在“.bss”部分时,即使是静态的,vector_table 也会通过 map 文件中的名称进行引用。当放置在“.noinit”中时,它仅在声明为静态时提及,但是无论如何为它保留的空间(标有它来自的编译单元的名称)都在那里。
是的,结果证明没有实际问题,我只是对静力学的 map 文件表示感到困惑,这取决于它们被放置在哪个段中。 – Richard Lang

关于c - 应用多个 __attribute__ 时 map 文件中缺少变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com