2017-08-13 284 views
0

如何从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来停止堆积。

除了建议将启动代码改写为汇编程序的建议外,还欢迎其他任何想法。

+0

人们提倡C标准不会喜欢你的问题和我的评论。 char * approximativeStackTop(char x){return(&x);)'? – Marian

+0

我想知道整个练习的目的是什么?你想用这种方式调试一些内存问题吗? –

+0

@Felix在开发过程中很高兴看到有多高堆栈正在运行,你有多少空闲内存,比计算还是任何静态分析要好。 – vlk

回答

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功能。 使用CMSIS的内在指令,如__get_MSP()

+0

感谢您的建议,但有一个问题,我的裸机模型不使用CMSIS,我完全避免使用它。但是我启发了CMSIS如何实现'__get_MSP()'函数,它非常简单。这里是我修改后的读取msp:'register unsigned * msp_reg; __asm__ volatile(“mrs%0,msp \ n”:“= r”(msp_reg));'在我的启动时按预期工作。 – vlk

+0

任何不使用CMSIS的理由?它只是一堆方便的定义,类型定义,内在函数和内联函数。这不是一个图书馆 - 没有开销,没有数据添加。 CMSIS是最裸机 - 除了普通的硬件。 –

+0

在我的项目中,我将外设重写为C++类或具有位域的结构。我完全避免使用'#define',但我使用'namespace','class','template','enum class','auto',bitfields,'inline'函数等C++ 11/...代码现在更干净,可读性更好,并且优化效果也很好(代码很小并且速度很快) – vlk