GCC ARM:从 SP 寄存器获取实际值

GCC ARM: get actual value from SP register

如何从SP寄存器获取实际值?

我想用一些初始值填充整个 SRAM,但我不想覆盖堆栈的实际内容。

我的启动代码(也覆盖堆栈的实际内容):

void RESET_handler() {
    unsigned *src, *dst;
    // initialize memory
    // .....

    // fill SRAM
    dst = &_bss_end;
    while (dst < &_stacktop) {
        *dst++ = 0x55555555;
    }
}

_bss_end 是静态变量已用内存的末尾,_stacktop 指向 SRAM 内存的末尾或堆栈顶部。

尽管此函数是重置处理程序,但 gcc 使其安全并开始将一些寄存器压入堆栈 ()。是的,此时堆栈的实际内容无关紧要,覆盖它是安全的,但为了清除,我想通过将 &_stacktop 替换为 SP 的实际值来停止在堆栈之前填充。

除建议将启动代码重写为汇编程序外,也欢迎任何其他想法。

只有修改启动文件才能可靠地完成。

我只关注单栈(线程*特权) openSTM32 类型启动示例:

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */

    bl  fillStack  // <------------ add this

    bl __libc_init_array
/* Call the application's entry point.*/
    bl  main

然后在您的任何 C 文件中实现 fillStack 函数。 使用 CMSIS 内部指令,如 __get_MSP()