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

2019-11-30来源: 51hei关键字:嵌入式内存  读写方法  强制类型转换

由函数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;


关键字:嵌入式内存  读写方法  强制类型转换 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481608.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于Proteus的LPC2106流水灯程序和仿真 测试成功
下一篇:LPC1768 MP3录音和循环播放源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

09全球工程师调查:中国工程师不爱新兴技术?
(system-in-package)与嵌入式内存;此外光电、太阳能与其他替代性能源技术,也在中国工程师心目中得到较低的评价。    在上述的调查中,来自中国、欧洲、印度与北美的工程师们,要从20项技术中选择所认为最具前景的项目(可复选);而在20个选项中有15个项目,勾选具前景的中国受访者比例都低于其他地区。这些项目除了前面已经提过的,还包括功能验证(formal verification)、XML、开放式脚本语言(open scripting languages)、微机电系统(MEMS)与硅智财(SIP)。     如上表,其中有不少项目在四个区域中的重要性差别度颇惹人注目;例如光电技术,仅有11%的中国受访者认为具前景,但在欧洲、北美与印度,认为该技术具
发表于 2009-12-05
09全球工程师调查:中国工程师不爱新兴技术?
透视Mentor与LogicVision公司的收购交易
      Mentor Graphics收购了LogicVision公司,总金额高达近13亿美元。该交易已经被安排为股票交换的交换形式,LogicVision作为Mentor的全资子公司形式得以保留下来。       实际上,LogicVision和Mentor的产品线存在很大程度的重叠:       两家公司都出售存储设备的测试与维修工具,包括针对通用内存芯片的和针对嵌入式内存的。       两家公司都出售逻辑BIST工具
发表于 2009-06-15
AVR读写IO口右一方法(借用ATmel)
//头文件#ifndef __always_inline__#define __always_inline__  _Pragma("inline=forced")inline#endif#define AVR_GPIO_ASSIGN(name, port, bit) \__always_inline__ static void   GPIO_##name##_Set(void)            {PORT##port |= (1 
发表于 2018-05-18
关于MSP430-Flash超过64K的读写操作方法
关于MSP430-Flash超过64K的读写操作方法#include "msp430xG46x.h"  void WriteFlashErrorNum(void);  //----------------------------------------------------------------------  //功能:从flash中读出数据,只需给出首地址和取出数据的数量  //输入:waddr为flash的地址,length为数据长度  //输出:无  
发表于 2018-05-01
DS1991的简介及其带密码保护存储器区的读写方法分析
    Dallas公司的iButton产品是一系列1-wire总线新型器件。DS1991是一种加密存储器型信息纽扣,封装于直径为16mm的不锈钢外壳中,体积小巧,便于携带、保存,防尘、防腐蚀,可以在恶劣的应用环境中实现带密码保护的数据传送。本文介绍DS1991的特点、工作原理及其带密码保护存储器区的读写方法。    内容摘要:    DS1991是Dallas公司的1-wire总线信息纽扣家庭中的一员,是一种加密存储器型信息纽扣。它内部集成了1Kbit是非易失性存储器及加密保护逻辑,封装于直径为16mm、厚约6mm的不锈钢外壳中,何种小巧、操作便捷,防潮、抗震
发表于 2018-04-07
DS1991的简介及其带密码保护存储器区的读写方法分析
AVR读写IO口右一方法(借用ATmel)
//头文件#ifndef __always_inline__#define __always_inline__  _Pragma("inline=forced")inline#endif#define AVR_GPIO_ASSIGN(name, port, bit) \__always_inline__ static void   GPIO_##name##_Set(void)            {PORT##port |= (1 
发表于 2017-11-24
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved