龙芯+RT-Thread+LVGL实战笔记(2)——写第一个线程和GUI

过去的大半年时间,一直带着学生备战全国职业院校技能大赛“嵌入式系统应用开发”赛项。由于是首次参加该赛项,很多东西都是从0到1的摸索和积累,最后的成绩自然也不甚理想。作为指导教师,备赛期间除了给予学生必要的指导,自己也花了不少精力研究了大赛指定的龙芯1B200嵌入式开发板,并尝试使用RT-Thread操作系统和LVGL图形组件,实现了样题的几十项任务,大大小小的版本也写了30多个,也算磕出点名堂了,见图1~图3。



本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。
由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。

上一篇我们完成了最基本的移植工作,这一篇我们在此基础上添加一个主按钮的GUI效果,如图4所示,并将其加入到创建的主线程当中。

一、工程文件和线程的框架
正式编写代码之前,这里先根据样题的编排(图5所示),把工程文件和线程的整体脉络梳理在图6中。当然,这只是本人的规划思路,并不一定是最合理的,供各位借鉴和参考。后续的版本和代码都将依据图6的规划来推进。


二、准备工程和文件
如图7所示,我们把上一次的整个工程复制另存一份,作为1.0的版本,并在 src 目录下新建4个文件:gui_layout.h、my_def.h、rtt_lvgl_top.h、rtt_lvgl_top.c。当然,别忘了把 .c 文件加入到工程中(.h文件可加可不加),如图8所示。


三、编写源码
关于源码,本人先声明一下,由于不是程序员出身,所以代码算不上特别严谨和规范,只能说在自己能力范围内力求最佳,毕竟阅读源码主要在于借鉴思路,有不妥或更优的地方请文明留言点评。此外,自己对于RT-Thread和LVGL的使用还是摸索阶段,谈不上精通深入,也希望行家能在必要之处给予指点。最后,就是在头条网页端编辑文章好像没有类似“添加源码”的功能,所以就只能用截图的方式来呈现了。
3.1 gui_layout.h文件源码
由于界面上用的最多的就是LVGL7的按钮矩阵(lv_btnmatrix),因此我们把按钮的布局代码统一放在这个文件中,这里我们先布局一级(主)按钮矩阵,如代码清单1所示。顺便提一下,关于LVGL各类组件的用法,推荐参考《百问网LVGL中文教程手册文档》
http://lvgl.100ask.net/7.11/,如图9所示。

另外,关于中文字符显示的问题,在《LoongIDE组件编程简介》文档的最后一个小节有如下交待:
LoongIDE使用ANSI进行字符编码,在代码编辑时通过快捷键 Ctrl+Alt 将汉字字符转换为UTF8的二进制编码。例如:选中编辑器的字符串:"龙芯" → 按 Ctrl+Alt → 转换为:"\xE9\xBE\x99"/*龙*/"\xE8\x8A\xAF"/*芯*/,生成的UTF8编码可以让LVGL正确识别并显示汉字。
3.2 my_def.h文件源码
该文件声明了一些适用于整个工程的宏和枚举,源码如代码清单2所示:
3.3 rtt_lvgl_top.h文件源码
这个头文件里是必要的全局变量和函数声明,源码如代码清单3所示:
3.4 rtt_lvgl_top.c文件源码
该文件是本工程的主要文件,主界面和主线程都在该文件中实现,源码较多,这里为了便于展示,做了如下处理:图10是本文件的整体示例,代码清单4为完整源码。

四、编译和测试
我在编译的时候选择了 -O1 级别的优化选项,如图11所示,首次编译时间较长(视电脑配置和性能),这样运行的触摸效果比不优化的更流畅,大家可以分别尝试一下。至于运行效果,也很简单,被单击的按钮会以绿色背景白色字体的效果呈现,以示选中,在图4中已展示。每次点击触摸都会把坐标打印出来,如图12所示。


(本文完)