找回密码
 立即注册
查看: 337|回复: 23

STC32G144K246单片机,xdata只能使用64K???

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:29
  • 最近打卡:2026-04-27 09:59:53

13

主题

79

回帖

367

积分

中级会员

积分
367
发表于 2026-3-31 11:02:40 | 显示全部楼层 |阅读模式
截图202603311101385930.jpg

错误如上图,按理来说,这STC32G144K246单片机,edata是16K,xdata是128K,可我才定多大的内存,就报错了呢???


问题补充:xdata区总内存大小没有超过64K,则不报错
截图202603311626126529.jpg

然后把xdata再加大,就报错了


截图202603311627049417.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:83
  • 最近打卡:2026-04-30 14:48:25

9

主题

95

回帖

1053

积分

金牌会员

积分
1053
发表于 2026-3-31 11:15:13 | 显示全部楼层
这个文件最大是64K,你看后面不是写max了么

点评

不是文件超过了64K,而是定义二维数组变量40960了,就报错了  发表于 2026-3-31 16:12
微信qsssuv
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:269
  • 最近打卡:2026-04-30 08:20:54
已绑定手机

22

主题

641

回帖

2384

积分

金牌会员

积分
2384
发表于 2026-3-31 11:39:39 | 显示全部楼层
用huge定义变量

点评

查deepseek,说用huge定义的变量,在edata区,而edata区只有16K,不够  发表于 2026-3-31 13:20
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-3-31 13:20:23 | 显示全部楼层
可能需要分开存储
尝试分两段

点评

我想知道,是keil的问题呢,还是单片机不支持,,分开存储,程序写起来麻烦很多  发表于 2026-3-31 13:22
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-3-31 13:58:31 | 显示全部楼层
keil编译器的限制
截图202603311358247902.jpg

点评

已经按这个图改了,还是报错。。。  发表于 2026-3-31 16:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:269
  • 最近打卡:2026-04-30 08:20:54
已绑定手机

22

主题

641

回帖

2384

积分

金牌会员

积分
2384
发表于 2026-3-31 15:55:33 | 显示全部楼层

deepseek是错的,你试试就知道了
截图202603311557012931.jpg

点评

事实上,我用huge定义的变量,编译后,可以看到edata+hdata的数字在增长  发表于 2026-3-31 16:59
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-3-31 17:43:20 | 显示全部楼层
重点是画红色下划线的文字。

截图202603311744227588.jpg

将"led_show.c"文件里面的代码分一部分到其它 C 文件里面。避免这个文件里面的代码量超过64K。

点评

单个文件,单个函数都在64K以内,但单个表格是什么意思不知道,现在是xdata加起来不能超过64K  发表于 2026-4-1 08:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-1 09:00:15 | 显示全部楼层
xdata超过64K要用far定义,附件例子供参考。
  1. #define EDATA_LEN       16074L
  2. #define XDATA1_LEN      65536L
  3. #define XDATA2_LEN      65536L
  4. #define XDATA3_LEN      4096L
  5. unsigned char edata eRAM[EDATA_LEN];        //0000H~3FFFH
  6. unsigned char xdata xRAM1[XDATA1_LEN];      //01:0000H~01:FFFFH
  7. unsigned char far xRAM2[XDATA2_LEN];        //02:0000H~02:FFFFH
  8. unsigned char far xRAM3[XDATA3_LEN] _at_ 0x030000;  //03:0000H~03:0FFFH
复制代码
截图202604010926075004.jpg

STC32G144K246-SRAM测试.zip

24.94 KB, 下载次数: 4

点评

但是问题又来了,用far定义的数组,不能做为LCM_DMA的发送区,里面的数据是乱的  发表于 2026-4-1 10:15
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:29
  • 最近打卡:2026-04-27 09:59:53

13

主题

79

回帖

367

积分

中级会员

积分
367
发表于 2026-4-1 09:58:30 | 显示全部楼层
乘风*** 发表于 2026-4-1 09:00
xdata超过64K要用far定义,附件例子供参考。

你给的这个程序确实可以编译
截图202604010952533047.jpg
有个疑问,就是用far定义的变量跑到edata+hdata中了,这里占用80K,与官方手册上说的,edata为16K,xdata为128K不符

而且我发现,能编译通过,是因为这里填了这两项值 ,不知道这两项值是什么意思
截图202604010956597182.jpg

但不管怎么样,单个数组不能超过64K,这是硬伤,看来这个STC32G144K246这个是32,不知道真32单片机要什么时候才出来。。。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-1 10:35:46 | 显示全部楼层
far 定义的变量属于 HDATA。单个数组不能超过64K,是编译器的限制,不是芯片的限制。就像中断向量超过31会报错,是编译器设计时没想过单片机会发展这么快,中断会变得那么多。
截图202604011033235019.jpg

点评

但是hdata就不能做为LCM_DMA的发送缓存区了。。。我试了乱码  发表于 2026-4-1 14:51
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:29 , Processed in 0.138194 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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