[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相与呢??????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
学习了!
---------------------------------
那这段代码看不懂原因是不是因为我没明白程序运行的方式,也就是说我错误理解的是当我的sramapp设置的栈顶指针设置为0x20001000时,就是从0x20001000+4开始执行
if(key==KEY_RIGHT)
{
printf("开始执行SRAM用户代码!! ");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.
{
iap_load_app(0X20001000);//SRAM地址
}else
{
printf("非SRAM应用程序,无法执行! ");
LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");
}
clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示
}
而当flashapp中的flash_app1_addr=0x08005000时程序运行就是从栈顶地址0x08005000+4开始运行
if(key==KEY_LEFT)
{
printf("开始执行FLASH用户代码!! ");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
但按照你说的,iap_load_app就是如果是sram地址参数,就是从这个参数+4开始执行,如果flash_app1_addr这个参数还要从flash_app1_addr这地址指针所指里面数据+4开始执行程序,能不能这样理解???????
一周热门 更多>