【问题标题】:Mutex for SPI communication用于 SPI 通信的互斥锁
【发布时间】:2019-08-08 07:50:37
【问题描述】:

假设我有多个节点通过公共 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

各个节点通过include指令创建自己的类实例并调用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 剪辑选择?如果这是处理任务的错误方法,那么正确的替代方法是什么?

【问题讨论】:

  • 我在你的代码中没有看到任何线程,所以如果没有线程,那么你甚至不需要mutex,因为所有操作都会按顺序执行。
  • 多个节点将创建自己的实例,因此从技术上讲,需要由互斥体处理多个实例。
  • 我不确定我是否正确理解您的意思。一个进程中有多个spi 对象实例?还是多个进程,每个进程都有一个 spi 实例?您稍后编写代码建议,在这种情况下,单个匿名 mutex 将不起作用。如果我没记错的话,应该在 Linux 中命名为 mutex 并且应该可以工作。
  • 多个进程有自己的spi实例。目的是阻止下一个流程实例对象调用writeSPI(...)函数,直到另一个流程中存在的前一个实例对象完成该函数的整个执行。
  • 这种情况下你需要使用进程间互斥锁,我们标准库中没有,但是好像在boost中或者你可以直接使用OS函数。

标签: c++ mutex spi


【解决方案1】:

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

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

【讨论】:

  • 这个应用程序听起来像是一个微型的。我想知道他们是否会通过使用std::lock_guard 来提高性能,因为它的功能比std::unique_lock 少?
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2012-04-20
  • 2012-06-05
  • 2010-09-16
相关资源
最近更新 更多