打印
[DemoCode下载]

嵌入式内存的读写方法,以及强制类型转换的知识点

[复制链接]
823|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大苏牙|  楼主 | 2015-12-7 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
函数flash读取,type为0代表128字节储存区,为1代表64K存储区(512字节/扇区)
void InterFlashRead(unsigned short addr, unsigned char nLength, unsigned char* dat)
{
unsigned char i;
EA = 0;
PSCTL=0x04;
FLSCL = 0x00;
for(i=0; i
{
*(dat+i) = *(unsigned char code*)(addr+i);
}
PSCTL = 0;
EA = 1;
}
而想到的问题,其中的   *(dat+i)= *(unsigned char code *)(addr+i);是什么意思呢?
这里面定义的dat是char型指针,也就是说一个指针(地址)保存一个字节的数据,然而addr这个地址是short型,addr是一个指针保存2个字节的数据,所以要进行强制的类型转换
沙发
大苏牙|  楼主 | 2015-12-7 21:11 | 只看该作者
(unsignedchar code *)这一部分就是强制转换

这里要明确的是如果我们对一个整型强制转换时可以用下列例子描述:
unsigned inta=0x1234;
b=(unsigned char)a;
那么b就等于0x34   (,[size=14.399999618530273px]int型数值赋给char型变量[size=14.399999618530273px]时,只保留其最低8位,高位部分舍弃)
[size=14.399999618530273px]

[size=14.545454025268555px]但是这个例子当中涉及到了指针的操作,首先把addr是一个地址值,相当于指针当中的&p的值比如是0x1111,那么(unsignedchar code*)(addr+i)这一步就是转换成指向这个地址的指针,指针的值是0x1111,前面再加一个*号就表示取值,哈哈,就这么理解。


2、以前看到#define SREG   (*(volatile unsigned char*)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~

使用特权

评论回复
板凳
大苏牙|  楼主 | 2015-12-7 21:12 | 只看该作者
嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,
    第一步是要把它强制转换为指针类型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向unsignedchar类型。
  volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
  第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
   *(volatile unsigned char*)0x5F
  第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以#defineSREG    (*(volatile unsigned char*)0x5F)
   类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义:
    #define RAM_ADDR    (*(volatile unsigned long *)0x0000555F)
   然后就可以用C语言对这个内存地址进行读写操作了
    读:tmp = RAM_ADDR;
    写:RAM_ADDR = 0x55;

使用特权

评论回复
地板
dml19890601| | 2015-12-8 09:16 | 只看该作者
您好,我是笙泉单片机中国区指定代理希特电子杜先生,您可以加我QQ3166720948。或者打我电话15295658706,我可以安排寄样测试,期待与您的合作,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

278

帖子

4

粉丝