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