OpenEdv-开源电子网

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

((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000这句话应该怎样理解呢?麻烦详细解释一下。。。

[复制链接]

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-10-27
在线时间
0 小时
发表于 2014-11-16 20:52:21 | 显示全部楼层 |阅读模式
5金钱

*(vu32*)(0X20001000+4)这里为什么是中断向量入口地址,那里为什么+4(我知道起始地址长度是4个字节,但是怎么和0x20001000就加在一起了呢?),&0xFF000000这里的与操作是怎么执行的,最后怎么就出来0x08000000了,还有地址这个东西怎么理解比较好,他是不是代表的是一片内存的名字呢?问题有点多。。。请大神解释一下下。。。

最佳答案

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

串口接收过来的数据,是从:0X20001000开始存储的。 第一个4个字节是MSP地址,第二个4个字节,才是复位中断向量的入口地址。 &0xFF000000就是取最高8位。因为FLASH的地址范围是0X0800 0000开始的。这可以一定程度上确保地址范围正常。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 20:52:22 | 显示全部楼层
串口接收过来的数据,是从:0X20001000开始存储的。
第一个4个字节是MSP地址,第二个4个字节,才是复位中断向量的入口地址。
&0xFF000000就是取最高8位。因为FLASH的地址范围是0X0800 0000开始的。这可以一定程度上确保地址范围正常。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-11-17 11:37:46 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
回复【2楼】正点原子:
---------------------------------
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{  
           iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
#define FLASH_APP1_ADDR 0x08020000   //第一个应用程序起始地址(存放在FLASH)
#define FLASH_APP2_ADDR 0x08040000
对于这句话的使用还是不太明白,如果我把if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)这句话中的FLASH_APP1_ADDR改为FLASH_APP2_ADDR,那么if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)与
if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)的执行效果为什么不一样,按位与的结果不都是0x08000000吗?
麻烦原子哥再稍微详细一点解释一下这句话的含义,现在想添加多个app程序,但不知道这句话具体含义,感觉还是地址的问题没搞懂,请指教
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-17 20:19:22 | 显示全部楼层
回复【3楼】满满VS犬夜叉:
---------------------------------
说明你FLASH_APP2_ADDR+4里面存放的数据有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-11-18 15:41:06 | 显示全部楼层


SCB->VTOR = FLASH_BASE | 0x40000;
有了这两个设置,app2应该可以存在0x8040000之后的区域吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-19 00:41:05 | 显示全部楼层
回复【5楼】满满VS犬夜叉:
---------------------------------
关键要看你写入正常没有
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-11-19 08:21:15 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
好的,我再找找原因。
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2014-11-20 08:35:27 | 显示全部楼层
回复【7楼】满满VS犬夜叉:
对于这句话的使用还是不太明白,如果我把if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)这句话中的FLASH_APP1_ADDR改为FLASH_APP2_ADDR,那么if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)与 
if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)的执行效果为什么不一样,按位与的结果不都是0x08000000吗? 
---------------------------------
 
*(vu32*)(FLASH_APP1_ADDR+4) <===這句是指位址0x08020000+4"裡面的內容"
*(vu32*)(FLASH_APP2_ADDR+4) <===0x08040000+4的"內容"

你應該是少看了一個最前面的 *  才會覺得2個都一樣
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-11-20 15:58:50 | 显示全部楼层
回复【8楼】civic7366:
---------------------------------
恩恩的确是,谢谢。
回复

使用道具 举报

13

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2016-2-2
在线时间
66 小时
发表于 2016-8-28 14:31:45 | 显示全部楼层
正点原子 发表于 2014-11-16 20:52
串口接收过来的数据,是从:0X20001000开始存储的。
第一个4个字节是MSP地址,第二个4个字节,才是复位中断 ...

原子哥,你好,你们讨论的这个问题我看了,但还是有点不明白,bin文件是不包含地址信息的,而0x0800 0000 属于地址信息啊,这点搞不明白,希望原子哥有时间给解答一下,谢谢
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-10-10
在线时间
16 小时
发表于 2016-9-28 15:04:19 | 显示全部楼层
xiao55555 发表于 2016-8-28 14:31
原子哥,你好,你们讨论的这个问题我看了,但还是有点不明白,bin文件是不包含地址信息的,而0x0800 0000 ...

兄弟,我原来也一直纠结,为毛串口接收的数据是0x20001000+4,我查看我的就不是,后来一想原子老大肯定是固定地址了,一看果然
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.
你看他把接收的首地址固定了。我就不想用指针,直接查看接收的数年前32位是不是符合,第二个32位是不是符合就OK了。
回复

使用道具 举报

18

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-8-22
在线时间
82 小时
发表于 2016-11-10 17:15:36 | 显示全部楼层
civic7366 发表于 2014-11-20 08:35
回复【7楼】满满VS犬夜叉:
对于这句话的使用还是不太明白,如果我把if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xF ...

大哥 我瞅了半天  到底是那个*号啊   
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-11-10 18:29:28 | 显示全部楼层
ksi魔杰 发表于 2016-11-10 17:15
大哥 我瞅了半天  到底是那个*号啊

哪翻的古文...差點看不懂哪裡少了*

原本版主再問說
*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000与
*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000为什么不一样

是因為少看了最前面的 依址取值運算子..才會覺得它們是一樣的
向下面這樣就一樣都是0x08000000了
(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000
(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-10-5
在线时间
14 小时
发表于 2016-11-10 19:14:11 | 显示全部楼层
(*(vu32*)(0X20001000+4)) 的意思是绝对地址 0X20001000+4 这个地方放的是一个指针的地址!至于它指向哪,由内容决定。
回复

使用道具 举报

18

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-8-22
在线时间
82 小时
发表于 2016-11-11 16:16:47 | 显示全部楼层
civic7366 发表于 2016-11-10 18:29
哪翻的古文...差點看不懂哪裡少了*

原本版主再問說

明白了  谢谢前辈     一个是  地址里面的内容进行比较  一个是地址进行比较
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2016-6-14
在线时间
22 小时
发表于 2016-12-16 11:55:29 | 显示全部楼层
xiao55555 发表于 2016-8-28 14:31
原子哥,你好,你们讨论的这个问题我看了,但还是有点不明白,bin文件是不包含地址信息的,而0x0800 0000 ...

我觉得接收的bin文件中的内容第一个4个字节是MSP的地址0x200.....,第二个4个字节,是复位中断向量的入口地址0x0800....。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 01:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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