难道STC32G不允许把变量定义到code段吗?
//16位BMP 40X40 QQ图像取模数据,存到程序段里//Image2LCD取模选项设置
//水平扫描
//16位
//40X40
//不包含图像头数据
//自左至右
//自顶至底
//低位在前
unsigned char code gImage_qq = { /*0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B,*/
0XDB,0XDE,0X5D,0XEF,0X5D,0XEF,0X7D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,
0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0XBE,0XF7,
0XFF,0XFF,0XDE,0XFF,0X38,0XC6,0X92,0X8C,0X8E,0X6B,0X6E,0X6B,0X10,0X7C,0X96,0XAD,
0X3C,0XE7,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,0X5D,0XEF,
定义了一个程序段数组变量unsigned char code gImage_qq用来存储图片,结果编译后却被存到了Xdata段,
难道STC32G不允许把变量定义到code段吗?求解
code 改成 const STC32G允许使用code关键字将常量定义到程序空间。
STC32G实验箱例程包:
37-2.4寸ILI9341驱动TFT显示屏实验程序,font文件夹下"pic.h"就定义了一个你同样的常量数组存放图片数据在程序空间。
编译后这个数组内容是放到Flash空间不是放在xdata里面。
小飞侠 发表于 2024-5-27 14:27
code 改成 const
谢谢 神农鼎 发表于 2024-5-27 15:02
谢谢 不可能 可以啊 STC32G的DPTR指令,有点BUG。
INTEL标准是,读写XRAM指令,MOVX@DPTR,A和MOVXA,@DPTR
最高扩展地址位,默认DPXL(STC指令是正确的)。
但读ROM指令,INTEL标准是,最高扩展地址强制置0xFF。
即MOVCA,@A+DPTR指令,读取最后一页(0xFF0000~0xFFFFFF)数据,
但STC指令,最高扩展地址位也选择DPXL(是错的)。
附:出现故障现象及解决方法
1、程序中使用4字节指针寻址(官方推荐)
可有效避开MOVC指令(结果正确)
如用户变量选用2字节指针,若全局变量定义CODE类型,程序执行会出错。
你只要强制定义为ECODE类型,即可正确执行。
注:变量指针是否2/4字节,与中断指针一定要用4字节无关!
2、函数(子程序)中定义CODE变量,由于函数内ROM变量指针默认2字节,
所以执行会出错,你只要将其强制定义为ECODE类型即可,就能正确执行。