【发布时间】: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函数。