解决互斥信号量同步死锁问题记录

解决互斥信号量同步死锁问题记录

使用变量在指定位置计数,查看运行次数,知道在哪一个地方阻塞

bool SysData_UpdateWagon(uint32_t mac, uint8_t track, int32_t lat, int32_t lon) {
    bool success = false;
    if (xSemaphoreTake(xDataMutex, portMAX_DELAY) == pdTRUE) {
        int i;
        for(i=0; i<g_SysData.wagon_count; i++) {
            if(g_SysData.wagons[i].mac == mac) {
				success = true;
                return success;//错误此处直接带着锁返回了,并没有运行到释放锁的位置,因此造成死锁 
				break;//正确,跳出循环,能够在后面释放锁
            }
        }
        if(!success && g_SysData.wagon_count < MAX_WAGONS) {
            int idx = g_SysData.wagon_count;
            g_SysData.wagons[idx].mac = mac;
            g_SysData.wagons[idx].track_id = track;
            g_SysData.wagons[idx].lat_x1E6 = lat;
            g_SysData.wagons[idx].lon_x1E6 = lon;
            g_SysData.wagons[idx].is_allocated = false;
            g_SysData.wagon_count++;
        }
        xSemaphoreGive(xDataMutex);
    }
    return success;
}
上面使用的互斥信号量和二值信号量的区别主要有三个:

互斥信号量和二值信号量都是有0和1两个状态,但是互斥信号量有优先级继承,比如A和B任务,优先级A>B。

当B在使用这个互斥锁,A想要使用的时候,B的优先级会被提高到和A一样高,以便于B任务迅速干完活后把锁释放,A优先级能够取锁;这样A高优先级的任务不会被低优先级任务B阻塞。

互斥信号量不能在中断中使用,因为中断用不了优先级继承。

互斥信号量有所有权限制,比如A任务取走信号量,那么只能是A来还。

posted @ 2026-01-12 20:31  Linux驱动开发  阅读(2)  评论(0)    收藏  举报