打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】04.数组定义过大竟然会影响到程序...

[复制链接]
1328|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hu9jj|  楼主 | 2021-3-29 14:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本次测试是准备做一个多功能时钟,没有去购买数码管,而是准备使用现成的LCD显示屏。现有的显示屏是192*64点阵的,起初准备使用32*48点阵的字库来作时钟显示,但没有找到合适的字库文件,最后用一个字模软件生成了24*48点阵的ASCII字库,但测试时不能正常显示,整个屏幕全部显示杂乱无章的字符,调试了两天都没有解决问题,加上这个字库字形不美观,上下均有很多空白,实际有效部分只有24*32点阵,最后决定自己制作一个小字符集字库。
    从网上找到一个可以生成自定义点阵的字模软件:


    软件的界面如下:


    我没有找到直接生成点阵字库的方法,只好手工按图上的点阵写数据。因为图上的点阵比较多,辨认起来容易错位,我只好用笔尺来确定位置,之后又用手机支架来确定行列位置:


    最后才想起来直接用窗口遮挡的方式,将需要的图形显示出来:


    我生成一个字符的点阵数据便测试效果,开始几个都能正常显示,如下图:


    但在增加到第8个字符时,显示便出现异常,屏幕上竟然会显示出许多多余的杂乱字符来:


    反复测试后发现只要注释掉其中的一个字符点阵数据时,程序运行就正常,多于7个字符的点阵数据就不能正常运行,说明点阵数据的数组过大会直接影响到程序正常运行。
    我计算了一下,一个字符的点阵数据是120字节,那么7个字符的数据是840字节,若是数组增加到960个字节时,程序就不能正常运行,写屏幕的操作便会无端增加了循环。我百思不得其解,难道说数组定义的过大难道会影响到程序运行时循环变量么?
    为了解决问题,我无奈只好将数组拆分,每7个字符点阵数据定义成一个数组,我需要使用大约18个字符,于是便拆分成三个数组:






    然后在写操作的程序中根据需要分别调用不同的数组:


    可是问题又出现了,代码中出现了调用第三个数组时,尽管没有实际运行到这行代码,显示屏的写操作又乱了,其他部位又充满了杂乱的字符,只有将调用第三个数组的代码注释掉,屏幕的写操作才恢复正常。为了解决这个问题,我尝试将写第三个数组的操作代码另外独立出一个函数,但写操作仍然又乱了。我考虑会不会不光是单个数组的长度有限制,总得数据区域也会不会超出了,于是我将暂时不用的汉字字符集注释掉,测试仍然不解决问题,况且从编译结果看,内存占用还少得很:


    下面是我测试项目的压缩包,看看哪位大佬能够解释这个现象:
Mytest1.X.rar (367.91 KB)

使用特权

评论回复
沙发
hu9jj|  楼主 | 2021-3-30 09:58 | 只看该作者
这是显示不正常的动画,除了需要显示的内容外,还显示了许多杂乱的字符:

使用特权

评论回复
板凳
lcczg| | 2021-3-30 14:06 | 只看该作者
变量定义去掉const,使其在SRAM中存取,结果如何?

使用特权

评论回复
地板
hu9jj|  楼主 | 2021-3-30 16:43 | 只看该作者
lcczg 发表于 2021-3-30 14:06
变量定义去掉const,使其在SRAM中存取,结果如何?

去掉const后就不会出现这个问题了,万分感谢!

使用特权

评论回复
5
lcczg| | 2021-3-31 14:35 | 只看该作者
你可以继续追查。仍然定义为const, 但显示时先从const读入一个SRAM的buffer, 把buffer数据进行显示。然后看还乱不乱。如果乱,就可以先比较一下CONST和buffer中的内容。

使用特权

评论回复
6
hu9jj|  楼主 | 2021-3-31 18:23 | 只看该作者
lcczg 发表于 2021-3-31 14:35
你可以继续追查。仍然定义为const, 但显示时先从const读入一个SRAM的buffer, 把buffer数据进行显示。然后看 ...

只要定义const数组的长度超过限度,程序就会不正常,即使定义的数组没有使用也一样。

使用特权

评论回复
7
lcczg| | 2021-4-6 11:43 | 只看该作者
hu9jj 发表于 2021-3-31 18:23
只要定义const数组的长度超过限度,程序就会不正常,即使定义的数组没有使用也一样。 ...

按我先前的说法,此时从CONST取到 buffer的数据有异常吗

使用特权

评论回复
8
hu9jj|  楼主 | 2021-4-6 13:01 | 只看该作者
lcczg 发表于 2021-4-6 11:43
按我先前的说法,此时从CONST取到 buffer的数据有异常吗

谢谢指教!待我稍空时再测试一下,这段时间被驱动DS1307弄得焦头烂额,不知为何总是读取不到正确数据。

使用特权

评论回复
9
名字是啥样| | 2021-4-6 14:10 | 只看该作者
没有这么玩的,大数组

使用特权

评论回复
10
tfqi| | 2021-4-7 14:51 | 只看该作者
当然会影响了

使用特权

评论回复
11
tfqi| | 2021-4-7 14:59 | 只看该作者
会出现溢出啊

使用特权

评论回复
12
kxsi| | 2021-4-7 14:59 | 只看该作者
会发生以下无法预料的现象

使用特权

评论回复
13
nawu| | 2021-4-7 15:09 | 只看该作者
最多可以定义一个多大的数组啊

使用特权

评论回复
14
qcliu| | 2021-4-7 15:23 | 只看该作者
不用const的话 会被改数吧

使用特权

评论回复
15
wiba| | 2021-4-7 15:24 | 只看该作者
const数组的长度超过限度,会覆盖不期望覆盖的数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1059

帖子

11

粉丝