谁能把STC单片机的XDATA,CODE说清楚吗
如题,定义了一个大点的数组,液晶直接不显示了。把数组注释掉一切正常,我不想管什么存在哪里,我只想我的程序正常运行。。。液晶的字库基本用的static const char code 定义的,然后定义了unsigned long xdatatemp ,液晶就显示白屏了。。。把这句话屏幕掉正常,我把XDATA 去掉也是能通过编译,但是一样白屏。
STC8G2K64S4单片机。。option里面都选择了两个 LargeLarge选项 本帖最后由 ackyee 于 2022-3-26 08:47 编辑
普通变量 定义在0-127的RAM 区域 128-255无法定义到 idata可以定义 0-255区域(包括前面的 0-127)
code 区是定义在 ROM也就是FLASH里的,只可读不可写,相当于从FLASH 读取,
xdata是定义在片内的外部(51core 的外部)存储器上(但是还是在芯片内的)的 ,至于有没有这个存储器需要去看你的手册了 ackyee 发表于 2022-3-26 08:43
普通变量 定义在0-127的RAM 区域 128-255无法定义到 idata可以定义 0-255区域(包括前面 ...
(引用自2楼)
谢谢,有几个液晶字模数据没有用code可能占用了xdata,我把取模的数据全部用了code,再定义大数组,目前正常了。非常感谢。 换成M3吧骚年 拿电脑的CPU作比较,data 相当于一级缓存,存取速度最快;idata 和 xdata 相当于二、三级缓存,存取速度慢一些 {:lol:} STC 的人 在论坛内其它帖子相关方面的回复
STC15F2K/STC8G/STC8K/STC8H,xdata 比较大,
强烈建议将用户变量全部强制指定声明在 xdata 区域中,
可以用 xdata 强制指定存储类型,例如:
unsigned char xdata k = 0;
将宝贵的 256字节 idata 留给堆栈专用,防程序考虑不周,堆栈溢出
另外坚决不要 使用 pdata, 避免 xdata/pdata 混用,keil 编译器犯错 sunliezhi 发表于 2022-3-26 12:18
拿电脑的CPU作比较,data 相当于一级缓存,存取速度最快;idata 和 xdata 相当于二、三级缓存,存取速度 ...
(引用自5楼)
速度快慢对于一般的程序来说无所谓吧,更重要的是程序正常运行,管它存在哪里,只要我的逻辑能正常运行就可以了。。。。。
最头疼的是程序应该这些小细节不能正常运行了,用stm8没遇到过这些问题。 rifjft 发表于 2022-3-26 14:35
STC 的人 在论坛内其它帖子相关方面的回复
STC15F2K/STC8G/STC8K/STC8H,xdata 比较大,
(引用自6楼)
非常赞同,很多帖子说了什么速度快慢相关的,其实对程序逻辑影响不大,我们更关心程序能不能正常运行,以后我知道了,凡是固定的数组全部用code,其他变量尽量用xdata。其实总结出来就这句话,
不用扯什么存在哪里,速度怎么快。。。 从世纪初写汇编过来的人,对这个理解的还算可以,但不敢随便给别人讲,即使这样,在前一段时间的帖子里也是第一次见到pdata这个关键字 8051数据类型很清晰的。
一般选择small模式,数组定义在xdata。
编译后,你的data xdata code 用了多少? 用了m3之后,发现8051的设计是反人类的,哈哈。 本帖最后由 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区域
xmlbb 发表于 2022-3-26 17:58
用了m3之后,发现8051的设计是反人类的,哈哈。
(引用自11楼)
那你再试试risc-v,反人类的感觉又回来了。
iamseer 发表于 2022-3-27 03:55
那你再试试risc-v,反人类的感觉又回来了。
(引用自13楼)
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄
STC 把 51 都搞成 32 位了,就不能把 51 改造成统一编址嗎? woshigeshuai 发表于 2022-3-26 18:16
哈哈,我就是玩51汇编的,常常把客户的汇编程序转成C语言
data 0-0x80区域
(引用自12楼)
更习惯把你说的pdata写成idata iamseer 发表于 2022-3-27 03:55
那你再试试risc-v,反人类的感觉又回来了。
(引用自13楼)
没看过risc-v,难道跟8051一样?
本帖最后由 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:38 编辑
dukelec 发表于 2022-3-27 05:21
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄
(引用自14楼)
我也看了看stc32的宣传,看出来是加了32位内存存取和运算的外设,核心还是标准51。要是魔改核心编译器不支持了,那还不如直接上别的核心 。
不过stc32我个人感觉算是劣化版的dsp还支持浮点,跑算法应该可以把同价位芯片按在地上摩擦。
就是高速内存才4k真可惜,要不然跑tensorflow估计很好玩。 dukelec 发表于 2022-3-27 05:21
risc-v 至少是统一编址吧
不太了解 risc-v,給大家科普一下反人類的點唄
(引用自14楼)
STC的32位51是统一编址 iamseer 发表于 2022-3-27 09:26
我也看了看stc32的宣传,看出来是加了32位内存存取和运算的外设,核心还是标准51。要是魔改核心编译器不 ...
(引用自18楼)
STC32的数据总线和指令总线应该都是32位的,否则32位内存存取和运算不可能1个时钟完成,但那个XDATA内存估计被老姚给阉割成了8位数据总线 寻思 发表于 2022-3-26 15:34
速度快慢对于一般的程序来说无所谓吧,更重要的是程序正常运行,管它存在哪里,只要我的逻辑能正常运行就 ...
(引用自7楼)
速度慢是因为xdata访问时使用DPTR间接访问,步骤多了,代码也多了。
不过使用51单片机的场合应该不需要太高性能,应该都不影响。
硬盘和光盘 woshigeshuai 发表于 2022-3-26 18:16
哈哈,我就是玩51汇编的,常常把客户的汇编程序转成C语言
data 0-0x80区域
(引用自12楼)
举例很实在 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]