2012-01-15 15 views
3

私は組み込みのARM GNU/Linuxシステム上のユーザ空間で動作するCプログラムを開発中です。私は、charデバイスノード/ dev/fpga_sramからデータを読み込む必要があります。 Cプログラムの中で、以下に示すように、mallocを使ってバッファが割り当てられています。read()を使用したcharデバイスからのバッファへのポインタ

uint16_t *buff; 
uint32_t num = 4194304 * 3; 
buff = (uint16_t *)malloc(num * sizeof(uint16_t)); 

リード()関数を使用して、私は以下のコードで示すように、バッファの特定のインデックスにデータを読みたいです。

int ret; 
int fd; 
int ptr_loc; 

ptr_loc = 0;  
fd = open("/dev/fpga_sram", O_RDONLY); 
ret = read(fd, &(buff[ptr_loc]), 4194304 * sizeof(uint16_t)); 
close(fd); 

バッファは異なる時刻にデバイスノードの/ dev/fpga_sramから読み取っ異なるで満たされる必要があるので、私はこれをしたい理由があります。バッファサイズは読み込んだ総バイト数よりも大きいので、次に示すように、ptr_locを別のインデックスに割り当てることが予想されます。

ptr_loc = 4194304;  
fd = open("/dev/fpga_sram", O_RDONLY); 
ret = read(fd, &(buff[ptr_loc]), 4194304 * sizeof(uint16_t)); 
close(fd); 

私は、バッファに格納されたデータにアクセスしようとすると、しかし、私はセグメンテーションフォルトを受け取る:

printf("i = 0, data = %u\n", buff[0]); // this line of code causes segfault 

私はここで間違って何をやっている、それが持つデバイスノードから読み取ることが可能ですバッファ位置へのポインタ?私は、デバイスノードからの読み込みはGNU/Linuxのファイルからの読み込みに似ていると思います。

+4

mallocからの返品を確認しましたか?そしてあなたはmallocに8MバイトのRAMを持っていますか? –

+1

常に戻り値を確認することを強くおすすめします。 mallocとopen。 – mdec

+1

バッファの最後を過ぎても 'read()'していないのは確かですか? 'ptr_loc> 1'なら、あなたのように見えます。 – Dave

答えて

4

読み取りビジネスを無視して、printfがSEGVを生成する唯一の理由は、プロセスの有効メモリの外側のどこかでbuffが指すことです。だから、printf( "%p"、buff)を使って、buffがどこを指しているのかを調べ、mallocが返すアドレスを指し示すのを止めるまで、これらのコードをコードに振りかける。

+1

あなたは正しいです。この問題は、別の関数内でポインタが変更されていることに関連していました。私はいくつかのテストプログラムを書いて、上記のコードスニペットで示されているように読み込みがうまくいくことを見出しました。コード全体でprintf( "%p"、buff)を使用しました。私が作成したエラーを見つけることができました。これを指摘していただきありがとうございます。 –

関連する問題