自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony輕量化系統(tǒng)的LVGL使用(二)

系統(tǒng) OpenHarmony
如果遇到lv_task_handler()執(zhí)行函數(shù)堵死,大概率是內(nèi)存沒(méi)分配夠,將線程的內(nèi)存分配和lvgl的內(nèi)存分配調(diào)大即可。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前言

在做OpenHarmony的LVGL之前,學(xué)習(xí)了STM32的LVGL移植,其中遇到了很多問(wèn)題,也學(xué)會(huì)了很多知識(shí),為下一步的移植打下了基礎(chǔ)。本篇文章主要講解如何移植LVGL到OpenHarmony輕量化系統(tǒng)上。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

環(huán)境

  • OpenHarmony-3.1
  • 潤(rùn)和hispark_pegasus Hi3861開(kāi)發(fā)板
  • DevEco Device Tool
  • 串口調(diào)試助手
  • SSD1306 0.96寸OLED屏幕

移植

我當(dāng)前下載的版本是LVGL8.3版本,大家可以在GitHub上下載獲取源碼:

LVGL8.3_GitHub也可以通過(guò)我上傳的源碼附件進(jìn)行下載。

移植LVGL文件的大致流程:

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

移植文件

先在applications/sample/wifi-iot/app路徑下新建一個(gè)lvgl文件夾,將下圖四個(gè)文件加入到lvgl文件夾中,并且lvgl根路徑下的lv_conf_template.h更改名字為lv_conf.h。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

取消注釋

在lvgl/examples/porting文件夾中把所需要的文件里的開(kāi)頭的#if 0改成 #if 1。本次只使用到屏幕驅(qū)動(dòng),所以只需要將lv_port_disp_template.c和lv_port_disp_template.h改掉即可。

  • lv_port_disp_template為屏幕驅(qū)動(dòng)。
  • lv_port_fs_template為文件系統(tǒng)驅(qū)動(dòng)。
  • lv_port_indev_template為輸入驅(qū)動(dòng)lvgl根路徑下的lv_conf.h將里面開(kāi)頭的#if 0也要改成#if 1在lvgl/examples/porting文件夾中,將lv_port_disp_template.h中的include修改成如圖所示:
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

加入編譯

這一步將LVGL加入到編譯里面,需要把以下源文件都添加到lvgl/BUILD.gn里面

  • lvgl/examples/porting目錄下的文件。
  • lvgl/src目錄下的core draw font hal misc widgets文件夾下的頭文件。
  • lvgl/src/extra/目錄下的文件。
  • lvgl/src/extra/layouts目錄下所有子目錄文件。
  • lvgl/src/extra/themes目錄下所有子目錄文件。
  • lvgl/src/extra/widgets目錄下所有子目錄文件。
    還需要將lvgl ,src,porting頭文件文件夾目錄添加到include_dirs。
    由于這一步過(guò)于繁雜瑣碎且容易出錯(cuò)(都是辛酸淚),建議大家直接到文章開(kāi)頭的Gitee鏈接里拉取根目錄下的BUILD.gn文件,放到lvgl根目錄即可。

修改報(bào)錯(cuò)

這時(shí)候進(jìn)行編譯的話,會(huì)發(fā)現(xiàn)報(bào)錯(cuò):lv_theme_default.c未定義lv_win_class。在lvgl工程里,lv_win.h里面已經(jīng)將lv_win_classextern了,但好像lv_theme_default.c文件還是報(bào)錯(cuò)未定義lv_win_class,于是我便直接在這個(gè)文件applications/sample/wifi-iot/app/lvgl/src/extra/themes/default/lv_theme_default.c中加入。

const lv_obj_class_t lv_win_class;

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

結(jié)合屏幕配置lvgl驅(qū)動(dòng)

本次實(shí)驗(yàn)使用一塊SSD1306的單色0.96寸顯示屏,分辨率是128*64.主要是方便驗(yàn)證lvgl的可行性,大致流程如下:

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

這塊屏幕參考了連志安老師的OLED屏幕開(kāi)發(fā),將源碼中的SSD1306文件夾復(fù)制到lvgl目錄下:

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

配置lv_conf文件

修改lvgl根目錄下的lv_conf.h文件。
加入以下代碼,分別對(duì)應(yīng)了屏幕的長(zhǎng)和寬。

#define MY_DISP_HOR_RES 128
#define MY_DISP_VER_RES 64

修改#define LV_COLOR_DEPTH 16為#define LV_COLOR_DEPTH 8.此選項(xiàng)為屏幕的色深。

(我嘗試過(guò)修改成1單色色深,但1的輸出只有純白色了,于是將這一步先設(shè)為8位色深,主要是我以后用的都是彩色屏幕,所以對(duì)此步驟并沒(méi)有硬性要求一定適配單色屏幕,此次先驗(yàn)證可行性)。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

設(shè)置內(nèi)存大小,按照需求設(shè)置,一般來(lái)說(shuō)20Kb夠用了(大工程除外)。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

若是想要顯示CPU占用率、內(nèi)存占用率、幀率,可以配置下圖兩個(gè)宏定義為1。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

配置lvgl屏幕驅(qū)動(dòng)

屏幕驅(qū)動(dòng)的文件為這個(gè)applications/sample/wifi-iot/app/lvgl/examples/porting/lv_port_disp_template.c。

最首先我們要在這個(gè)文件加入屏幕驅(qū)動(dòng)的頭文件引用。

lvgl精華所在便是它只需要屏幕的畫(huà)點(diǎn)API即可完成操作,這種低耦合性使得它非常便于移植。

SSD1306的畫(huà)點(diǎn)API在ssd1306.h中。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

修改void lv_port_disp_init(void)屏幕驅(qū)動(dòng)初始化函數(shù)。

lvgl官方提供了三種緩存模式,想要詳細(xì)了解的可以在官網(wǎng)查詢(xún)相關(guān)資料,本文章不過(guò)多贅述,我們本次使用了單緩存模式,其余兩種模式注釋掉即可.也由于屏幕比較小,所以緩存大小便是屏幕大小。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

lvgl的繪圖實(shí)現(xiàn)函數(shù)static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p),用于圖形填充.我們需要在這里實(shí)現(xiàn)繪圖功能,SSD1306的畫(huà)點(diǎn)APIssd1306_DrawPixel將在這里被調(diào)用,SSD1306繪圖完成后還需要調(diào)用刷新函數(shù)ssd1306_UpdateScreen();才可以將屏幕刷新.(當(dāng)然,如果有更加高效快速的刷新方式也可以使用,并不一定是不斷畫(huà)點(diǎn)的形式刷新)。

在前文中,我們將lvgl設(shè)置成8位色深模式,所以我們這里要稍加做判斷,但顏色小于100時(shí),我們把它當(dāng)成黑色,大于100時(shí),我們把它當(dāng)成白色.由此實(shí)現(xiàn)單色顯示。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

顯示測(cè)試

在lvgl根路徑創(chuàng)建ssd1306_demo.c,在里面實(shí)現(xiàn)ssd1306的初始化以及l(fā)vgl的初始化,還有l(wèi)vgl需要一直不斷循環(huán)的定時(shí)器和執(zhí)行函數(shù),定時(shí)器需要在執(zhí)行函數(shù)之前。

需要注意的是此定時(shí)器和執(zhí)行函數(shù)可以分成兩個(gè)線程執(zhí)行,但如果這么做,需要為這兩個(gè)線程加上互斥鎖,并且定時(shí)器的間隔時(shí)間需要比執(zhí)行函數(shù)的間隔時(shí)間短。

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_pwm.h"
#include "iot_i2c.h"
#include "iot_errno.h"

#include "ssd1306.h"

#include "hi_io.h"
#include "lvgl.h"

#include "lv_port_disp_template.h"
#define OLED_I2C_BAUDRATE 400*1000
//按鍵組件
void lv_ex_label(void)
{
lv_obj_t* btn = lv_btn_create(lv_scr_act());
lv_obj_set_pos(btn, 0, 0); //x,y
lv_obj_set_size(btn, 60, 30);
lv_obj_t* label = lv_label_create(btn);
lv_label_set_text(label, "FSR");
lv_obj_center(label);
}

void TestGetTick(void)
{
for (int i = 0; i < 20; i++) {
usleep(10*1000);
printf("HAL_GetTick(): %d\r\n", HAL_GetTick());
}

for (int i = 0; i < 20; i++) {
HAL_Delay(25);
printf(" HAL_GetTick(): %d\r\n", HAL_GetTick());
}
}

void LVGLTestTask(void* arg)
{
//IO口初始化
(void) arg;
IoTGpioInit(HI_IO_NAME_GPIO_13);
IoTGpioInit(HI_IO_NAME_GPIO_14);

hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA);
hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL);

IoTI2cInit(0, OLED_I2C_BAUDRATE);

//WatchDogDisable();

usleep(20*1000);
//ssd1306初始化
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_SetCursor(0, 0);
uint32_t start = HAL_GetTick();
ssd1306_UpdateScreen();
uint32_t end = HAL_GetTick();
printf("ssd1306_UpdateScreen time cost: %d ms.\r\n", end - start);

lv_init(); //lvgl初始化
lv_port_disp_init(); //lvgl屏幕驅(qū)動(dòng)初始化
lv_ex_label(); //按鈕組件
while (1)
{
lv_tick_inc(5); //計(jì)時(shí)器
lv_task_handler(); //lvgl執(zhí)行函數(shù)
usleep(5000);
}
}
//線程創(chuàng)建
void LVGLTestDemo(void)
{
osThreadAttr_t attr;

attr.name = "LVGL_Task";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024*20; //內(nèi)存分配一定要充足
attr.priority = osPriorityNormal;

if (osThreadNew(LVGLTestTask, NULL, &attr) == NULL) {
printf("[LVGL_Task] Falied to create LVGL_Task!\n");
}
}
APP_FEATURE_INIT(LVGLTestDemo);

#創(chuàng)作者激勵(lì)#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

如果遇到lv_task_handler()執(zhí)行函數(shù)堵死,大概率是內(nèi)存沒(méi)分配夠,將線程的內(nèi)存分配和lvgl的內(nèi)存分配調(diào)大即可。

本次移植到這里就告一段落了,等下一階段有空了再做按鍵的使用。

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:

 https://ost.51cto.com/resource/2672。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來(lái)源: 51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-03-17 16:31:19

LVGL鴻蒙

2023-03-15 16:31:56

系統(tǒng)聲音收錄鴻蒙

2023-03-10 09:32:31

ANY功能短數(shù)據(jù)通信功能

2022-10-24 14:54:29

LWIP協(xié)議鴻蒙

2022-09-22 15:23:40

設(shè)備開(kāi)發(fā)鴻蒙

2023-09-11 19:53:50

2019-07-04 11:46:44

智慧安防云存儲(chǔ)軟件

2023-06-09 14:51:31

5G輕量化

2017-11-21 08:19:26

機(jī)箱桌面PC

2021-09-07 18:05:51

深信服安全

2021-03-25 18:00:53

HarmonyOS元服務(wù)開(kāi)發(fā)者

2020-04-27 15:33:04

Bodhi LinuxLinux

2011-04-28 12:53:29

3D眼鏡3D家庭影院

2016-04-20 15:36:38

圖片壓縮工具輕量化

2022-08-10 16:56:30

StreamLak快手

2022-01-20 11:04:31

Linux DRMOpenHarmon鴻蒙

2016-01-22 09:47:10

HTML5WebGLBIM模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)