精华内容
下载资源
问答
  • 对于开箱报警 主要是对箱门开启、关闭状态输入检测接点 检测开关位置状态,发生变位时应记入内存并在最近一次主站查询时向其发送该变位信号,由相应的仪器主动上报
  • SD卡引脚 电路图及工作原理介绍

    万次阅读 多人点赞 2016-04-11 11:00:27
    对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,...

    转自:http://blog.csdn.net/zhangyanquen/article/details/6658802

    SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。

    (1) SD卡的引脚定义

    SD卡引脚功能详述:

    引脚
    编号
    SD模式         SPI模式
    名称 类型 描述 名称 类型 描述
    1 CD/DAT3 IO或PP
    卡检测/
    数据线3
    #CS I 片选
    2 CMD PP
    命令/
    回应
    DI I 数据输入
    3 VSS1 S 电源地 VSS S 电源地
    4 VDD S 电源 VDD S 电源
    5 CLK I 时钟 SCLK I 时钟
    6 VSS2 S 电源地 VSS2 S 电源地
    7 DAT0 IO或PP 数据线0 DO O或PP 数据输出
    8 DAT1 IO或PP 数据线1 RSV    
    9 DAT2 IO或PP 数据线2 RSV    

     

    注:S:电源供给  I:输入 O:采用推拉驱动的输出
    PP:采用推拉驱动的输入输出

     

    SD卡SPI模式下与单片机的连接图:

    SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。

    (2) SPI方式驱动SD卡的方法
         SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。
    1) 命令与数据传输
    1. 命令传输
    SD卡自身有完备的命令系统,以实现各项操作。命令格式如下:

    命令的传输过程采用发送应答机制,过程如下:

    每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

    字节 含义
     
     
     
    1
    7 开始位,始终为0
    6 参数错误
    5 地址错误
    4 擦除序列错误
    3 CRC错误
    2 非法命令
    1 擦除复位
    0 闲置状态

     

     

    字节
    含义
     
     
     
    1
    7
    开始位,始终为0
    6
    参数错误
    5
    地址错误
    4
    擦除序列错误
    3
    CRC错误
    2
    非法命令
    1
    擦除复位
    0
    闲置状态
     
     
     
    2
    7
    溢出,CSD覆盖
    6
    擦除参数
    5
    写保护非法
    4
    卡ECC失败
    3
    卡控制器错误
    2
    未知错误
    1
    写保护擦除跳过,锁/解锁失败
    0
    锁卡

     

    字节 含义
     
     
     
    1
    7 开始位,始终为0
    6 参数错误
    5 地址错误
    4 擦除序列错误
    3 CRC错误
    2 非法命令
    1 擦除复位
    0 闲置状态
    2~5 全部 操作条件寄存器,高位在前


    写命令的例程:
    //-----------------------------------------------------------------------------------------------
      向SD卡中写入命令,并返回回应的第二个字节
    //-----------------------------------------------------------------------------------------------
    unsigned char Write_Command_SD(unsigned char *CMD)
    {
       unsigned char tmp;
       unsigned char retry=0;
       unsigned char i;

       //禁止SD卡片选
       SPI_CS=1;
       //发送8个时钟信号
       Write_Byte_SD(0xFF);
       //使能SD卡片选
       SPI_CS=0;

       //向SD卡发送6字节命令
       for (i=0;i<0x06;i++)
       {
          Write_Byte_SD(*CMD++);
       }
      
       //获得16位的回应
       Read_Byte_SD(); //read the first byte,ignore it.
       do
       {  //读取后8位
          tmp = Read_Byte_SD();
          retry++;
       }
       while((tmp==0xff)&&(retry<100));
       return(tmp);
    }

    2) 初始化
    SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的。在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式
               初始化时序图:

       初始化例程:
    //--------------------------------------------------------------------------
        初始化SD卡到SPI模式
    //--------------------------------------------------------------------------
    unsigned char SD_Init()

       unsigned char retry,temp;
       unsigned char i;
       unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
    SD_Port_Init(); //初始化驱动端口
      
       Init_Flag=1; //将初始化标志置1

     

       for (i=0;i<0x0f;i++)
       {
          Write_Byte_SD(0xff); //发送至少74个时钟信号
       }
     
       //向SD卡发送CMD0
       retry=0;
       do
       { //为了能够成功写入CMD0,在这里写200次
         temp=Write_Command_SD(CMD);
         retry++;
         if(retry==200)
         { //超过200次
           return(INIT_CMD0_ERROR);//CMD0 Error!
         }
       }
       while(temp!=1);  //回应01h,停止写入
      
       //发送CMD1到SD卡
       CMD[0] = 0x41; //CMD1
       CMD[5] = 0xFF;
       retry=0;
       do
       { //为了能成功写入CMD1,写100次
         temp=Write_Command_SD(CMD);
         retry++;
         if(retry==100)
         { //超过100次
           return(INIT_CMD1_ERROR);//CMD1 Error!
         }
       }
       while(temp!=0);//回应00h停止写入
      
       Init_Flag=0; //初始化完毕,初始化标志清零
      
       SPI_CS=1;  //片选无效
       return(0); //初始化成功
    }
    3) 读取CID
    CID寄存器存储了SD卡的标识码。每一个卡都有唯一的标识码。
    CID寄存器长度为128位。它的寄存器结构如下:
     

     

    名称 数据宽度 CID划分
    生产标识号 MID 8 [127:120]
    OEM/应用标识 OID 16 [119:104]
    产品名称 PNM 40 [103:64]
    产品版本 PRV 8 [63:56]
    产品序列号 PSN 32 [55:24]
    保留 4 [23:20]
    生产日期 MDT 12 [19:8]
    CRC7校验合 CRC 7 [7:1]
    未使用,始终为1 1 [0:0]

     

    它的读取时序如下:

    与此时序相对应的程序如下:
    //------------------------------------------------------------------------------------
        读取SD卡的CID寄存器   16字节   成功返回0
    //-------------------------------------------------------------------------------------
    unsigned char Read_CID_SD(unsigned char *Buffer)
    {
       //读取CID寄存器的命令
       unsigned char CMD[] = {0x4A,0x00,0x00,0x00,0x00,0xFF};
       unsigned char temp;
       temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes
       return(temp);
    }

    4)读取CSD
    CSD(Card-Specific Data)寄存器提供了读写SD卡的一些信息。其中的一些单元可以由用户重新编程。具体的CSD结构如下:

     

    名称
    数据宽度
    单元类型
    CSD划分
    CSD结构
    CSD_STRUCTURE
    2
    R
    [127:126]
    保留
    -
    6
    R
    [125:120]
    数据读取时间1
    TAAC
    8
    R
    [119:112]
    数据在CLK周期内读取时间2(NSAC*100)
    NSAC
    8
    R
    [111:104]
    最大数据传输率
    TRAN_SPEED
    8
    R
    [103:96]
    卡命令集合
    CCC
    12
    R
    [95:84]
    最大读取数据块长
    READ_BL_LEN
    4
    R
    [83:80]
    允许读的部分块
    READ_BL_PARTIAL
    1
    R
    [79:79]
    非线写块
    WRITE_BLK_MISALIGN
    1
    R
    [78:78]
    非线读块
    READ_BLK_MISALIGN
    1
    R
    [77:77]
    DSR条件
    DSR_IMP
    1
    R
    [76:76]
    保留
    -
    2
    R
    [75:74]
    设备容量
    C_SIZE
    12
    R
    [73:62]
    最大读取电流@VDDmin
    VDD_R_CURR_MIN
    3
    R
    [61:59]
    最大读取电流@VDDmax
    VDD_R_CURR_MAX
    3
    R
    [58:56]
    最大写电流@VDDmin
    VDD_W_CURR_MIN
    3
    R
    [55:53]
    最大写电流@VDDmax
    VDD_W_CURR_MAX
    3
    R
    [52:50]
    设备容量乘子
    C_SIZE_MULT
    3
    R
    [49:47]
    擦除单块使能
    ERASE_BLK_EN
    1
    R
    [46:46]
    擦除扇区大小
    SECTOR_SIZE
    7
    R
    [45:39]
    写保护群大小
    WP_GRP_SIZE
    7
    R
    [38:32]
    写保护群使能
    WP_GRP_ENABLE
    1
    R
    [31:31]
    保留
    -
    2
    R
    [30:29]
    写速度因子
    R2W_FACTOR
    3
    R
    [28:26]
    最大写数据块长度
    WRITE_BL_LEN
    4
    R
    [25:22]
    允许写的部分部
    WRITE_BL_PARTIAL
    1
    R
    [21:21]
    保留
    -
    5
    R
    [20:16]
    文件系统群
    FILE_OFRMAT_GRP
    1
    R/W
    [15:15]
    拷贝标志
    COPY
    1
    R/W
    [14:14]
    永久写保护
    PERM_WRITE_PROTECT
    1
    R/W
    [13:13]
    暂时写保护
    TMP_WRITE_PROTECT
    1
    R/W
    [12:12]
    文件系统
    FIL_FORMAT
    2
    R/W
    [11:10]
    保留
    -
    2
    R/W
    [9:8]
    CRC
    CRC
    7
    R/W
    [7:1]
    未用,始终为1
    -
    1
     
    [0:0]

     

    读取CSD 的时序:

    相应的程序例程如下:
    //-----------------------------------------------------------------------------------------
        读SD卡的CSD寄存器   共16字节    返回0说明读取成功
    //-----------------------------------------------------------------------------------------
    unsigned char Read_CSD_SD(unsigned char *Buffer)

       //读取CSD寄存器的命令
       unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};
       unsigned char temp;
       temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes
       return(temp);
    }


    4) 

    读取SD卡信息
    综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。如下:
    //-----------------------------------------------------------------------------------------------
    //返回
    //  SD卡的容量,单位为M
    //  sector count and multiplier MB are in
    u08 == C_SIZE / (2^(9-C_SIZE_MULT))
    //  SD卡的名称
    //-----------------------------------------------------------------------------------------------
    void SD_get_volume_info()
    {  
        unsigned char i;
        unsigned char c_temp[5];
        VOLUME_INFO_TYPE SD_volume_Info,*vinf;
        vinf=&SD_volume_Info; //Init the pointoer;
    /读取CSD寄存器
        Read_CSD_SD(sectorBuffer.dat);
    //获取总扇区数
     vinf->sector_count = sectorBuffer.dat[6] & 0x03;
     vinf->sector_count <<= 8;
     vinf->sector_count += sectorBuffer.dat[7];
     vinf->sector_count <<= 2;
     vinf->sector_count += (sectorBuffer.dat[8] & 0xc0) >> 6;
     // 获取multiplier
     vinf->sector_multiply = sectorBuffer.dat[9] & 0x03;
     vinf->sector_multiply <<= 1;
     vinf->sector_multiply += (sectorBuffer.dat[10] & 0x80) >> 7;
    //获取SD卡的容量
     vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);
     // get the name of the card
     Read_CID_SD(sectorBuffer.dat);
     vinf->name[0] = sectorBuffer.dat[3];
     vinf->name[1] = sectorBuffer.dat[4];
     vinf->name[2] = sectorBuffer.dat[5];
     vinf->name[3] = sectorBuffer.dat[6];
     vinf->name[4] = sectorBuffer.dat[7];
     vinf->name[5] = 0x00; //end flag 
    }
             以上程序将信息装载到一个结构体中,这个结构体的定义如下:
    typedef struct SD_VOLUME_INFO
    { //SD/SD Card info
      unsigned int  size_MB;
      unsigned char sector_multiply;
      unsigned int  sector_count;
      unsigned char name[6];
    } VOLUME_INFO_TYPE;


    展开全文
  • SD卡电路原理

    2012-06-19 20:04:29
    SD卡电路原理
  • 内存电路分析-设计框图和金手指 在DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)中已经讲了DDR芯片的管脚及用法,但是实际生活中我们经常看到的都是DIMM(SO-DIMM)的条子,不能直接接触到DDR...

    DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)中已经讲了DDR芯片的管脚及用法,但是实际生活中我们经常看到的都是DIMM(SO-DIMM)的条子,不能直接接触到DDR芯片,那么问题来了,DIMM芯片上的金手指和DDR芯片的引脚之间是怎样联系的呢?

    下面找到了另外一篇文章,这篇文章是以8GB/64位DDR2内存条为例,虽然比DDR3性能是要差了点,但是用来了解其原理还是可以的

     

    文章出处: http://www.wtoutiao.com/p/14fOzCc.html

     

    设计框图

    具体框图如下图。从图中可以看到,这个设计中共用了18颗内存芯片,9颗组成一个rank。前面曾经说过rank的概念,这里复习一下:一个rank就是一个或多个内存芯片组合在一起以达到内存总线带宽的需求;一个rank对应一个片选信号。这个设计中每个内存芯片是512MB/8位,要达到64位带宽,需要64/8=8颗芯片。另外为了保证系统更加稳定,这个内存条设计采用了ECC (error correction code) 也就是数据错误检查和纠正技术 - 64位总线需要8位的错误校验位来进行错误检查和纠正。这也就是说该设计中的每个rank(一个rank是64位)就需要一个8位的内存芯片来存放错误校验数据。这样加起来,一个rank共有9颗内存芯片。

     

     

    这个设计有2个rank,分别对应片选信号CS0#和CS1#。每个rank内的9个内存芯片:8个接内存总线的数据线,一个芯片接一个数据组也就是8根线组成的一个数据组,依次为Data[0:7], Data[8:15], …, Data[56:63];第九个芯片接数据校验位。地址线连接到所有的内存芯片。每个内存芯片是512MB/8位,接数据线的内存芯片共16个,所以该内存条的设计容量是16*512MB = 8GB。

     

    图中底部是内存条金手指(golden finger)的示意图,在内存条上,几乎所有信号都连接金手指接口与内存条上的芯片和其他元器件。下面就来看看金手指接口电路连接。

     

    内存条金手指

    设计文档的第四页主要是金手指内存接口引脚及信号连接。我们先来看看什么是金手指。金手指就是内存条底部一排铜箔引脚触点,表面一般会镀金处理。当内存条插入到内存插槽中,金手指上的信号触点于内存插槽内的内存信号引脚接触连通,从而保证内存总线从主板到内存条的充分连接。所以金手指上的信号与内存插槽上的信号定义是一一对应的。金手指包括正面和背面两排信号触点,下图显示正面的部分,背面在同样的位置还有一排信号触点。

     

     

    金手指时间长了会由于表面积灰或者氧化而导致其导电性大大受到影响,系统不稳定,容易死机/蓝屏;或者干脆就不能正常开机,上电后无屏显。这种情况下,往往用工业酒精擦拭金手指表面,上述问题常可以得到解决。

     

    金手指接口电路信号

    金手指信号连接如下图,一张图是正面,另外一张是背面。其实金手指上的连接的信号都是前面分享中讲过的内存总线的数据,地址和控制信号,还有就是电源和地信号。内存条自己本身并没有电源电路,其上面所有芯片使用的电路和地都由主板通过金手指传输到内存条上,因此需要较多的电源和地的引脚。

    绝大部分信号前面都做过解析,这里就不赘述了。有几点补充一下:

      • S0/S1就是前面说过的片选信号CS0#/CS1#,这里起了不同的名字而已

      • 有几个信号以前没有讲过:SA0/SA1/SA2/SCL/SDA。这几个信号是连接到SPD的,具体后面在SPD部分会详细介绍

      • 地信号数量要远多余电源信号数量,在每个数据信号引脚旁边都有地信号引脚。为什么要做这样的设计?这里先把这个问题提出来,今后在相关部分详细探讨。大家也可以花些时间研究一下,培养自己的针对一个专题的学习和探究能力

    posted on 2016-07-11 21:46 christ0127 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/christsong/p/5659739.html

    展开全文
  • 内存结构 在了解C ++的内存模式之前,你需要知道如何将信息存储在计算机中。每个现代计算机都包含一些高速内部存储器,它是主要的信息库。在典型的机器中,该存储器是由称为RAM的专用集成电路芯片构成的,代表...

    在大多数情况下,我们所写的程序都依赖抽象数据类型来表示复合对象。从实践的角度来看,这个策略是极其常见的。当你以C++等面向对象语言编写程序时,应该尽可能利用库提供的抽象类型的优势,并尽可能远离底层细节的复杂性。因此了解C++如何表示数据是有用的。掌握这些知识可以让我们更好地了解这些抽象类型的工作原理,并帮助我们了解C ++的行为原理。
    我们前面提到过的STL使编程变得更容易。在接下来的内容中,主要目标是了解如何有效地实现这些结构。评估不同可能算法的效率取决于了解这些策略如何利用内存以及各种选项涉及的成本。如果我们没有对底层结构的更详细的了解,这些是不可能评估的。

    内存结构

    在了解C ++的内存模式之前,你需要知道如何将信息存储在计算机中。每个现代计算机都包含一些高速内部存储器,它是主要的信息库。在典型的机器中,该存储器是由称为RAM的专用集成电路芯片构成的,代表随机存取存储器(In a typical machine, that memory is built out of a special integrated-circuit chip called a RAM, which stands for random-access memory.)。 随机访问存储器允许程序随时使用任何存储单元的内容。 RAM芯片运行的技术细节对大多数程序员来说并不重要。重要的是这些内存是怎么样组成的。

    Bits, bytes, and words

    在计算机内部,所有数据值,无论多么复杂,都作为基本信息单元的组合存储,这些基本单元被称为位(bit)。每个位可以处于两种可能的状态之一。如果你想到机器内部的电路,就像它是一个微小的灯开关,可以将这些状态标记为关闭和打开。如果您将每个位都视为一个布尔值,您可以使用标签false和true。由于字位原本来自二进制数字的收缩,所以更常见的是将这些状态标记为0和1,这是计算机运算所依赖的二进制数字系统中使用的两位数字。
    由于单个位保存这么少的信息,因此个别位不是用于存储数据的最方便的机制。为了更容易地存储诸如数字或字符的这种传统类型的信息,我们将单独的位一起收集到更大的单元中,然后将其视为整体存储单元。最小的这样的组合单元称为一个字节(byte),由八位组成(1 byte = 8 bit),足够容纳char类型的值。在大多数机器上,字节被组装成的更加大结构,我们称为word,一个字,其中通常将单词定义为保持int类型所需的大小。 今天,大多数机器使用四或八个字节长(32或64位)的字。
    特定计算机可用的内存量在很宽的范围内变化。早期的机器支持的内存大小以千字节(KB)为单位,80年代和90年代的机器的内存大小以兆字节(MB)为单位,而今天的机器通常以千兆字节(GB)测量内存体。然而,在计算机世界中,这些基数值不符合机器的内部结构。因此,按照传统,这些前缀被用来代表最接近他们传统解释的两个前缀的力量。 因此,在编程中,前缀kilo,mega和giga具有以下含义:

    从70年代初的64KB计算机将有64×1024或65,536字节的内存。 同样,现代的4GB机器将具有4×1,037,741,824或4,294,967,296字节的内存。

    二进制和十六进制表示

    机器中的每个字节保存的数据,其含义取决于系统如何解释各个位。根据用于操作它的硬件指令,特定的位序列可以表示整数,字符或浮点值,每个都需要某种特定的编码方案。要描述的最简单的编码方案是对于无符号整数,其中这些位用于表示以二进制符号表示的整数,其中唯一的合法值为0和1,与底层位相同。 二进制符号在结构上与我们更熟悉的十进制符号相似,但使用2而不是10作为其基础。 二进制数字对整个数字的贡献取决于它在整个数字中的位置。最右边的数字表示单位字段,其他每个位置的数字是其右侧数字的两倍。
    例如,考虑包含以下二进制数字的8位字节:

    该位序列表示42,可以通过计算每个位的来验证,如下所示:

    该图说明了如何将二进制符号转换为整数,但是这也说明以二进制形式编写数字是非常不方便的。二进制数是麻烦的,主要是因为它们往往很长。十进制表示是直观和熟悉的,但使得更难理解数字如何转换成位。
    对于应用程序来说,了解数字如何转换为二进制表示形式是有用的,但是对于处理一整页的二进制数字,计算机科学家倾向于使用十六进制(16进制)表示。以十六进制表示法,有十六位数字,表示从0到15的值。十位数字0到9对于前十位数字是完全足够的,但经典算术没有定义你需要表示剩余六位数的额外符号。 计算机科学传统上使用字母A到F用于此目的,其中字母具有以下值:

    使十六进制符号如此吸引人的是,你可以立即在十六进制值和底层二进制表示之间进行转换。所有你需要做的是将这些位数4个组成一组。 例如,42可以从二进制转换为十六进制,如下所示:

    前四位表示数字2,下四个表示数字10.将其中的每一个转换为相应的十六进制数字,将其作为十六进制形式给出2A。然后,你可以通过将数字值相加来验证此数字仍然具有值42,如下所示:

    在大多数情况下,为了数字的可读性。遵循使用下标来表示基数的策略。 因此,数字42,二进制和十六进制的三种最常见的表示如下所示:

    其他数据类型的表示

    在许多方面,现代计算背后的基本思想是任何数据值都可以表示为一组位。很容易看到,例如,如何在单个位中表示一个布尔值。所有你需要做的是将一个位的每个可能状态分配给两个布尔值之一。通常,0被解释为假(false),1被解释为真(true)。 你也可以通过将位序列解释为二进制符号的数字来存储无符号整数,以使8位序列00101010表示数字42.使用8位可以表示0之间的数字 和2^8 - 1或255.十六位足以表示0和2^16 - 1之间的数字或65,535。 32位允许高达2^32 - 1或4,294,967,295的数字

    每个字节(8 bit)的内存可以存储0到255之间的数值,这意味着一个字节(byte)是存储ASCII字符的完美大小。其历史可追溯到其前身语言,C++将数据类型char定义为一个字节大小。 这种设计决策使得C ++程序更难以使用编入ASCII模型的语言编码所需的扩展字符集。 C++标准库定义了一个名为**wchar_**t的类型,以表示扩展到ASCII范围之外的“宽字符”。但是这些我们不做讨论。
    整数也可以通过对编码进行较小的更改来存储为bit序列。主要是因为这样做简化了硬件设计,大多数计算机使用称为二进制补码运算(two’s complement arithmetic)的表示来表示有符号整数。如果要在二进制补码算术中表示非负值,则只需使用其传统的二进制扩展。要表示负值,你从2^N中减去其绝对值,其中N是表示中使用的位数。 例如,通过执行以下二进制减法来计算32位字中的* -1* 的二进制补码表示:

    浮点数也表示为C++中的固定长度位序列。 虽然浮点表示的细节超出了我们讨论的范围,但是,假设构建硬件会使用一个字中的位的一些子集来表示浮点值中的数字,那么其他一些子集来表示该值被缩放的指数。 要记住的重要事情是,在内部,每个数据值被存储为位。
    在C++中,不同的数据类型需要不同的内存量。对于原始类型,以下的值都是是典型的,尽管C ++标准为编译器编写者提供了一些灵活性,可以选择对特定类型硬件更为方便的不同大小:

    在C++中,对象的大小通常只是它包含的实例变量的大小的总和。例如,我们之前定义的Point类,则其私有部分将包含以下实例变量:

    int x;
    int y;

    这些实例变量中的每一个通常需要四个字节,因此在大多数机器上存储该对象数据所需的总空间是八个字节。然而,编译器允许将内存空间添加到对象的底层表示,主要是因为这样做有时允许它们生成更有效的机器语言代码。因此,Point对象的大小必须至少为保存实例变量x和y所需的8个字节,但可能会更大
    在C++程序中,我们可以使用 sizeof 运算符来确定向变量分配多少内存。sizeof运算符需要一个操作数,它必须是括号或表达式中的一个类型名称。如果操作数是一个类型,则sizeof操作符返回存储该类型的值所需的字节数,如果操作数是表达式,则sizeof返回存储该表达式的值所需的字节数。例如,表达式:

    sizeof(int);

    返回存储int类型所需的字节数。而表达式

    sizeof(x);

    则返回存储变量X所需的字节数。

    展开全文
  • 内存的物理结构和工作原理

    千次阅读 2014-04-22 17:06:42
    内存的物理结构和工作原理 作者:xiaofeng 来源:PConline 发布时间:2012-11-01 点击数:1163  内存也叫主存,是PC系统存放数据与指令的半导体存储器单元,也叫主存储器(Main Memory),通常分为只读...

    内存的物理结构和工作原理

    作者:xiaofeng 来源:PConline 发布时间:2012-11-01 点击数:1163

      内存也叫主存,是PC系统存放数据与指令的半导体存储器单元,也叫主存储器(Main Memory),通常分为只读存储器(ROM-Read Only Memory)、随机存储器(RAM-Red Access Memory)和高速缓存存储器(Cache)。我们平常所指的内存条其实就是RAM,其主要的作用是存放各种输入、输出数据和中间计算结果,以及与外部存储器交换信息时做缓冲之用。

    结构

    1、PCB板

      内存条的PCB板多数都是绿色的。如今的电路板设计都很精密,所以都采用了多层设计,例如4层或6层等,所以PCB板实际上是分层的,其内部也有金属的布线。理论上6层PCB板比4层PCB板的电气性能要好,性能也较稳定,所以名牌内存多采用6层PCB板制造。因为PCB板制造严密,所以从肉眼上较难分辩PCB板是4层或6层,只能借助一些印在PCB板上的符号或标识来断定。

    2、金手指

      黄色的接触点是内存与主板内存槽接触的部分,数据就是靠它们来传输的,通常称为金手指。金手指是铜质导线,使用时间长就可能有氧化的现象,会影响内存的正常工作,易发生无法开机的故障,所以可以隔一年左右时间用橡皮擦清理一下金手指上的氧化物。 

    3、内存芯片

      内存的芯片就是内存的灵魂所在,内存的性能、速度、容量都是由内存芯片组成的。

    4、内存颗粒空位

           在内存条上你可能常看到这样的空位,这是因为采用的封装模式预留了一片内存芯片为其他采用这种封装模式的内存条使用。这块内存条就是使用9片装PCB,预留ECC校验模块位置。

    5、电容

      PCB板上必不可少的电子元件就是电容和电阻了,这是为了提高电气性能的需要。电容采用贴片式电容,因为内存条的体积较小,不可能使用直立式电容,但这种贴片式电容性能一点不差,它为提高内存条的稳定性起了很大作用。

    6、电阻

      电阻也是采用贴片式设计,一般好的内存条电阻的分布规划也很整齐合理。

    7、内存固定卡缺口

      内存插到主板上后,主板上的内存插槽会有两个夹子牢固的扣住内存,这个缺口便是用于固定内存用的。

    8、内存脚缺口

           内存的脚上的缺口一是用来防止内存插反的(只有一侧有),二是用来区分不同的内存,以前的SDRAM内存条是有两个缺口的,而DDR则只有一个缺口,不能混插。

    9、SPD

      SPD是一个八脚的小芯片,它实际上是一个EEPROM可擦写存贮器,这的容量有256字节,可以写入一点信息,这信息中就可以包括内存的标准工作状态、速度、响应时间等,以协调计算机系统更好的工作。从PC100时代开始,PC100规准中就规定符合PC100标准的内存条必须安装SPD,而且主板也可以从SPD中读取到内存的信息,并按SPD的规定来使内存获得最佳的工作环境。

    内存工作原理

    1、内存寻址

           首先,内存从CPU获得查找某个数据的指令,然后再找出存取资料的位置时(这个动作称为“寻址”),它先定出横坐标(也就是“列地址”)再定出纵坐标(也就是“行地址”),这就好像在地图上画个十字标记一样,非常准确地定出这个地方。对于电脑系统而言,找出这个地方时还必须确定是否位置正确,因此电脑还必须判读该地址的信号,横坐标有横坐标的信号(也就是RAS信号,Row Address Strobe)纵坐标有纵坐标的信号(也就是CAS信号,Column Address Strobe),最后再进行读或写的动作。

    2、内存传输

      为了储存资料,或者是从内存内部读取资料,CPU都会为这些读取或写入的资料编上地址(也就是我们所说的十字寻址方式),这个时候,CPU会通过地址总线(Address Bus)将地址送到内存,然后数据总线(Data Bus)就会把对应的正确数据送往微处理器,传回去给CPU使用。

    3、存取时间

      存取时间,指的是CPU读或写内存内资料的过程时间,也称为总线循环(bus cycle)。以读取为例,从CPU发出指令给内存时,便会要求内存取用特定地址的特定资料,内存响应CPU后便会将CPU所需要的资料送给CPU,一直到CPU收到数据为止,便成为一个读取的流程。因此,这整个过程简单地说便是CPU给出读取指令,内存回复指令,并丢出资料给CPU的过程。我们常说的6ns(纳秒,秒-9)就是指上述的过程所花费的时间,而ns便是计算运算过程的时间单位。我们平时习惯用存取时间的倒数来表示速度,比如6ns的内存实际频率为1/6ns=166MHz(如果是DDR就标DDR333,DDR2就标DDR2 667)。

    4、内存延迟

      内存的延迟时间(也就是所谓的潜伏期,从FSB到DRAM)等于下列时间的综合:FSB同主板芯片组之间的延迟时间(±1个时钟周期),芯片组同DRAM之间的延迟时间(±1个时钟周期),RAS到CAS延迟时间:RAS(2-3个时钟周期,用于决定正确的行地址),CAS延迟时间 (2-3时钟周期,用于决定正确的列地址),另外还需要1个时钟周期来传送数据,数据从DRAM输出缓存通过芯片组到CPU的延迟时间(±2个时钟周期)。一般的说明内存延迟涉及四个参数CAS(Column Address Strobe 行地址控制器)延迟,RAS(Row Address Strobe列地址控制器)-to-CAS延迟,RAS Precharge(RAS预冲电压)延迟,Act-to-Precharge(相对于时钟下沿的数据读取时间)延迟。其中CAS延迟比较重要,它反映了内存从接受指令到完成传输结果的过程中的延迟。大家平时见到的数据3—3—3—6中,第一参数就是CAS延迟(CL=3)。当然,延迟越小速度越快。

    展开全文
  • 手机电路原理学习

    千次阅读 2016-04-15 08:28:13
    电路图中CPU: RF&HSL:射频 PHY:物理层 PWR&DDRIO:电源 GPIO:generalpurpose IO ports,通用IO接口。 在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的...
  • malloc()函数返回给用户的实际内存块。 1 半导体存储体结构 半导体存储体由存储单元构成,存储单元由存储元件构成。此处略存储器内的其它电路模块。 (1) 存储元件 存储器用于寄存“0”和“1”代码的电路称为存储器的...
  • 内存对齐原理

    2020-08-04 15:41:25
    偶然间看到这片博文,觉得非常...内存物理结构我们来了解一下内存的物理构造,一般内存的外形图片如下1 内存外形一个内存是由若干个黑色的内存颗粒构成的。每一个内存颗粒叫做一个chip。每个chip内部,是由8个
  • 内存寻址 、硬件中的分段与分页 、Linux内存管理 页与内存管理区 、kmalloc()和vmalloc()
  • 内存

    千次阅读 2008-04-14 14:15:00
    内存1 内存发展1. 30pin SIMM 2. 30pin和72pin的 SIMM FPM(Fast Page Mode) 3. 72pin EDO(Extended Data Out) RAM 4. 168pin DIMM SD(Synchronous Dynamic) RAM (1)PC66 (2)PC100 (3)PC133 5. VCM
  • DRAM内存原理(一)内存基础

    万次阅读 2014-12-08 08:38:49
     只是DRAM一个基本单位的结构示意:电容器的状态决定了这个DRAM单位的逻辑状态是1还是0,但是电容的被利用的这个特性也是它的缺点。一个电容器可以存储一定量的电子或者是电荷。一个充电的电容器在数字电子中被...
  • SRAM整体结构图

    千次阅读 2020-06-08 16:43:04
    SRAM由基本单元构成的阵列以及外围电路构成,其中阵列的划分和外围电路的优劣对整个SRAM的性能有很大的影响。 SRAM是随机存储器的一种,它由静态挥发性存储单元组成的存储阵列(或者叫内核,core) 组成,其地址译码...
  • DDR3内存详解,存储器结构+时序+初始化过程 2017-06-17 16:10:33a_chinese_man阅读数 23423更多 分类专栏:硬件开发基础 转自:http://www.360doc.com/content/14/0116/16/15528092_345730642.shtml 首先,...
  • 电路

    千次阅读 2010-02-03 12:12:00
    一款应急灯电路_实用电路㈦2005...其电路1。下面介绍其工作原理。在供电正常时,J2得电吸合,其动触点与“N/O(常开点)”接通,后备蓄电池正端与IC1的反相端相联。IC1(LM308)和D5、D6组成电压比较器,参考电压由
  • 文章目录标题挥发性内存分2种,SRAM和DRAM主内存子系统channel 和 DIMMrank 和 chipbank、row、column内存的读写方式越多越好,加速读写能力 bank、rank、channel这些关于内存的名词是否已困绕许久,疑似了解却又说...
  • 内存和磁盘的关系

    千次阅读 2020-02-06 11:43:05
    文章目录内存和磁盘的区别程序,内存和磁盘的交互关系磁盘缓存缓存虚拟内存分页式虚拟内存分段式虚拟内存从代码编写角度来节约内存磁盘的物理结构固态硬盘 VS 传统硬盘固态硬盘 VS 内存经典提问环节 内存和磁盘的...
  • 计算机内存图解

    千次阅读 2017-09-19 11:06:53
    作为电脑中必不可少的三大件之一(其余的两个是主板与CPU),内存是决定系统性能的关键设备之一,它就像一个临时的仓库,负责数据的中转、暂存…… 不过,虽然内存对系统性能的至关重要。 作为电脑中必不可...
  • Linux内存讲解

    千次阅读 2015-04-10 17:16:18
    简介程序和进程存储类别和作用域程序大小内存映射调用堆栈页表库内存限制内存分配实现细节参考文献 简介 在Linux下,所有的程序都在虚拟内存环境中运行。如果有某个C程序员将指针的值打印出来(在实践中从来...
  • 内存映射(IO地址和内存地址)

    千次阅读 2012-07-16 00:04:12
    ARM体系结构下面内存和i/o映射区别 (1)关于IO与内存空间: 在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标识了外设的寄存器地址。Intel语法的in、...
  • 15.检测可用内存

    千次阅读 2018-11-16 14:08:20
    简介 内存作为计算机有限宝贵资源,好的程序需要有良好的内存管理算法。首先需要知道内存的可用区域再...3、 es:di 指向一块足够大的内存地址,BIOS会把有关内存的信息写到这个地址,内存信息是一种数据结构,称之...
  • CUDA学习笔记(6) 共享内存与全局内存

    万次阅读 多人点赞 2017-12-22 13:07:36
    共享内存(Shared memory)是位于每个流处理器组(SM)中的高速内存空间,主要作用是存放一个线程块(Block)中所有线程都会频繁访问的数据。流处理器(SP)访问它的速度仅比寄存器(Register)慢,它的速度远比全局...
  • 内存带宽

    千次阅读 2014-06-13 18:10:56
    显然,内存的容量决定“仓库”的大小,而内存的带宽决定“桥梁”的宽窄,两者缺一不可,这也就是常常说道的“内存容量”与“内存速度”。除了内存容量与内存速度,延时周期也是决定其性能的关键。当CPU需要内
  • 内存寻址

    千次阅读 2011-07-07 14:39:55
    <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm ... 内存寻址内存地址使用用80x86微处理器时,必須区分以下三种不同的地址逻辑地址包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址有80x
  • ,可以看到,EP4CE10F17C8一共有46个M9K,每个M9K 9kbit,46 * 9 * 1024 = 423936 bit,刚好,总的内存423936 bit。 M9K特性如下: 可以看到,不同数据深度和数据宽度最终能够使用的M9K最大资源都不一样。 如果...
  • 在硬件层面,计算机内存是有大量触发电路组成的。每个触发电路包含了一些晶体管并且能够存储一个位(bit)。单个触发器可通过唯一的标识符寻址,因此我们可以读取并重写它们。因此,在概念上,我们可以将整个计算机...
  • Java内存模型与线程

    千次阅读 2018-08-07 11:28:07
    Java内存模型与线程 Java内存模型与线程 Start 硬件的效率与一致性 Java内存模型 主内存与工作内存 内存间交互操作 对于volatile型变量的特殊规则 可见性 禁止指令重排序优化 对于long和double型变量的特殊...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,115
精华内容 12,846
关键字:

内存结构电路图