在串口执行shell命令导致死锁。rtmutex相关故障排查方法。

串口执行命令导致阻塞的流程是这样的,假设有如下场景:

1) 优先级为60的1041(0x411)号线程(命令解析线程), 解析命令后,执行system时产生缺页(c库代码段缺页),这个时候
1041抓到了mmap_sem,执行请求调页(可能比较耗时),接着do_fork会将进程的页表全部设为只读,以引发写时复制;
2)优先级为88的MediaThd 线程, 由于代码段被改成只读,也发生了缺页;
3) 优先级为87的IdleTask_Cpu线程,由于代码段被改成只读,也发生了缺页;
4)1041的请求调页执行完,尝试按照优先级由高到低顺序依次唤醒阻塞队列里的各个线程;
5)假如1041线程,先唤醒MediaThd1, 然后MediaThd1执行完缺页流程再去唤醒IdleTask_Cpu1,同时

   把锁持有者(pending owner)强行置为IdleTask_Cpu1。

   由于这两个线程在一个cpu上,并且前者优先级比后者高,

   因此后者一直得不到调度,同时idle的优先级也比较高,其他同一个进程下的其他线程无法偷到此锁,导致系统中连环死锁

6)可以把idle的任务优先级往下调整至最低来避免此问题(媒体面设置了排他,idle下调优先级应该无影响)

你可能感兴趣的:(c,shell,System,任务)