对SDRAM进行读写操作

首先,对memest()函数进行一下介绍。

memest原型 (please type "man memset" in your shell)

void *memset(void *s,  int c, size_t n);

memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。

常见的三种错误

第一: 搞反了c 和 n的位置.

一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20)
而不是 memset(a, 20,  0)

第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:

char buffer[20];

memset(buffer, 0, sizeof((char)*20));
strcpy(buffer, "123");

这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.

第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现

int some_func(struct something *a){


memset(a, 0, sizeof(a));

}

问:为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。

答:1.如果不清空,可能会在测试当中出现野值。 你做下面的试验看看结果()

char buf[5];

CString str,str1; //memset(buf,0,sizeof(buf)); for(int i = 0;i<5;i++) { str.Format(“%d “,buf[i]); str1 +=str ; } TRACE(“%s\r\n“,str1)

2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

 

 

 1 #include <stdio.h>
2  //#include "../inc/sopc.h"
3  #include "system.h"
4 #include "string.h"
5 #include "unistd.h"
6 #include "altera_avalon_pio_regs.h"
7  /*在DE2开发板相对应的system.h文件中定义的是SDRAM_0_BASE
8 * #define SDRAM_0_BASE 0x00800000,所以有如下宏定义
9 */
10 #define SDRAM_BASE 0x00800000
11 unsigned short * ram = (unsigned short *)(SDRAM_BASE+0x10000); //SDRAM地址
12
13 int main(void)
14 {
15 int i;
16
17 memset(ram,0,100);
18 //从这里可以看出SDRAM的读写速度有多么的快!!!
19 //向ram中写数据,当ram写完以后,ram的地址已经变为(SDRAM_BASE+0x10100)
20 for(i=0;i<100;i++)
21 {
22 *(ram++) = i;
23 }
24
25 //逆向读取ram中的数据
26 for(i=0;i<100;i++){
27 printf("%d\n",*(--ram));
28 }
29 for(i=100;i<200;i++)
30 {
31 *(ram++) = i;
32 }
33
34 //逆向读取ram中的数据
35 for(i=100;i<200;i++)
36 {
37 IOWR(SEG7_DISPLAY_BASE,0,*(--ram));
38 printf("%d\n",*(--ram));
39 usleep(1000000);
40 }
41
42 return 0;
43 }
44
45

 

posted @ 2010-08-26 11:27  xxfighting  阅读(2975)  评论(0编辑  收藏  举报