FreeRTOS+LVGL|Freertos+lvgl如何配置lvgl的心跳和任務管理器



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),一些定時器計數器(自定義的計數器)可以在該函數里面實現
  1. FreeRTOSConfig.h中配置configUSE_IDLE_HOOK1
  2. 運行周期:由configTICK_RATE_HZ決定, 一般都設置為 1MS
  3. 實現 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

  1. 設置任務並分配普通任務的最高優先級,堆棧建議設為 512
  2. 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中文教程主頁


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM