标题: 一个数组影响指示灯的闪烁是什么原因 [打印本页]

作者: liyago    时间: 2022-8-8 23:34
标题: 一个数组影响指示灯的闪烁是什么原因
本帖最后由 liyago 于 2022-8-9 00:16 编辑

#include "STC15Fxxxx.h"
#include "intrins.h"
#define uint unsigned int


sbit lamp=P3^7; //指示灯
uint i,k=0;
uint led_pinlu=50;//
uint  remotedata[800];//这个数组设900以上就不闪灯了
void Timer1Init(void);


/******主函数****/                                                                                                                                                                        
void main()
{  
                Timer1Init();
                EA=1; //开总中断
                while(1)
                {
                                if(k>led_pinlu)//上电正常慢闪灯,计数大于频率和频率不等于0是闪
                                {        
                                                k=0;
                                                lamp=!lamp;
                                }
                }
}


void Timer1Init(void)               
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TH0=(65535-9000)/256;        //10毫秒一次
        TL0=(65535-9000)%256;
        ET0=1;//开T0中断
        TR0 = 1;                //定时器0开始计时               
        
}

void time0()interrupt 1
{
        k++;
}


全部程序如上,当定义数组uint  remotedata[800];为800以下时程序运行后LED灯闪,当定义数组为900以上时LED灯就不闪了,求各位大侠指点迷津,谢谢了!!!
用的芯片型号 : STC15F2K08S2



作者: liyago    时间: 2022-8-9 00:16
用的芯片型号 : STC15F2K08S2
作者: wulin    时间: 2022-8-9 06:38
内存容量有限,remotedata[ ];虽然没有被使用,但它把茅坑占满了,别人无处拉便便
作者: 188610329    时间: 2022-8-9 08:23
不用900,只有896以上就出问题了吧?溢出了!
作者: lkc8210    时间: 2022-8-9 09:02
liyago 发表于 2022-8-9 00:16
用的芯片型号 : STC15F2K08S2

此芯片有2048Byte SRAM
其中128Byte是data
下128Byte是idata
最后的1792Byte是xdata
900个uint 有1800个Byte
内存溢出了
作者: tzs233    时间: 2022-8-9 09:20
RAM不够了呗! 这个芯片只有2kRAM, 减去固定idata256字节  排外RAM区还有1800字节不到 那个数组i是nt型数据占了1800字节 你编译器应该也已经警告过你了
作者: tzs233    时间: 2022-8-9 09:27
如果只是固定不变的数据就存放在ROM区,用const code修饰。如非有必要存储那么大的数字 可以把数组类型改为unsigned char型,否则只有更换更大ram型号芯片了
作者: 的花朵    时间: 2022-8-9 09:48
一共2k sram,900*2=1800差不多到临界了,可能是sram用超了?编译器没报啥警告吗
作者: yzwzfyz    时间: 2022-8-9 09:49
你有对数组操作吗?
程序中没有看到对数组的操作的部分。

作者: coody_sz    时间: 2022-8-9 09:53
数组定义没有加xdata,你看看是不是这个问题?
作者: lhzw2001    时间: 2022-8-9 11:18
溢出了
作者: liyago    时间: 2022-8-9 11:55
wulin 发表于 2022-8-9 06:38
内存容量有限,remotedata[ ];虽然没有被使用,但它把茅坑占满了,别人无处拉便便

一直没留意内存的影响,谢谢了!
作者: liyago    时间: 2022-8-9 11:57
188610329 发表于 2022-8-9 08:23
不用900,只有896以上就出问题了吧?溢出了!

实测是887就不行了,真是内存小的问题
作者: liyago    时间: 2022-8-9 12:07
lkc8210 发表于 2022-8-9 09:02
此芯片有2048Byte SRAM
其中128Byte是data
下128Byte是idata

谢谢了,一直没注意这方面的问题。
作者: liyago    时间: 2022-8-9 12:12
tzs233 发表于 2022-8-9 09:20
RAM不够了呗! 这个芯片只有2kRAM, 减去固定idata256字节  排外RAM区还有1800字节不到 那个数组i是nt型数据 ...



STC15Fxx.7z (2.17 KB, 下载次数: 3)

STC15Fxxxx.7z (7.38 KB, 下载次数: 2)

用STC15Fxx.H会出现警告,用STC15Fxxxx.H就算数组是几万都不警告。


作者: liyago    时间: 2022-8-9 12:14
tzs233 发表于 2022-8-9 09:27
如果只是固定不变的数据就存放在ROM区,用const code修饰。如非有必要存储那么大的数字 可以把数组类型改为 ...

这个数组要写入数据的,unsigned char不是比unsigned int还小吗?
作者: liyago    时间: 2022-8-9 12:15
祖国的花朵 发表于 2022-8-9 09:48
一共2k sram,900*2=1800差不多到临界了,可能是sram用超了?编译器没报啥警告吗

是超了,用错了头文件。
作者: liyago    时间: 2022-8-9 12:20
yzwzfyz 发表于 2022-8-9 09:49
你有对数组操作吗?
程序中没有看到对数组的操作的部分。

这里数组没操作,纯属占坑的,所以没考虑运行内存,STC15F2K08S2程序空间有8K都不行,换STC15F2K32S2有32K程序空间也是一样,所以还是SRAM小的问题。
作者: liyago    时间: 2022-8-9 12:24
coody_sz 发表于 2022-8-9 09:53
数组定义没有加xdata,你看看是不是这个问题?

加xdata也不行
作者: liyago    时间: 2022-8-9 12:53
SOP28封装的没有比这更大内存的了
作者: 188610329    时间: 2022-8-9 19:25
liyago 发表于 2022-8-9 12:12
用STC15Fxx.H会出现警告,用STC15Fxxxx.H就算数组是几万都不警告。

你没出警告,不是头文件的问题,是你KEIL设置问题。
KEIL 如下,选择正确的芯片型号,并且在 XRAM 这里打勾,超出了就会出警告了。反之则不会警告。



作者: liyago    时间: 2022-8-10 18:34
188610329 发表于 2022-8-9 19:25
你没出警告,不是头文件的问题,是你KEIL设置问题。
KEIL 如下,选择正确的芯片型号,并且在 XRAM 这里 ...

确实是这样,编译器有好多坑是平时不留意的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1