程序代码相关困惑

2019-07-20 12:13发布

[mw_shl_code=c,true]//跳转到应用程序段 //appxaddr:用户代码起始地址. void iap_load_app(u32 appxaddr) { if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法. { jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP. } } [/mw_shl_code]
在原子IAP实验中为什么要检查栈顶地址是否合法,而且地址要与0X2FFE0000相与呢??????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
wengxh642
2019-07-21 10:15


1、对照着个框图已经开始明白了,但有个疑问就是栈顶地址范围是不是就sram范围,比如stm32f103zet6 64KB,按照你所说(*(vu32*)appxaddr)就是指针里面的数据,对照框图就是栈顶地址,而跟0x2ffe0000相与判断有没有在sram内存地址范围内,sram地址范围与栈顶地址是什么关系?????2、 MSR_MSP(*(vu32*)appxaddr);     //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址),在初始化中app中是不是有开辟了一个栈顶地址,也就是说在只有一个IAP和APP情况下,有两个栈顶地址,APP栈顶地址进行偏移,但原子款图中并没有两个栈顶地址指示?????

一周热门 更多>