1

我有两个这样的结构

typedef struct data {
    int datap;
    int channelNumber;
} data;

typedef struct RingBuffer {
    unsigned int *size;
    unsigned int *start;
    unsigned int *count;
    unsigned int *end;
    data *elems;
} RingBuffer;

我正在尝试使用以下方法在某个内存位置(嵌入式应用程序)初始化环形缓冲区结构:

void rbInit(RingBuffer *rb, unsigned int size) {
    //put rb into appropriate memory locations
    rb->size = (unsigned int *) (RB_UTILS_SIZE + USERSPACE_OFFSET);
    rb->start = (unsigned int *) (RB_UTILS_START + USERSPACE_OFFSET);
    rb->count = (unsigned int *) (RB_UTILS_COUNT + USERSPACE_OFFSET);
    rb->end = (unsigned int *) (RB_UTILS_END + USERSPACE_OFFSET);
    rb->elems = (data *) (RB_DATA + USERSPACE_OFFSET);

    //intialize rb parameter/pointer values
    data empty;
    empty.datap = 0;
    empty.channelNumber = 0;

    *(rb->size) = size; //SEGFAULT HERE
    *(rb->start) = 0;
    *(rb->count) = 0;
    *(rb->end) = 0; 
    *(rb->elems) = empty;
}

但是,代码段错误(请参阅代码中的注释)。我用 gdb 检查了 rb->size 确实指向我想要放置它的位置,是的,该位置可用(BeagleBone PRU 上的共享 ram)。RB_UTILS_SIZE,USERSPACE_OFFSET之类的只是十六进制地址#defined 别处。

我对可能是什么问题感到非常兴奋。

4

1 回答 1

1

我对 BeagleBoard 并不特别熟悉,但在 Linux 中,如果不先从内核访问内存,就无法从进程访问 RAM。通常,您将使用 mmap 来访问内存,并且该调用将返回指向内存的指针以供您在应用程序中使用。这可能会有所帮助:

如何在 C 中与 Linux 一起使用共享内存

您是否有理由尝试使用该特定地址而不是仅使用 malloc 获取内存?

于 2013-04-18T15:01:43.213 回答