程序代码相关困惑

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条回答
zc123
1楼-- · 2019-07-20 16:28
 精彩回答 2  元偷偷看……
龙之谷
2楼-- · 2019-07-20 19:07
刚看了一下,貌似地址与上0X2FE00000比较合适,等高手解答吧~
ianhom
3楼-- · 2019-07-20 19:20
回复【3楼】zc123:
---------------------------------
学习了!
wengxh642
4楼-- · 2019-07-20 23:39
 精彩回答 2  元偷偷看……
zc123
5楼-- · 2019-07-21 00:05
 精彩回答 2  元偷偷看……
wengxh642
6楼-- · 2019-07-21 00:29
回复【6楼】zc123:
---------------------------------
 那这段代码看不懂原因是不是因为我没明白程序运行的方式,也就是说我错误理解的是当我的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开始执行程序,能不能这样理解???????

一周热门 更多>