OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3914|回复: 12

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

[复制链接]

15

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-11-30
在线时间
42 小时
发表于 2017-1-10 22:25:19 | 显示全部楼层 |阅读模式
3金钱
void iap_load_app(u32 appxaddr)
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }
}
这段代码看不懂,求详细说明一下,谢谢

最佳答案

查看完整内容[请看2#楼]

1, 假定app是从0x80002000开始的; MCU内存RAM是从0x20000000开始的;[/backcolor] 2, 0x80002000这个位置装载的是MSP指针初始化的数据地址, 这个数据是指向MCU内存RAM区域; [/backcolor] 3, 0x80002004这个位置装载的硬件复位中断函数的地址, 这个地址是指向MCU程序ROM区域;[/backcolor] 4, 系统是从硬件复位中断函数开始运行的;[/backcolor] 5, 理解一个函数指针 [/backcolor]typedef void (*iapfun)(void); //函数指针 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2017-1-10 22:25: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啦.
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2017-1-11 09:02:24 | 显示全部楼层
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。APP第二个4字节地址存放程序起始地址,所以将它取值出来然后用MSR_MSP函数将程序指针PC指向该起始地址。然后运行即可
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-11 09:06:12 | 显示全部楼层
学习一下!
回复

使用道具 举报

2

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
599
金钱
599
注册时间
2014-11-6
在线时间
97 小时
发表于 2017-1-11 11:29:19 | 显示全部楼层
官方这么写的能用
多看美女有益健康!
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2012-5-2
在线时间
25 小时
发表于 2017-2-13 14:34:41 | 显示全部楼层
电子之旅 发表于 2017-1-11 09:02
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。 ...

厉害@ME
不忘初衷,方得始终
回复

使用道具 举报

8

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-17
在线时间
102 小时
发表于 2017-4-1 14:53:38 | 显示全部楼层
电子之旅 发表于 2017-1-11 09:02
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。 ...

清晰,直中要害
回复

使用道具 举报

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2015-9-9
在线时间
59 小时
发表于 2017-4-13 15:14:02 | 显示全部楼层
电子之旅 发表于 2017-1-11 09:02
APP代码存放地址appxaddr里面存放的第一个4字节的值是栈顶地址,栈顶地址是RAM地址,所以是0x2000000开头。 ...

“MSR_MSP函数”是设置的栈顶地址吧,
后边一句jump2app();才是“程序指针PC指向该起始地址。”
毕业两年才学STM32...
这些都没关系,重点是自己到底成长了没有
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2019-6-28 09:22:07 | 显示全部楼层
当年我一直以为6楼7楼都是夸我的,今天才看到是夸3楼的,
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-6-28 16:49:18 | 显示全部楼层
hhlh2l 发表于 2019-6-28 09:22
当年我一直以为6楼7楼都是夸我的,今天才看到是夸3楼的,

您这坟挖的、、、、、我来夸你一下
回复

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2019-7-8 20:43:57 | 显示全部楼层
学习了学习了
天然懒,天然呆
能吃会睡,未来可期
回复

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-4-24
在线时间
53 小时
发表于 2019-7-9 08:53:44 | 显示全部楼层
厉害,MARK一下
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2019-7-26 08:59:22 | 显示全部楼层
brucewoo 发表于 2019-6-28 16:49
您这坟挖的、、、、、我来夸你一下

谢夸奖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 22:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表