GNU ARM工具链中的堆栈初始化

GNU ARM工具链中的堆栈初始化,arm,stm32,cortex-m3,gnu-toolchain,Arm,Stm32,Cortex M3,Gnu Toolchain,查看GNU ARM工具链中作为示例提供的启动文件,有一件事我无法理解 这里提供的代码片段取自从下载的GNU ARM嵌入式工具链文件中包含的示例代码已编译,一切似乎都很好。 我想知道为什么他们写的代码完全是这样的,比如为什么他们使用相同的名字 我想知道为什么我的链接器没有抱怨\uu StackTop和\uu StackLimit的多定义错误。以下是文件startup\u ARMCM0.S .syntax unified .arch armv6-m .section .

查看GNU ARM工具链中作为示例提供的启动文件,有一件事我无法理解

这里提供的代码片段取自从下载的GNU ARM嵌入式工具链文件中包含的示例代码已编译,一切似乎都很好。

我想知道为什么他们写的代码完全是这样的,比如为什么他们使用相同的名字

我想知道为什么我的链接器没有抱怨
\uu StackTop
\uu StackLimit
的多定义错误。以下是文件
startup\u ARMCM0.S

    .syntax unified
    .arch   armv6-m

    .section .stack
    .align  3
#ifdef __STACK_SIZE
    .equ    Stack_Size, _*emphasized text*_STACK_SIZE
#else
    .equ    Stack_Size, 0xc00
#endif
    .globl  __StackTop
    .globl  __StackLimit
__StackLimit:
    .space  Stack_Size
    .size   __StackLimit, . - __StackLimit
__StackTop:
    .size   __StackTop, . - __StackTop
如果链接器正在定义相同的符号:
\uu StackTop
\uu StackLimit

.stack_dummy (COPY):
    {
        *(.stack*)
    } > RAM

    /* Set stack top to end of RAM, and stack limit move down by
     * size of stack_dummy section */
    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
    PROVIDE(__stack = __StackTop);
在检查链接器文档时,有人写道:

在本例中,如果程序定义了
\u etext
(带前导 下划线),链接器将给出一个多定义错误。如果 另一方面,程序定义
etext
(无前导 下划线),链接器将以静默方式使用中的定义 节目。如果程序引用了
etext
,但未定义 如果是,链接器将使用链接器脚本中的定义


另外,当使用
readelf-s
仅检查从汇编文件
启动\u ARMCM0.s
生成的符号而不进行链接时,我可以看到带有一个值的符号
\u StackTop
\u StackLimit
。然而,在链接之后,它们具有由链接器设置的值(请记住,链接器的值实际上存储在符号的地址中)

我从来没有见过有人使用
对齐他们的代码。align 3
这意味着你在3字节=24位上对齐代码,这很奇怪。。。通常是4字节=32位,或者过去是2字节=16位。@71GA看,这段代码是Gnu工具链Arm的人写的,我相信他们知道应该怎么做。而且,您不在这里-
。align 3
表示按2^3=8对齐。看看这里,您既没有
提供(\uu StackTop=xxx)
也没有
提供(\uu StackLimit=xxx)
<代码>提供(\uuuu stack=\uuuu StackTop)将仅具有不在汇编程序中的
\uuu stack
的倍数。我读的手册有误吗?.align应该避免使用gnu assembler,因为每个目标定义了n的含义(字节、2的幂等)。如果我记得正确,最好使用balign,因为它是一致的,希望我能找到描述问题的文章。多么天真的声音啊basically@old_timer你能给我一些建议吗,我正在为一个更大的项目stm32f103编写代码。我想用GNU手臂工具链来设置它。我在StackOverflow上看到了答案提供的一些例子,也通过互联网看到了。但这些ARM的罐装初创公司似乎是我迄今为止在这个话题上发现的最好的。我如何找到使用GNU进行stm32开发的最佳实践?我从来没有见过有人使用
对齐他们的代码。align 3
这意味着您要在3字节=24位上对齐代码,这很奇怪。。。通常是4字节=32位,或者过去是2字节=16位。@71GA看,这段代码是Gnu工具链Arm的人写的,我相信他们知道应该怎么做。而且,您不在这里-
。align 3
表示按2^3=8对齐。看看这里,您既没有
提供(\uu StackTop=xxx)
也没有
提供(\uu StackLimit=xxx)
<代码>提供(\uuuu stack=\uuuu StackTop)将仅具有不在汇编程序中的
\uuu stack
的倍数。我读的手册有误吗?.align应该避免使用gnu assembler,因为每个目标定义了n的含义(字节、2的幂等)。如果我记得正确,最好使用balign,因为它是一致的,希望我能找到描述问题的文章。多么天真的声音啊basically@old_timer你能给我一些建议吗,我正在为一个更大的项目stm32f103编写代码。我想用GNU手臂工具链来设置它。我在StackOverflow上看到了答案提供的一些例子,也通过互联网看到了。但这些ARM的罐装初创公司似乎是我迄今为止在这个话题上发现的最好的。我怎样才能找到关于使用GNU开发stm32的最佳实践?
SECTIONS
{
.text :
    {
    *(.text)
    _etext = .;
    PROVIDE(etext = .);
    }
}