OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9057|回复: 10

51中使用大型数组的问题

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
发表于 2017-5-22 10:06:03 | 显示全部楼层 |阅读模式
5金钱
使用芯片STC89C52RC,
KEIL C51     MEMORY MODE   LARGE:VARIABLES IN XDATA.

//定义一个数组,并将数组内容发送至串口。
unsigned char temp[]="7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A";
//之前是这样定义的,没有指定数组长度,程序烧进去能正常跑。
unsigned char temp[100]="7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A";
//后来这样定义了,程序烧进去,初始化都完成不了。初始化过程主要是串口 LCD1602 GSM通信握手。
是不同的定义导致数组存放在了不同的区域吗?小弟汇编看不懂,一脸懵逼。
求指教。


最佳答案

查看完整内容[请看2#楼]

多谢了,我试了下,解决问题了,原因应该是我的memory model设置了large,导致xdata超出,我在其他地方看到:512字节内部ram, data\idata可以访问256字节,用xdata可以访问另外的256字节。 Program Size: data=15.1 xdata=255 code=3658//使用xdata,这样会超出256吧; Program Size: data=145.1 xdata=100 code=3304//同时使用data,xdata.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 10:06:04 | 显示全部楼层
jxcrgt35 发表于 2017-5-22 12:37
STC89C52只有512字节内部RAM,哪来的XDATA?试试unsigned char idata  temp[100]

多谢了,我试了下,解决问题了,原因应该是我的memory model设置了large,导致xdata超出,我在其他地方看到:512字节内部ram,  data\idata可以访问256字节,用xdata可以访问另外的256字节。
Program Size: data=15.1 xdata=255 code=3658//使用xdata,这样会超出256吧;
Program Size: data=145.1 xdata=100 code=3304//同时使用data,xdata.
回复

使用道具 举报

62

主题

902

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3555
金钱
3555
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-5-22 10:07:30 | 显示全部楼层
看看堆栈 设置了多大
回复

使用道具 举报

1

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2014-4-14
在线时间
104 小时
发表于 2017-5-22 11:00:25 | 显示全部楼层
本帖最后由 翼间 于 2017-5-22 11:03 编辑

定义的不同导致了数组占用空间的大小不同,未定义长度的,会根据内容分配存储空间的大小,同样的数据,第一串字符只占用了七十多个字节,而你定义了100的长度,那这个数组就是100长,占用100个字节,没有数据的被0x00填充了,溢出了。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 11:48:45 | 显示全部楼层
Sun_Fly 发表于 2017-5-22 10:07
看看堆栈 设置了多大

  TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0005H     UNIT         _DATA_GROUP_
                    000DH     0013H                  *** GAP ***
            BIT     0020H.0   0001H.1   UNIT         _BIT_GROUP_
                    0021H.1   0000H.7                *** GAP ***
            IDATA   0022H     0001H     UNIT         ?STACK

            * * * * * * *  X D A T A   M E M O R Y  * * * * * * *
            XDATA   0000H     00CBH     UNIT         ?XD?MAIN
            XDATA   00CBH     0034H     UNIT         _XDATA_GROUP_

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H     0003H     ABSOLUTE     
            CODE    0003H     001EH     UNIT         ?PR?LCDINIT?LCD
                    0021H     0002H                  *** GAP ***
            CODE    0023H     0003H     ABSOLUTE     
            CODE    0026H     0365H     UNIT         ?PR?PRINTF?PRINTF
            CODE    038BH     01A4H     UNIT         ?PR?MAIN?MAIN
            CODE    052FH     0141H     UNIT         ?C?LIB_CODE
            CODE    0670H     013CH     UNIT         ?CO?MAIN
            CODE    07ACH     00BFH     UNIT         ?PR?_STRSTR?STRSTR
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 11:51:17 | 显示全部楼层
muyexinya 发表于 2017-5-22 11:48
TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            ----------------------------- ...

看不明白,不会是堆栈不足的问题吧
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 11:53:56 | 显示全部楼层
  X:00D4H         SYMBOL        thousand
  X:00D5H         SYMBOL        hundred
  X:00D6H         SYMBOL        ten
  D:0005H         SYMBOL        one
这4个变量我是定义在同一个函数里的,为什么会前三个分到xdata,一个分到data,我强制 xdata后还是这样,函数原型:
void sim900a_ascii2unicode(unsigned int src, unsigned char *dst)
{

        unsigned char  thousand = src/1000;
        unsigned char  hundred = src % 1000 / 100;
        unsigned char  ten = src % 1000 /100;
        unsigned char  one = src % 1000 % 100 % 10;
        sprintf(dst,"7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A%04x%04x%04x%04x",thousand+0x30,hundred+0x30,ten+0x30,one+0x30);
       
}
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 11:55:20 | 显示全部楼层
muyexinya 发表于 2017-5-22 11:48
TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            ----------------------------- ...

  X:00D4H         SYMBOL        thousand
  X:00D5H         SYMBOL        hundred
  X:00D6H         SYMBOL        ten
  D:0005H         SYMBOL        one
这4个变量我是定义在同一个函数里的,为什么会前三个分到xdata,一个分到data,我强制 xdata后还是这样,函数原型:
void sim900a_ascii2unicode(unsigned int src, unsigned char *dst)
{
        unsigned char  thousand = src/1000;
        unsigned char  hundred = src % 1000 / 100;
        unsigned char  ten = src % 1000 /100;
        unsigned char  one = src % 1000 % 100 % 10;
        sprintf(dst,"7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A%04x%04x%04x%04x",thousand+0x30,hundred+0x30,ten+0x30,one+0x30);
       
}
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-9
在线时间
5 小时
 楼主| 发表于 2017-5-22 11:56:00 | 显示全部楼层
muyexinya 发表于 2017-5-22 11:48
TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            ----------------------------- ...

  X:00D4H         SYMBOL        thousand
  X:00D5H         SYMBOL        hundred
  X:00D6H         SYMBOL        ten
  D:0005H         SYMBOL        one
这4个变量我是定义在同一个函数里的,为什么会前三个分到xdata,一个分到data,我强制 xdata后还是这样,函数原型:
void sim900a_ascii2unicode(unsigned int src, unsigned char *dst)
{
        unsigned char  thousand = src/1000;
        unsigned char  hundred = src % 1000 / 100;
        unsigned char  ten = src % 1000 /100;
        unsigned char  one = src % 1000 % 100 % 10;
        sprintf(dst,"%04x%04x%04x%04x",thousand+0x30,hundred+0x30,ten+0x30,one+0x30);
       
}
回复

使用道具 举报

4

主题

133

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3860
金钱
3860
注册时间
2016-6-11
在线时间
709 小时
发表于 2017-5-22 12:37:15 | 显示全部楼层
STC89C52只有512字节内部RAM,哪来的XDATA?试试unsigned char idata  temp[100]
回复

使用道具 举报

62

主题

902

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3555
金钱
3555
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-5-22 14:42:50 | 显示全部楼层
100改成76试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 14:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表