Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于查询imu传感器数据的stm32板线程_C_Multithreading_Stm32_Imu - Fatal编程技术网

C 用于查询imu传感器数据的stm32板线程

C 用于查询imu传感器数据的stm32板线程,c,multithreading,stm32,imu,C,Multithreading,Stm32,Imu,我正在从单个stm32板查询多个imu传感器。但是,读取这些多个传感器会导致每个传感器的数据频率下降100毫秒。 我想知道是否有一种方法可以在我的代码中使用线程,以便查询可以同时进行,或者想知道是否有其他方法 while (1) { /* USER CODE END WHILE */ MX_X_CUBE_BLE1_Process(); /* USER CODE BEGIN 3 */ for(i = 0; i < NUM_MPU_DEVICES; ++i) { u

我正在从单个stm32板查询多个imu传感器。但是,读取这些多个传感器会导致每个传感器的数据频率下降100毫秒。 我想知道是否有一种方法可以在我的代码中使用线程,以便查询可以同时进行,或者想知道是否有其他方法

while (1)
  {

  /* USER CODE END WHILE */

 MX_X_CUBE_BLE1_Process();
 /* USER CODE BEGIN 3 */
 for(i = 0; i < NUM_MPU_DEVICES; ++i) {
     update_MPU_data(&mpu_devices[i]);
 }
 uint32_t timestamp = HAL_GetTick();
 for(i = 0; i < NUM_MPU_DEVICES; ++i) {
     print_MPU_data(i+1, &mpu_devices[i], timestamp);
 }
}
此外,此功能是读取传感器数据的示例

void MPU_Read_Accel_Data(MPU_DEVICE * pMPU9250)
{

  uint8_t rawData[6];  // x/y/z accel register data stored here
  int16_t tempData[3];
  // Read the six raw data registers into data array
  MPU_SPI_Read(pMPU9250, MPUREG_ACCEL_XOUT_H, 6, rawData);

  // Turn the MSB and LSB into a signed 16-bit value
  tempData[0] = ((int16_t)rawData[0] << 8) | rawData[1] ;
  tempData[1] = ((int16_t)rawData[2] << 8) | rawData[3] ;
  tempData[2] = ((int16_t)rawData[4] << 8) | rawData[5] ;

// Now we'll calculate the accleration value into actual g's
  // This depends on scale being set
pMPU9250->accelX = (float)tempData[0] * pMPU9250->accelRes;
pMPU9250->accelY = (float)tempData[1] * pMPU9250->accelRes;
pMPU9250->accelZ = (float)tempData[2] * pMPU9250->accelRes;
}
我在一个函数调用MPU芯片Select中发现了10毫秒的HAL_延迟,在取消Select中发现了10毫秒的HAL_延迟。尽管如此,我认为该延迟对于spi信号完整性是必要的,即不干扰信号

总的来说,我希望电路板每100ms输出8个传感器的数据,其中NUM_MPU_DEVICES==8。然而,输出所有8个传感器的数据大约需要800毫秒


提前感谢。

如果您不知道瓶颈在哪里,线程将不会对您有多大帮助。即使在阻塞模式下,单个mpu传感器的读数也不应超过几个us/ms。很可能您的一个函数调用等待事件处理很长时间。因此,您需要检查函数调用的运行时。为此,您可以使用HAL_GetTick函数来获取相对函数运行时值(diff)。你在投票吗?如果没有,中断是什么样子的?我怀疑瓶颈在MPU_SPI_Read()内部。@mban我已经添加了MPU_SPI_Read()代码。您的更新MPU_数据占用的时间是设备传感器数据的三倍;假设你选择的每一个芯片至少需要20毫秒,那么你总共只有60毫秒来完成这项任务。尽量减少你的电话延迟时间。因此,在不切换beetween中的芯片选择的情况下,尝试一次读取所有数据。同时,尽量将MPU芯片Select调用中的HAL_延迟时间减少到1ms。根据数据表,MPU9250的CS设置和保持时间分别为8ns和500ns@维曼是对的。10毫秒是SPI通信的永恒。SPI通常以MHz运行-CS没有理由需要10ms。此外,您需要发布所有代码。您尚未发布对HAL_SPI_Transmit()和Receive()的调用。这才是真正的交流发生的地方,在我们准确地看到发生了什么之前,我们无法准确地诊断问题。
void MPU_Read_Accel_Data(MPU_DEVICE * pMPU9250)
{

  uint8_t rawData[6];  // x/y/z accel register data stored here
  int16_t tempData[3];
  // Read the six raw data registers into data array
  MPU_SPI_Read(pMPU9250, MPUREG_ACCEL_XOUT_H, 6, rawData);

  // Turn the MSB and LSB into a signed 16-bit value
  tempData[0] = ((int16_t)rawData[0] << 8) | rawData[1] ;
  tempData[1] = ((int16_t)rawData[2] << 8) | rawData[3] ;
  tempData[2] = ((int16_t)rawData[4] << 8) | rawData[5] ;

// Now we'll calculate the accleration value into actual g's
  // This depends on scale being set
pMPU9250->accelX = (float)tempData[0] * pMPU9250->accelRes;
pMPU9250->accelY = (float)tempData[1] * pMPU9250->accelRes;
pMPU9250->accelZ = (float)tempData[2] * pMPU9250->accelRes;
}
int MPU_SPI_Read(MPU_DEVICE *pMPU9250, unsigned char reg_addr, unsigned char 
length, unsigned char *pData)
{
MPU_Chip_Select(pMPU9250);

// specifying reister address
uint8_t address;
address = reg_addr | 0x80;
uint8_t *pRegAddr = &address;
HAL_SPI_Transmit(pMPU9250->pSPIHandle, pRegAddr, 1, 10);

// reading data from register
HAL_SPI_Receive(pMPU9250->pSPIHandle, pData, length, 10);
MPU_Chip_Deselect(pMPU9250);
HAL_Delay(1);

return 0;
}