c++ - 用于 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
剪辑选择?如果这是处理任务的错误方法,那么正确的选择是什么?
解决方案
静态 std::mutex 将正确防止对 writeSPI(...) 的多线程访问。
但是,您不应该手动调用 lock/unlock,而是使用 std::unique_lock 来防止错误。
推荐阅读
- r - 使用 dplyr 在 R 中处理数据
- java - 这个动态时间规整代码是如何工作的?
- javascript - 如何解决 TypeError: undefined is not an object (evalating 'rss.items[0].title')
- git - 导致语法冲突,在“git pull”
- reactjs - react Portal - 在模态外部单击时如何关闭模态以及如何将 ref 分配给父组件渲染模态内的模态?
- microservices - 微服务 - 系统设计 - Node.js+React 框架 + Azure 上的 Mongo DB
- android - 图像不是类型 imageprovider 动态的子类型
- go - 如何从 Telnet 会话中读取数据
- c# - 用剃须刀页面填充html表格中的特定单元格
- ubuntu - Ubuntu 上的 AWS + Remmina - Remmina 进入循环尝试重新连接