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()
如何从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()