admin管理员组

文章数量:1023838

I am cross-compiling on a Ubuntu 24.04 host for a Raspberry Pi Zero2 W. I want to be able to access data for a device on the i2c bus not only from multiple instances in the same program but also from different processes. So, I believe I need to use shared memory and I need a lock in that shared memory so only 1 instance of 1 process can communicate with the device at a time.

So, I have the following:

int shmem_fd = shm_open(shmem_fname.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
  if (shmem_fd != -1) {
    /*
     * This is the first access so size the shared memory, mmap it and initialize the data
     */
    int result = ftruncate(shmem_fd, sizeof(Lps22DeviceData));
    device_data_ = static_cast<Lps22DeviceData*>(mmap(NULL, sizeof(Lps22DeviceData), PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0));

My question is how do I initialize the lps22DeviceData in the mmap ?

It is a data only class.

class Lps22DeviceData {
 public:
  std::recursive_mutex lock_ = {};
  uint64_t read_total_ = 0;
  bool initialized = false;
  int16_t temperature_measurement_ = 0;
  time_point<system_clock> temperature_measurement_system_time_;
  time_point<steady_clock> temperature_measurement_steady_time_;
  milliseconds temperature_response_time;

  int32_t pressure_measurement_ = 0;
  time_point<system_clock> pressure_measurement_system_time_;
  time_point<steady_clock> pressure_measurement_steady_time_;
  milliseconds pressure_response_time;
};

Most of them are simple integers or time values that I can just assign to some initial values. But, I haven't figured out how to get the lock_ initialized.

    device_data_->read_total_ = 0;
    device_data_->initialized = false;
    device_data_->temperature_measurement_ = 0;
    device_data_->temperature_measurement_system_time_ = system_clock::now();
    device_data_->temperature_measurement_steady_time_ = steady_clock::now();
    device_data_->temperature_response_time = milliseconds(0);

    device_data_->pressure_measurement_ = 0;
    device_data_->pressure_measurement_system_time_ = system_clock::now();
    device_data_->pressure_measurement_steady_time_ = steady_clock::now();
    device_data_->pressure_response_time = milliseconds(0);
    device_data_->initialized = true;

I tried:

device_data_->lock_ = {};

Which seems to work in the class definition when I had this working for multiple instances in one process:

[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp: In constructor ‘Lps22::Lps22(I2cBus, uint8_t)’:
[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp:49:28: error: use of deleted function ‘std::recursive_mutex& std::recursive_mutex::operator=(const std::recursive_mutex&)’
[build]    49 |     device_data_->lock_ = {};

How do I initialize a device_data_->lock_ that ends up inside the mmap so that all processes see the lock?

Thanks

I am cross-compiling on a Ubuntu 24.04 host for a Raspberry Pi Zero2 W. I want to be able to access data for a device on the i2c bus not only from multiple instances in the same program but also from different processes. So, I believe I need to use shared memory and I need a lock in that shared memory so only 1 instance of 1 process can communicate with the device at a time.

So, I have the following:

int shmem_fd = shm_open(shmem_fname.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
  if (shmem_fd != -1) {
    /*
     * This is the first access so size the shared memory, mmap it and initialize the data
     */
    int result = ftruncate(shmem_fd, sizeof(Lps22DeviceData));
    device_data_ = static_cast<Lps22DeviceData*>(mmap(NULL, sizeof(Lps22DeviceData), PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0));

My question is how do I initialize the lps22DeviceData in the mmap ?

It is a data only class.

class Lps22DeviceData {
 public:
  std::recursive_mutex lock_ = {};
  uint64_t read_total_ = 0;
  bool initialized = false;
  int16_t temperature_measurement_ = 0;
  time_point<system_clock> temperature_measurement_system_time_;
  time_point<steady_clock> temperature_measurement_steady_time_;
  milliseconds temperature_response_time;

  int32_t pressure_measurement_ = 0;
  time_point<system_clock> pressure_measurement_system_time_;
  time_point<steady_clock> pressure_measurement_steady_time_;
  milliseconds pressure_response_time;
};

Most of them are simple integers or time values that I can just assign to some initial values. But, I haven't figured out how to get the lock_ initialized.

    device_data_->read_total_ = 0;
    device_data_->initialized = false;
    device_data_->temperature_measurement_ = 0;
    device_data_->temperature_measurement_system_time_ = system_clock::now();
    device_data_->temperature_measurement_steady_time_ = steady_clock::now();
    device_data_->temperature_response_time = milliseconds(0);

    device_data_->pressure_measurement_ = 0;
    device_data_->pressure_measurement_system_time_ = system_clock::now();
    device_data_->pressure_measurement_steady_time_ = steady_clock::now();
    device_data_->pressure_response_time = milliseconds(0);
    device_data_->initialized = true;

I tried:

device_data_->lock_ = {};

Which seems to work in the class definition when I had this working for multiple instances in one process:

[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp: In constructor ‘Lps22::Lps22(I2cBus, uint8_t)’:
[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp:49:28: error: use of deleted function ‘std::recursive_mutex& std::recursive_mutex::operator=(const std::recursive_mutex&)’
[build]    49 |     device_data_->lock_ = {};

How do I initialize a device_data_->lock_ that ends up inside the mmap so that all processes see the lock?

Thanks

本文标签: cHow to initialize values in shared memoryStack Overflow