IAP代码看不太懂,求大神解释一下

2019-07-20 23:01发布

void iap_load_app(u32 appxaddr)
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }
}
这段代码看不懂,求详细说明一下,谢谢

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
hhlh2l
1楼-- · 2019-07-21 00:20
本帖最后由 hhlh2l 于 2017-1-11 13:31 编辑

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啦.
电子之旅
2楼-- · 2019-07-21 03:02
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。APP第二个4字节地址存放程序起始地址,所以将它取值出来然后用MSR_MSP函数将程序指针PC指向该起始地址。然后运行即可
lvkanger
3楼-- · 2019-07-21 03:27
 精彩回答 2  元偷偷看……
一叶扁舟V5
4楼-- · 2019-07-21 03:45
官方这么写的能用
potrial
5楼-- · 2019-07-21 07:59
 精彩回答 2  元偷偷看……
丶路常寻走不
6楼-- · 2019-07-21 13:50
电子之旅 发表于 2017-1-11 09:02
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。 ...

清晰,直中要害

一周热门 更多>