单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3030|回复: 2
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
lianyiqun 发表于 2015-7-8 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由函数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个字节的数据,所以要进行强制的类型转换,(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)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~
    嵌入式系统编程,要求程序员能够利用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;



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
C罗戴帽 发表于 2017-7-7 13:34 | 只看该作者
mark一下,总结得不错
回复

使用道具 举报

板凳
zwf 发表于 2017-9-22 16:12 | 只看该作者
楼主辛苦了!!谢谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

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