栈顶判断
以GD32F130C8为例,该单片机flash为64KB,ram为8KB。
64KB = 0x10000B,起始地址:0x08000000。
8KB = 0x2000B,起始地址:0x20000000。
因此MDK中配置如下:

单片机启动过程中,首先运行.s启动文件,该文件中定义了栈顶地址、中断向量表以及中断向量服务器程序。


CPU在上电执行时,第一时间需要知道栈顶地址,执行程序时才能进栈出栈。
通过查看map文件可知:

栈地址为0x20000128,栈大小为1024字节,即0x400字节。
在.s文件中栈大小定义如下:

由于栈是向下生长的,即由高地址向低地址存储数据的。因此CPU需要知道栈顶地址,而不是栈底地址,map文件中显示的为栈底地址。bin文件中第一个字即存放栈顶地址。如下图所示:

栈顶地址为0x20000528,即0x20000128 + 0x400。
在boot跳转app中,需要判断栈顶是否合法,即判断栈顶地址是否在该单片机内存空间地址范围内即可。
不同单片机内存大小不一致,因此判断范围也不一致。

浙公网安备 33010602011771号