[英]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使它安全,并在开始时将一些寄存器推入堆栈( 更多信息 )。 是的,这时堆栈的实际内容无关紧要,并且可以覆盖它,但出于安全考虑,我想通过用SP的实际值替换&_stacktop
来停止在堆栈之前填充。
除建议将启动代码重写为汇编程序外,其他任何想法也都欢迎。
只能通过启动文件移动来可靠地完成此操作。
我将仅关注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内部指令
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.