先上代码,属于原子例程
#define FLASH_APP1_ADDR 0x08010000 //第一个应用程序起始地址(存放在FLASH)
//保留0X08000000~0X0800FFFF的空间为Bootloader使用(64KB)
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}else
{
printf("非FLASH应用程序,无法执行!
");
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");
}
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
如果上述函数执行iap_load_app,那FLASH_APP1_ADDR地址里的内容判断是否是0x20000000,FLASH_APP1_ADDR+4的内容判断是否是0x08000000;这判断的我没看懂求指教
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
因为如果代码是存储在RAM,那肯定就是0X2000开头的
如果代码是存储在flash的,肯定就是0X0800,开头的
那FLASH_APP1_ADDR+4的内容判断是否是0x08000000是什么??
这里判断了两次啊、、先判断的0x08000000跳转到iap_load_app又判断了一次0x20000000
这个不管是flash还是sram最后都是通过iap_load_app()跳转的,跳转之后都是要判断if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法,
一周热门 更多>