免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3663 | 回复: 4
打印 上一主题 下一主题

如何读写外部存储器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-28 16:07 |只看该作者 |倒序浏览
10可用积分
基本结构:s3c2410的板子,2.6.8.1内核,板子外接了一个SRAM。
为了测试这个结构的正确性,我写了一个字符驱动程序,在驱动程序初始化例程中,也就是__init例程中,我首先使用ioremap_nocache(BASE_ADDR,SRAM_SIZE)将物理地址映射为虚拟地址(BASE_ADDR是硬件连线所决定的SRAM的基地址),然后使用for循环 对所有单元进行读操作

[C/C++ code]
for(i=0;i<1000;i++)//对所有单元读1000次
{
   for(j=0;j<SRAM_SIZE;j++)//循环读所有单元
  {
    value=readb(ptr);
    ptr++;
   }
}

[/code]


结果发现,读了两三次就发生硬件重启,但是,我把最外层的for去掉之后,就正常了。不知道是不是我的思路有问题?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-07-28 16:40 |只看该作者

回复 #1 zclever 的帖子

你这个ptr指针有问题,不断地加,最后加到哪里去了?都超过你SRAM的大小了。

论坛徽章:
0
3 [报告]
发表于 2008-07-29 21:54 |只看该作者

回复 #1 zclever 的帖子

for(i=0;i<1000;i++)//对所有单元读1000次
{
   ptr = SRAM_START;
   for(j=0;j<SRAM_SIZE;j++)//循环读所有单元
  {
    value=readb(ptr);
    ptr++;
   }
}

论坛徽章:
0
4 [报告]
发表于 2008-07-30 11:48 |只看该作者

回复 #1 zclever 的帖子

贴出详细的代码方便分析

论坛徽章:
0
5 [报告]
发表于 2008-08-01 22:13 |只看该作者
原帖由 zclever 于 2008-7-28 16:07 发表
基本结构:s3c2410的板子,2.6.8.1内核,板子外接了一个SRAM。
为了测试这个结构的正确性,我写了一个字符驱动程序,在驱动程序初始化例程中,也就是__init例程中,我首先使用ioremap_nocache(BASE_ADDR,SRAM ...

从硬件设计上得到这块SRAM 的物理地址范围,比如起始地址0xF0000000,大小512K
如果你的CPU 没有开始类似于MMU 的内存管理功能,则可以直接通过物理地址访问内存,如果开启了内存管理功能,则需要把这块内存映射到虚拟地址空间
知道了硬件的映射地址直接读写就可以了.

比如你要从0xF0000000读出一个字节;

volatile unsigned int  Buf = 0xF0000000;
char                  read_byte;

read_byte = (char *)Buf;
写的话,反过来就是了。
(char *)Buf = 'a';
16位,32位一样的操作,改变一下指针的类型就可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP