2013-04-18 59 views
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; 
} 

但是,代码段错误(请参阅代码中的注释)。我用gdb检查过rb-> size确实指向了我想放置的位置,是的,该位置可用(BeagleBone PRU上的共享ram)。 RB_UTILS_SIZEUSERSPACE_OFFSET等只是其他地方定义的十六进制地址。

我对这可能是什么问题颇感兴趣。

+1

如果您尝试直接分配该内存地址,它会工作吗?例如:*((unsigned int *)(RB_UTILS_SIZE + USERSPACE_OFFSET)= size; – FazJaxton

+0

现在我在调用rbInit()的行的main()中添加了段错误(我将你的直接赋值行添加为rbInit中的第一行) ))这意味着我不能写入这个地址,尽管控件甚至没有输入rbInit(),但它只是在main中进行了段错误,而且我已经多次检查了TFM中的内存映射。事实上,我已经使用过这个地址,并且成功了。 – kbau

+0

你能告诉我们你的指针,const等的实际值吗?? –

回答

1

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

How to use shared memory with Linux in C

有你试图使用该特定地址,而不是刚开内存使用malloc理由吗?

+0

姗姗来迟,但澄清任何ne阅读这个讨论:如果我没有记错,我试图访问处理器中的一个特殊位,它在实时单元和主存储器之间共享。根据与应用程序相关的一些数学算法,我想将一些数据传递给来自SPI链接的用户空间并进行实时处理(在熟悉BeagleBone和/或其处理器的PRU中)。 无论如何,有人更多地参与了这个项目,并且更熟悉C和硬件,写了一个非常整洁的解决方案,并且我搬到了另一所大学。 – kbau