如何读写外部存储器
基本结构: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去掉之后,就正常了。不知道是不是我的思路有问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你这个ptr指针有问题,不断地加,最后加到哪里去了?都超过你SRAM的大小了。
for(i=0;i<1000;i++)//对所有单元读1000次
{
ptr = SRAM_START;
for(j=0;j<SRAM_SIZE;j++)//循环读所有单元
{
value=readb(ptr);
ptr++;
}
}
贴出详细的代码方便分析
从硬件设计上得到这块SRAM 的物理地址范围,比如起始地址0xF0000000,大小512K
如果你的CPU 没有开始类似于MMU 的内存管理功能,则可以直接通过物理地址访问内存,如果开启了内存管理功能,则需要把这块内存映射到虚拟地址空间
知道了硬件的映射地址直接读写就可以了.
比如你要从0xF0000000读出一个字节;
volatile unsigned int Buf = 0xF0000000;
char read_byte;
read_byte = (char *)Buf;
写的话,反过来就是了。
(char *)Buf = 'a';
16位,32位一样的操作,改变一下指针的类型就可以。