移植" C"从IAR Embedded工作台到GCC的ARM Cortex M3项目,在Windows平台上使用来自go here的arm-none-eabi工具链。
这是一个全局变量,提供一个可重新分配的中断向量表,需要使用特定的对齐方式进行定位,并且不需要从" C"启动,在IAR代码中通过使用IAR特定指令强制它到硬编码的内存位置来实现(注意变量不强需要强制到任何特定位置,它& #39;重要的对齐方式)
static __attribute__((section (".noinit"), aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
我试图通过定义一个名为" .noinit"的RAM部分来在GCC代码中实现相同的目标。在我的链接器脚本中并使用__attribute__指令将我的变量放在" .noinit"部分(所以它不默认为" .bss")并强制对齐如下:
static __attribute__((section (".noinit")) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
然而,尽管构建似乎已经完成,但生成的地图文件中没有 vector_table 的迹象(不能将二进制文件加载到目标上并尝试出来尚未)。
有趣的是,两个__attribute__指令中的任何一个在隔离使用时似乎都按预期工作,
static __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
导致 vector_table 出现在" .noinit"地图文件中的部分,而
static __attribute__((section (".noinit"))) __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
导致 vector_table 出现在" .bss"尊重请求对齐的部分。
尝试单独指定两个指令,如下所示:
String value = firstName.getText().toString();
int int_value = Integer.parseInt(value);
if (firstName.getText().toString().length() != 0)
if (int_value < 1500) {
// do what you want
}
else if (int_value < 59) {
// do what you want
}
else if (int_value < 23) {
// do what you want
}
}else {
firstName.setError("First name is required!");
}
但没有区别。
有什么想法吗?
答案 0 :(得分:0)
无论如何,Ran objdump -x和vector_table
都存在于目标文件中。我看到的差异似乎与vector_table
是否被声明为静态有关。放置在“.bss”中时,vector_table
部分即使在静态时也会从地图文件中按名称引用。当置于“.noinit”时,只有当不声明为静态时才会提及它,但是为它保留的空间(标记有它来自的编译单元的名称)无论如何都在那里。
是的,所以没有真正的问题,因为事实证明,我只是被静态的地图文件表示混淆,这取决于它们被放置在哪个部分。 - Richard Lang