rt-thread + lvgl :线程调用lv_task_handler() 之后,无法休眠

一、问题描述

定义了一个tui 线程用于处理lvgl 相关调度。如果在线程处理函数中,调用了lv_task_handler() ,出现两个问题:

  • 在线程处理函数中调用 rt_thread_mdelay 线程不能休眠;程序只花了几微秒,就执行完了休眠10ms 的处理。
  • 无法输入Finsh 命令查看线程信息。

如果没调用lv_task_handler(),调用rt_thread_mdelay ,线程正常休眠。Finsh 命令也能正常交互。

二、问题分析

2.1 mcu 心跳频率被修改?

一开始,我怀疑的是lv_task_handler() 修改了mcu 的心跳频率,如果心跳频率很高,例如1us 心跳一次,但是rt-thread 不知道心跳频率被改了,还是以为1ms 心跳一次,会出现类似的问题。

查看了lv_task_handler() 的源码,没发现修改mcu 的处理。

2.2 当前线程有其他唤醒源?

当前线程只是个简单的demo 程序,没有其他处理逻辑,不存在被唤醒的情况。线程中调用rt_thread_mdelay 进入休眠,并没有设置等待事件或者信号量。

三、问题解决

尝试将tui 线程的栈空间加大200个word,重新运行,运行结果符合预期。下面列一下三种情况下,tui 线程栈空间的使用情况,方便理解。

完全不加入lvgl 相关代码(栈空间是1000 bytes)

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tui        6  suspend 0x00000058 0x000003e8    08%   0x00000005 000

这个时候,栈空间最大的使用量是8%。

加入了lvgl 的初始化代码(栈空间是1000 bytes)

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tui        6  suspend 0x0000005c 0x000003e8    35%   0x00000002 000

这个时候,栈空间的最大使用量是35%。

加入了lvgl 的初始化代码+ lv_task_handler(栈空间是1800 bytes)

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tui        6  suspend 0x0000005c 0x00000708    60%   0x00000001 000

这个时候,栈空间的最大使用量是60%。栈空间大小是0x708(1800bytes)。1800 bytes * 60% = 1080 bytes 。也就是说,在栈需要1080 bytes 的时候,程序只分配了1000 bytes 的空间,导致了出现上述的异常。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdut_llkkyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值