void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
这段代码看不懂,求详细说明一下,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1, 假定app是从0x80002000开始的; MCU内存RAM是从0x20000000开始的;
2, 0x80002000这个位置装载的是MSP指针初始化的数据地址, 这个数据是指向MCU内存RAM区域;
3, 0x80002004这个位置装载的硬件复位中断函数的地址, 这个地址是指向MCU程序ROM区域;
4, 系统是从硬件复位中断函数开始运行的;
5, 理解一个函数指针 typedef void (*iapfun)(void);
//函数指针的用法
void fun_t(void); //定义一个函数
iapfun _iapfun; //定义一个函数指针变量
_iapfun = fun_t; //给函数指针变量赋值
_iapfun(); //这句的意思就是让CPU运行_iapfun所指向的函数, 这里这个函数fun_t
6, 要从bootloader跳转到app要进行两部操作:
1) 设置MSP指针;
2) 调用硬件中断函数;
7, 定义一个函数指针变量 iapfun jump2app; 假设appxaddr = 0x80002000;
8, if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000); //检查msp指针在不在可用内存范围,不在的话程序就跑飞了;
jump2app=(iapfun)*(vu32*)(appxaddr+4); //获取硬件中断函数的的地址;
MSR_MSP(*(vu32*)appxaddr); //设置MSP指针;
jump2app(); //运行中断函数;
9, 这样程序就自动跳转到app啦.
清晰,直中要害
一周热门 更多>