首页 > 解决方案 > 用于 SPI 通信的互斥锁

问题描述

假设我有多个节点通过公共 MISO MOSI 通道执行 SPI 通信以及不同的 GPIO 引脚来执行芯片选择选项,如下面的类所示

#ifndef TEST_H
#define TEST_H

#include<mutex>
#include<stdint.h>

class spi
{
private:
    static std::mutex mtx;

public:
    writeSPI(int gpio, uint8_t reg, char* buf)
    {
        mtx.lock();
        //opening chip select sequence for the received gpio
        //spi sequence to write data to target
        //closing chip select sequence for the received gpio
        mtx.unlock();
    }
};
#endif

各个节点通过包含指令创建自己的类实例并调用writeSPI(int, uint8_t, char)如下所示的函数

#include "test.h"
#include <unistd.h>

int main(int argc, char* argv[])
{
    spi instance;
    while(true)
    {
        instance.writeSPI(/* required args*/);
        usleep(1000000);
    }
}

是否有可能将分配的内容buf写入错误的gpio剪辑选择?如果这是处理任务的错误方法,那么正确的选择是什么?

标签: c++mutexspi

解决方案


静态 std::mutex 将正确防止对 writeSPI(...) 的多线程访问。

但是,您不应该手动调用 lock/unlock,而是使用 std::unique_lock 来防止错误。


推荐阅读