henangongda123 发表于 2021-6-7 15:10

STC单片机xdata乱码问题有多少遇到过?

一直不太喜欢STC,10几年前用的时候就BUG多多,今年被逼无奈,STM8供不了货,用了一下,感觉又碰到坑了!
写了一个幻彩灯带控制程序,因为有各种定制效果,就需要用到大的数组,由于STC8G1K08的内存跟51一样,很小,必须要把数组定义到xdata区,这个操作没问题,可以理解,问题是我在调用数组,展示幻彩效果的时候,总是遇到随机性的乱码导致灯带有闪烁点。。。很无语,怎么调试都不行。
网上查了一下,还不止我一个人遇到这样的问题,不知道大家有没有遇到?

henangongda123 发表于 2021-6-7 15:14

今天专门找了一片STM8S103移植程序测试,发现STM8S003就没有这个问题,STM8S003的RAM区1K字节,数组定义的时候可以不用管RAM够不够用,而且同样的效果代码,运行起来就没有随机的闪点!

ayb_ice 发表于 2021-6-7 15:47

多半是程序自身问题,XDATA访问效率低而已,需要更多的指令来完成,在任务与中断等多处修改时要特别注意,容易出错,必要时禁止中断

henangongda123 发表于 2021-6-7 15:48

STC8G1K08的RAM只有256字节,而且要给全局变量、临时变量使用,数组只能定义到xdata区

henangongda123 发表于 2021-6-7 15:49

ayb_ice 发表于 2021-6-7 15:47
多半是程序自身问题,XDATA访问效率低而已,需要更多的指令来完成,在任务与中断等多处修改时要特别 ...

你意思是中断会影响xdata访问?我只有一个定时器中断,几十ms中断一次

henangongda123 发表于 2021-6-7 15:55

ayb_ice 发表于 2021-6-7 15:47
多半是程序自身问题,XDATA访问效率低而已,需要更多的指令来完成,在任务与中断等多处修改时要特别 ...

厉害了,我关掉所有中断后还真没有这个问题了。。。

ayb_ice 发表于 2021-6-7 15:55

henangongda123 发表于 2021-6-7 15:49
你意思是中断会影响xdata访问?我只有一个定时器中断,几十ms中断一次

中断如果不修改他,当然是没问题的

henangongda123 发表于 2021-6-7 15:57

ayb_ice 发表于 2021-6-7 15:55
中断如果不修改他,当然是没问题的

中断没有修改它,定时中断检测按键的,跟数组没有关系,但是关掉总中断后还确实没有这个不良问题了!

ayb_ice 发表于 2021-6-7 16:01

henangongda123 发表于 2021-6-7 15:55
厉害了,我关掉所有中断后还真没有这个问题了。。。

XDATA区间访问效率是最低的,也是最容易出错的,其它区间效率较高,出错的概率是最低的,但不表示不会出错,
这就是临界代码的概念,要想各种方法来处理这些临时代码,关中断是常用方法,设标志位也是常用方法

ayb_ice 发表于 2021-6-7 16:03

henangongda123 发表于 2021-6-7 15:57
中断没有修改它,定时中断检测按键的,跟数组没有关系,但是关掉总中断后还确实没有这个不良问题了! ...

可能你的时序要求严,关中断的话,不会被打断,时序符合要求

henangongda123 发表于 2021-6-7 16:09

ayb_ice 发表于 2021-6-7 16:03
可能你的时序要求严,关中断的话,不会被打断,时序符合要求

只是定义一个数组,不断的修改、调用数组而已,没什么时序要求

henangongda123 发表于 2021-6-7 16:09

//全局变量
uchar bdata Send_Byte;      //定义可操作位的一字节发送数据
sbit Bit0 = Send_Byte^0;          //被发送的数据各位定义
sbit Bit1 = Send_Byte^1;
sbit Bit2 = Send_Byte^2;
sbit Bit3 = Send_Byte^3;
sbit Bit4 = Send_Byte^4;
sbit Bit5 = Send_Byte^5;
sbit Bit6 = Send_Byte^6;
sbit Bit7 = Send_Byte^7;
uchar R_Data=0;               //定义每个像素点的红光灰度值(0-255)
uchar G_Data=0;               //定义每个像素点的绿光灰度值(0-255)
uchar B_Data=0;               //定义每个像素点的蓝光灰度值(0-255)
uchar LED_Pixel=40;         //定义灯带要控制的像素点数
uchar Flash_Mode=1;         //定义灯带闪烁模式
uchar Flash_Mode_Old=0;       //定义程序运行时闪烁模式变量
uchar Flash_Color=0;          //定义闪烁颜色(红0,蓝1,绿2,琥珀3,紫4,白5)
uchar Flash_Speed=0;          //定义闪烁速度
uint Speed_Time=0;            //定义闪烁间隔时间值
uchar T0_Number1=0;         //定义、保存T0定时器辅助定时计数1(用于按键短按扫描)
uchar T0_Number2=0;         //定义、保存T0定时器辅助定时计数2(用于按键长按扫描)
pdata uchar Display_Data;//定义用于存储每个像素点效果数据的数组(LED_Pixel*3)


henangongda123 发表于 2021-6-7 16:11

我只是定义了一个xdata数组,程序中不断修改数组的内容,实现各种效果,然后定时中断去检测按键,改变效果内容,定时中断居然会影响到xdata访问,奇了

henangongda123 发表于 2021-6-7 16:23

ayb_ice 发表于 2021-6-7 16:03
可能你的时序要求严,关中断的话,不会被打断,时序符合要求

我特意去开了一下STM8的定时中断,没有这种不良情况

ayb_ice 发表于 2021-6-7 16:31

henangongda123 发表于 2021-6-7 16:23
我特意去开了一下STM8的定时中断,没有这种不良情况

千万不要这么认为,在这里没有问题,就代表程序没有问题,
如果没有中断,一般是可以这么认为的,因为程序不会被打断,但有中断情况就很杂了,这就涉及临界代码了,

同一个临界代码,不同的内核执行,有的需要关中断,有的不需要关中断

henangongda123 发表于 2021-6-7 16:38

ayb_ice 发表于 2021-6-7 16:31
千万不要这么认为,在这里没有问题,就代表程序没有问题,
如果没有中断,一般是可以这么认为的,因为程 ...

归根结底还是STC的xdata有问题,xdata使用的时候不能开中断,这谁能接受得了?没有对比就没有伤害,BOSS决定了,准备花一倍多的价钱用STM8,换掉STC。。。这STC扩展的1K xdata有还毛用!

henangongda123 发表于 2021-6-7 16:53

ayb_ice 发表于 2021-6-7 16:31
千万不要这么认为,在这里没有问题,就代表程序没有问题,
如果没有中断,一般是可以这么认为的,因为程 ...

貌似不是xdata问题,是时序被中断打乱问题。。。

ayb_ice 发表于 2021-6-7 16:54

henangongda123 发表于 2021-6-7 16:53
貌似不是xdata问题,是时序被中断打乱问题。。。

你不是说没时序吗

henangongda123 发表于 2021-6-7 16:55

可以结贴了,不是STC xdata问题,是定时中断干扰了时序问题,误会了

henangongda123 发表于 2021-6-7 17:12

ayb_ice 发表于 2021-6-7 16:54
你不是说没时序吗

忘记了,单片机端口要把数组内容发送出去,这个过程中如果有中断进来就会干扰出错,大意了,丢人啊{:lol:}
页: [1] 2 3
查看完整版本: STC单片机xdata乱码问题有多少遇到过?