2013-04-18 95 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