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

时间:2017-08-13 08:11:49

标签: c gcc cpu-registers cortex-m bare-metal

如何从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使它安全并且在开始时将一些寄存器推入堆栈(more info)。是的,此时堆栈的实际内容是无关紧要的并且覆盖它是安全的但是为了清除我想在堆栈之前通过用{SP}的实际值替换&_stacktop来停止填充。

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

1 个答案:

答案 0 :(得分:1)

只能通过启动文件修改来可靠地完成。

我只关注单个堆栈(对于线程*特权) 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函数。 使用像__get_MSP()

这样的CMSIS内在指令