女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

害怕追新?LVGL8發布穩定性更新(附部署教程)

jf_L18yujSQ ? 來源:小飛哥玩嵌入式 ? 2023-02-09 10:55 ? 次閱讀

【說在前面的話】


LVGL的剛剛完成了對LVGL8的維護更新,發布了v8.3.5版。相對master分支上正在開發的LVGL9,該版本是一個吐血推薦的穩定版本:
  • 它是 LVGL8 的維護性更新,API保持不變,只做了一些修修補補的工作
  • 修復和更新了對眾多GPU的支持,包括

用LVGL做產品的小伙伴可以放心食用。

9f9a609a-a7e3-11ed-bfe3-dac502259ad0.png

用戶也直接通過MDKPack-Installer進行直接安裝,就像lwIP那樣:

9fb77cd4-a7e3-11ed-bfe3-dac502259ad0.png

無論采用哪種方法,一旦完成安裝,以后就可以通過Pack-Installer來獲取最新版本啦。

【如何在MDK中部署LVGL】


步驟一:配置RTE

MDK中通過菜單 Project->Manage->Run-Time Enviroment 打開RTE配置窗口:

9fe823f2-a7e3-11ed-bfe3-dac502259ad0.png

RTE配置界面中找到LVGL,將其展開:

9ffd1f8c-a7e3-11ed-bfe3-dac502259ad0.png

與其它平臺下部署LVGL不同,cmsis-pack允許大家像點菜那樣只將所需的模塊(或者功能)加入到工程中。

注意,這里必點的是“Essential”,它是LVGL的核心服務。一般來說,為了使用LVGL所攜帶的豐富控件(Widgets),我們還需要選中“Extra Themes”。如果你是第一次為當前硬件平臺進行LVGL移植,則非常推薦加點“Porting”——它會為你添加移植所需的模板,非常方便。 單擊“OK”關閉RTE配置窗口,我們會看到LVGL已經被加入到工程列表中了:

a0120de8-a7e3-11ed-bfe3-dac502259ad0.png

此時,我們就已經可以成功編譯了。

步驟二:配置LVGL

將LVGL展開,找到配置頭文件 lv_conf_cmsis.h

a070fff6-a7e3-11ed-bfe3-dac502259ad0.png

該文件其實就是LVGL官方移植文檔中所提到的lv_conf.h,它是基于lv_conf_template.h修改而來。值得說明的是,一些模塊的開關宏都被刪除了,例如:

LV_USE_GPU_ARM2D
LV_USE_GPU_STM32_DMA2D
LV_USE_GPU_NXP_PXP
……

這是因為,當我們在RTE配置窗口中勾選對應選項時,cmsis-pack就會自動把對應的宏定義加入到 RTE_Components.h 里——換句話說,再也不用我們手動添加啦!

a0807e86-a7e3-11ed-bfe3-dac502259ad0.png

a093c39c-a7e3-11ed-bfe3-dac502259ad0.png

其它對LVGL的配置,請參考官方文檔,這里就不再贅述。

步驟三:使用模板進行移植

當我們在RTE中選擇了porting模塊后,三個移植模板會被加入到工程列表中。

a0a44780-a7e3-11ed-bfe3-dac502259ad0.png

它們是可以編輯的,保存在當前工程的RTE/LVGL目錄中。

a0b2d728-a7e3-11ed-bfe3-dac502259ad0.png

這些模板極大的簡化了我們的驅動移植過程,下面,我們將以lv_port_disp_template為例,為大家介紹這些模板的使用方法:

1、打開 lv_port_disp_template.h,將開頭處 #if0 修改為 #if 1,使整個頭文件生效:

a0c613ba-a7e3-11ed-bfe3-dac502259ad0.png

2、打開lv_port_disp_template.c,將開頭處#if0修改為#if 1,使整個遠文件生效。

a0d787e4-a7e3-11ed-bfe3-dac502259ad0.png

4、根據官方 porting 文檔的指導,根據你的硬件實際情況,在三種緩沖模式中做出選擇:

a0f23b8e-a7e3-11ed-bfe3-dac502259ad0.png

需要特別強調的是:如果你的系統沒有DMA或者替用戶完成Frame Buffer刷新的專門LCD控制器,那么雙緩沖其實是沒有意義的(因為無論如何都是CPU在干活,因此不會比單緩沖模式有任何性能上的本質不同)

5、找到disp_init() 函數,并在其中添加LCD的初始化代碼。該函數會被 lv_port_disp_init()調用。

6、找到 disp_flush()函數,并根據你的硬件實際情況,將其改寫。比如這是使用 GLCD_DrawBitmap進行實現的參考代碼:

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if (disp_flush_enabled) {
        GLCD_DrawBitmap(area->x1,               //!< x
                        area->y1,               //!< y
                        area->x2 - area->x1 + 1,    //!< width
                        area->y2 - area->y1 + 1,    //!< height
    (constuint8_t*)color_p);
}
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}


GLCD_DrawBitmap 用于將給定的顯示緩沖區刷新到LCD,其函數原型如下:
/**
  fn          int32_t GLCD_DrawBitmap (uint32_t x, uint32_t y, uint32_t width, uint32_t height, const uint8_t *bitmap)
  rief       Draw bitmap (bitmap from BMP file without header)
  param[in]   x      Start x position in pixels (0 = left corner)
  param[in]   y      Start y position in pixels (0 = upper corner)
  param[in]   width  Bitmap width in pixels
  param[in]   height Bitmap height in pixels
  param[in]   bitmap Bitmap data
  
eturns
   -   0: function succeeded
   -  -1: function failed
*/
int32_t GLCD_DrawBitmap (uint32_t x, 
                         uint32_t y, 
                         uint32_t width, 
                         uint32_t height, 
                         const uint8_t *bitmap)

這里,5個參數之間的關系如下圖所示:

a104bb6a-a7e3-11ed-bfe3-dac502259ad0.png簡單來說,這個函數就是把bitmap指針所指向的“連續存儲區域”中保存的像素信息拷貝到LCD的一個指定矩形區域內,這一矩形區域由位置信息x,y和體積信息(widthheight)共同確定。

很多LCD都支持一個叫做“操作窗口”的概念,這里的窗口其實就是上圖中的矩形區域——一旦你通過指令設置好了窗口,隨后連續寫入的像素就會被依次自動填充到指定的矩形區域內(而無需用戶去考慮何時進行折行的問題)。

此外,如果你有幸使用帶LCD控制器的芯片——LCD的顯示緩沖區被直接映射到Cortex-M芯片的4GB地址空間中,則我們可以使用簡單的存儲器讀寫操作來實現上述函數,以STM32F746G-Discovery開發板為例:

//!STM32F746G-Discovery
#define GLCD_WIDTH     480
#define GLCD_HEIGHT    272


#defineLCD_DB_ADDR   0xC0000000
#define LCD_DB_PTR    ((volatile uint16_t *)LCD_DB_ADDR)


int32_t GLCD_DrawBitmap (uint32_t x, 
                         uint32_t y, 
                         uint32_t width, 
                         uint32_t height, 
                         const uint8_t *bitmap) 
{
volatileuint16_t*phwDes=LCD_DB_PTR+y*GLCD_WIDTH+x;
    const uint16_t *phwSrc = (const uint16_t *)bitmap;
    for (int_fast16_t i = 0; i < height; i++) {
        memcpy ((uint16_t *)phwDes, phwSrc, width * 2);
        phwSrc += width;
        phwDes += GLCD_WIDTH;
    }


return 0;
}


7、在 main.c 中加入對 lv_port_disp_template.h 的引用:

#include "lv_port_disp_template.h"

8、在main()函數中對LVGL進行初始化:

int main(void)
{
...
    lv_init();
lv_port_disp_init();
    ...
    while(1) {
        
}
}

至此,我們就完成了LVGL在MDK工程的部署。是不是特別簡單?

【時間相關的移植】


根據官方移植文檔的要求,我們實際上還需要處理兩個問題:
  • 讓lvgl 知道從復位開始經歷了多少毫秒

  • 以差不多5ms為間隔,調用函數lv_timer_handler() 來進行事件處理(包括刷新)

依據平臺的不同,小伙伴們當然有自己的解決方案。這里,我推薦一個MDK環境下基于perf_counter的方案,它更通用,也更簡單。關于它的使用文章,小伙伴可以參考《【喂到嘴邊了的模塊】超級嵌入式系統“性能/時間”工具箱》,這里就不再贅述。 步驟一:獲取 perf_counter 的cmsis-pack

關注公眾號【裸機思維】后,向后臺發送關鍵字“perf_counter”獲取對應的cmsis-pack網盤鏈接。下載后安裝。

步驟二:在工程中部署 perf_counter

打開RTE配置窗口,找到 Utilities 后展開,選中 perf_counter的 Core:

a128a28c-a7e3-11ed-bfe3-dac502259ad0.png

需要說明的是,無論你用不用操作系統這里關于各類操作系統的 Patch 你即便不選擇也能正常工作,不必擔心。單擊OK后即完成了部署。 在main()函數中初始化 perf_counter(別忘記添加對頭文件 perf_counter.h 的包含):
#include "perf_counter.h"


intmain(void)
{
/*配置MCU的系統時鐘頻率 */

/*重要:更新 SystemCoreClock 變量*/
SystemCoreClockUpdate(); 

/*初始化perf_counter*/
init_cycle_counter(true);
...
while(1) {
}
...
}

需要特別說明的是:

  • 調用 init_cycle_counter() 之前,最好通過 SystemCoreClockUpdate() 來將當前的系統頻率更新到關鍵全局變量 SystemCoreClock 上。你當然也可以自己用賦值語句來做,比如:

extern uint32_t SystemCoreClock;
SystemCoreClock=72000000ul;  /* 72MHz */
  • 如果你已經有應用或者RTOS占用了SysTick(一般都是這樣),則應該將 true 傳遞給 init_cycle_counter() 作為參數——告訴 perf_counter SysTick已經被占用了;反之則應該傳遞 false,此時 perf_counter 會用最大值 0x00FFFFFF來初始化SysTick。

步驟三:更新超級循環

最新版本的LVGL為用戶提供了一個全新的方式來周期性的刷新 LVGL任務函數:lv_timer_handler_run_in_period(毫秒數)。無論是裸機還是RTOS環境,你都可以簡單的將其插入超級循環中——以指定的ms數為間隔刷新LVGL的任務函數,例如:

int main(void)
{
...
lv_init();
    lv_port_disp_init();
    lv_port_indev_init();
    ...
while(1){
lv_timer_handler_run_in_period(LV_DISP_DEF_REFR_PERIOD);
    }
    
}

【跑分從未如此簡單】


完成移植后,也許你會急于想知道當前環境下自己的平臺能跑出怎樣的幀率吧?別著急,LVGLcmsis-pack已經為您好了準備。打開RTE配置窗口,勾選benchmark

a13613ea-a7e3-11ed-bfe3-dac502259ad0.png

main.c 中加入對lv_demo_benchmark.h 的“間接”引用:

#include"demos/lv_demos.h"

在 LVGL 初始化代碼后,加入benchmark 無腦入口函數:

int main(void)
{
    lv_init();
    lv_port_disp_init();
    
#if LV_USE_DEMO_BENCHMARK
    lv_demo_benchmark();
#endif
    
    while(1) {
        lv_timer_handler_run_in_period(5);
    }
    
}

編譯,運行,走起:

a15bfaec-a7e3-11ed-bfe3-dac502259ad0.png

嗯…… Slow but common case……

最新的 benchmark 允許我們通過lv_demo_benchmark_set_finished_cb()注冊一個回調函數——用于告知我們所有測試已經完成:

static void on_benchmark_finished(void)
{

}


int main(void)
{
    lv_init();
    lv_port_disp_init();
lv_port_indev_init();
    
    lv_demo_benchmark_set_finished_cb(&on_benchmark_finished);
    lv_demo_benchmark();
    //lv_demo_benchmark_set_max_speed(true);
    
//lv_demo_benchmark_run_scene(43);//runsceneno31


    while(1) {
        lv_timer_handler();
}
}

如果我們對具體某一個測試場景感興趣,還可以在注釋掉 lv_demo_benchmark()后通過函數lv_demo_benchmark_run_scene() 來運行指定編號的場景。

【裝逼從未如此簡單】


完成移植后,也許你“”會急于想知道當前環境下自己的平臺能跑出怎樣的效果吧?(咦?為什么要說又?)別著急,LVGLcmsis-pack已經為您好了準備。打開RTE配置窗口,勾選Demo:Widgets

a182b4e8-a7e3-11ed-bfe3-dac502259ad0.png

main.c中加入對lv_demo_widgets.h的“間接”引用:

#include "demos/lv_demos.h"

在 LVGL 初始化代碼后,加入Demo Widgets的無腦入口函數:

int main(void)
{


    lv_init();
    lv_port_disp_init();
    
#if LV_USE_DEMO_BENCHMARK
    lv_demo_benchmark();
#endif
    
#if LV_USE_DEMO_WIDGETS
    lv_demo_widgets();
#endif


    while(1) {
        lv_timer_handler_run_in_period(5);
    }
    
}

需要特別注意的是:要跑這個Demo,Stack(棧)不能小于 4K,切記,切記!

編譯,運行,走起:

a1921690-a7e3-11ed-bfe3-dac502259ad0.png

【說在后面的話】


最后,對在MDK中用cmsis-pack來部署LVGL的過程感到好奇,但又想有個參考的小伙伴,可以關注下面這個開源項目(也是我負責維護的): https://github.com/lvgl/lv_port_an547_cm55_sim 按照readme的教程你甚至不需要硬件就可以在MDK中免費模擬一個Arm開發板來跑LVGL。加之最近MDK為非商業應用場景提供了幾乎沒有什么限制的社區版,大家已經可以挺直腰板白嫖MDK啦。

此外,如果你是Raspberry Pi Pico的愛好者,還可以參考這個官方倉庫(“又”是我維護的哦):

https://github.com/lvgl/lv_port_raspberry_pi_pico_mdk

如果他對你有所幫助的話,還請賞賜個Star呀。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GitHub
    +關注

    關注

    3

    文章

    481

    瀏覽量

    17406
  • LVGL
    +關注

    關注

    1

    文章

    99

    瀏覽量

    3510

原文標題:【喂到嘴邊了的模塊】害怕追新?LVGL8發布穩定性更新(附部署教程)

文章出處:【微信號:小飛哥玩嵌入式,微信公眾號:小飛哥玩嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    在esp-idf上使用esp32-s3跑lvgl8,界面刷新很卡頓,如何對其進行幀率優化呢?

    在esp-idf上使用esp32-s3跑lvgl8,界面刷新很卡頓,如何對其進行幀率優化呢?
    發表于 06-19 07:54

    android 高穩定性高并發全平臺社交聊天IM對外合作支持源碼

    /H5應用/附近的人/等模塊化功能高定制性,支持用戶在此底層基礎進行二次開發,支持對客戶特定需求進行特定開發消息收發經過大規模壓測以及客戶案例驗證,穩定性強,達到電信級發布架構穩定,支持多臺服務器進行
    發表于 03-28 15:20

    如何提高lwip的穩定性

    如題、如何提高lwip的穩定性,目前用的是f107+lwip1.4.1目前系統運行一段時間后lwip就掛掉啦(時間很不固定)問題;應主要從那幾個方面來提高穩定性,懇請大家指點一二,小弟在此不勝感激
    發表于 07-09 23:36

    淺析環路穩定性原理與DCDC Buck環路穩定性

    環路穩定性原理與DCDC Buck環路穩定性這個文章是之前寫的,但是自己對于這部分理解又忘記了,所以在此發布下,大家都可以看看有哪些問題存在。
    發表于 11-17 08:26

    GUI向導lvgl8模擬器mingw32-make運行失敗的原因?

    GUI guider lvgl8運行c模擬器時總是mingw32-make run failed,而lvgl7卻沒有,如何解決這個問題
    發表于 03-14 13:29

    電感的穩定性

    電感的穩定性 穩定性是表示電感線圈參數隨環境條件變化而改變的程度。通常用電感溫度系數αL 來評定線圈的穩定程度,它表示電感量相對淚度的穩定
    發表于 08-22 14:33 ?1668次閱讀

    系統的穩定性

    現代控制理論-5.系統的穩定性
    發表于 12-13 22:20 ?0次下載

    macOS Catalina發布10.15.2更新 提高了Mac的穩定性及性能

    今天蘋果是忙碌的,發布完iOS/iPad OS 13.3更新后,還帶來了macOS Catalina的更新,其版本號為10.15.2,同樣也是修復了一大波兒錯誤,其距離10.15.1發布
    的頭像 發表于 12-11 09:11 ?7611次閱讀

    2019年11月的固件更新改善Surface Pro X設備的續航和系統穩定性

    本周正式開售的一些Surface Pro X評論提到了電池續航達不到預期和系統穩定性較差的問題。微軟現在已經發布了Surface Pro X設備的首個系統固件更新。2019年11月的固件更新
    的頭像 發表于 11-07 15:18 ?3231次閱讀

    什么是熱電偶穩定性?如何檢測熱電偶穩定性

    在規定的條件下,熱電特性變化大即表明穩定性差,變化小則表明穩定性良好。熱電偶的穩定性好壞會直接影響到熱電偶測量的準確性,因此,穩定性是衡量熱電偶性能的一個重要指標。
    發表于 12-31 09:19 ?2855次閱讀
    什么是熱電偶<b class='flag-5'>穩定性</b>?如何檢測熱電偶<b class='flag-5'>穩定性</b>?

    谷歌Chrome v80.0.3987.162發布 更新安全修復和穩定性改進及用戶體驗

    谷歌瀏覽器Google Chrome穩定版迎來v80第八個維護版本發布,詳細版本號為v80.0.3987.162,上一個正式版v80.0.3987.149發布于3月18日,時隔14天Google又
    的頭像 發表于 04-01 16:59 ?2744次閱讀

    環路穩定性原理與DCDC Buck環路穩定性

    環路穩定性原理與DCDC Buck環路穩定性這個文章是之前寫的,但是自己對于這部分理解又忘記了,所以在此發布下,大家都可以看看有哪些問題存在。2019-10-312019馬上結束了...
    發表于 11-10 11:05 ?91次下載
    環路<b class='flag-5'>穩定性</b>原理與DCDC Buck環路<b class='flag-5'>穩定性</b>

    如何在MDK中部署LVGL

    LVGL的剛剛完成了對LVGL8的維護更新發布了v8.3.5版。相對master分支上正在開發的LVGL9,該版本是一個吐血推薦的
    的頭像 發表于 07-27 14:41 ?1638次閱讀
    如何在MDK中<b class='flag-5'>部署</b><b class='flag-5'>LVGL</b>

    怎么分析電路的穩定性

    怎么分析電路的穩定性?? 電路的穩定性是指電路在不同條件下保持穩定的能力。穩定性是電路設計中十分重要的一個方面,因為穩定的電路能夠提供可靠和
    的頭像 發表于 09-17 16:44 ?2515次閱讀

    微軟PowerToys發布0.80.1版,修復多項BUG提升軟件穩定性

    微軟日前發布PowerToys 0.80.1穩定更新,該版無新增功能,其主要目的在于修復先前版本所遺留的若干問題,提升軟件運作穩定性
    的頭像 發表于 04-11 10:50 ?1793次閱讀