乘简 发表于 7 天前

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



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


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


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


青穗三三 发表于 7 天前

这个文件最大是64K,你看后面不是写max了么

Ayb_ice 发表于 7 天前

用huge定义变量

狂热主宰 发表于 7 天前

可能需要分开存储
尝试分两段

乘风飞扬 发表于 7 天前

keil编译器的限制

Ayb_ice 发表于 7 天前

Ayb_ice 发表于 2026-3-31 11:39
用huge定义变量
deepseek是错的,你试试就知道了

乘风飞扬 发表于 7 天前

重点是画红色下划线的文字。



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

乘风飞扬 发表于 6 天前

xdata超过64K要用far定义,附件例子供参考。
#define EDATA_LEN       16074L
#define XDATA1_LEN      65536L
#define XDATA2_LEN      65536L
#define XDATA3_LEN      4096L

unsigned char edata eRAM;      //0000H~3FFFH
unsigned char xdata xRAM1;      //01:0000H~01:FFFFH
unsigned char far xRAM2;      //02:0000H~02:FFFFH
unsigned char far xRAM3 _at_ 0x030000;//03:0000H~03:0FFFH

乘简 发表于 6 天前

乘风飞扬 发表于 2026-4-1 09:00
xdata超过64K要用far定义,附件例子供参考。

你给的这个程序确实可以编译

有个疑问,就是用far定义的变量跑到edata+hdata中了,这里占用80K,与官方手册上说的,edata为16K,xdata为128K不符

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


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

乘风飞扬 发表于 6 天前

far 定义的变量属于 HDATA。单个数组不能超过64K,是编译器的限制,不是芯片的限制。就像中断向量超过31会报错,是编译器设计时没想过单片机会发展这么快,中断会变得那么多。
页: [1] 2
查看完整版本: STC32G144K246单片机,xdata只能使用64K???