Lv_indev的探究

1 lv_indev的作用

在LittlevGL的全局设置中可以看到(如下图),lv_indev的作用是定义获取输入操作的周期,单位为毫秒。

2 效果

  • #define LV_INDEV_READ_PERIOD 10的时候,在屏幕上滑动列表,感觉滑动的效果会比较流畅
  • #define LV_INDEV_READ_PERIOD 50的时候,在屏幕上滑动列表,感觉滑动的效果有明显的卡顿感

3 实现过程

在 lv_obj.c 文件中可以找到如下定义,lv_indev的启动入口即是从这里开始

在 lv_indev.c 中可以看到 lv_indev_init()模块的初始化其实是创建了一个任务

任务唤醒周期参数LV_INDEV_READ_PERIOD 正好就是全局设置中设置好的宏定义。任务中调用的模块indev_proc_task如下所示

可以看到首先是通过indev_proc_task来获取下一个输入操作的指针,
如果指针存在,就在载入这个输入操作之前重置其句柄,随后判断如果输入操作没有被禁用,就去读这个输入操作的类型,是长按、点击、组合键盘、还是按钮的类型,并且读取输入操作获取的数据,最后结束判断后再将句柄重置一遍,再获取下一个输入操作的指针,并且标记当前输入活动为空。

下面是代码是指向下一个输入设备的操作

可以看到,如果没有指定的句柄,就直接返回输入操作的列表,否则就返回句柄中的下一个输入操作。

indev_list的值是通过lv_indev_drv_register来获取的的,如下图所示,其实也就是一个带有输入操作参数的结构体,然后其指针被付给了indev_list

而这个lv_indev_drv_registermain 函数中被加载

文章作者: Sirius65535
文章链接: http://sirius.ink/2018/04/23/lv_indev的探究/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sirius' Notes