私はこのような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_SIZE
、USERSPACE_OFFSET
および同類は、他の場所で定義された単なる16進アドレスです。
何が問題なのか、私はとても興奮しています。