寻思 发表于 2022-3-26 08:17:06

谁能把STC单片机的XDATA,CODE说清楚吗

如题,定义了一个大点的数组,液晶直接不显示了。把数组注释掉一切正常,我不想管什么存在哪里,我只想我的程序正常运行。。。
液晶的字库基本用的static const char code 定义的,然后定义了unsigned long xdatatemp ,液晶就显示白屏了。。。把这句话屏幕掉正常,我把XDATA 去掉也是能通过编译,但是一样白屏。
STC8G2K64S4单片机。。option里面都选择了两个 LargeLarge选项

ackyee 发表于 2022-3-26 08:43:49

本帖最后由 ackyee 于 2022-3-26 08:47 编辑

普通变量 定义在0-127的RAM 区域 128-255无法定义到            idata可以定义 0-255区域(包括前面的 0-127)

code 区是定义在 ROM也就是FLASH里的,只可读不可写,相当于从FLASH 读取,

xdata是定义在片内的外部(51core 的外部)存储器上(但是还是在芯片内的)的 ,至于有没有这个存储器需要去看你的手册了

寻思 发表于 2022-3-26 08:52:40

ackyee 发表于 2022-3-26 08:43
普通变量 定义在0-127的RAM 区域 128-255无法定义到            idata可以定义 0-255区域(包括前面 ...
(引用自2楼)

谢谢,有几个液晶字模数据没有用code可能占用了xdata,我把取模的数据全部用了code,再定义大数组,目前正常了。非常感谢。

qtechzdh 发表于 2022-3-26 08:53:59

换成M3吧骚年

sunliezhi 发表于 2022-3-26 12:18:16

拿电脑的CPU作比较,data 相当于一级缓存,存取速度最快;idata 和 xdata 相当于二、三级缓存,存取速度慢一些

rifjft 发表于 2022-3-26 14:35:40

{:lol:} STC 的人 在论坛内其它帖子相关方面的回复

STC15F2K/STC8G/STC8K/STC8H,xdata 比较大,
强烈建议将用户变量全部强制指定声明在 xdata 区域中,
可以用 xdata 强制指定存储类型,例如:
unsigned char xdata k = 0;   
将宝贵的 256字节 idata 留给堆栈专用,防程序考虑不周,堆栈溢出
另外坚决不要 使用 pdata, 避免 xdata/pdata 混用,keil 编译器犯错

寻思 发表于 2022-3-26 15:34:46

sunliezhi 发表于 2022-3-26 12:18
拿电脑的CPU作比较,data 相当于一级缓存,存取速度最快;idata 和 xdata 相当于二、三级缓存,存取速度 ...
(引用自5楼)

速度快慢对于一般的程序来说无所谓吧,更重要的是程序正常运行,管它存在哪里,只要我的逻辑能正常运行就可以了。。。。。
最头疼的是程序应该这些小细节不能正常运行了,用stm8没遇到过这些问题。

寻思 发表于 2022-3-26 15:38:56

rifjft 发表于 2022-3-26 14:35
STC 的人 在论坛内其它帖子相关方面的回复

STC15F2K/STC8G/STC8K/STC8H,xdata 比较大,
(引用自6楼)

非常赞同,很多帖子说了什么速度快慢相关的,其实对程序逻辑影响不大,我们更关心程序能不能正常运行,以后我知道了,凡是固定的数组全部用code,其他变量尽量用xdata。其实总结出来就这句话,
不用扯什么存在哪里,速度怎么快。。。

MYQQ2021 发表于 2022-3-26 16:38:40

从世纪初写汇编过来的人,对这个理解的还算可以,但不敢随便给别人讲,即使这样,在前一段时间的帖子里也是第一次见到pdata这个关键字

小李非刀 发表于 2022-3-26 17:38:13

8051数据类型很清晰的。
一般选择small模式,数组定义在xdata。
编译后,你的data xdata code 用了多少?

xmlbb 发表于 2022-3-26 17:58:40

用了m3之后,发现8051的设计是反人类的,哈哈。

woshigeshuai 发表于 2022-3-26 18:16:57

本帖最后由 woshigeshuai 于 2022-3-26 18:18 编辑

哈哈,我就是玩51汇编的,常常把客户的汇编程序转成C语言

data 0-0x80区域
pdata 0x80-0xff区域
xdata 很早以前是外扩的RAM ,另加一个芯片。现在STC和其它51厂家集中在51内部了。可以用一部分空间比如2048字节就是0-0x800这个区域,空间大小不定
用C语言写的时候可以这样定义
u8 data volt1;    // RAM空间访问最快
u8 pdata volt2;   // 间接访问地址
u8 xdata volt3;   // 51的SRAM区域

iamseer 发表于 2022-3-27 03:55:03

xmlbb 发表于 2022-3-26 17:58
用了m3之后,发现8051的设计是反人类的,哈哈。
(引用自11楼)

那你再试试risc-v,反人类的感觉又回来了。

dukelec 发表于 2022-3-27 05:21:05

iamseer 发表于 2022-3-27 03:55
那你再试试risc-v,反人类的感觉又回来了。
(引用自13楼)

risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄

STC 把 51 都搞成 32 位了,就不能把 51 改造成统一编址嗎?

MYQQ2021 发表于 2022-3-27 07:27:02

woshigeshuai 发表于 2022-3-26 18:16
哈哈,我就是玩51汇编的,常常把客户的汇编程序转成C语言

data 0-0x80区域

(引用自12楼)

更习惯把你说的pdata写成idata

xmlbb 发表于 2022-3-27 07:51:19

iamseer 发表于 2022-3-27 03:55
那你再试试risc-v,反人类的感觉又回来了。
(引用自13楼)

没看过risc-v,难道跟8051一样?

iamseer 发表于 2022-3-27 09:10:33

本帖最后由 iamseer 于 2022-3-27 09:12 编辑

dukelec 发表于 2022-3-27 05:21
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄


(引用自14楼)

我也是最近刚接触,为了出波形写汇编。
riscv为了追求硬件简单,指令集不是特别方便。一个直观感受是编译大小比arm要大。
手写汇编我当时干了这样一件事,把一个字节移位,把溢出的位送到io口,模拟串口快速出数据,方便调试。
8051很简单,移位然后把c标志位赋到io口,两条指令。
avr有bld指令,三条指令一位,也还行。
riscv就比较麻烦了,没有标志位,只能用sltu这种诡异指令中转,需要7条指令。
riscv另外还有指令压缩的问题,某些指令压缩成16位后会导致流水线出现不可预测的延迟,非常讨厌。

当然我这测试比较极端。riscv毕竟有一大堆寄存器,一般运算还是比51效率高,不抢A寄存器。

测试代码在此
https://github.com/DeqingSun/Debug-on-any-GPIO-with-high-speed-UART/blob/main/uartTxDemoCode/otherArchitectureHighSpeedSerialTX.txt

iamseer 发表于 2022-3-27 09:26:32

本帖最后由 iamseer 于 2022-3-27 09:38 编辑

dukelec 发表于 2022-3-27 05:21
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄


(引用自14楼)

我也看了看stc32的宣传,看出来是加了32位内存存取和运算的外设,核心还是标准51。要是魔改核心编译器不支持了,那还不如直接上别的核心 。

不过stc32我个人感觉算是劣化版的dsp还支持浮点,跑算法应该可以把同价位芯片按在地上摩擦。

就是高速内存才4k真可惜,要不然跑tensorflow估计很好玩。

modbus 发表于 2022-3-27 10:27:53

dukelec 发表于 2022-3-27 05:21
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄

(引用自14楼)

STC的32位51是统一编址

modbus 发表于 2022-3-27 10:40:37

iamseer 发表于 2022-3-27 09:26
我也看了看stc32的宣传,看出来是加了32位内存存取和运算的外设,核心还是标准51。要是魔改核心编译器不 ...
(引用自18楼)

STC32的数据总线和指令总线应该都是32位的,否则32位内存存取和运算不可能1个时钟完成,但那个XDATA内存估计被老姚给阉割成了8位数据总线

laujc 发表于 2022-3-27 17:38:10

寻思 发表于 2022-3-26 15:34
速度快慢对于一般的程序来说无所谓吧,更重要的是程序正常运行,管它存在哪里,只要我的逻辑能正常运行就 ...
(引用自7楼)

速度慢是因为xdata访问时使用DPTR间接访问,步骤多了,代码也多了。

不过使用51单片机的场合应该不需要太高性能,应该都不影响。

cc2666 发表于 2022-3-27 18:00:20

硬盘和光盘

anshaoyuan 发表于 2022-4-3 09:50:25

woshigeshuai 发表于 2022-3-26 18:16
哈哈,我就是玩51汇编的,常常把客户的汇编程序转成C语言

data 0-0x80区域
(引用自12楼)

举例很实在

qinxg 发表于 2022-4-4 13:52:33

code: 放在代码里, 不能变动
data: 0-0x80内如RAM,可以直接寻址 MOV ACC 52
idata: 0--0xff.内部RAM, 间接寻址 MOV ACC @R0/R1
xdata . 0--0XFFFF外部RAM:MOVX ACC,@DPTR
--------- 单个变量如i,j,k之类放在内部RAM,加快运行速度(堆栈也放这里);大数组如buff放xdata, 不能占用内部RAM.
页: [1]
查看完整版本: 谁能把STC单片机的XDATA,CODE说清楚吗