嵌入式技术论坛
直播中

jjll652

8年用户 1399经验值
私信 关注
[问答]

请问为何薄膜键盘用了多线程后LVGL就好像不工作了

我有一个已经成功移植LVGL的工程,这个sysInit();函数的作用是启动薄膜键盘扫描线程。

已知:

薄膜键盘的按键值能正常读出(薄膜键盘扫描线程工作正常)。
问题:我只有在不调用sysInit();时屏幕能正常显示,请问这是为什么。

main.c

1.jpg

这样就能显示:

1.jpg

回帖(9)

王浩

2022-10-10 14:32:36
死循环,优先级比 main 高,rt-thread 使用宝典里有提到这种“坑”
举报

jjll652

2022-10-10 14:39:43
您好,请问是LVGL比main线程的优先级高吗?
举报

王浩

2022-10-10 14:39:54
sysinit 里面干啥了,不是起了一个键盘线程吗?线程优先级多少不是比main函数所在线程优先级高吗?而且,是不是键盘扫描时没有休眠
举报

王浩

2022-10-10 14:40:49
sysinit 里面干啥了,不是起了一个键盘线程吗?线程优先级多少不是比main函数所在线程优先级高吗?而且,是不是键盘扫描时没有休眠
举报

jjll652

2022-10-10 14:43:50
您好,请看:
在sysInit();中调用的就是图中的membraneKeyboardScanThreadInitialization()函数:
1.jpg
举报

王浩

2022-10-10 14:44:03
你这是想,有按键按下再发个 SCAN COMPLETED 事件? 然后 main 函数里等到 SCAN COMPLETED 事件后再执行 task_handler ?这样没有按键的时候 lvgl 线程就不工作了
举报

jjll652

2022-10-10 14:44:20
不是,你好像误会了,键盘扫描函数在执行完一个周期的扫描后会退出,依靠键盘扫描线程不断调用这个函数来获取按键值,函数内容请看:
2.jpg
下图中的函数就是在键盘扫描线程中不断调用的函数:
此函数在键盘扫描线程中执行完毕后就会发送一个“薄膜键盘扫描完成事件”并挂起线程,main线程收到该事件后向控制台打印按键值并调用lvtaskhandler();刷新界面,执行完毕后发送 EVENT_BEGIN 事件表示可以开始执行键盘扫描线程了
举报

王浩

2022-10-10 14:46:36
试过把 keyboardread 那个函数挪到 main 函数里吗?省掉一个线程和事件。这样能跑起来不?
键盘线程和 lvgl 线程栈看起来不少。
如果是内存被破坏了。难道是其它线程破坏了 lvgl 的内存?
你说的显示不正常是啥样的,没有显示,还是显示乱七八糟的?
举报

jjll652

2022-10-10 14:51:02
找到了开发板的原理图,发现是因为键盘扫描脚与屏幕驱动脚部分共用,导致的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分