中国电子科技集团第41研究所,蚌埠依爱消防电子有限公司 卢志强
某型号产品使用的主控MCU为8051单片机,为增大程序空间使用了复杂的BANK技术,基本满足了现有程序需求。然而,随着用户的使用,对产品功能不断提出新的要求,有些功能比较耗费程序空间,残余的一点程序空间就又捉襟见肘了。因此需要考虑进一步优化程序空间,而又有一些用户提出原有的汉字库太小,希望增大字库,起码包括一级字库的内容。通过研究,决定将存放在程序空间中的字库移到存放编程数据的芯片空余扇区中,将旧字库与一级字库融合。
在完成此方案的过程中遇到了几个问题,将问题和解决方案总结如下:
因为旧字库是经过了用户长期使用而积累下的常用字,既包含了大量的一级字库,也根据实际应用情况,包含了部分一级字库以外的汉字,而要在字库中挑选这些汉字又比较繁琐,因此设计了一款计算机软件,通过自动读取原字库和一级字库,自动生成所需全部汉字库索引(按区位码排序)和汉字点阵数据数组。
因为使用keil静态数组编译生成字库需要较大程序空间(大于64K),整体编译不能通过,只能另辟蹊径,采用将字库分成多个数组,并分割成两个工程,分别编译,然后用superpro烧录工具拼接的方法生成字库烧录文件。
因为需要切换外部74HC373地址来读取另一片存储芯片中某一页的字库数据,在读取汉字和汉字区位码(帮助菜单中)时发现液晶屏显示汉字时速度较慢,在优化算法后显示速度已与改动前一致。下文将对此方法进行详细论述。
本产品的字库查找主要是通过简单的区位码索引,对输入的汉字区位码以二分法进行折半查找对应的汉字库点阵数组地址,然后到对应地址中读取汉字点阵数据,送给液晶驱动程序控制汉字显示。
在2.3中提到,字库迁移后显示汉字时速度较慢,这是从内部存取改为外部存取的硬件设计变化引起的,需要通过算法对软件代码进行优化,重点是优化汉字库查找和存取的过程。
优化前的代码流程图,见图1。
图1
对应的C语言核心代码:
优化后的代码流程图,见图2。
图2
通过优化,刷新一屏汉字(以100字进行测试)所需的时间约提高了2倍,显示流畅,与字库迁移前的速度基本一致,完全不影响用户体验。
通过以上方案的实施,成功将字库和字库索引迁移到外部flash空间中,最终增加到3773个汉字(原字库为1285个汉字),并且显示速度与字库放在程序空间中时基本一致,完全不影响用户体验。与原程序相比,直接节省了空间约25K,新字库加索引共约73K,相当于在满足新字库的要求下节省程序空间约73K。