硬汉嵌入式论坛

 找回密码
 立即注册
查看: 156|回复: 0
收起左侧

[CMSIS-Driver] CMSIS6新增了个vSrteam组件

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 6 天前 | 显示全部楼层 |阅读模式
今天刷CMSIS的Github看到新增了这么一个功能

下载.png

CMSIS-Driver中对这个组件的功能介绍:

https://arm-software.github.io/C ... ce__gr.html#details

12.png

采用固定大小数据块的虚拟流接口驱动API(cmsis_vstream.h)

vStream软件组件为使用固定大小块的数据流提供了一个抽象层。它提供标准化接口,以便与各种流设备(如传感器、摄像头、麦克风、扬声器或模拟设备)交互。支持在一个平台上无缝开发,并在另一个平台上部署。

vStream API
以下头文件定义了虚拟流接口的应用程序编程接口(API):

cmsis_vstream.h:虚拟流接口的驱动API
该驱动的实现通常是特定板级支持包(BSP)的一部分,适用于带有流设备的开发板。

驱动函数
所有驱动函数均通过vStreamDriver_t访问结构进行分组。

用户代码模板

CMSIS驱动:vStream(API):自定义组件提供了所有vStream驱动函数的桩实现。
此模板可用于为目标硬件实现vStream驱动。

默认的驱动访问结构名为Driver_vStreamDevice,但需将Device替换为具体设备名称,例如Driver_vStreamAccelerometer。更多细节请参阅vStreamDriver_t。

举例:

[C] 纯文本查看 复制代码
#include "cmsis_vstream.h"
#include "cmsis_os2.h"
#include "cmsis_compiler.h"
 
#include <stdio.h>
#include <string.h>
 
// Sensor characteristics
#define SENSOR_DATA_BYTES_PER_SAMPLE    (6U)
 
// Sensor data usage configuration
#define SENSOR_DATA_SAMPLES_PER_SLICE   (100U)
 
// Thread flag for signaling sensor data available
#define SENSOR_DATA_READY_FLAG          (1U)
 
// Raw sensor data sample structure
typedef struct {
  int16_t x;
  int16_t y;
  int16_t z;
} accelerometer_sample_t;
 
static uint8_t vstream_buf[(SENSOR_DATA_SAMPLES_PER_SLICE * SENSOR_DATA_BYTES_PER_SAMPLE) * 2] __ALIGNED(4);
 
// vStream driver
extern vStreamDriver_t     Driver_vStreamAccelerometer;
static vStreamDriver_t *ptrDriver_vStreamAccelerometer = &Driver_vStreamAccelerometer;
 
// Thread identifier
osThreadId_t threadId_threadDataProcess = NULL;
 
// Local function declaration
__NO_RETURN void threadDataProcess (void *argument);
 
 
// Function that signals thread event when data is available with vStream
static void vStreamEvent (uint32_t event_flags) {
 
  if ((event_flags & VSTREAM_EVENT_DATA) != 0U) {
    // Inform data processing thread that sensor data is available
    osThreadFlagsSet(threadId_threadDataProcess, SENSOR_DATA_READY_FLAG);
  }
}
 
// Function that initializes vStream for accelerometer
void vStreamInit (void) {
 
  ptrDriver_vStreamAccelerometer->Initialize(vStreamEvent);
  ptrDriver_vStreamAccelerometer->SetBuf(vstream_buf, sizeof(vstream_buf), SENSOR_DATA_SAMPLES_PER_SLICE * SENSOR_DATA_BYTES_PER_SAMPLE);
  ptrDriver_vStreamAccelerometer->Start(VSTREAM_MODE_CONTINUOUS);
 
  threadId_threadDataProcess = osThreadNew(threadDataProcess, NULL, NULL);
}
 
// Thread function that processes the sensor data
__NO_RETURN void threadDataProcess (void *argument) {
  accelerometer_sample_t *ptr_acc_sample;
  (void) argument;
 
  for (;;) {
    uint32_t flags = osThreadFlagsWait(SENSOR_DATA_READY_FLAG, osFlagsWaitAny, osWaitForever);
 
    if (((flags & osFlagsError)           == 0U) &&         // If not an error and
        ((flags & SENSOR_DATA_READY_FLAG) != 0U)) {         // if flag is sensor data ready
 
      // Get pointer to acquired sensor data
      ptr_acc_sample = (accelerometer_sample_t *)ptrDriver_vStreamAccelerometer->GetBlock();
 
      // Do something with sensor data, convert, copy for ML, ...
      // In this example we just print it to STDIO
      for (uint32_t i = 0U; i < SENSOR_DATA_SAMPLES_PER_SLICE; i++) {
        printf("Acc x=%i, y=%i, z=%i\r\n", ptr_acc_sample->x, ptr_acc_sample->y, ptr_acc_sample->z);
        ptr_acc_sample++;
      }
    }
 
    // Release current block for further data acquisition
    ptrDriver_vStreamAccelerometer->ReleaseBlock();
  }
}


2.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 17:24 , Processed in 0.276225 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表