完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
使用芯片STC89C52RC,
KEIL C51 MEMORY MODE LARGE:VARIABLES IN XDATA. //定义一个数组,并将数组内容发送至串口。 unsigned char temp[]="7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A"; //之前是这样定义的,没有指定数组长度,程序烧进去能正常跑。 unsigned char temp[100]="7528623759DA901A901A00320030003100330031003200300037003800337528753591CF4E3A"; //后来这样定义了,程序烧进去,初始化都完成不了。初始化过程主要是串口 LCD1602 GSM通信握手。 是不同的定义导致数组存放在了不同的区域吗?小弟汇编看不懂,一脸懵逼。 求指教。 |
|
相关推荐
10个回答
|
|
|
多谢了,我试了下,解决问题了,原因应该是我的memory model设置了large,导致xdata超出,我在其他地方看到:512字节内部ram, dataidata可以访问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. |
|
|
|
|
|
看看堆栈 设置了多大
|
|
|
|
|
|
定义的不同导致了数组占用空间的大小不同,未定义长度的,会根据内容分配存储空间的大小,同样的数据,第一串字符只占用了七十多个字节,而你定义了100的长度,那这个数组就是100长,占用100个字节,没有数据的被0x00填充了,溢出了。
|
|
|
|
|
|
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 |
|
|
|
|
|
看不明白,不会是堆栈不足的问题吧
|
|
|
|
|
|
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); } |
|
|
|
|
|
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); } |
|
|
|
|
|
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); } |
|
|
|
|
|
STC89C52只有512字节内部RAM,哪来的XDATA?试试unsigned char idata temp[100]
|
|
|
|
|
|
100改成76试试
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1955 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4778 浏览 0 评论
4256 浏览 9 评论
3845 浏览 16 评论
4422 浏览 1 评论
4255浏览 3评论
2413浏览 0评论
3431浏览 0评论
1194浏览 0评论
2883浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 03:34 , Processed in 0.987353 second(s), Total 92, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
505