打印
[开发工具]

rtx 互斥锁 锁死问题

[复制链接]
1015|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
求进的心|  楼主 | 2019-11-5 23:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 求进的心 于 2019-11-5 23:15 编辑

小伙伴们,你们有遇到过互斥锁,锁死的情况吗?具体情况是这样的:
有三个进程:
A进程,优先级为10(优先级最高)
B进程,优先级为9(优先级次之)
C进程,优先级为8(优先级最低)

其中A进程和C进程,会调用串口发送函数f_uart2_send_byte,函数体如下:
f_uart2_send_byte(uint8_t * data, uint16_t length)
{
      uint32_t time_out =1000;      //1000ms超时

      os_mut_wait_(&g_uart2_mux_tx, 0xFFFF);
      while(length--)
     {
          Usart2_SendData( data );
          data++;          length--;
      }

     while(  ( SET != Usart2_GetFlagStatus(USART_FLAG_TC)  )  &&  time_out  )
    {
           os_dly_wait(1);            //sleep 1ms
           time_out--
    }

   os_mut_release(& g_uart2_mux_tx);
}


代码运行一段时间后,会出现如下情况:
进程A,一直处于WAIT_MUT的状态,优先级为10;
进程B,处于正常运行的状态,优先级为9;
进程C,处于正常运行状态,优先级为10

调试发现,进程C调用f_uart2_send_byte函数时,os_mut_release函数的返回值为OS_R_NOK,也即是解锁失败了,从而导致进程A,一直在wait,还没查出release失败的原因,有遇到类似问题的小伙伴吗?求教了!

使用特权

评论回复
沙发
ayb_ice| | 2019-11-6 08:53 | 只看该作者
while(length--)
     {
          Usart2_SendData( data );
          data++;          length--;
      }
length需要减两次吗

使用特权

评论回复
板凳
求进的心|  楼主 | 2019-11-6 09:23 | 只看该作者
ayb_ice 发表于 2019-11-6 08:53
while(length--)
     {
          Usart2_SendData( data );

嗯嗯,笔误,只有一个,多谢多谢!

使用特权

评论回复
地板
求进的心|  楼主 | 2019-11-6 10:22 | 只看该作者
现在排查发现,出问题的时候,或者os_mut_wait没调用成功,或者执行到os_mut_release函数时,任务ID已经变了

使用特权

评论回复
5
wzt19910506| | 2019-11-8 09:48 | 只看该作者
昨天才写了一篇在freertos下printf 重入上锁的**:http://www.eemaker.com/freertos-printf.html

使用特权

评论回复
6
求进的心|  楼主 | 2019-11-12 09:29 | 只看该作者
wzt19910506 发表于 2019-11-8 09:48
昨天才写了一篇在freertos下printf 重入上锁的**:http://www.eemaker.com/freertos-printf.html ...

兄弟,感谢你的帖子,认真拜读了,写的不错,但是情况和我的不太一样,我用的是阻塞式的,

使用特权

评论回复
7
求进的心|  楼主 | 2019-11-12 09:36 | 只看该作者
求进的心 发表于 2019-11-12 09:29
兄弟,感谢你的帖子,认真拜读了,写的不错,但是情况和我的不太一样,我用的是阻塞式的, ...

现在的故障现象就是os_mut_wait函数直接没执行,感觉程序跑到这完全乱了,后面有个while(x)循环,x=0,还能跑进while循环里面

使用特权

评论回复
8
求进的心|  楼主 | 2019-11-13 10:31 | 只看该作者
wzt19910506 发表于 2019-11-8 09:48
昨天才写了一篇在freertos下printf 重入上锁的**:http://www.eemaker.com/freertos-printf.html ...

请教下,在os_mut_wait函数,和os_mut_release函数之间,有用os_dly_wait函数,会有问题吗?

使用特权

评论回复
9
wzt19910506| | 2019-11-16 23:28 | 只看该作者
求进的心 发表于 2019-11-13 10:31
请教下,在os_mut_wait函数,和os_mut_release函数之间,有用os_dly_wait函数,会有问题吗? ...

加os_dly_wait 可以,但是不能太长,如果时间长了,也会造成其他线程获取互斥锁的时间加长。也可能造成优先级翻转的问题

使用特权

评论回复
10
paotangsan| | 2019-12-4 13:44 | 只看该作者
感觉有些复杂

使用特权

评论回复
11
renzheshengui| | 2019-12-4 13:46 | 只看该作者
加一个互斥变量 呵呵呵

使用特权

评论回复
12
wakayi| | 2019-12-4 13:52 | 只看该作者
写的很不错啊

使用特权

评论回复
13
wowu| | 2019-12-4 13:56 | 只看该作者
层次清晰啊

使用特权

评论回复
14
xiaoqizi| | 2019-12-4 14:04 | 只看该作者
我也学习了 呵呵

使用特权

评论回复
15
meigang1120| | 2019-12-6 14:18 | 只看该作者
我今天也遇到这个问题,楼主有正解吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

153

帖子

1

粉丝