lvgl運行機制分析

  • lv_timer_handler()?是 LVGL 的“心臟”:這個函數會依次做以下事情:

    1. 處理定時器(如動畫、延遲回調)。

    2. 讀取輸入設備(如觸摸屏、按鍵的狀態)。

    3. 刷新臟區域(僅重繪屏幕上發生變化的區域)。

    4. 執行用戶注冊的回調函數(如按鈕點擊事件)。

  • 開發者需要手動調用它:通常在一個?while(1)?循環或 FreeRTOS 任務中定期調用,例如每 5~50ms 調用一次。例如:

    c

    復制

    while (1) {lv_timer_handler();  // 驅動 LVGL 的核心邏輯vTaskDelay(5);       // FreeRTOS 中延時 5ms
    }
  • 如果沒有調用?lv_timer_handler():LVGL 的定時器不會觸發,輸入設備狀態不會被讀取,UI 也不會更新,導致“死機”。


2.?為什么 LVGL 不依賴硬件中斷?

  • 跨平臺兼容性:LVGL 需要支持從低端單片機到 Linux 的各種平臺,硬件中斷機制差異較大,輪詢更通用。

  • 可控性:輪詢允許開發者自由控制 LVGL 的調用頻率,避免中斷搶占導致實時系統的不確定性(尤其是在 FreeRTOS 中)。

  • 資源效率:中斷處理需要上下文切換,頻繁的中斷可能占用過多 CPU 資源,而輪詢可以通過調整調用間隔平衡性能與功耗。


3.?LVGL 如何與 FreeRTOS 協同工作?

  • 典型場景:在 FreeRTOS 中創建一個專用任務(如?lvgl_task),負責定期調用?lv_timer_handler()。例如:

    c

    復制

    void lvgl_task(void *pvParameters) {while (1) {lv_timer_handler();      // 驅動 LVGLvTaskDelay(pdMS_TO_TICKS(5)); // 5ms 周期}
    }
  • 輸入設備的讀取:觸摸屏或按鍵的狀態通常也需要通過輪詢或中斷獲取,但 LVGL 不強制要求使用中斷。例如:

    • 輪詢方式:在?lv_timer_handler()?中調用?lv_indev_read()

    • 中斷方式:在觸摸屏中斷中標記事件,然后在?lv_timer_handler()?中處理。

因為需要用到systicks作為lvgl時基函數的基本盤,所以你freertos配置systicks時最好為1ms也就是時間片長短哪里的配置綜合結果要為每1ms systicks觸發一次


4.?LVGL 的優化:減少輪詢開銷

  • 臟區域機制(Dirty Area):LVGL 只會重繪屏幕上發生變化的區域,而不是全屏刷新,大幅降低 CPU 負載。

  • 事件驅動回調:用戶可以為 UI 元素(如按鈕)注冊回調函數,僅在事件發生時觸發邏輯,避免不必要的輪詢計算。

  • 定時器精度控制:通過調整?lv_timer_handler()?的調用頻率,平衡響應速度和 CPU 占用率。


5.?對比 FreeRTOS 的任務調度

  • FreeRTOS 的任務:基于優先級搶占,依賴調度器(如 PendSV 中斷)切換任務。

  • LVGL 的輪詢:依賴開發者主動調用?lv_timer_handler(),本質上是一個“協作式”任務。

  • 關鍵區別:LVGL 不直接依賴硬件中斷,而是通過任務調度間接實現“偽實時性”。


6.?你的推測是否正確?

  • 正確部分

    • LVGL 確實依賴輪詢(lv_timer_handler()),而非硬件中斷。

    • 不調用?lv_timer_handler()?會導致 LVGL 無法工作。

  • 需要補充的細節

    • LVGL 的輪詢是協作式的,需要開發者將?lv_timer_handler()?嵌入到主循環或任務中。

    • FreeRTOS 的任務調度和 LVGL 的輪詢是互補的,前者管理多任務,后者管理 UI 邏輯。


7.?實際項目中的建議

  • 調用頻率:根據 UI 復雜度調整?lv_timer_handler()?的調用間隔(通常 5~50ms)。

  • 任務優先級:在 FreeRTOS 中,為 LVGL 任務分配中低優先級,避免阻塞關鍵任務。

  • 輸入設備優化:如果使用觸摸屏,可以在硬件中斷中標記觸摸事件,然后在?lv_timer_handler()?中批量處理,減少響應延遲。

1.?LVGL 的定時器機制

  • LVGL 內部有一個定時器系統,lv_timer_handler()?是這個系統的核心函數。它負責處理所有與時間相關的任務,比如動畫、屏幕刷新、輸入設備的狀態檢測等。

  • ?lv_timer_handler()?函數必須定期調用,否則 LVGL 的定時器系統將無法正常工作,導致動畫停止、輸入設備無響應等問題。這是因為 LVGL 的定時器系統是基于輪詢的,而不是基于中斷的。

  • 在 FreeRTOS 中,你可以在一個任務中定期調用?lv_timer_handler(),比如每隔幾毫秒調用一次。這個任務可以是一個低優先級的任務,確保它不會影響其他高優先級任務的執行。

2.?LVGL 的輸入設備處理

  • LVGL 通過?lv_indev_read()?函數來讀取輸入設備(如觸摸屏、按鍵等)的狀態。這個函數通常會在?lv_timer_handler()?中被調用。

  • “持續監測觸摸屏有沒有被按下”實際上是通過定期調用?lv_indev_read()?來實現的。LVGL 并不會像 FreeRTOS 的任務調度那樣實時監測輸入設備,而是通過輪詢的方式來獲取輸入設備的狀態。

  • 當?lv_timer_handler()?被調用時,它會檢查輸入設備的狀態,并根據這些狀態更新 UI。例如,如果檢測到觸摸屏被按下,LVGL 會更新相應的 UI 元素(如按鈕的狀態)。

3.?LVGL 與 FreeRTOS 的協同工作

  • FreeRTOS 的任務調度是基于優先級的,高優先級的任務會搶占低優先級的任務。LVGL 的?lv_timer_handler()?通常在一個低優先級的任務中運行,確保它不會影響其他高優先級任務的執行。

  • 你提到的“類似 PendSV 的機制”在 LVGL 中并不存在。LVGL 的定時器系統和輸入設備處理是基于輪詢的,而不是基于中斷的。PendSV 是 FreeRTOS 用于任務切換的中斷,而 LVGL 的定時器系統是通過定期調用?lv_timer_handler()?來實現的。

4.?LVGL 的 UI 更新機制

  • 當你添加 UI 部件(如按鈕、標簽等)時,LVGL 會將這些部件添加到顯示列表中。lv_timer_handler()?會定期檢查這些部件的狀態,并根據需要更新顯示。

  • 如果觸摸屏被按下,LVGL 會檢測到這個事件,并更新相應的 UI 部件(如改變按鈕的顏色、觸發回調函數等)。這些更新操作通常是在?lv_timer_handler()?中完成的。

5.?總結

  • LVGL 的運行機制是基于輪詢的,而不是基于中斷的。它通過定期調用?lv_timer_handler()?來處理定時器、輸入設備和 UI 更新。

  • FreeRTOS 的任務調度機制與 LVGL 的定時器系統可以協同工作。你可以在 FreeRTOS 的一個任務中定期調用?lv_timer_handler(),確保 LVGL 的正常運行。

  • LVGL 并不會像 FreeRTOS 的任務調度那樣實時監測輸入設備,而是通過輪詢的方式來獲取輸入設備的狀態,并在?lv_timer_handler()?中處理這些狀態。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72317.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

達夢數據庫授權給某個用戶查詢其他指定用戶下所有表的權限

方法1: 新版本有一個數據庫參數 GRANT_SCHEMA,表示是否開啟授予和回收模式權限功能。0:否;1:是 此參數為靜態參數,默認是0,將改參數修改為1后,重啟數據庫生效。 將參數修改為1 S…

人大金倉國產數據庫與PostgreSQL

一、簡介 在前面項目中,我們使用若依前后端分離整合人大金倉,在后續開發過程中,我們經常因為各種”不適配“問題,但可以感覺得到大部分問題,將人大金倉視為postgreSQL就能去解決大部分問題。據了解,Kingba…

Python之參數星號(*)使用筆記

背景 在學習python時發現方法調用和方法定義會經常發現有帶星號的標記,為了弄明白是怎么使用的。特此做個筆記。 一、參數符號對比速查表 符號類使用場景作用描述示例無符號函數定義/調用普通位置參數或關鍵字參數.def func(a, b)*函數定義收集多余位置參數為元組…

使用haproxy實現MySQL服務器負載均衡

一、環境準備 主機名IP地址備注openEuler-1192.168.121.11mysql-server-1openEuler-2192.168.121.12mysql-server-2openEuler-3192.168.121.13clientRocky-1192.168.121.51haproxy 二、mysql-server配置 [rootopenEuler-1 ~]# yum install -y mariadb-server [rootopenEuler…

Python與Web3.py庫:構建去中心化應用的未來

Python與Web3.py庫:構建去中心化應用的未來 在區塊鏈的世界里,“去中心化”是最核心的理念之一,它賦予了用戶更多的控制權和自由,消除了傳統中心化系統中的單點故障和信任問題。而在這場技術革命中,Web3.0無疑是最受矚…

對“預訓練”的理解

預訓練有什么用 傳統的機器學習是偏數學的,對數據的量不做過多要求,而深度學習的項目通常是有大量的數據可供使用。 在平常的任務或者項目中,我們可能并沒有大量數據,只有少量數據,在這時我們就可以通過“借用”有大…

VMware Ubuntu 共享目錄

在VMware中掛載Ubuntu共享目錄需要以下步驟,分為設置共享文件夾和在Ubuntu中掛載兩部分: 一、VMware 設置共享文件夾 關閉Ubuntu虛擬機 在配置前,建議先關閉虛擬機(若已運行需關閉,部分VMware版本支持熱添加&#xff0…

AF3 crop_chains函數解讀

AlphaFold3 feature_processing_multimer模塊的crop_chains函數的功能是對多條鏈的蛋白質結構預測任務中的MSA(多序列比對)特征和模板特征進行裁剪(cropping)。裁剪的目的是為了控制輸入模型的MSA序列數量和模板數量,以適應模型的輸入限制或優化計算效率。 源代碼: def…

Java基礎-數組,集合創建方式

Java 中 new 關鍵字的作用 在 Java 中,new 關鍵字用于 在堆內存中分配空間 并創建對象。 數組 和 集合 在 Java 中都是對象,因此必須使用 new 來創建實例。Java 和 C 之間的主要區別在于 內存管理 和 對象的創建方式。 Java 與 C 中數組 & 集合的創…

LeeCode題庫第三十九題

39.組合總和 項目場景: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同…

大模型應用案例 | 大模型+金融運維,擎創攜手某證券創新運維能力新范式

一、當大模型遇上金融運維:一場讓告警處理“脫胎換骨”的變革 2022年底,ChatGPT的橫空出世讓AI技術徹底出圈;短短兩年后,大模型已悄然潛入金融行業的“心臟地帶”——運維系統。面對指數級暴增的告警信息、碎片化的處理流程&#…

【MongoDB】在Windows11下安裝與使用

官網下載鏈接:Download MongoDB Community Server 官方參考文檔:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 選擇custom類型,其他默認 注意,此選…

阿里云輕量級服務器通過寶塔安裝PgVector要點

設置環境變量: export PG_HOME/www/server/pgsql export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/www/server/pgsql/lib export PG_CONFIG/www/server/pgsql/bin/pg_config export PGDATA/www/server/pgsql/data PATH$PATH:$HOME/.local/bin:$HOME/bin:$PG_HOME/bin ali…

OpenSSL 基礎使用流程

理解 OpenSSL 的基礎使用流程是學習如何進行安全通信的關鍵,特別是在實現 SSL/TLS 連接時。以下是 OpenSSL 基礎使用流程的一個簡要總結,并附上一個簡單的示例代碼,幫助你理解如何通過 OpenSSL 建立一個基本的安全通信連接。 OpenSSL 基礎使…

什么是最終一致性,它對后端系統的意義是什么

最終一致性(Eventual Consistency)是分布式系統中的一種一致性模型。與傳統的強一致性模型不同,最終一致性并不要求系統在任何時刻都保持一致,而是保證在足夠的時間后,所有節點的數據最終會達到一致的狀態。換句話說,系統允許短時間內出現數據的不一致性,但最終會通過某…

SQL命令詳解之增刪改數據

目錄 簡介 1 添加數據 1.1 基礎語法 1.2 SQL 練習 2 修改數據 2.1 基礎語法 2.2 SQL 練習 ?3 刪除數據 3.1 基礎語法 3.2 SQL 練習 總結 簡介 在數據庫操作中,增、刪、改是最基礎的操作,它們通常對應著SQL中的INSERT、DELETE和UPDATE命令。…

std::allocator_traits 能做但 std::allocator 不能的事情

🌟 std::allocator_traits 能做但 std::allocator 不能的事情 1?? 適配自定義分配器 假設你要實現一個內存池 MyAllocator,而 STL 容器默認使用的是 std::allocator。 如果你希望 STL 容器可以使用你的 MyAllocator,你 不能直接用 std::a…

QT——c++界面編程庫

非界面編程 QT編譯的時候,依賴于 .pro 配置文件: SOURCES: 所有需要參與編譯的 .cpp 源文件 HEADERS:所有需要參與編譯的.h 頭文件 QT:所有需要參與編譯的 QT函數庫 .pro文件一旦修改,注意需要鍵盤按 ctrls 才能加載最新的配置文…

基于專利合作地址匹配的數據構建區域協同矩陣

文章目錄 地區地址提取完成的處理代碼 在專利合作申請表中,有多家公司合作申請。在專利權人地址中, 有多個公司的地址信息。故想利用這里多個地址。想用這里的地址來代表區域之間的專利合作情況代表區域之間的協同、協作情況。 下圖是專利合作表的一部分…

汽車小助手智能體

汽車小助手:智能驅動汽車服務新體驗 鏈接:文心智能體平臺AgentBuilder | 想象即現實 文心智能體平臺AgentBuilder,是百度推出的基于文心大模型的智能體平臺,支持廣大開發者根據自身行業領域、應用場景,選取不同類型的…