首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C p_thread:分段故障

C p_thread:分段故障
EN

Stack Overflow用户
提问于 2018-09-07 04:24:36
回答 1查看 37关注 0票数 0

我正在尝试实现一个循环缓冲区,以便从加速度计获取数据并将信息导出到csv。加速度计的读数必须有一个恒定的周期。我使用p_thread同时运行读取和导出功能,但它给出了一个分段错误。此外,我不确定是否可以使用p_thread导出多个值。你能帮我解决我的问题吗?

#include <stdio.h>
#include "MPU-9150.h"
#include <stdint.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>

#define nBuff   32

struct thread_data{
   double ax_buff[nBuff];
   double ay_buff[nBuff];
   double gz_buff[nBuff];
   int n_int;
   int n_save;
};

void *reader( void *threadarg) {
    int ret;
    struct thread_data *my_data;
    my_data = (struct thread_data *) threadarg;
    time_t usecs = 0.005; // 0.005 seconds
    while(1) {
        time_t ustartTime = time(NULL);
        while (time(NULL) - ustartTime == usecs) {
            if (my_data->n_int + 1 != my_data->n_save) {
                ret = imupi_read( my_data->ax_buff[my_data->n_int], my_data->ay_buff[my_data->n_int], my_data->gz_buff[my_data->n_int] );
                if ( ret )  {
                    mpu_read_error(ret);
                }
            my_data->n_int = (my_data->n_int+1) % nBuff;
            }
        }
    }
}

void main( void ) {
    int ret;
    // Set acquisition timer
    struct thread_data data;
    pthread_t my_thread;

    // Initialization of the MPU-9150
    if ( ret = imupi_init( ) )  {
        mpu_init_error(ret);
    }

    //Open Data File
    /*FILE *fid = fopen("mpu_cal.csv", "w");
    if (fid == NULL) {
        perror("Error opening file\n");
        exit(1);
    }*/

    if (pthread_create(&my_thread, NULL, reader, (void *) &data)) {
        fprintf(stderr, "Error creating thread\n");
        exit(1);
    }

    // Set full timer
    time_t secs = 30; // 30 seconds
    time_t startTime = time(NULL);
    while (time(NULL) - startTime < secs) {     

        if (data.n_save != data.n_int) {
            printf( "%f,%f,%f\n", data.ax_buff[data.n_save], data.ay_buff[data.n_save], data.gz_buff[data.n_save]);
            //fflush(stdout);
            data.n_save = (data.n_save+1) % nBuff;
        }
    }
    //fclose(fid);
    exit(1);
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-07 07:48:16

您没有初始化data.n_intdata.n_save。最简单的修复方法是在声明中添加一个初始化器:

struct thread_data data = { .n_int = 0, .n_save = 0 };

此外,您正在将double值传递给imupi_read(),而它似乎应该以指针代替:

ret = imupi_read(&my_data->ax_buff[my_data->n_int],
    &my_data->ay_buff[my_data->n_int], &my_data->gz_buff[my_data->n_int]);

您将面临的另一个问题是,在常见平台上,time_t是整型类型,因此将0.005赋值给usecs只会将其设置为零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52211672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档