【发布时间】:2017-08-13 08:11:48
【问题描述】:
如何从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 来停止在堆栈之前填充。
也欢迎任何其他想法,除了建议将启动代码重写为汇编程序。
【问题讨论】:
-
崇尚 C 标准的人不会喜欢你的问题和我的评论。
char *approximativeStackTop(char x) {return(&x);}呢? -
我想知道整个练习的目的是什么?您是否尝试以这种方式调试一些内存问题?
-
@Felix 在开发过程中很高兴看到堆栈有多高,你有多少可用内存,比计算或任何静态分析都要好。
-
目标架构是什么?
-
@PeterJ ARM, Cortex-M (STM32F0xx)
标签: c gcc cpu-registers cortex-m bare-metal