[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相与呢??????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1、对照着个框图已经开始明白了,但有个疑问就是栈顶地址范围是不是就sram范围,比如stm32f103zet6 64KB,按照你所说(*(vu32*)appxaddr)就是指针里面的数据,对照框图就是栈顶地址,而跟0x2ffe0000相与判断有没有在sram内存地址范围内,sram地址范围与栈顶地址是什么关系?????2、 MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址),在初始化中app中是不是有开辟了一个栈顶地址,也就是说在只有一个IAP和APP情况下,有两个栈顶地址,APP栈顶地址进行偏移,但原子款图中并没有两个栈顶地址指示?????
一周热门 更多>