栈顶判断

GD32F130C8为例,该单片机flash64KBram8KB

64KB = 0x10000B,起始地址:0x08000000

8KB = 0x2000B,起始地址:0x20000000

因此MDK中配置如下:

 

 

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

 

 

 

 

 CPU在上电执行时,第一时间需要知道栈顶地址,执行程序时才能进栈出栈。

通过查看map文件可知:

 

 

 栈地址为0x20000128,栈大小为1024字节,即0x400字节。

.s文件中栈大小定义如下:

 

 

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

 

 

 栈顶地址为0x20000528,即0x20000128 + 0x400

 

boot跳转app中,需要判断栈顶是否合法,即判断栈顶地址是否在该单片机内存空间地址范围内即可。

不同单片机内存大小不一致,因此判断范围也不一致。

posted @ 2022-08-24 15:22  hifish  阅读(276)  评论(0)    收藏  举报