GCC ARM:从SP寄存器获取实际值
如何从SP
寄存器获取实际值?GCC ARM:从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
来停止堆积。
除了建议将启动代码改写为汇编程序的建议外,还欢迎其他任何想法。
只能通过启动文件修饰才能可靠地完成。
我将只专注于单一堆栈(螺纹*特权) 例如用于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()
感谢您的建议,但有一个问题,我的裸机模型不使用CMSIS,我完全避免使用它。但是我启发了CMSIS如何实现'__get_MSP()'函数,它非常简单。这里是我修改后的读取msp:'register unsigned * msp_reg; __asm__ volatile(“mrs%0,msp \ n”:“= r”(msp_reg));'在我的启动时按预期工作。 – vlk
任何不使用CMSIS的理由?它只是一堆方便的定义,类型定义,内在函数和内联函数。这不是一个图书馆 - 没有开销,没有数据添加。 CMSIS是最裸机 - 除了普通的硬件。 –
在我的项目中,我将外设重写为C++类或具有位域的结构。我完全避免使用'#define',但我使用'namespace','class','template','enum class','auto',bitfields,'inline'函数等C++ 11/...代码现在更干净,可读性更好,并且优化效果也很好(代码很小并且速度很快) – vlk
人们提倡C标准不会喜欢你的问题和我的评论。 char * approximativeStackTop(char x){return(&x);)'? – Marian
我想知道整个练习的目的是什么?你想用这种方式调试一些内存问题吗? –
@Felix在开发过程中很高兴看到有多高堆栈正在运行,你有多少空闲内存,比计算还是任何静态分析要好。 – vlk