精华内容
下载资源
问答
  • STC单片机xdata的使用疑惑

    千次阅读 2019-05-15 14:43:40
    STC单片机xdata的使用疑惑 [复制链接] jxrjamu发表于 2018-10-30 11:56|显示全部楼层 按照STC8的数据手册 #define uchar unsigned charuchar xdata a; 这样定义可以编译都是...

    STC单片机xdata的使用疑惑 

    [复制链接]
      

     jxrjamu 发表于 2018-10-30 11:56 | 显示全部楼层

    按照STC8的数据手册 #define uchar unsigned char  uchar xdata a;
    这样定义可以编译都是程序异常不知道怎么回事。
    那我大神可以科普一下STC xdata 的使用方法吗?



     
     
     回复

    举报

      

     mengzhixinheng 发表于 2018-10-31 21:05 | 显示全部楼层

    这个不是XDATA的问题吧,你的宏定义有问题。而且XDATA的申明只是把变量放到内部扩展RAM中,没有其他意义。你就这样“XDATA uchar a”就可以了
     
     回复

    举报

      

     cjm82 发表于 2018-11-1 10:32 | 显示全部楼层

    XDATA区为内部扩展RAM,基本上现在的51片子的RAM分内部RAM和内部扩展RAM,内部RAM一般为256字节,而内部扩展RAM区则根据不同的型号有所差别,一般同品牌,价钱越贵,基本内部扩展RAM容量也越大.内部RAM KEIL里对应的关键字为idata,其低128字节可以简单理解为生成代码最少读写速度最快,KEIL里对应的关键字为data.内部扩展RAM,KEIL对应的关键字为XDATA,通常内部RAM不够用的时候,会在定义变量时加上xdata关键字.详见相关参考手册.
    详细了解这些需要比较好的汇编和微机原理基础,一般只需大概了解即可.
    此外常用的还有bdata,其好处就是可以用sbit类型指向其具体一位.这在扩展IO口的时候经常用.

    bdata unsigned char P9;
    sbit Led1 = P9^0;
     
     

    回复

    展开全文
  • 关于单片机XDATA 和DATA区

    千次阅读 2019-01-09 08:57:45
    DATA和XDATA 最近在做项目的时候在编译keil文档时遇到问题,其实自己也是小白菜,在做项目中慢慢进步,遇到问题解决了就记下来,以免后边犯同样的错误 关于*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT错误 这...

    DATA和XDATA

    最近在做项目的时候在编译keil文档时遇到问题,其实自己也是小白菜,在做项目中慢慢进步,遇到问题解决了就记下来,以免后边犯同样的错误

    关于*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT错误
    这个错误说明你的单片机内部的data区已经满了,放不下更多的变量。我们单片机内部的data区的大小是有限的我的项目用的是C8051F340这个单片机,查一下这个单片机的规格书
    规格书详情

    单片机内部地址详情
    规格书可以去官网下载:https://www.alldatasheet.com/datasheet-pdf/pdf/182721/SILABS/C8051F340.html
    可以看到我们存储一般的变量都是片内data 00–7FH地址,对于以上错误,如果存在变量不多的情况下,我们可以考虑把后来的变量存放在xdata区,那这样做会有个缺点,就是访问外部数据区会比访问内部数据区代码复杂,自然我们是看不到的,但是作为写代码的人得知道。

    为了优化代码,可以这样做,对于不常用的变量,比如说就一两次使用过,那可以放在xdata区,对于常用的或者一直调用的放在data 区即可,具体情况看使用者的情况。

    展开全文
  • xdata External data memory (64 KBytes); accessed by opcode MOVX @DPTR. far Extended RAM and ROM memory spaces (up to 16MB); accessed by user defined routines or specific chip extensions (Philips...

    http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm

     

    The Cx51 Compiler provides access to all 8051 memory areas. Variables may be explicitly assigned to a specific memory space (by including a memory type specifier in the declaration) or implicitly assigned (based on the memory model).

    The following table summarizes the memory type specifiers you may use.

    Memory TypeDescription
    codeProgram memory (64 KBytes); accessed by opcode MOVC @A+DPTR.
    dataDirectly addressable internal data memory; fastest access to variables (128 bytes).
    idataIndirectly addressable internal data memory; accessed across the full internal address space (256 bytes).
    bdataBit-addressable internal data memory; supports mixed bit and byte access (16 bytes).
    xdataExternal data memory (64 KBytes); accessed by opcode MOVX @DPTR.
    farExtended RAM and ROM memory spaces (up to 16MB); accessed by user defined routines or specific chip extensions (Philips 80C51MX, Dallas 390).
    pdataPaged (256 bytes) external data memory; accessed by opcode MOVX @Rn.

    As with the signed and unsigned attributes, you may include memory type specifiers in the variable declaration. For example:

    char data var1;
    char code text[] = "ENTER PARAMETER:";
    unsigned long xdata array[100];
    float idata x,y,z;
    unsigned int pdata dimension;
    unsigned char xdata vector[10][4][4];
    char bdata flags;
    

    Note

    • For compatibility with previous versions of the C51 Compiler, you may specify the memory area before the data type. For example, the following two declarations are equivalent:

      data char x;   // Old-Style Memory Type Declaration
      char data x;   // New-Style Memory Type Declaration
      

      Nonetheless, this feature should not be used in new programs because it may not be supported in future versions of the Cx51 Compiler. Be careful when using the old C51 syntax with memory-specific pointers. For example, the following two declarations are equivalent:

      data char *x;   // Old-Style Memory Type Declaration
      char *data x;   // New-Style Memory Type Declaration
      
    • Accessing the internal data memory is considerably faster than accessing the external data memory. For this reason, place frequently used variables in internal data memory. Place larger, less frequently used variables in external data memory.

    If no memory type is specified for a variable, the compiler implicitly locates the variable in the default memory space determined by the memory model: SMALL, COMPACT, or LARGE. Function arguments and automatic variables that cannot be located in registers are also stored in the default memory area. Refer to Memory Models for more information.

    Related Knowledgebase Articles

    转载于:https://www.cnblogs.com/e-shannon/archive/2012/04/09/2439723.html

    展开全文
  • 文章为大家介绍了单片机中关键字data idata xdata和pdata的区别。
  • 单片机中关键字data,idata,xdata,pdata的区别
  • 本文为大家介绍了单片机中data、idata、xdata、pdata和code区别。
  • dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。...xdATa:
    dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
    idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
    idATa是用类似C中的指针方式访问的。
    汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)

    xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

    pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

    startup.a51 的作用,和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char dATa xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51 ==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域, 如堆栈区,将不会有赋值或清零动作。

    有人喜欢改 startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改 startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。


    bit
    是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,这在DATA的20H以后以字节形式出现,可互相参照。另外加上 8051 可寻址 的SFR,但刚刚试过,只是00H--7FH起作用,也就是说当数据有变化时颜色变红,以后的从80H到--FFH就不是位寻址区了,是位寻址的特殊寄存 器,如涉及到了可位寻址的那11个当然会有反应。

    复位后,程序计数器PC的内容为0000H,内部RAM各单元的值不确定。
    各功能寄存器的复位值如下:
    堆栈指针SP的复位值为07H,累加器ACC、寄存器B的复位值为00H,数据指针DPTR的复位值为0000H,而p0、p1、p2、p3四个口的复位值为0FFH。其他SFR如PSW、TCON、TMOD、TL0、TH0、TL1、TH1的复位值也为00H。

    wave中是低128字节和高128字节(0-7FH),低128字节是片内RAM区,高128字节(80-FFH)是SFR(特殊功能寄存器)bit则是位于低128字节的20H .. 2FH 区域,即data的20H .. 2FH 区域

    code 是在 0000H .. 0FFFFH 之间的一个代码地址。

    我用
    ORG     5000H
    TAB:    DB      22H,3BH,43H,66H,5H,6DH,88H后,
    CODE从5000H开始以后变成DB各位


    data
    是 在 0 到 127 之间的一个数据存储器地址,或者加 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址。两者访问的方式不同。实际上由于PSW的复位设置PSW.3=RS0和PSW.4=RS1皆为0,所以通用工 作寄存器区就是第0区,所以data的00--07H部分是与 REG栏中的R0--R7对应的。以后的则仅代表低128字节的内部RAM。
    idata
    是 0 to 255 范围内的一个 idata 存储器地址
    idata与data重合低128字节,有的地方只有DATA表示256字节的片内RAM,
    xdata 是 0- 65535 范围内的一个 xdata 存储器地址。

    指针类型和存储区的关系详解
    一、存储类型与存储区关系
    data     --->     可寻址片内ram
    bdata     --->    可位寻址的片内ram
    idata     --->    可寻址片内ram,允许访问全部内部ram
    pdata     --->   分页寻址片外ram (MOVX @R0) (256 BYTE/页)
    xdata     --->   可寻址片外ram (64k 地址范围FFFFH)
    code     --->    程序存储区 (64k 地址范围),对应MOVC @DPTR

    二、指针类型和存储区的关系

    对变量进行声明时可以指定变量的存储类型如:
    uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。

    同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的
    使用如:

    uchar xdata * data pstr

    是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),
    可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。

    ......
    uchar xdata tmp[10];     //在外ram区开辟10个字节的内存空间,地址是外ram的0x0000-0x0009
    ......

    第1种情况:

    uchar data * data pstr;
    pstr="tmp";

    首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编
    代码:

    MOV 0x08,#tmp(0x00)         ;0x08是指针pstr的存储地址

    看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说
    就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的
    默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。

    第2种情况:

    uchar xdata * data pstr;
    pstr = tmp;

    这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向
    xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。

    MOV 0x08,#tmp(0x00)         ;0x08和0x09是在内ram区分配的pstr指针变量地址空间
    MOV 0x09,#tmp(0x00)

    这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。

    第3种情况:

    uchar xdata * xdata pstr;
    pstr="tmp";

    这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。

    MOV DPTR, #0x000A         ;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
    MOV A, #tmp(0x00)
    MOV @DPTR, A
    INC DPTR
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。

    第4种情况:

    uchar data * xdata pstr;
    pstr="tmp";

    如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分
    配到了外ram区了。编译后的汇编代码如下。

    MOV DPTR, #0x000A         ;0x000A是在外ram区分配的pstr指针变量的地址空间
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    第5种情况:

    uchar * data pstr;
    pstr="tmp";

    大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我
    来”,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗? 为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51
    编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!

    MOV 0x08, #0X01             ;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间
    MOV 0x09, #tmp(0x00)
    MOV 0x0A, #tmp(0x00)

    注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了
    呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,
    系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。

    第6种情况:

    uchar * pstr;
    pstr="tmp";

    这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。

    MOV DPTR, #0x000A         ;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
    MOV A, #0x01
    MOV @DPTR, A
    INC DPTR
    MOV DPTR, #0x000A
    MOV A, #tmp(0x00)
    MOV @DPTR, A
    INC DPTR
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。 
    展开全文
  • 很多单片机初学者甚至有些用老工程师对data,idata,xdata,pdata,code这些东西一直都搞不明白是怎么回事。下面一起来看看
  • 单片机方面的文档,希望大家好好的看一下吧
  • 单片机C51 DATA,XDATA,BDATA,IDATA,CODE存储资源分配
  • 很多单片机初学者甚至有些用老工程师对data,idata,xdata,pdata,code这些东西一直都搞不明白是怎么回事。最近看到一篇关于keil中data,idata,xdata,pdata,code的问题的文章,转过来跟大家分享一下
  • 在51系列单片机中data,idata,xdata,pdata的区别
  • 使用单片机型号:STC89C52RC ---------------- ***********************************************************************/ #include "main.h" #include "HX711.h" unsigned long HX711_Buffer = 0; ...
  • 详细讲解C51单片机中data idata xdata pdata的区别,并有相关的例子
  • 51单片机的data,xdata,code区别详解

    千次阅读 2016-07-18 15:57:50
    dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa:固定指前面0x00-0xff...汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)xdATa: 外部扩展R
  • 本文主要对单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code做了相关的解释,希望对你的学习有所帮助。
  • dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。...xdATa:
  • data:  固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的... xdata:  外 部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读
  •  是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),  可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的...
  • 51单片机的data,xdata,code

    千次阅读 2011-05-10 18:33:00
    dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写... 汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好) <br />xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用
  • 51单片机程序根据使用存储器的不同,执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。 1.data:内部RAM的前128个字节,地址为0x00-0x7f,速度最快,生成的代码最小。 2.idata...
  • 先来看data、bdata、idata、pdata、xdata、code指代的意思。 然后我们对应到51单片机的存储空间: 从上面可以知道: 1、51的存储空间分为指令空间和数据空间,他们独立编址。指令空间是flash,...
  • 从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的...
  • dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。...xdATa
  • 从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,940
精华内容 776
关键字:

单片机xdata