内容简介
- 这一篇是综合调试,主要包括服务层调试,显示层联调,以及问题备忘
服务层调试
- 做BS系统习惯了,发现在单片机内存、存储捉真见肘的条件下,真是害死自己。我一共分了几个部分,1、驱动层,放到lib文件夹下;2、功能层,包括网络处理、文件处理、外控处理、算法处理等;3、服务层,业务处理;4、显示层,调用服务层与操作者互动。
- 这个服务层的调试还是比较顺利的,各种操作都是基于理想情况,不用考虑过多的问题,灯亮了,数记了,上传成功了就算通过了。有个卡点是处理报警事件(灯闪蜂鸣),这个需要单独主线程调度。
- 在事件处理过程中,看了眼内存不停的减少,增加了垃圾回收,效果稳定
gc.collect()
显示层调试
- 这层的调试就要了命了,引入包、编写完代码执行,直接就内存爆了(开机内存只有205kb!)。使用了mpy,效果一般,最后采用的策略是,找到内存占用大户(服务层、lvgl显示屏初始化这两个是大头),调整加载顺序并立即回收,最后调试,内存稳定还剩下21kb。我的顺序是:引业务相关包,服务层初始化,引lvgl包相关包,初始化lvgl,加载屏幕,加载字体。如何找内存大户?代码如下:
import gc
print("开机内存:", gc.mem_free() / 1024, "KB")
timer1 = lv.timer_create_basic()
timer1.set_period(1000)
timer1.set_repeat_count(-1)
timer1.set_cb(lambda t: getTime(timer1))
- 因为加入了人机互动,各种问题就来了,没反应、乱码、显示组件颜色等等,依次解决就好,重要的问题的主线程执行过程中的事件调度问题,要拆分好哪些是实时的,哪些是定时,对于定时的采用定时器就可以了,但对于实时性的就需要谨慎对待的,可能需要一杆子直接看到驱动层里边有没有sleep、wait、timeout之类的,这些容易引起连锁反应,比如设置的看门狗超时时间是2秒,超时没有及时喂狗,那程序就崩了。
- 这里遇到最棘手的问题是,音频模块一播放,屏幕就闪烁,调试了一下午,最后发现是接地问题,我是引出了一根接地线,接入了一个面包板的接地,然后用一根线连接另一个面包板的接地。解决方式是,从电源引出两组电源与接地,分别接这两个面包板,音频模块接A面包板,屏幕模块接B面包板就解决了。
问题备忘