rtx 互斥锁 锁死
你们有遇到过互斥锁,锁死的情况吗? 具体情况是? 有三个进程: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失败的原因? while(length--)
{
Usart2_SendData( data );
data++; length--;
}
length需要减两次吗 嗯嗯,笔误,只有一个,多谢多谢!
现在排查发现,出问题的时候,或者os_mut_wait没调用成功 或者执行到os_mut_release函数时,任务ID已经变了 freertos下printf 重入上锁的**:http://www.eemaker.com/freertos-printf.html 写的不错,但是情况和我的不太一样,我用的是阻塞式的 现在的故障现象就是os_mut_wait函数直接没执行,感觉程序跑到这完全乱了,后面有个while(x)循环,x=0,还能跑进while循环里面
请教下,在os_mut_wait函数,和os_mut_release函数之间,有用os_dly_wait函数,会有问题吗?
加os_dly_wait 可以,但是不能太长,如果时间长了,也会造成其他线程获取互斥锁的时间加长。 也可能造成优先级翻转的问题 感觉有些复杂
加一个互斥变量 呵呵呵
写的很不错啊
层次清晰啊
我今天也遇到这个问题,楼主有正解吗?
页:
[1]
2