小小工大 发表于 2014-6-22 10:34:32

求教 用keil编译51出现超出地址空间是怎么回事、

*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:?_STRNCPY?BYTE
    SEGMENT: ?DT?_STRNCPY?STRNCPY
Program Size: data=230.0 xdata=0 code=6665
出现这个错误,问题的关键是在主函数里面我只写了一个点亮LED灯的,
这就是我的所有.c和.h文件。
这到底是为什么啊?
求大神指导。

小小工大 发表于 2014-6-22 11:59:38

但是如果在程序里面加入一大段代码的话,似乎就不会超出地址空间。。
就像:
void main(void)
{
        //uchar error_num = 0;       
          init_5110();
                GPS_Init();   //初始化GPS   
       
//        Uart_Init();//初始化串口

//        rev_stop=0;
//        REV_NO;
/*        while(1)
        {
        /*        if (rev_stop)   //如果接收完一行         
                {
                        TR0 = 1;   //开启定时器         
                        REV_YES;
                        if (change_page % 2 == 1)//换页   
                        {
                                if (GPS_GGA_Parse(rev_buf, &GPS))//解析GPGGA      
                                {
                                        GGA_YES;
                                           //
                                        error_num = 0;
                                        gps_flag = 0;
                                        rev_stop= 0;
                                        REV_NO;
                                }
                                else
                                {
                                        error_num++;
                                        if (error_num >= 20) //如果数据无效超过20次               
                                        {
                                                GGA_NO;
                                                error_num = 20;
                                                GPS_Init();   //返回初始化            
                                        }
                                        gps_flag = 0;
                                        rev_stop= 0;
                                        REV_NO;
                                }

                        }
                        else
                        {
                                if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC         
                                {
                                        RMC_YES;

                          //显示GPS第一页信息         
                                        error_num = 0;
                                        gps_flag = 0;
                                        rev_stop= 0;
                                        led1 = 1;       
                                }
                                else
                                {
                                        error_num++;
                                        if (error_num >= 20) //如果数据无效超过20次               
                                        {
                                                RMC_NO;
                                                error_num = 20;
                                                GPS_Init();   //返回初始化         
                                        }
                                        gps_flag = 0;
                                        rev_stop= 0;
                                        REV_NO;
                                }
                        }
                }*/
        //}
}


/*void timer0(void) interrupt 1
{
        static uchar count = 0;
        TH0 = 0x3c;
        TL0 = 0xb0;
        count++;
        if (count == 200)//2*5秒钟   
        {
                count = 0;
                change_page++;//换页
                if (change_page == 10)
                        change_page = 0;
        }       
}*/


/*void Uart_Receive(void) interrupt 4
{
        uchar ch;
        ES = 0;
        if (RI)
        {
                ch = SBUF;   
                if ((ch == '$') && (gps_flag == 0))//如果收到字符'$',便开始接收         
                {
                        rev_start = 1;
                        rev_stop= 0;
                }
       
                if (rev_start == 1)//标志位为1,开始接收            
                {
                        rev_buf = ch;//字符存到数组中         
                        if (ch == '\n')   //如果接收到换行         
                        {
                                rev_buf = '\0';
                                rev_start = 0;
                                rev_stop= 1;
                                gps_flag = 1;
                                num = 0;
                        }
                }
        }
        RI = 0;       //RI清0,重新接收            
        ES = 1;       
}
*/
这又是咋回事。。{:dizzy:}

小小工大 发表于 2014-6-22 12:05:27

这就是那个程序

cocom 发表于 2014-6-22 12:20:44

你用的LED太大了,用了太大太多的LED,就会占太多的内存,用0201贴片LED吧,会比原来少占90%的内存。

小小工大 发表于 2014-6-22 12:27:12

cocom 发表于 2014-6-22 12:20
你用的LED太大了,用了太大太多的LED,就会占太多的内存,用0201贴片LED吧,会比原来少占90%的内存。 ...

这位兄弟说的是极好!讲的是相当有道理啊!

孤独的凯 发表于 2014-6-22 13:39:47

.c .h文件也是要占空间的 可以考虑把芯片型号改为55 如果你芯片rom够大的话

xyz543 发表于 2014-6-22 15:01:46

小小工大 发表于 2014-6-22 12:27
这位兄弟说的是极好!讲的是相当有道理啊!

楼主用到了 XDATA 而 Memory Model 又设到小模式去了,改改配置就好了!... {:smile:}

小小工大 发表于 2014-6-22 16:54:10

xyz543 发表于 2014-6-22 15:01
楼主用到了 XDATA 而 Memory Model 又设到小模式去了,改改配置就好了!...

...


可是你看这个程序里面也只是选择small 模式,他也是定义了Xdata,我就是照这个程序改的,只是换了个显示的。然后就出现这个问题。。
求解答~

小小工大 发表于 2014-6-22 16:56:47

xyz543 发表于 2014-6-22 15:01
楼主用到了 XDATA 而 Memory Model 又设到小模式去了,改改配置就好了!...

...

额额,还有个问题麻烦你,为什么你编译出来没有警告?我编译之后就是这样

xyz543 发表于 2014-6-22 21:04:10

小小工大 发表于 2014-6-22 16:54
可是你看这个程序里面也只是选择small 模式,他也是定义了Xdata,我就是照这个程序改的,只是换了个显 ...

很抱歉,我没有下载您的这程序来帮您 Check,因为目前是假期,我只想尽可能的先抛开这些东西。

而选到了那个大模式是我向来测试程序的一个习惯,选到后才知道您有调用到 XDATA,而为何 XDATA 才 233 个就发生问题这我不是很了解,尚请见谅。 {:smile:}

xyz543 发表于 2014-6-22 21:16:33

小小工大 发表于 2014-6-22 16:56
额额,还有个问题麻烦你,为什么你编译出来没有警告?我编译之后就是这样 ...

嗯,这个嘛...一言难尽,说实在的我是使用了一些偏门的方法了。
首先我没有安装 C51 v9.xx 版,我目前使用的是 C51 v8.12 版。
而您的程序是还有些问题要处理,但我都先使用 Build All 后再使用 Build 就没有错误发生了,而仍有警告就先设置屏闭掉它即可 Build 成功。
您觉得如何呢?这应该算是偏方吧?!哈~ {:titter:}我认为坛内肯定有许多人有能力能帮您一步步的来解决您的问题及解答您的疑问了。 {:smile:}
页: [1]
查看完整版本: 求教 用keil编译51出现超出地址空间是怎么回事、