ulog的互斥信号量锁死

发布于 2021-01-07 09:02:40

我用STM32运行RT-Thread nano3.13版本,其中使用了ulog组件,运行了十几个线程,很多线程使用了LOG_D,LOG_HEX打印,包括定时器,硬件中断中,现在遇到了诡异的问题:

产品运行几个小时后会出现死机状况,经过shell查看,原因是线程5没有释放ulog.output_locker这个互斥信号量,导致其它需要打印的线程全部挂起,包括ulog输出线程也挂起了,中断中打印是直接输出的,是可以输出的,其它没有打印的线程则运行正常,比如shell线程可以正常运行,其中线程5也就是调用了LOG_D,LOG_HEX打印了两条信息,在挂掉前这两条信息是有输出,此后这个互斥信号量一直被这个线程5占用了,线程5能够运行,其它有打印的前程全部挂起,我很困惑

  1. 线程5调用了LOG_D,LOG_HEX打印,这个打印完后调用output_unlock函数ulog.output_locker会释放啊,为什么没有释放呢,这让我很是困惑
  2. 有哪些可能会造成这种情况,有可能是我哪里使用不当吗?
  3. 不会是有bug吧,是互斥信号量有问题,还是ulog有问题?想想都可怕

有偿解决这个问题,希望大家指点,WX:18688455698

/××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
谢谢各位的回答

那个ISR是打开了的,现在最新的调试发现ulog打印完后调用的unlock函数中释放互斥信号量,出现释放失败的情况
001.png
这怎么可能会出现这种情况啊?

查看更多

关注者
1
被浏览
340
8 个回答
flyboy
flyboy 2021-01-07

如果某一线程在打印过程中被其他线程suspend或者delete也会出现这个问题。可以检测下应用,有没有使用这两个api。

ylz0923
ylz0923 2021-01-07

image.png
请检查这个宏有没有打开

HappyTime
HappyTime 2021-01-07

image.png
是因为这个条件返回的错误嘛?错误码 -1

帅金泉
帅金泉 2021-01-07

因为lock和unlock是成对使用的,调用unlock时,这个互斥信号量肯定是被自己占用的,难道这个thread不是当前跑的线程?

答案在风中飘
答案在风中飘 认证专家 2021-01-07

会不会你系统还没跑起来就操作mutex了

Cfly
Cfly 认证专家 2021-01-11

在 console_be 里面把它的outpout中 rt_hw_console_output(log) 替换为 rt_kprintf("%.*s", len, log);

whj467467222
whj467467222 2021-01-15

楼主的问题找到原因了吗?

iamyhw
iamyhw 2021-01-15

可能内存泄露?,有没有调用一些库函数,又不确定库函数造成的结果。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览