硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2154|回复: 4
收起左侧

内核地址映射的疑问

[复制链接]

5

主题

14

回帖

75

积分

初级会员

积分
75
发表于 2017-8-6 22:50:27 | 显示全部楼层 |阅读模式
今天突然想试试,在external device 这1GB的地方,我随便写一个地址,比如属于SDRAM的地址0xD0000000,或本来属于external ram区的0x60000000地址处,写入数据,再通过指针的方式读出来,居然是可行的,读出的数据是正确的,我就觉得疑惑了,为什么会这样?我程序没有配置这些地址对应的nor flash 或者sdram功能,只有定义一个地址,然后往这个地址写数据,然后读出来。通过看map文件,发现我定义的变量处于0x2000 0010处,即在sram区。但是我地址是强制定义在外部区0xD0000000和0x60000000,不过外部区外设那些都没有使能,也就是外部区应该s是不工作的。那为什么还能正确读出数据,而且map文件显示还是在sram区,这里面发生了什么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2017-8-7 01:31:39 | 显示全部楼层
方便的话,发测试代码看下。
回复

使用道具 举报

5

主题

14

回帖

75

积分

初级会员

积分
75
 楼主| 发表于 2017-8-7 08:45:06 | 显示全部楼层

串口可以正常输出

串口可以正常输出
    串口可以正常输出
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2017-8-7 09:30:31 | 显示全部楼层
你的测试代码问题,这种测试容易被编译器优化掉,0xD0000000地址的变量就是个临时的,你设置了优化等级后,会直接优化掉。
改成
    *(__IO uint32_t *)(0xD0000000) = 0x1234;
   
    read_test = *(__IO uint32_t *)(0xD0000000);

就好了。
回复

使用道具 举报

5

主题

14

回帖

75

积分

初级会员

积分
75
 楼主| 发表于 2017-8-7 10:07:40 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的测试代码问题,这种测试容易被编译器优化掉,0xD0000000地址的变量就是个临时的,你设置了优化等级后,会直接优化掉。
改成
    *(__IO uint32_t *)(0xD0000000) = 0x1234;
    
    read_test = *(__IO uint32_ .. (2017-08-07 09:30) 
谢谢版主,确实因为开了优化,没想到会是因为这个,把我弄懵好久。安富莱果然没选错[s:141]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 21:36 , Processed in 0.258177 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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