打印
[51单片机]

Keil中关于Xdata区的使用

[复制链接]
14477|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
airwill| | 2013-7-30 11:59 | 只看该作者
没有说用的什么芯片.
我估计是带 256 字节 XDATA 的芯片吧?

使用特权

评论回复
板凳
huhaomcu|  楼主 | 2013-7-30 13:15 | 只看该作者
airwill 发表于 2013-7-30 11:59
没有说用的什么芯片.
我估计是带 256 字节 XDATA 的芯片吧?

用的是Silabs的C8051单片机,我将原来的那个数组去掉后,重新定义了一个数组大小和原来的一样,只不过没有初始化赋值,但还是可以运行。想请问一个怎么知道你所说的”带 256 字节 XDATA 的芯片吧”?从那里看出来的?请指教

使用特权

评论回复
地板
huhaomcu|  楼主 | 2013-7-30 13:22 | 只看该作者
airwill 发表于 2013-7-30 11:59
没有说用的什么芯片.
我估计是带 256 字节 XDATA 的芯片吧?

还有编译后的信息我看了的,xdata区的使用不到256byte

使用特权

评论回复
5
ayb_ice| | 2013-7-30 14:31 | 只看该作者
1: 芯片有没有这个XARM
2: 检查指针操作,特别是强制指针操作
3: 程序自身错误

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
huhaomcu + 2
6
airwill| | 2013-7-30 21:12 | 只看该作者
怎么知道你所说的”带 256 字节 XDATA 的芯片吧”?
看芯片手册

使用特权

评论回复
7
huhaomcu|  楼主 | 2013-7-30 23:14 | 只看该作者
airwill 发表于 2013-7-30 21:12
怎么知道你所说的”带 256 字节 XDATA 的芯片吧”?
看芯片手册

芯片手册上是关于内存是这样说的
4352 bytes internal data RAM(256+4096)
64KB Flash,in system programable in 1024 byte sectors --1024 bytes are reserved in the 64kb devices
这样是不是说明它没有Xdata区啊,但是我程序里面有定义其它的变量或数组处于Xdata区,但程序可以运行,但是只要在定义一定数量的变量到XDATA区,程序就不能运行了!
求指教!

使用特权

评论回复
8
天风立马| | 2013-7-30 23:37 | 只看该作者
代码贴上来看看

使用特权

评论回复
9
airwill| | 2013-7-31 08:42 | 只看该作者
本帖最后由 airwill 于 2013-7-31 08:43 编辑

4352 bytes internal data RAM(256+4096)

可能是 4096Bytes 的 XDATA  RAM.
当然还有可能是分页方式占用 XDATA 或者 IDATA 的某个地址空间

使用特权

评论回复
10
four_zhg| | 2013-7-31 08:46 | 只看该作者
这两个地方改了没有
F:\aa.bmp
这是我用的外部xram

使用特权

评论回复
11
huhaomcu|  楼主 | 2013-7-31 09:12 | 只看该作者
这是我用的内存情况C:\Documents and Settings\Administrator.E51325051626485\桌面

使用特权

评论回复
12
huhaomcu|  楼主 | 2013-7-31 09:14 | 只看该作者
four_zhg 发表于 2013-7-31 08:46
这两个地方改了没有

这是我用的外部xram

这是我的内存使用情况
Program size :data =11.0 xdata = 329;code = 2416
C8051MCU 应该不可能XDATA区会这么小!
不明白

使用特权

评论回复
13
huhaomcu|  楼主 | 2013-7-31 09:18 | 只看该作者
four_zhg 发表于 2013-7-31 08:46
这两个地方改了没有

这是我用的外部xram

这两个地方我改了,但还是不行

使用特权

评论回复
14
huhaomcu|  楼主 | 2013-7-31 09:18 | 只看该作者
天风立马 发表于 2013-7-30 23:37
代码贴上来看看

代码太多,贴上来后不容易看

使用特权

评论回复
15
four_zhg| | 2013-7-31 09:30 | 只看该作者
上传文件吧,不然有可能分析不出来了

使用特权

评论回复
16
huhaomcu|  楼主 | 2013-7-31 10:33 | 只看该作者
four_zhg 发表于 2013-7-31 09:30
上传文件吧,不然有可能分析不出来了

好,我把主文件贴上来吧,其它的太多了!
#include <REG51Si1000.H>
//#include <string.h>
//#include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */
#include ".\si4432\si4432.h"
#define SYSCLK 24500000UL       
#define BAUDRATE 9600

unsigned char commdata[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
       
xdata unsigned char commdata2[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
                                 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,
                                 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
                                 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
                                 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
                                                                                                         100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
                                                                                                         120,121,122,123,124,125,126,127};

// xdata char commdata3[]={0,1,2,3,4,5,6,7,8,9,10
//                                                                                                         };

xdata unsigned char  commdata1[64];

static xdata unsigned char i = 1;
unsigned char flag = 0;

/*******************************
  º¯Êý˵Ã÷£ºÏµÍ³³õʼ»¯
  ÊäÈë²ÎÊý£ºÎÞ
  Êä³ö²ÎÊý£ºÎÞ
********************************/
void SysInit( void )
{
  //Use Internal Precision Oscillator as SYSCLK       
  FLSCL     = 0x40;
  OSCICN    = 0x8F;
  CLKSEL    = 0x00;
       
        //SPI1 Configuration
        XBR1      = 0x40;
  XBR2      = 0x40;
       
        SPI1CFG   = 0x40;                                        //Master Mode Enable
  SPI1CN    = 0x01;                                        //Enable SPI1
  SPI1CKR   = 0x3C;                                        //SPI CLOCK RATE = 200KHZ
        //Port Configuration
        P0SKIP = 0x02;                                                //nIRQ Pin is skipped by the crossbar
        P1SKIP = 0x10;                                                //P1.4 Pin is skipped by the Crossbar
        P2SKIP = 0x04;                                                //P2.2 Pin is skipped by the Crossbar
       
        //Exinternal Interrupt Configuration
        IT01CF = 0x01;                                                //P0.1 as External Interrupt Source
       
        //Timer Configuration
        CKCON = 0x04;                                                       
       
       
        PCA0MD &= ~0x40;                                                                                                //WDT Disable
       
        P0MDOUT   = 0x10;                                                                                                //P0.4/TX Output is push-pull
  XBR0      = 0x01;                                                                                                //UART Output Enable
  XBR2      = 0x40;                                                                                                //Crossbar Enable

  TMOD = 0x20;                                                                                                                //Timer Work in 8-bit Counter/Timer with Auto-Reload
        TH1 = -(SYSCLK/BAUDRATE/2/12);                                        // Auto-Reload Value
        TL1 = TH1;
        TR1 = 1;                                                                                       
       
        SCON0 = 0x10;                                                                                                                //Enable UART Receive
        //ES0 = 1;                                                                                                                                //Enable UART Interrupt
        EX0 = 1;                                                                                                                                //Enable External Interrupt
        IT0 = 1;
        EA = 1;               
}

/********************************
  º¯Êý˵Ã÷£ºTimer0³õʼ»¯
  ÊäÈë²ÎÊý£º¶¨Ê±Ê±¼ä
  Êä³ö²ÎÊý£ºÎÞ
********************************/
void Timer0( unsigned int timeval )
{
        CKCON = 0x04;                                                                                                                //Sysclk/12 as ClockSource
  TMOD  = 0x01;
        TH0 = (65536-timeval*24500/12)/255;
        TL0 = (65536-timeval*24500/12)%256;
        TR0 = 1;
}
/********************************
  º¯Êý˵Ã÷£ºUART ÖжϺ¯Êý
  ÊäÈë²ÎÊý£ºÎÞ
  Êä³ö²ÎÊý£ºÎÞ
*********************************/
/*void Uart0( void ) interrupt 4
{
        if( RI0 == 1 )
        {
                //temp = SBUF0;
                RI0 = 0;                                                                                                                                //Clear Receive Interrupt Flag
                //SBUF0 = temp;
        }
        if ( TI0 ==1 )
        {
                TI0 = 0;                                                                                                                                //Clear Send Interrupt Flag
                SBUF0 = commdata1[i++];
                if( i >= 24 )
                        i = 1;
        }
}*/


/*******************************
  º¯Êý˵Ã÷£ºÊ¹ÄÜRFÖжÏ
  ÊäÈë²ÎÊý£ºÎÞ
  Êä³ö²ÎÊý£ºÎÞ
********************************/
void rf_ISR_Enable(void)
{
  si4432_ISR_Enable();
}

/*******************************
  º¯Êý˵Ã÷£ºÍⲿÖжϺ¯Êý
  ÊäÈë²ÎÊý£ºÎÞ
  Êä³ö²ÎÊý£ºÎÞ
********************************/
void Ext0Inter( void ) interrupt 0
{
        volatile unsigned char i;
        unsigned char ItStatus3=0,ItStatus4=0,ItStatus5=0;
       
        IE0 = 0;
       
  sreg.ItStatus1 = RF_ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);  
  sreg.ItStatus2 = RF_ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
  ItStatus3 = RF_ReadReg(EZRADIOPRO_DEVICE_STATUS);
        ItStatus4 = RF_ReadReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1);
        ItStatus5 = RF_ReadReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2);
       
        if ((sreg.ItStatus2 & EZRADIOPRO_ISWDET) == EZRADIOPRO_ISWDET)                        //Sync Word Detected
        {
                i = 0;
               
                //return;
        }
        if ((sreg.ItStatus2 & EZRADIOPRO_IPREAVAL) == EZRADIOPRO_IPREAVAL)                //Valid Preamble detected
        {
                i = 0;
                //return;
        }
        if ((sreg.ItStatus2 & EZRADIOPRO_IPREAINVAL) == EZRADIOPRO_IPREAINVAL)        //Invalid Preamble detected
        {
                i = 0;
                //return;
        }
  if ((sreg.ItStatus1 & EZRADIOPRO_ICRCERROR) == EZRADIOPRO_ICRCERROR)  //CRC Error, then drop this package
  {
   //rf_ReceiveReady();
                i = 0;
                //si4432_ReadData(commdata);
                //SBUF0 = commdata[i++];
   return;
  }
        if ((sreg.ItStatus1 & EZRADIOPRO_IPKVALID) == EZRADIOPRO_IPKVALID)                        //Valid Packet received
        {
                flag = 1;
        }
        /*if ((sreg.ItStatus1 & EZRADIOPRO_IRXFFAFULL) == EZRADIOPRO_IRXFFAFULL)   //RX FIFO almost full
        {
                si4432_ReadData(commdata1);
    SBUF0 = commdata1[0];
        }*/
}
               

/*******************************
  º¯Êý˵Ã÷£ºRF³õʼ»¯
  ÊäÈë²ÎÊý£ºÎÞ
  Êä³ö²ÎÊý£ºÎÞ
********************************/
unsigned char rf_Init(void)
{
  return si4432_Init();
}

/*******************************
  º¯Êý˵Ã÷£º·¢ËÍ»º³åÇøÄÚÈݵ½RFÇø
  ÊäÈë²ÎÊý£º»º³åÇøÖ¸Õ룬»º³åÇø³¤¶È
  Êä³ö²ÎÊý£ºÎÞ
*******************************/
void rf_sendData(unsigned char *buf, unsigned char len)
{
  len = (len <= FIFO_MAXLEN)? len : FIFO_MAXLEN;
  si4432_WriteData(buf,len);
}



void main( void )
{
        unsigned char temp;
        int i,j;
       
        SysInit();
        rf_Init();
        //while(!rf_Init());
        rf_ISR_Enable();
        si4432_ReceiveReady();
        while(1)
        {
                //rf_sendData(commdata,20);
                if (flag)
                {
                        si4432_ReadData(commdata1);
                        for(temp=0;temp<24;temp++)
                        {
                                SBUF0 = commdata1[temp];
                                while( !TI0 );
                                TI0 = 0;
                        }
                        flag = 0;
                        si4432_ReceiveReady();
                }
        }
}

使用特权

评论回复
17
tergy2012| | 2013-7-31 11:54 | 只看该作者
不错,学习了

使用特权

评论回复
18
wang5637| | 2013-7-31 14:33 | 只看该作者
主程序都没有运行呢怎样初始化啊?放在main中把  在main之前的不能操作大批量data xdat数组

使用特权

评论回复
19
3htech| | 2013-7-31 16:09 | 只看该作者
C8051系列单片机初始化时,看门狗的复位时间很短。

全局变量如果是在定义时就赋值,那么这个操作是在main函数执行前进行的。会占用大量时间,从而导致看门狗复位。

建议,去掉大数组定义时的赋值。改成在main函数里赋值(如果需要的话)并且注意要喂狗。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
huhaomcu + 2
20
ayb_ice| | 2013-7-31 16:39 | 只看该作者
确实是狗咬人了,在startup.a51中一开始就关狗

这种问题调试一下就应该知道了,何况C8051F调试这么方便

未命名.JPG (24.4 KB )

未命名.JPG

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
huhaomcu + 2
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

508

帖子

3

粉丝