Spi方式读取imu数据问题,无法实现定频采样

我使用的是定时器中断方式读取 ,设置了一个1ms一次中断的定时器,在定时器回调函数中,每10ms通过信号量方式通知负责imu采集的线程去采集数据,在采集的执行函数前打上时间戳,采集后打上时间戳 这样作差计算的采集数据的时间差。
但是不知道这样不稳定的原因处在哪里?

void* get_imu_thread(void* args)

{

const char* id = (const char*)args;      



while(1){

    // pthread_mutex_lock(&mutex);  // 锁定互斥锁

    sem_wait(&sem_get_imu);  // 等待信号量

    memset(&IMU_Data, 0, sizeof(imu_raw_data));

    SPI_ICM42688_Data(&IMU_Data);

    static unsigned int p_time = 0;

    static int gps_time = 0;

    if (gnss_time_init) {

      gnss_time_init = 0;

      p_time = pps_time;

      gps_time = g_gnss_info.gps_weekssec;

    }

    double tmp_time = (g_running_ms - p_time) + gps_time;

    IMU_Data.time_imu = tmp_time * 1e-3 + (g_gnss_info.gpsweek * week2s);

    if ((p_time != 0)) {

      set_imu();

    }

    sem_post(&sem_set_nav);

}      

}

void time_callback(int sigum)

{

g_running_ms ++;

static int time_temp = 0;

time_temp++;

if(time_temp == 10){

    time_temp = 0;

    sem_post(&sem_get_imu);

}

}

void* get_time_thread(void* args)

{

const char* id = (const char*)args;  

// int temp = 0;

// 设置信号处理程序

struct sigaction sa;

sa.sa_flags =   SA_SIGINFO;  // SA_RESTART

sa.sa_handler = time_callback;  // 定时器触发时调用的函数

sigemptyset(&sa.sa_mask);

if (sigaction(SIGRTMIN, &sa, NULL) == -1) {

    perror("sigaction failed");

    exit(1);

}

// 创建定时器

timer_t timerid;

struct sigevent sev;

struct itimerspec its;

// 设置定时器通知方式为信号(SIGRTMIN)

sev.sigev_notify = SIGEV_SIGNAL;  // SIGEV_THREAD SIGEV_SIGNAL

sev.sigev_signo = SIGRTMIN;

// sev.sigev_notify_attributes = NULL;

sev.sigev_value.sival_ptr = &timerid;

if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {

    perror("timer_create failed");

    exit(1);

}

// 设置定时器的初始时间和间隔时间(1 毫秒)

its.it_value.tv_sec = 5;         // 初始延迟 0 秒

its.it_value.tv_nsec = 0;  // 初始延迟 1 毫秒

its.it_interval.tv_sec = 0;      // 间隔 0 秒

its.it_interval.tv_nsec = 1000000;  // 间隔 1 毫秒

// 启动定时器

if (timer_settime(timerid, 0, &its, NULL) == -1) {

    perror("timer_settime failed");

    exit(1);

}



while (1)

{

    pause();  // 等待信号

}

}
这是我的部分代码

它的表现是什么,不是很了解你的问题,如果定时器不准的话可以换个时钟源试试

并不是定时器不准哈。
定时器只是起到两个作用 1.程序运行记录运行的系统时间 2. 作为定频标志 每10ms 给imu的线程一个信号量 通知该线程获取一次imu数据

我所说的不定频 是只在读取imu数据这个线程中 每次执行读取imu数据的这个函数 执行时间不稳定 有时候1ms执行完 有时候2ms 甚至有时候10ms ,这明显很不正常 但是我不知道原因是什么

或者能不能把spi频率调高点试试?

提高了 没有作用 之前这款imu 我在STM32上开发过 读取一次数据大概需要400us 。现在没想到这样了:rofl: