如何从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
来停止填充。
除了将启动代码重写为汇编程序的建议外,还欢迎任何其他想法。
答案 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()