OpenEdv-开源电子网

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

IAP的例子里void iap_load_app(u32 appxaddr)函数中

[复制链接]

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
发表于 2017-4-14 21:04:28 | 显示全部楼层 |阅读模式
1金钱
IAP的例子里void iap_load_app(u32 appxaddr)函数中if  (     (  (*(vu32*)appxaddr)&2FFE0000)==0X2000 0000  ) //检查栈顶地址是否合法
想问下&2FFE0000这个数字是什么含义,0x2000 0000大概是片上内存地址.
向大家请教了,在原子教你玩stm32(库函数版本)503面

最佳答案

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

0x2000 0000是片上ram的起始地址,( ( (*(vu32*)appxaddr)&2FFE0000)==0X2000 0000 )判断你的栈顶地址是不是在ram的地址范围内,有没有超范围
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2017-4-14 21:04:29 | 显示全部楼层
0x2000 0000是片上ram的起始地址,(     (  (*(vu32*)appxaddr)&2FFE0000)==0X2000 0000  )判断你的栈顶地址是不是在ram的地址范围内,有没有超范围
回复

使用道具 举报

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
 楼主| 发表于 2017-4-15 12:37:03 | 显示全部楼层
szczyb1314 发表于 2017-4-15 12:34
0x2000 0000是片上ram的起始地址,(     (  (*(vu32*)appxaddr)&2FFE0000)==0X2000 0000  )判断你的栈顶地 ...

&2FFE0000  是什么意思啊按位与2FFE0000,不懂这个,向你请教了谢谢
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2017-4-15 12:54:28 | 显示全部楼层
richthoffen 发表于 2017-4-15 12:37
&2FFE0000  是什么意思啊按位与2FFE0000,不懂这个,向你请教了谢谢

你想啊,在FFE的位置上出现1,与之后是不是就不是20000000了
在这些个位置上出现1其实就是地址超出范围了。
如果你的RAM是64K的话,你写个2fff0000也行,现在写个2ffe0000是128k的ram地址,范围是20000000-2001ffff,你在这个128k的地址范围内相与都不会报错。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
 楼主| 发表于 2017-4-15 18:50:36 | 显示全部楼层
szczyb1314 发表于 2017-4-15 12:54
你想啊,在FFE的位置上出现1,与之后是不是就不是20000000了
在这些个位置上出现1其实就是地址超出范围 ...

谢谢你说的我都明白了,谢谢,我现在还有点疑惑的是,前面有*(vu32*)就会将地址(就是appxaddr)&2FFE0000变为地址存放的值&2FFE0000,这个位置有点不懂.
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2017-4-16 10:17:18 | 显示全部楼层
*(vu32*)appxaddr具体是:
1.先将appxaddr强制类型转换为vu32类型的指针,
2.然后最前面的*是指这个指针里面具体的内容值
这个函数原来调用的时候原子写的是iap_load_app(0x8010000);
具体是说程序跳转到地址位0x8010000的位置上,这个0x8010000地址里面存放的是app程序的起始地址值。这个值就是*(vu32*)appaddr。然后判断这个值是否合法。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
 楼主| 发表于 2017-4-16 18:31:20 | 显示全部楼层
szczyb1314 发表于 2017-4-16 10:17
*(vu32*)appxaddr具体是:
1.先将appxaddr强制类型转换为vu32类型的指针,
2.然后最前面的*是指这个指针 ...

从哪里可以知道0x8010000地址里存放的还是地址,这个知识点我不知道,麻烦你了.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-4-17 01:34:22 | 显示全部楼层
richthoffen 发表于 2017-4-16 18:31
从哪里可以知道0x8010000地址里存放的还是地址,这个知识点我不知道,麻烦你了.

你应该多百度。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
 楼主| 发表于 2017-4-17 19:05:34 | 显示全部楼层
szczyb1314 发表于 2017-4-16 10:17
*(vu32*)appxaddr具体是:
1.先将appxaddr强制类型转换为vu32类型的指针,
2.然后最前面的*是指这个指针 ...

http://www.openedv.com/forum.php ... &extra=page%3D1  想问下fwaddr+=2048;这里为什么是2048而不是1024,急切的想知道为什么,麻烦你了,谢谢
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2017-4-17 19:44:20 | 显示全部楼层
32的flash是16位数据宽度的,一次写一扇区,一扇区1024个,但是fwaddr里面是8位数据,把两个8位凑成了一个16位写入的。所以地址偏移时是2048的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
 楼主| 发表于 2017-4-17 20:13:03 | 显示全部楼层
szczyb1314 发表于 2017-4-17 19:44
32的flash是16位数据宽度的,一次写一扇区,一扇区1024个,但是fwaddr里面是8位数据,把两个8位凑成了一个1 ...

1 按书上说的fwaddr+=2048; 偏移2048 16=2*8
我也觉得fwaddr地址指向的是8位数据,但是就是没看到u8 *fwaddr这样的语句
2 还有我想问写flash一个扇区,是不是只能写偶数地址的字节?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2017-4-18 14:37:38 | 显示全部楼层
richthoffen 发表于 2017-4-17 20:13
1 按书上说的fwaddr+=2048; 偏移2048 16=2*8
我也觉得fwaddr地址指向的是8位数据,但是就是没看到u8 *fwa ...

fwaddr其实就是串口发送下去的bin文件的地址。串口发送的时候是一次1byte的就是8位的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-1-18
在线时间
26 小时
发表于 2019-11-20 22:30:59 | 显示全部楼层
richthoffen 发表于 2017-4-16 18:31
从哪里可以知道0x8010000地址里存放的还是地址,这个知识点我不知道,麻烦你了.

STM32中文参考手册的中断向量表可以看到,0x0000_0004地址保存的是复位后程序的起始地址,0x0000_0000地址只说了保留,但保存的就是复位后栈顶的地址
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 12:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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