嵌入式技术william hill官网
直播中

河神大人

9年用户 1528经验值
擅长:电源/新能源
私信 关注
[问答]

在线程中获取互斥量导致程序卡死的原因?如何修改?

1、对于互斥量不能再中断中使用的限制,我已经明白。
2、现在开了一个RS232的接收线程,RS232接收是中断接收,在线程中去轮询RS232的接收,如果接收到数据,则会执行获取互斥的操作,但是执行该操作会导致程序跑飞(调试时看上去是跑飞了,因为SP和PC都被复位了),函数信息如下:
1.png

3、配置RS232接收的函数如下:
2.png

我想请教下,这是什么原因?应该如何修改呢?

回帖(1)

茶壶茶茶

2023-10-11 11:38:05
可能是由于你在轮询RS232接收时,没有正确地处理互斥量。在获取互斥量之前,必须先初始化互斥量,并在调用该函数之前将互斥量锁住。你还需要确保在处理完RS232接收数据后解锁互斥量。

正确的代码应该类似于以下示例:

// 定义互斥量
pthread_mutex_t rs232_mutex = PTHREAD_MUTEX_INITIALIZER;

// 在线程中轮询RS232接收
void* rs232_receive_thread(void* arg)
{
    // 先锁住互斥量
    pthread_mutex_lock(&rs232_mutex);

    while(1)
    {
        // 接收RS232数据,并根据需要处理
        unsigned char data = receive_data_from_RS232();

        // 处理完数据后解锁互斥量
        pthread_mutex_unlock(&rs232_mutex);
    }

    return NULL;
}

在处理互斥量时,最好使用pthread_mutex_lock和pthread_mutex_unlock函数的返回值来判断是否成功。如果返回值为非零,则表示操作失败,需要进行错误处理。

如果问题仍然存在,可以尝试使用线程同步工具,如条件变量或信号量,来确保线程之间的同步。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分