成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

系統 OpenHarmony
如果遇到lv_task_handler()執行函數堵死,大概率是內存沒分配夠,將線程的內存分配和lvgl的內存分配調大即可。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

前言

在做OpenHarmony的LVGL之前,學習了STM32的LVGL移植,其中遇到了很多問題,也學會了很多知識,為下一步的移植打下了基礎。本篇文章主要講解如何移植LVGL到OpenHarmony輕量化系統上。

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

環境

  • OpenHarmony-3.1
  • 潤和hispark_pegasus Hi3861開發板
  • DevEco Device Tool
  • 串口調試助手
  • SSD1306 0.96寸OLED屏幕

移植

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

LVGL8.3_GitHub也可以通過我上傳的源碼附件進行下載。

移植LVGL文件的大致流程:

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

移植文件

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

取消注釋

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

  • lv_port_disp_template為屏幕驅動。
  • lv_port_fs_template為文件系統驅動。
  • lv_port_indev_template為輸入驅動lvgl根路徑下的lv_conf.h將里面開頭的#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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

加入編譯

這一步將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。
    由于這一步過于繁雜瑣碎且容易出錯(都是辛酸淚),建議大家直接到文章開頭的Gitee鏈接里拉取根目錄下的BUILD.gn文件,放到lvgl根目錄即可。

修改報錯

這時候進行編譯的話,會發現報錯:lv_theme_default.c未定義lv_win_class。在lvgl工程里,lv_win.h里面已經將lv_win_classextern了,但好像lv_theme_default.c文件還是報錯未定義lv_win_class,于是我便直接在這個文件applications/sample/wifi-iot/app/lvgl/src/extra/themes/default/lv_theme_default.c中加入。

const lv_obj_class_t lv_win_class;

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

結合屏幕配置lvgl驅動

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

配置lv_conf文件

修改lvgl根目錄下的lv_conf.h文件。
加入以下代碼,分別對應了屏幕的長和寬。

#define MY_DISP_HOR_RES 128
#define MY_DISP_VER_RES 64

修改#define LV_COLOR_DEPTH 16為#define LV_COLOR_DEPTH 8.此選項為屏幕的色深。

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

設置內存大小,按照需求設置,一般來說20Kb夠用了(大工程除外)。

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

配置lvgl屏幕驅動

屏幕驅動的文件為這個applications/sample/wifi-iot/app/lvgl/examples/porting/lv_port_disp_template.c。

最首先我們要在這個文件加入屏幕驅動的頭文件引用。

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

SSD1306的畫點API在ssd1306.h中。

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

修改void lv_port_disp_init(void)屏幕驅動初始化函數。

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

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

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

顯示測試

在lvgl根路徑創建ssd1306_demo.c,在里面實現ssd1306的初始化以及lvgl的初始化,還有lvgl需要一直不斷循環的定時器和執行函數,定時器需要在執行函數之前。

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

#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屏幕驅動初始化
lv_ex_label(); //按鈕組件
while (1)
{
lv_tick_inc(5); //計時器
lv_task_handler(); //lvgl執行函數
usleep(5000);
}
}
//線程創建
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; //內存分配一定要充足
attr.priority = osPriorityNormal;

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

#創作者激勵#【FFH】OpenHarmony輕量化系統的LVGL使用(二)-開源基礎軟件社區

如果遇到lv_task_handler()執行函數堵死,大概率是內存沒分配夠,將線程的內存分配和lvgl的內存分配調大即可。

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

文章相關附件可以點擊下面的原文鏈接前往下載:

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

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-03-17 16:31:19

LVGL鴻蒙

2023-03-15 16:31:56

系統聲音收錄鴻蒙

2023-03-10 09:32:31

ANY功能短數據通信功能

2022-09-22 15:23:40

設備開發鴻蒙

2022-10-24 14:54:29

LWIP協議鴻蒙

2023-09-11 19:53:50

2025-06-16 08:51:23

2019-07-04 11:46:44

智慧安防云存儲軟件

2023-06-09 14:51:31

5G輕量化

2025-05-19 09:32:06

2021-09-07 18:05:51

深信服安全

2017-11-21 08:19:26

機箱桌面PC

2020-04-27 15:33:04

Bodhi LinuxLinux

2021-03-25 18:00:53

HarmonyOS元服務開發者

2016-04-20 15:36:38

圖片壓縮工具輕量化

2011-04-28 12:53:29

3D眼鏡3D家庭影院

2022-01-20 11:04:31

Linux DRMOpenHarmon鴻蒙

2025-06-03 08:45:25

2022-08-10 16:56:30

StreamLak快手
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人 在线| 亚洲一二三区在线观看 | 国产在线视频一区 | 欧美一级片在线看 | 国产区在线观看 | 91久久国产综合久久 | 91社区在线观看高清 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 日韩在线成人 | 亚洲精品一区二区 | 亚洲欧美视频 | 久久精品国产一区二区三区不卡 | 午夜影院视频 | 欧美综合精品 | 日日夜夜免费精品 | 很黄很污的网站 | 国产午夜精品一区二区三区嫩草 | 亚洲福利| 久久久久久九九九九九九 | 日本二区在线观看 | 日韩高清国产一区在线 | 久久久久久一区 | 亚洲一区综合 | 日本激情一区二区 | 国产在线精品一区二区 | 成人在线免费视频观看 | 精品久久久久久久人人人人传媒 | 欧美性大战久久久久久久蜜臀 | 草久久 | 国产精品视频一区二区三 | 夜操 | 情侣酒店偷拍一区二区在线播放 | 国产精品永久免费 | 亚洲精品字幕 | 欧美日韩一区二区三区视频 | 岛国精品| 久久精品国产亚洲夜色av网站 | 五月网婷婷 | 亚洲精品久久视频 | 99九九视频 | 最新中文在线视频 |