1

私はこのような2つの構造体を持っています

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;
}

ただし、コード segfaults (コード内のコメントを参照)。rb->size が実際に配置したい場所を指していることを gdb で確認しました。はい、その場所が利用可能です (BeagleBone PRU の共有 RAM)。RB_UTILS_SIZEUSERSPACE_OFFSETおよび同類は、他の場所で定義された単なる16進アドレスです。

何が問題なのか、私はとても興奮しています。

4

1 に答える 1

1

私は特に BeagleBoard に精通しているわけではありませんが、Linux では、最初にカーネルから RAM にアクセスしないと、プロセスから RAM にアクセスできません。通常、mmap を使用してメモリにアクセスします。この呼び出しは、アプリケーションで使用するメモリへのポインタを返します。これは役立つかもしれません:

Linux in C で共有メモリを使用する方法

malloc でメモリを取得する代わりに、その特定のアドレスを使用しようとしている理由はありますか?

于 2013-04-18T15:01:43.213 に答える