lvgl需要系統滴答聲(心跳)才能知道動畫和其他任務的經過時間,所以我們必須要配置好lvgl的心跳。
要處理lvgl的任務我們需要定期調用 lv_task_handler(任務管理器),及時我們沒有使用到lvgl的任務也需要配置好lvgl的任務管理器,因為lvgl庫本身就用到了任務管理器,除非我們對lvgl進行了精簡裁剪,否則默認情況下都需要配置好任務管理器。
配置lvgl心跳(Tick)
參考lvgl中文文檔中的說明:http://lvgl.100ask.net/documentation/02_porting/05_tick.html
實現freertos中的 Tick滴答鈎子函數:void vApplicationTickHook() :
- 該函數在Tick中斷函數中調用,所以該函數的運行時間越短越好,不能加任何delay。
- 該函數調用的周期性很強(1MS),一些定時器計數器(自定義的計數器)可以在該函數里面實現
- 在
FreeRTOSConfig.h
中配置configUSE_IDLE_HOOK
為1
- 運行周期:由
configTICK_RATE_HZ
決定, 一般都設置為 1MS - 實現 void vApplicationTickHook()
void vApplicationTickHook()
{
// 告訴lvgl已經過去了1毫秒
lv_tick_inc(1);
}
配置lvgl任務管理器(Task Handler)
參考lvgl中文文檔中的說明:http://lvgl.100ask.net/documentation/02_porting/06_task-handler.html
- 設置任務並分配普通任務的最高優先級,堆棧建議設為 512;
5ms
周期執行vTaskDelayUntil
函數即可。
#define LVGL_TASK_HANDLER_PRIORITY (tskIDLE_PRIORITY + 3) // lvgl task handel
#define LVGL_TASK_HANDLER_STACK_SIZE (512)
xTaskCreate( lv_100ask_task_handler, "lvgl_task_handler", LVGL_TASK_HANDLER_STACK_SIZE, NULL, LVGL_TASK_HANDLER_PRIORITY, (TaskHandle_t *) NULL );
static portTASK_FUNCTION( lv_100ask_task_handler, pvParameters )
{
TickType_t xLastWakeTime;
const TickType_t xPeriod = pdMS_TO_TICKS( 5 );
// 使用當前時間初始化變量xLastWakeTime ,注意這和vTaskDelay()函數不同
xLastWakeTime = xTaskGetTickCount();
for(;;)
{
/* 調用系統延時函數,周期性阻塞5ms */
vTaskDelayUntil( &xLastWakeTime,xPeriod );
lv_task_handler();
}
vTaskDelete(NULL);
}
LVGL中文手冊
lvgl官方的教程是英文的,這個是我在做項目時順便做出來的中文教程站點(持續更新維護),不僅僅只是照搬lvgl官方文檔的翻譯,同時總結了我們在實際開發中遇到的各種細節,讓這個文檔更加適合我們在實際開發中的需求。
- lvgl官方原版教程: https://docs.lvgl.io
- lvgl中文教程(中文手冊):http://lvgl.100ask.net