欢迎光临散文网 会员登陆 & 注册

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

2023-08-31 14:04 作者:都叫我老耿  | 我要投稿

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


图1 带两级任务按钮和部分功能(实时显示传感器数据)的效果
图2 自己编写的不同功能的版本(V1.0~V7.6)
图3 自己编写的工程文件(约8000行)

        本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。

        由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。

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


图4 添加了主界面UI的效果


一、工程文件和线程的框架

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


图5 部分样题展示
图6 工程文件和线程的框架


二、准备工程和文件

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


图7 新建的工程和文件
图8 把.c文件加入到工程中


三、编写源码

        关于源码,本人先声明一下,由于不是程序员出身,所以代码算不上特别严谨和规范,只能说在自己能力范围内力求最佳,毕竟阅读源码主要在于借鉴思路,有不妥或更优的地方请文明留言点评。此外,自己对于RT-Thread和LVGL的使用还是摸索阶段,谈不上精通深入,也希望行家能在必要之处给予指点。最后,就是在头条网页端编辑文章好像没有类似“添加源码”的功能,所以就只能用截图的方式来呈现了。


3.1 gui_layout.h文件源码

        由于界面上用的最多的就是LVGL7的按钮矩阵(lv_btnmatrix),因此我们把按钮的布局代码统一放在这个文件中,这里我们先布局一级(主)按钮矩阵,如代码清单1所示。顺便提一下,关于LVGL各类组件的用法,推荐参考《百问网LVGL中文教程手册文档》
http://lvgl.100ask.net/7.11/,如图9所示。


图9 百问网LVGL7的中文手册文档


        另外,关于中文字符显示的问题,在《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为完整源码。


图10 rtt_lvgl_top.c文件源码整体示例


四、编译和测试

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


图11 选择 -O1 级别的编译优化
图12  打印触摸点的坐标

(本文完)

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

分享到微博请遵守国家法律