首页> 中国专利> 一种应用开发环境的配置方法、装置、设备及存储介质

一种应用开发环境的配置方法、装置、设备及存储介质

摘要

本申请实施例公开了一种应用开发环境的配置方法、装置、设备及存储介质,该方法应用于计算机设备,所述计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL,该方法包括:通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;基于所述模拟设备信息,利用嵌入式开源图形库LVGL配置所述应用开发环境。这样,可以降低基于LVGL的应用开发成本,而且与SDL配合,无需移植开发板的外设驱动程序,实现与驱动问题解耦,从而能够提升开发效率,同时基于该应用开发环境所开发的应用还具有可移植性。

著录项

  • 公开/公告号CN112199087A

    专利类型发明专利

  • 公开/公告日2021-01-08

    原文格式PDF

  • 申请/专利权人 OPPO广东移动通信有限公司;

    申请/专利号CN202011092725.X

  • 发明设计人 马迎斌;

    申请日2020-10-13

  • 分类号G06F8/34(20180101);G06F8/71(20180101);G06F11/36(20060101);

  • 代理机构11270 北京派特恩知识产权代理有限公司;

  • 代理人马丽;张颖玲

  • 地址 523860 广东省东莞市长安镇乌沙海滨路18号

  • 入库时间 2023-06-19 09:30:39

说明书

技术领域

本申请涉及计算机技术领域,尤其涉及一种应用开发环境的配置方法、装置、设备及存储介质。

背景技术

RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行,同时RT-Thread具有实时性高、占用资源小、功耗低、启动快速等特点,非常适用于资源受限平台。其中,在RT-Thread上可以移植LittlevGL,这里的LittlevGL(可简称为LVGL)是一个嵌入式开源图形库,其组件易于使用,图形效果好,且内存占用低。

目前的相关方案中,LVGL图形库支持显示和交互,这时需要RT-Thread在对应的微控制单元(Microcontroller Unit,MCU)上移植显示和触控驱动程序。目前虽然可以在MCU开发板上开发基于LVGL的应用,但是成本较高、难度较大,比如针对不同的MCU开发板,需要先移植RT-Thread,且还需配备显示屏以及移植对应的显示驱动程序;另外,如果所开发的应用需要交互,那么还需要添加对应输入外部设备(简称为外设)以及移植对应的外设驱动程序;除此之外,在应用调试时,如果存在驱动问题,那么将很难调试并解决,使得开发效率低。

发明内容

本申请提出一种应用开发环境的配置方法、装置、设备及存储介质,可以降低基于LVGL的应用开发成本,而且与SDL配合,从而能够提升开发效率,同时基于该应用开发环境所开发的应用还具有可移植性。

为达到上述目的,本申请的技术方案是这样实现的:

第一方面,本申请实施例提供了一种应用开发环境的配置方法,应用于计算机设备,所述计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL,所述方法包括:

通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;

基于所述模拟设备信息,利用嵌入式开源图形库LVGL配置所述应用开发环境。

第二方面,本申请实施例提供了一种应用开发环境的配置装置,应用于计算机设备,所述计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL,所述应用开发环境的配置装置包括:仿真单元和配置单元;其中,

所述仿真单元,配置为通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;

所述配置单元,配置为基于所述模拟设备信息,利用嵌入式开源图形库LVGL配置所述应用开发环境。

第三方面,本申请实施例提供了一种计算机设备,所述计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL,所述计算机设备包括:存储器和处理器;其中,

所述存储器,用于存储能够在所述处理器上运行的可执行指令;

所述处理器,用于在运行所述可执行指令时,执行如第一方面所述的方法。

第四方面,本申请实施例提供了一种计算机存储介质,所述计算机存储介质存储有应用开发环境的配置程序,所述应用开发环境的配置程序被至少一个处理器执行时实现如第一方面所述的方法。

本申请实施例所提供的一种应用开发环境的配置方法、装置、设备及存储介质,应用于计算机设备,该计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL。通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;基于所述模拟设备信息,利用嵌入式开源图形库LVGL配置所述应用开发环境。这样,通过SDL仿真模拟显示设备和输入设备,不再依赖于MCU开发板,可以降低基于LVGL的应用开发成本;而且与SDL配合,还无需移植MCU开发板的外设驱动程序,实现与驱动问题解耦,可以对基于LVGL的应用进行单步调试和断点调试,能够加快调试速度,同时不再需要反复烧写MCU开发板程序以通过人眼观测结果进行开发调试,还能够缩短开发周期,降低开发难度,从而提升开发效率;此外,基于该应用开发环境所开发的应用还具有可移植性,能够将计算机设备上开发的应用移植到MCU开发板上运行,适用性强。

附图说明

图1为本申请实施例提供的一种应用开发环境的配置方法的流程示意图;

图2为本申请实施例提供的一种事件队列的结构示意图;

图3为本申请实施例提供的一种从事件队列读取事件数据到预设类型结构体的结构示意图;

图4为本申请实施例提供的一种应用开发环境的配置方法的详细流程示意图;

图5为本申请实施例提供的一种应用开发环境的配置装置的组成结构示意图;

图6为本申请实施例提供的一种计算机设备的硬件结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。可以理解的是,此处所描述的具体实施例仅仅用于解释相关申请,而非对该申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关申请相关的部分。

RT-Thread是一款主要由中国开源社区主导开发的开源实时操作系统(Real TimeOperating System,RTOS)。实时线程操作系统不仅仅是一个单一的实时操作系统内核,它也是一个完整的应用系统,包含了实时、嵌入式系统相关的各个组件:传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol,TCP/IP)协议栈,标准函数库(Stantard C Library,libc)接口,图形用户界面等。这里,RT-Thread作为一个嵌入式实时多线程操作系统,允许多个任务同时运行,同时RT-Thread具有实时性高、占用资源小、功耗低、启动快速等特点,非常适用于资源受限(如成本、功耗限制等)的场合。

另外,LittlevGL作为一个免费的开放源代码图形库,它可以提供创建嵌入式图形用户界面(Graphical User Interface,GUI)所需的一切,它具有易于使用的图形元素,精美的视觉效果和低内存占用。也就是说,LVGL是一个嵌入式开源图形库,其组件易于使用、图形效果好、内存占用低。

目前,RT-Thread已经移植了LVGL GUI,可以通过RT-Thread online packages中system packages内选择LittlevGL2RTT,然后再进行更新即可实现在RT-Thread上运行LVGL。这里,LittlevGL2RTT是在RT-Thread3.0版本以上做的LittlevGL中间框架层,目的是无缝嵌入RT-Thread的液晶显示器(Liquid Crystal Display,LCD)框架,无需开发者移植。具体来说,首先在env中运行menuconfig;然后进入RT-Thread online packages->systempackages目录;再开启LittlevGL2RTT,选择version为lateset最新版本,开启demo并保存退出menuconfig;最后执行pkgs--update更新LittlevGL2RTT包到板级支持包(BoardSupport Package,BSP)目录下,即可实现在RT-Thread上运行LVGL。

应理解,LVGL图形库可以支持显示和交互,那么需要RT-Thread在对应MCU平台上移植显示驱动和触控驱动,这时候首先需要将RT-Thread启动,然后LVGL需要执行以下步骤进行初始化。具体如下,

(1)调用初始化函数(lv_init)来初始化LVGL有关的库,包含存储(memory)、文件系统(filesystem)、动画、群组(group)、样式(style)、显示系统、输入设备(input device)处理机制等。

(2)分配显示缓冲区(display_buffer)用来存放显示内容,空间可以比屏幕小,显示时即将该块缓存(buffer)的内容送去显示(display)。

(3)注册显示驱动程序(display_driver),设置display_driver中的缓冲区为display_buffer,再设置刷新回调函数(flush_cb),该回调函数将显示内容按照像素一行行绘制到屏幕上。

(4)注册输入驱动程序(input_driver),设置输入设备读取数据回调函数(read_cb),对于鼠标或者触摸屏而言,该回调函数会周期性地读取触点的(x,y)坐标以及抬起和按下等状态信息。

(5)RT-Thread维护LVGL的时标(tick)线程,该线程周期性地通过lv_tick_inc函数告知LVGL时间消逝,该tick用于LVGL主任务、动画等的运行;这里,tick是系统的相对时间单位,也称为系统的时基,来源于定时器的周期性中断(输出脉冲),一次中断表示一个tick,也可被称为一个“时钟滴答”、时标。

(6)RT-Thread维护LVGL的task线程,该线程周期性通过lv_task_handler函数,可以使得处于LVGL所有高、低优先级任务、用户注册的任务等也会被周期性地调用。

如此,可在对应MCU平台上,基于RT-Thread移植LVGL,然后即可使用LVGL支持的组件、布局、事件、任务等机制开发GUI应用。

然而,目前的相关技术方案虽然可以在MCU开发板上开发基于LVGL的应用,但是成本较高、难度较大。如下,

(1)针对不同的MCU开发板,需要先移植RT-Thread;而且MCU开发板还需配备LCD显示屏,同时需要移植对应的显示屏驱动程序。这些基本工作必不可少;

(2)如果LVGL应用需要交互,那么MCU开发板还需要添加对应的输入外设,并移植对应的外设驱动程序;

(3)在调试LVGL应用时,由于应用开发强依赖底层硬件和驱动的稳定,如果是存在驱动问题,那么将会很难调试(debug)并解决。

基于此,本申请实施例提供了一种应用开发环境的配置方法,应用于计算机设备,该计算机设备安装有预设操作系统,且所述预设操作系统支持跨平台多媒体库SDL。该方法的基本思想是:通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;基于所述模拟设备信息,利用LVGL配置所述应用开发环境。这样,通过SDL仿真模拟显示设备和输入设备,不再依赖于MCU开发板,可以降低基于LVGL的应用开发成本;而且与SDL配合,还无需移植MCU开发板的外设驱动程序,实现与驱动问题解耦,可以对基于LVGL的应用进行单步调试和断点调试,能够加快调试速度,同时不再需要反复烧写MCU开发板程序以通过人眼观测结果进行开发调试,还能够缩短开发周期,降低开发难度,从而提升开发效率;此外,基于该应用开发环境所开发的应用还具有可移植性,能够将计算机设备上开发的应用移植到MCU开发板上运行,适用性强。

下面将结合附图对本申请各实施例进行详细说明。

本申请的一实施例中,参见图1,其示出了本申请实施例提供的一种应用开发环境的配置方法的流程示意图。如图1所示,该方法可以包括:

S101:通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备。

S102:基于所述模拟设备信息,利用LVGL配置所述应用开发环境。

需要说明的是,本申请实施例的应用开发环境的配置方法应用于计算机设备,该计算机设备中安装有预设操作系统。这里,计算机设备可以是个人计算机(PersonalComputer,PC),诸如台式机、一体机、笔记本电脑、平板电脑等等,这里不作任何限定。

还需要说明的是,预设操作系统主要是指Windows操作系统、Linux操作系统等主流的PC操作系统。在本申请实施例中,预设操作系统还能够支持SDL,而LVGL是基于SDL仿真外部设备,搭建在RT-Thread上。

其中,SDL可称为简单直控媒体层,是一套开放源代码的跨平台多媒体开发库,可以支持诸如Windows和Linux等主流的操作系统。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Windows、Linux等)的应用软件。换句话说,SDL以精简的方式来完成基础的功能,能够大幅度地简化控制图像、声音、输出入等工作所需撰写的代码。这里,SDL在结构上可以将不同操作系统的库再包装成相同的函数,然后对外提供相同的接口。

LVGL是LittlevGL的简写,作为一个免费的开源嵌入式GUI库,具有界面精美,消耗资源小,可移植度高等特点,能够提供多种组件、动画效果,而且占用内存小,支持PC操作系统、外部存储和图形处理器(Graphics Processing Unit,GPU),仅仅单个帧缓冲设备就可以呈现高级视觉特效。

这样,在本申请实施例中,对于计算机设备而言,LVGL通过SDL跨平台库仿真模拟的预设外部设备(比如显示设备、输入设备等)来在计算机设备上模拟运行,然后根据所获取的模拟设备信息,就可以开发相关应用。如此,通过SDL仿真模拟集成开发环境,不再依赖于MCU开发板,可以降低基于LVGL的应用开发成本;而且与SDL配合,还无需移植开发板的外设驱动程序,实现与驱动问题解耦,同时不再需要反复烧写MCU开发板程序以通过人眼观测结果进行开发调试,可以加快调试速度,缩短开发周期,降低开发难度,从而能够提升开发效率;此外,所开发的应用还具有可移植性,能够将计算机设备上开发的应用移植到MCU开发板上运行。

可以理解地,LVGL是在RT-Thread上运行的。在一些实施例中,对于S101来说,所述通过SDL对预设外部设备进行仿真,得到模拟设备信息,可以包括:

将嵌入式实时多线程操作系统RT-Thread移植到所述预设操作系统;

基于所述RT-Thread,通过SDL对所述显示设备进行仿真,得到显示设备模拟信息;或者,

基于所述RT-Thread,通过SDL对所述输入设备进行仿真,得到输入设备模拟信息。

也就是说,本申请实施例将RT-Thread移植到PC操作系统上,然后基于SDL仿真预设外部设备,LVGL直接使用仿真模拟的外部设备搭建应用开发环境进行应用开发。

需要说明的是,RT-Thread的板级支持包(Board Support Package,BSP)目录下有一个模拟器(simulator)文件夹,simulator可以用于模拟集成开发环境来实现RT-Thread。具体来说,使用scons编译工具生成集成开发环境(Visual Studio,VS)工程,支持在VS中进行调试开发。

这里,BSP是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为其属于操作系统的一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好地运行于硬件主板。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如统一建模语言(Unified ModelingLanguage,UML)工具、代码管控工具、集成开发环境(Integrated DevelopmentEnvironment,IDE)等等。

具体地,RT-Thread在计算机设备上的启动流程如下,

(1)startup.c中包含main函数,其中通过rtthread_startup启动RTOS;

(2)rtthread_startup会调用rt_hw_board_init初始化单板,主要通过动态内存分配(memory allocation,malloc)申请一块内存来进行静态随机存取存储器(StaticRandom-Access Memory,SARM)初始化;

(3)调用rt_system_timer_init初始化系统定时器;

(4)调用rt_thread_idle_init初始化空闲(idle)线程并开始运行;

(5)调用rt_application_init初始化应用程序相关的工作;

(6)调用rt_system_scheduler_start开始调度器的运行。

其中,rt_application_init是该流程的关键。在该流程中,会进行平台相关的初始化。例如,初始化finsh终端,用来与RT-Thread进行交互;初始化sdcard,用来模拟外设存储;通过对文件sd.bin的打开、关闭、读写、控制等操作,用来模拟flash的操作;最后就是基于SDL对预设外部设备进行初始化。

进一步地,在一些实施例中,对于S102来说,所述基于所述模拟设备信息,利用LVGL配置所述应用开发环境,可以包括:

控制所述LVGL通过刷新回调函数获取所述显示设备模拟信息,并根据所获取的所述显示设备模拟信息配置所述应用开发环境;或者,

控制所述LVGL通过输入回调函数获取所述输入设备模拟信息,并根据所获取的所述输入设备模拟信息配置所述应用开发环境。

需要说明的是,LVGL移植在RT-Thread中。另外,LVGL通过SDL模拟的显示设备模拟信息或者输入设备模拟信息可以在PC上模拟运行,主要是通过驱动注册函数(比如刷新回调函数、输入回调函数等)来获取设备信息。其中,刷新回调函数被注册到显示驱动程序中,输入回调函数被注册到输入驱动程序中。

这样,基于RT-Thread,通过SDL对显示设备进行仿真,可以得到显示设备模拟信息;然后根据该显示设备模拟信息,能够通过LVGL搭建本申请实施例的应用开发环境。或者,基于RT-Thread,通过SDL对输入设备进行仿真,可以得到输入设备模拟信息;然后根据该输入设备模拟信息,也能够通过LVGL搭建本申请实施例的应用开发环境。这时候基于该应用开发环境进行应用开发,可以提升开发效率,而且所开发的应用还具有可移植性。

还需要说明的是,预设外部设备可以是外部的显示设备,可简称为显示外设,即本申请实施例的显示设备;也可以是外部的输入设备,可简称为输入外设,即本申请实施例的输入设备。

下面将针对这两种外设下仿真模拟开发应用的具体场景分别进行描述。

在一种可能的实施方式中,在预设外部设备为显示设备的情况下,针对SDL仿真搭建显示设备的情况,除了通过SDL对所述显示设备进行仿真,得到显示设备模拟信息之外,该方法还可以包括:初始化显示设备需求的资源;在接收到刷新事件时,循环渲染数据;在接收到退出事件时,释放所述资源。

其中,这里的资源可以包括窗口(SDL_Window)、渲染器(SDL_Renderer)、纹理(SDL_Texture)和帧缓冲区(framebuffer)。这里的循环渲染数据,可以包括:首先通过SDL_UpdateTexture()设置纹理的数据;再通过SDL_RenderCopy()将纹理复制给渲染器;最后通过SDL_RenderPresent()进行显示。

还需要说明的是,对于SDL仿真来说,首先需要创建SDL主线程sdl_refr,所有SDL相关的任务都在该线程中处理;然后在sdl_refr线程中先通过SDL_Init函数初始化Video系统,该系统会初始化线程(thread)和事件管理(event)相关机制;并选择一个合适的视频设备(SDL_VideoDevice),如果计算机设备上运行的是Windows操作系统,则选择Windows的视频设备驱动的定义,这样正好体现了SDL跨平台的特性。再根据SDL_VideoDevice的VideoInit()进行初始化视频驱动。

这样,在通过SDL仿真模拟显示设备时,需要初始化显示设备需求的SDL_Window、SDL_Renderer、SDL_Texture、framebuffer。其中,SDL_Window包含窗口应该包含的各种属性,设置其标题、位置、高度、宽度等;SDL_Renderer包含渲染器应该包含的各种属性,设置其渲染窗口、渲染设备、渲染标志(使用软件渲染或硬件渲染)等;SDL_Texture包含纹理所具备的各种属性,设置其目标渲染器、纹理格式、纹理的高度和宽度等;framebuffer为帧缓冲区,空间大小定义为MONITOR_HOR_RES*MONITOR_VER_RES*sizeof(uint32_t),这里,MONITOR_HOR_RES为水平分辨率、MONITOR_VER_RES为垂直分辨率。

然后持续进行刷新任务,可以由刷新标志函数(sdl_refr_qry)的标志决定当前是否需要真正刷新,sdl_refr_qry则由lvgl display周期性进行设置。若当前需要真正刷新,则循环渲染数据,具体是先通过SDL_UpdateTexture()设置纹理的数据、在通过SDL_RenderCopy()将纹理复制给渲染器、最后通过SDL_RenderPresent()进行显示。直至在接收到SDL_QUIT事件(比如用户单击窗口右上角的关闭按钮时,事件的类型是SDL_QUIT),这时候才会停止刷新任务,并将SDL_Window、SDL_Renderer、SDL_Texture、framebuffer等资源释放。

进一步地,在SDL仿真搭建显示设备后,LVGL可以使用模拟的显示设备在计算机设备上模拟运行,通过回调函数来获取相关设备信息,即可开发基于LVGL的应用。也就是说,在一些实施例中,所述控制所述LVGL通过刷新回调函数获取所述显示设备模拟信息,可以包括:

设置刷新回调函数,将待刷新区域所包括的显示内容按照像素拷贝至预设帧缓冲区中;

在当前需求为刷新需求的情况下,控制SDL执行刷新任务,以将所述预设帧缓冲区内的显示内容按照像素进行绘制显示。

进一步地,在一些实施例中,该方法还可以包括:设置刷新标志函数;其中,所述刷新标志函数用于指示当前需求是否为刷新需求。

需要说明的是,刷新回调函数可以用flush_cb表示。该刷新回调函数被注册到显示驱动程序(display_driver)中,主要与显示设备进行交互,可以将待刷新区域所包括的显示内容按照像素拷贝至framebuffer中;该刷新回调函数最后必须调用lv_disp_flush_ready通知图形库当前已准备好刷新。

还需要说明的是,刷新标志函数可以用sdl_refr_qry表示,即sdl_refr_qry用于指示当前是否需要刷新任务。在本申请实施例中,将待显示的显示内容拷贝到SDL分配的framebuffer中,然后设置sdl_refr_qry,可以使得SDL执行刷新任务。

在另一种可能的实施方式中,在预设外部设备为输入设备的情况下,输入设备可以是鼠标设备、键盘设备等。针对SDL仿真搭建输入设备的情况,除了通过SDL对所述输入设备进行仿真,得到输入设备模拟信息之外,该方法还可以包括:当接收到SDL事件时,确定所接收的事件对应的类型,并保存所述输入设备的输入信息。

可以理解地,在SDL中,当接收到一个事件时,需要将所接收到的事件放置于事件队列中;其中,事件队列用于为每一个放置的事件保存事件数据。也就是说,事件队列机制是由SDL自身实现的,用于获取外设的输入信息,并将其缓存到该事件队列中。

然而,LVGL所需的输入信息是从该事件队列中缓存的事件数据中得到的。在一些实施例中,所述将所述输入设备模拟信息输入LVGL,可以包括:

获取所述SDL中的事件队列;其中,所述事件队列用于为所接收的每一个事件保存事件数据;

从所述事件队列的底部读取一个事件,并将所读取的事件对应的事件数据放置到预设类型的结构体中,以将所述事件数据作为所述输入设备的输入信息提供给LVGL。

也就是说,在SDL中,当接收到一个事件时,需要将所接收到的事件放置于事件队列中;然后通过从该事件队列的底部读取一个事件,并将所读取的事件对应的事件数据放置到预设类型的结构体中,以将得到的事件数据作为所述输入设备的输入信息提供给LVGL。

进一步地,在一些实施例中,所述获取SDL中的事件队列,可以包括:

在SDL中,若接收到的事件为鼠标类型事件,则在所述事件队列中保存鼠标设备的状态信息和点击位置信息,以将所述鼠标设备的状态信息和点击位置信息作为所述鼠标设备的输入信息提供给LVGL;

若接收到的事件为键盘类型事件,则在所述事件队列中保存保存键盘设备的状态信息和键值信息,以将所述键盘设备的状态信息和键值信息作为所述键盘设备的输入信息提供给LVGL;

其中,所述状态信息包括按下状态信息和抬起状态信息。

需要说明的是,在SDL中,每当有一个事件发生,那么这个事件就会被置于事件队列中,该事件队列为每一个发生的事件保存了事件数据。如图2所示,其示出了本申请实施例提供的一种事件队列的结构示意图。在图2中,首先是按一下鼠标按钮(mousebutton),这时候在事件队列中放置SDL_MouseButtonEvent;然后再移动一下鼠标(mouse),这时候在事件队列中放置SDL_MouseMotionEvent;紧接着再按下键盘(keyboard)上的某个按键,这时候在事件队列中放置SDL_KeyboardEvent。

另外,SDL_PollEvent()的作用是从事件队列底部取出一个事件并将该事件数据粘贴到一个预设类型(具体可以是指SDL_Event类型)的结构体中。如图3所示,从图2所示的事件队列底部将“SDL_MouseButtonEvent”的事件数据粘贴到一个SDL_Event类型的结构体中,用以将该事件数据作为鼠标设备的输入信息提供给LVGL。

还需要说明的是,如果当前接收到的事件是mouse类型事件,那么可以保存mouse的按下、抬起状态信息以及mouse的点击位置信息,这些信息作为LVGL指针类型外设的输入信息;如果当前接收到的事件是keyboard类型事件,那么可以保存keyboard的按下、抬起状态信息以及keyboard的键值信息,这些信息作为LVGL keyboard类型外设的输入信息。

进一步地,在SDL仿真搭建输入设备后,LVGL可以使用模拟的输入设备在计算机设备上模拟运行,通过回调函数来获取相关设备信息,即可开发基于LVGL的应用。也就是说,在一些实施例中,所述控制所述LVGL通过输入回调函数获取所述输入设备模拟信息,可以包括:

设置输入回调函数,按照预设周期读取所述输入设备的输入信息并进行事件响应。

进一步地,所述设置输入回调函数,按照预设周期读取所述输入设备的输入信息并进行事件响应,可以包括:

若所述输入设备为鼠标设备,则通过所述输入回调函数读取所述鼠标设备的状态信息和点击位置信息,并根据所述鼠标设备的状态信息和点击位置信息对所述鼠标设备进行事件响应;

若所述输入设备为键盘设备,则通过所述输入回调函数读取所述键盘设备的状态信息和键值信息,并根据所述键盘设备的状态信息和键值信息对所述键盘设备进行事件响应。

需要说明的是,输入回调函数可以用read_cb表示。该输入回调函数被注册到输入驱动程序(input_driver)中,周期性回调上报输入设备的输入信息;当没有多余数据时,会直接返回空。另外,针对不同的输入设备,上报的输入信息是不同的。

还需要说明的是,如果输入设备为鼠标设备,即注册指针类型外设时,该输入回调函数可以读取SDL仿真鼠标设备的按下、抬起状态信息以及点击位置信息。如果输入设备为键盘设备,即注册keyboard类型外设时,该输入回调函数可以读取SDL仿真键盘设备的按下、抬起状态信息以及键值信息。

另外,如果使用keyboard,那么需要加入到组(group)中。在一个group中,当前必须只有一个控件(object)处于焦点状态来接收按键动态。例如,一个文本框处于焦点状态,则keyboard的输入键(key)值可以被发送并插入到该文本框中。一个输入设备只能发送到一个group,但一个group可以接收多个输入设备的信息。

在完成上述步骤后,即可开发基于LVGL的应用。使用LVGL提供的控件进行绘制用户界面(User Interface,UI),并通过lv_obj_set_event_cb注册控件的事件处理函数。当控件被点击、拖拽时,会产生各种类型的事件,该控件的事件处理函数可以根据不同的事件进行对应的处理来与用户进行交互。

本实施例提供了一种应用开发环境的配置方法,应用于计算机设备,该计算机设备安装有预设操作系统,且所述预设操作系统支持SDL。通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;基于所述模拟设备信息,利用LVGL配置所述应用开发环境。这样,通过SDL仿真模拟显示设备和输入设备,不再依赖于MCU开发板,可以降低基于LVGL的应用开发成本;而且与SDL配合,还无需移植MCU开发板的外设驱动程序,实现与驱动问题解耦,可以对基于LVGL的应用进行单步调试和断点调试,能够加快调试速度,同时不再需要反复烧写MCU开发板程序以通过人眼观测结果进行开发调试,还能够缩短开发周期,降低开发难度,从而提升开发效率;此外,基于该应用开发环境所开发的应用还具有可移植性,能够将计算机设备上开发的应用移植到MCU开发板上运行,适用性强。

本申请的另一实施例中,参见图4,其示出了本申请实施例提供的一种应用开发环境的配置方法的详细流程示意图。如图4所示,该详细流程可以包括:

S401:将RT-Thread移植到预设操作系统。

需要说明的是,本申请实施例的应用开发环境的配置方法应用于计算机设备,该计算机设备中安装有预设操作系统,该预设操作系统主要是指Windows操作系统、Linux操作系统等主流的PC操作系统。

还需要说明的是,本申请实施例的应用开发环境的配置方法采用SDL平台仿真思路,可以将RT-Thread移植到PC操作系统上,然后基于SDL仿真外部的显示设备(即display设备)和外部的输入设备(即input设备),LVGL直接使用仿真的外设进行应用开发。

其中,RT-Thread在BSP目录下提供了simulator来实现,可支持在Windows操作系统运行。这里,使用scons编译工具生成VS工程,支持在VS中进行调试开发。具体地,RT-Thread在计算机设备上的启动流程如下:

(1)startup.c中包含main函数,其中通过rtthread_startup启动RTOS;

(2)rtthread_startup会调用rt_hw_board_init初始化单板,主要通过malloc一块内存来进行SRAM初始化;

(3)调用rt_system_timer_init初始化系统定时器;

(4)调用rt_thread_idle_init初始化idle线程并开始运行;

(5)调用rt_application_init初始化应用程序相关的工作;

(6)调用rt_system_scheduler_start开始调度器的运行。

需要说明的是,rt_application_init是该流程的关键。在该流程中,会进行平台相关的初始化。例如,初始化finsh终端,用来与RT-Thread进行交互;初始化sdcard,用来模拟外设存储;通过对文件sd.bin的打开、关闭、读写、控制等操作,用来模拟flash的操作;最后就是基于SDL对显示设备和输入设备进行初始化。

S402:基于SDL搭建模拟的显示设备和输入设备。

需要说明的是,SDL是一套开放源代码的跨平台多媒体开发库,支持包括Windows和Linux的主流操作系统。这里,以精简的方式来完成基础的功能,它大幅度简化了控制图像、声音、输出入等工作所需撰写的代码。另外,SDL在结构上是将不同操作系统的库再包装成相同的函数,对外提供相同的接口。

具体地,SDL对显示设备和输入设备的仿真步骤如下,

(1)创建SDL主线程sdl_refr,所有SDL相关的任务都在该线程中处理;

(2)在sdl_refr线程中先通过SDL_Init函数初始化Video系统,该系统会初始化线程(thread)和事件管理(event)的相关机制;并选择一个合适的SDL_VideoDevice,如果计算机设备上运行的是Windows操作系统,则选择Windows的视频设备驱动的定义,这正体现了SDL跨平台的特性。再根据SDL_VideoDevice的VideoInit()进行初始化视频驱动;

(3)初始化显示设备需要的SDL_Window、SDL_Renderer、SDL_Texture、framebuffer。其中,SDL_Window包含窗口应该包含的各种属性,设置其标题、位置、高度、宽度等;SDL_Renderer包含渲染器应该包含的各种属性,设置其渲染窗口、渲染设备、渲染标志(使用软件渲染或硬件渲染)等;SDL_Texture包含纹理所具备的各种属性,设置其目标渲染器、纹理格式、纹理的高度和宽度等;framebuffer为帧缓冲区,空间的大小定义为MONITOR_HOR_RES*MONITOR_VER_RES*sizeof(uint32_t),这里,MONITOR_HOR_RES为水平分辨率、MONITOR_VER_RES为垂直分辨率;

(4)持续进行刷新任务和事件处理任务,直至接收到SDL_QUIT事件(如用户单击窗口右上角的关闭按钮时,事件的类型会是SDL_QUIT)才会停止刷新任务,并将SDL_Window、SDL_Renderer、SDL_Texture、framebuffer等资源释放;

(5)在刷新任务中,由sdl_refr_qry标志决定当前是否需要真正刷新,sdl_refr_qry可以由LVGL display周期性进行设置。若当前需要真正刷新,则循环渲染数据,包括:先通过SDL_UpdateTexture设置纹理的数据、在通过SDL_RenderCopy()将纹理复制给渲染器、最后通过SDL_RenderPresent()进行显示;

(6)在事件处理任务中,当接收到SDL事件时,判断当前事件是什么类型的事件,并保存当前外设输入信息。

在SDL中,每当有一个事件发生,那么这个发生的事件会被置于事件队列中。事件队列为每个发生的事件保存了事件数据。所以如果用户先按一下鼠标按钮,再移动一下鼠标,接着再按下键盘上某个按键,这时候的事件队列如图2所示。

另外,SDL_PollEvent()的作用是从事件队列底部取出一个事件并将其事件数据粘贴到一个SDL_Event类型的结构体中。如图3所示,从图2所示的事件队列底部将“SDL_MouseButtonEvent”的事件数据粘贴到一个SDL_Event类型的结构体中,用以将该事件数据作为鼠标设备的输入信息提供给LVGL。

若当前事件是mouse类型事件时,则保存mouse的按下、抬起状态信息及mouse的点击位置信息,这些信息可以作为LVGL指针类型外设的输入信息;

若当前事件是keyboard类型事件时,则保存keyboard的按下、抬起状态信息及keyboard的键值信息,这些信息作为LVGL keyboard类型外设的输入信息。

S403:LVGL使用模拟的显示设备和输入设备配置应用开发环境,在计算机设备上进行应用开发。

需要说明的是,LVGL是一个免费的开源图形库,可以提供多种组件、动画效果,占用内存小,支持操作系统、外部存储和GPU,仅仅单个帧缓冲设备就可以呈现高级视觉特效。

本申请实施例中,LVGL通过SDL跨平台库模拟的显示设备和输入设备来在PC上模拟运行,主要通过driver注册函数来获取设备信息。具体如下,

(1)设置display_driver的flush_cb刷新回调函数。

该刷新回调函数被注册到display_driver中,主要与display进行交互,将待刷新区域按照像素级别把显示内容拷贝到显示缓冲区中,该函数最后必须调用lv_disp_flush_ready通知图形库当前已准备好刷新。

在本申请实施例中,将待显示的显示内容拷贝到SDL分配的framebuffer中,并设置sdl_refr_qry,使得SDL执行真正的刷新任务。

(2)设备input_driver的read_cb输入回调函数。

该输入回调函数注册到input_driver中,周期性回调来上报输入设备的输入信息;当没有多余数据时,会直接返回空。针对不同的输入设备,上报的输入信息不同。

注册指针类型外设时,该输入回调函数可以读取SDL仿真输入设备(mouse)的按下、抬起状态信息以及点击位置信息;

注册keyboard类型外设时,该输入回调函数可以读取SDL仿真输入设备(keyboard)的按下、抬起状态信息以及键值信息;

另外,如果使用keyboard类型外设外设,需要加入到group中。在一个group中,当前必须只有一个控件(object)处于焦点状态来接收按键动态。例如,一个文本框处于焦点状态,则keyboard的输入键值可以被发送并插入到该文本框中。一个输入设备只能发送到一个group,但一个group可以接收多个输入设备的信息。

在完成上述步骤后,即可开发基于LVGL的应用。使用LVGL的提供的控件进行绘制UI,并通过lv_obj_set_event_cb注册控件的事件处理函数。当控件被点击、拖拽时,会产生各种类型的事件,该控件的事件处理函数可以根据不同的事件进行对应的处理来与用户进行交互。

简言之,本申请实施例可以实现在计算机设备上基于RT-Thread开发LVGL应用,开发成本低、调试速度快,而且应用开发不再依赖于MCU开发板,提高开发速度;此外,本申请实施例可以使用SDL模拟显示设备和输入设备,且SDL提供大量服务外,应用程序接口(Application Programming Interface,API)比较简单,且可以尽可能接近本机硬件。

还需要说明的是,当添加一种新的外部设备时,只需要先在SDL中基于事件机制模拟该外部设备,然后LVGL通过注册回调函数就可以获取该外部设备的输入信息来进行对应的处理。

除此之外,在本申请实施例中,SDL可以跨平台支持,且稳定、简单、灵活,而且已支持Windows、Linux等主流的PC操作系统。在将RT-Thread移植到Windows、Linux等PC操作系统上,LVGL注册SDL模拟的外部设备,在这些PC操作系统上都可开发LVGL应用。如此,应用开发者能够灵活使用各自的PC开发平台,提升应用开发者的体验。另外,SDL除了提供视频服务(包括模拟显示设备和输入设备)之外,还可以提供音频(Audio)服务,这时候可以通过SDL仿真Audio设备,模拟audio driver的打开和播放;从而可在应用中使用SDL模拟的Audio设备,用以增加音频效果。

本申请实施例的技术方案可以产生的有益效果如下,

(1)通过SDL模拟显示设备和输入设备,不用再依赖MCU开发板硬件和驱动,降低了LVGL应用开发成本;

(2)配合集成开发环境使用SDL仿真平台,可对LVGL应用进行单步调试、断点调试,可观察各种变量、RAM的实时数据,加快了调试速度;

(3)配合集成开发环境使用SDL仿真平台,不用反复烧写MCU开发板通过人眼观察结果进行开发调试,还可以减少开发周期、降低开发难度;

(4)LVGL开发的应用具有可移植性,在计算机设备上开发的应用可以简单移植到MCU开发板上运行。

本实施例提供了一种应用开发环境的配置方法,通过上述实施例对前述实施例的具体实现进行了详细阐述,从中可以看出,通过前述实施例的技术方案,通过SDL仿真模拟显示设备和输入设备,不再依赖于MCU开发板,可以降低基于LVGL的应用开发成本;而且与SDL配合,还可以缩短开发周期,提升开发效率;此外,基于该应用开发环境所开发的LVGL应用还具有可移植性,能够将计算机设备上开发的应用移植到MCU开发板上运行,适用性强。

本申请的又一实施例中,基于前述实施例相同的发明构思,参见图5,其示出了本申请实施例提供的一种应用开发环境的配置装置50的组成结构示意图。如图5所示,应用开发环境的配置装置50可以包括:仿真单元501和配置单元502;其中,

仿真单元501,配置为通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;

配置单元502,配置为基于所述模拟设备信息,利用LVGL配置所述应用开发环境。

其中,应用开发环境的配置装置50应用于计算机设备,该计算机设备安装有预设操作系统,且所述预设操作系统支持SDL,而LVGL是基于SDL仿真外部设备,搭建在RT-Thread上。

在一些实施例中,参见图5,所述应用开发环境的配置装置50还可以包括移植单元503,配置为将RT-Thread移植到预设操作系统;

仿真单元501,具体配置为基于所述RT-Thread,通过SDL对所述显示设备进行仿真,得到显示设备模拟信息;或者,基于所述RT-Thread,通过SDL对所述输入设备进行仿真,得到输入设备模拟信息。。

在一些实施例中,配置单元502,具体配置为控制LVGL通过刷新回调函数获取所述显示设备模拟信息,并根据所获取的所述显示设备模拟信息配置所述应用开发环境;或者,控制LVGL通过输入回调函数获取所述输入设备模拟信息,并根据所获取的所述输入设备模拟信息配置所述应用开发环境;其中,LVGL移植在RT-Thread中。

在一些实施例中,配置单元502,还配置为设置刷新回调函数,将待刷新区域所包括的显示内容按照像素拷贝至预设帧缓冲区中;以及在当前需求为刷新需求的情况下,控制SDL执行刷新任务,以将所述预设帧缓冲区内的显示内容按照像素进行绘制显示。

在一些实施例中,配置单元502,还配置为设置刷新标志函数;其中,所述刷新标志函数用于指示当前需求是否为刷新需求。

在一些实施例中,配置单元502,还配置为设置输入回调函数,按照预设周期读取所述输入设备的输入信息并进行事件响应。

在一些实施例中,参见图5,所述应用开发环境的配置装置50还可以包括获取单元504和读取单元505,其中,

获取单元504,配置为获取所述SDL中的事件队列;其中,所述事件队列用于为所接收的每一个事件保存事件数据;

读取单元505,配置为从所述事件队列的底部读取一个事件,并将所读取的事件对应的事件数据放置到预设类型的结构体中,以将所述事件数据作为所述输入设备的输入信息提供给LVGL。

在一些实施例中,获取单元504,具体配置为在所述SDL中,若接收到的事件为鼠标类型事件,则在所述事件队列中保存鼠标设备的状态信息和点击位置信息;以及若接收到的事件为键盘类型事件,则在所述事件队列中保存保存键盘设备的状态信息和键值信息;其中,所述状态信息包括按下状态信息和抬起状态信息。

在一些实施例中,配置单元502,具体配置为若所述输入设备为鼠标设备,则通过所述输入回调函数读取所述鼠标设备的状态信息和点击位置信息,并根据所述鼠标设备的状态信息和点击位置信息对所述鼠标设备进行事件响应;以及若所述输入设备为键盘设备,则通过所述输入回调函数读取所述键盘设备的状态信息和键值信息,并根据所述键盘设备的状态信息和键值信息对所述键盘设备进行事件响应。

在一些实施例中,所述预设操作系统至少包括:Windows操作系统或Linux操作系统。

可以理解地,在本实施例中,“单元”可以是部分电路、部分处理器、部分程序或软件等等,当然也可以是模块,还可以是非模块化的。而且在本实施例中的各组成部分可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。

所述集成的单元如果以软件功能模块的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

本申请的再一实施例中,本实施例提供了一种计算机存储介质,该计算机存储介质存储有应用开发环境的配置程序,所述应用开发环境的配置程序被至少一个处理器执行时实现前述实施例中任一项所述的方法。

基于上述应用开发环境的配置装置50的组成以及计算机存储介质,参见图6,其示出了本申请实施例提供的一种计算机设备60的硬件结构示意图。如图6所示,计算机设备60可以包括:通信接口601、存储器602和处理器603;各个组件通过总线系统604耦合在一起。可理解,总线系统604用于实现这些组件之间的连接通信。总线系统604除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图6中将各种总线都标为总线系统604。其中,通信接口601,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;

存储器602,用于存储能够在处理器603上运行的计算机程序;

处理器603,用于在运行所述计算机程序时,执行:

通过SDL对预设外部设备进行仿真,得到模拟设备信息;其中,所述预设外部设备至少包括显示设备和输入设备;

基于所述模拟设备信息,利用LVGL配置应用开发环境。

可以理解,本申请实施例中的存储器602可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(Read-Only Memory,ROM)、可编程只读存储器(Programmable ROM,PROM)、可擦除可编程只读存储器(Erasable PROM,EPROM)、电可擦除可编程只读存储器(Electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(Random Access Memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(Static RAM,SRAM)、动态随机存取存储器(Dynamic RAM,DRAM)、同步动态随机存取存储器(Synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(Double Data RateSDRAM,DDRSDRAM)、增强型同步动态随机存取存储器(Enhanced SDRAM,ESDRAM)、同步链动态随机存取存储器(Synchronous link DRAM,SLDRAM)和直接内存总线随机存取存储器(Direct Rambus RAM,DRRAM)。本文描述的系统和方法的存储器602旨在包括但不限于这些和任意其它适合类型的存储器。

而处理器603可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器603中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器603可以是通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器602,处理器603读取存储器602中的信息,结合其硬件完成上述方法的步骤。

可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(ApplicationSpecific Integrated Circuits,ASIC)、数字信号处理器(Digital Signal Processing,DSP)、数字信号处理设备(DSP Device,DSPD)、可编程逻辑设备(Programmable LogicDevice,PLD)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)、通用处理器、控制器、微控制器、微处理器、用于执行本申请所述功能的其它电子单元或其组合中。

对于软件实现,可通过执行本文所述功能的模块(例如过程、函数等)来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。

可选地,作为另一个实施例,处理器603还配置为在运行所述计算机程序时,执行前述实施例中任一项所述的方法的步骤。

需要说明的是,在本申请中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

本申请所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。

本申请所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。

本申请所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号