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

GCC ARM:从SP寄存器获取实际值,c,gcc,cpu-registers,cortex-m,bare-metal,C,Gcc,Cpu Registers,Cortex M,Bare Metal,如何从SP寄存器中获取实际值 我想用一些初始值填充整个SRAM,但我不想覆盖堆栈的实际内容 我的启动代码(也会覆盖堆栈的实际内容): void RESET_handler(){ 无符号*src,*dst; //初始化内存 // ..... //填充SRAM dst=&U bss_结束; 而(dst

如何从
SP
寄存器中获取实际值

我想用一些初始值填充整个SRAM,但我不想覆盖堆栈的实际内容

我的启动代码(也会覆盖堆栈的实际内容):

void RESET_handler(){
无符号*src,*dst;
//初始化内存
// .....
//填充SRAM
dst=&U bss_结束;
而(dst<&U stacktop){
*dst++=0x5555;
}
}
\u bss\u end
是静态变量所用内存的末尾,
\u stacktop
指向SRAM内存的末尾或堆栈的顶部

尽管此函数是重置处理程序,但gcc会确保它的安全,并在开始时将一些寄存器推入堆栈()。是的,此时堆栈的实际内容是不相关的,覆盖它是安全的,但是为了获得许可,我想在堆栈之前停止填充,用SP的实际值替换
&\u stacktop


除了将启动代码重写到汇编程序中的建议外,任何其他想法都是受欢迎的。

只有通过修改启动文件才能可靠地完成

我将只关注单个堆栈(对于线程*privileged) 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
/*调用时钟系统初始化功能*/
bl系统初始化
/*调用静态构造函数*/

bl fillStack//提倡C标准的人不会喜欢你的问题和我的评论。那么
char*approximativeStackTop(char x){return(&x);}
呢?我想知道整个练习的目的是什么?您是否正试图以这种方式调试某些内存问题?@Felix在开发过程中很高兴看到堆栈有多高,您有多少可用内存,这比计算或任何静态分析都好。目标体系结构是什么?@PeterJ ARM,Cortex-M(STM32F0xx)感谢您的建议,但有一个问题,我的裸机模型没有使用CMSIS,我完全避免使用它。但我启发了CMSIS如何实现
\uu get\u MSP()
函数,它非常简单。这是我修改后的阅读msp:
register unsigned*msp\u reg__asm_uuuuuvolatile(“mrs%0,msp\n”:“=r”(msp_uureg))在我的启动中,它按预期工作。有没有不使用CMSIS的原因?它只是一堆方便的定义、typedef、内部函数和内联函数。它不是一个库-没有开销,没有添加数据。CMSIS是最裸露的金属——除了普通的硬件之外什么都没有。在我的项目中,我用外围设备重写了C++类或结构。我完全避免使用
#define
,但我使用C++11/14中的所有商品,如
名称空间
模板
枚举类
自动
,位字段,
内联
函数。。。代码现在更干净、可读性更好,而且优化效果也很好(代码很小,速度也很快)PS您不能使用寄存器,因为如果启用优化,它会被忽略:)是的,但如果寄存器与_asm__;()连接,则不会被忽略。。。我刚刚测试了所有的优化,比如-Os-O3-Ofast。。无论在哪里,它都能正确编译,代码也能正常工作。
/* 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