金牌会员
- 积分
- 1039
- 金钱
- 1039
- 注册时间
- 2020-7-21
- 在线时间
- 258 小时
|
本帖最后由 DFY 于 2021-3-8 18:19 编辑
基于正点原子的探索者FreeRTOS/UCOSIII/LVGL工程上面移植的
步骤:1.添加lv_tick_inc 2.建立任务循环调用lv_task_handler()
LVGL需要一个心跳,通过在定时器中断中调用lv_tick_inc()函数告诉LVGL的心跳时间。
lv_tick_inc()的参数代表心跳是多少ms,例如定时器是1ms产生中断的,那么lv_tick_inc(1);
原子裸机实验是通过1ms定时调用lv_tick_inc(1)就可以了。那么在操作系统中如何调用?
了解操作系统的开发人员知道,一般操作系统使用滴答定时器中断提供心跳给操作系统。
这样我们可以在滴答定时器中断里面调用lv_tick_inc函数提供心跳给LVGL。原子移植的
UCSOIII操作系统是5ms产生一次中断,FreeRTOS是1ms产生一次中断,那么它们在滴答
中断分别是lv_tick_inc(5) 和 lv_tick_inc(1)。
有了心跳,接着建立一个任务里面循环调用lv_task_handler(),延时5ms。(官方说计时并不严格,但应保持大约5毫秒,以保持系统响应速度)
一、UCOSIII:
1.delay.c
void SysTick_Handler(void)
{
if(delay_osrunning==1) //OS开始跑了,才执行正常的调度处理
{
OSIntEnter(); //进入中断
OSTimeTick(); //调用ucos的时钟服务程序
lv_tick_inc(5); // 提供心跳给LVGL
OSIntExit(); //触发任务切换软中断
}
}
2.maic.c文件
//任务优先级
#define LVGL_TASK_PRIO 4
//任务堆栈大小
#define LVGL_STK_SIZE 512
//任务控制块
OS_TCB LVGLTaskTCB;
//任务堆栈
CPU_STK LVGL_TASK_STK[LVGL_STK_SIZE];
//任务函数
void LVGL_task(void *p_arg);
void LVGL_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
//通过TEST_NUM的值来选择运行不同的例程
#if(TEST_NUM==1)
demo_create();
#elif(TEST_NUM==2)
lv_test_theme_1(lv_theme_night_init(210, NULL));
#else
lv_test_theme_2();
#endif
while(1)
{
tp_dev.scan(0);
lv_task_handler();
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时5ms
}
}
二、FreeRTOS:
1.delay.c
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
lv_tick_inc(1); // 提供心跳给LVGL
xPortSysTickHandler();
}
}
2.maic.c文件
//任务优先级
#define LVGL_TASK_PRIO 3
//任务堆栈大小
#define LVGL_STK_SIZE 512
//任务句柄
TaskHandle_t LVGLTask_Handler;
//任务函数
void LVGL_task(void *pvParameters);
#define TEST_NUM 3 //1,2,3分别对应三个演示例程
//LVGL任务函数
void LVGL_task(void *pvParameters)
{
//通过TEST_NUM的值来选择运行不同的例程
#if(TEST_NUM==1)
demo_create();
#elif(TEST_NUM==2)
lv_test_theme_1(lv_theme_night_init(210, NULL));
#else
lv_test_theme_2();
#endif
while(1)
{
tp_dev.scan(0);
lv_task_handler();
vTaskDelay(5);
}
}
因为工程是在操作系统上面添加LVGL代码的,具体的添加步骤就不详细说了
(可以参考 操作系统移植教程 和 LVGL裸机移植教程 )
在这里提一下:
①任务的堆栈要开大一点,例如512,不然会死机。
②官方说LVGL线程是默认不安全的,如果涉及多个任务调用LVGL函数,会出现问题,要加互斥锁。
lv_tick_inc说明:https://docs.lvgl.io/latest/en/html/porting/tick.html#api
线程不安全:https://docs.lvgl.io/latest/en/h ... l#tasks-and-threads
lv_lv_task_handler说明:https://docs.lvgl.io/latest/en/html/porting/task-handler.html
开发手册:
littleVGL开发手册指南.rar
(15.57 MB, 下载次数: 810)
|
|