我有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;
}
然而,代码段错误(请参阅代码中的注释)。我已经用gdb检查过rb->尺寸确实指向我要放置它的位置,是的,该位置是可用的(BeagleBone PRU上的共享ram)。 RB_UTILS_SIZE
,USERSPACE_OFFSET
等等只是十六进制地址#defined在别处。
我很担心可能出现的问题。
答案 0 :(得分:1)
我并不是特别熟悉BeagleBoard,但是在Linux中,如果没有首先从内核访问RAM,就无法从进程访问RAM。通常,您将使用mmap来访问内存,并且调用将返回指向内存的指针,供您在应用程序中使用。这可能会有所帮助:
How to use shared memory with Linux in C
您是否有理由尝试使用该特定地址而不是仅使用malloc获取内存?