質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

セグメンテーション違反

セグメンテーション違反とは、ソフトウェア実行時に発生するエラーのひとつであり、許可されていないメモリにアクセスしたときに起きます。しばしば、ポインタの不適切な使用、またはバッファオーバーフローによって起こります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

解決済

【C言語】ループの途中でSegmentation faultが出る

BOLTE
BOLTE

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

セグメンテーション違反

セグメンテーション違反とは、ソフトウェア実行時に発生するエラーのひとつであり、許可されていないメモリにアクセスしたときに起きます。しばしば、ポインタの不適切な使用、またはバッファオーバーフローによって起こります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

3回答

0リアクション

0クリップ

2200閲覧

投稿2021/02/21 10:02

状況と質問

Cで書かれたあるソースコード(念のため一番下に載せておきます)をコピペして動かしたいのですが、セグフォのエラーが出てしまいました。そこで最低限のものを書いて実験したところ、ループの途中でセグフォが出ていることがわかりました。

どうしてループの途中で、しかも決まった回数のときにsegmentation faultになるのでしょうか? またそれを解決する方法はありますか?

初歩的な質問かもしれないことは承知ですが、調べるとっかかりになるワードだけでも構いませんので、ご回答いただければ助かります。

コード

C

// test2.h #include <stdio.h> struct udmabuf{ char name[128]; unsigned char * buf; };

C

// test1.c #include <stdio.h> #include "test2.h" int main(){ struct udmabuf intake_buf; float a[32 * 32]; int i, j; // 行列の添字 int m, n; // 行列のサイズ m = n = 32; for (i = 0; i < m*n; i++){ // 行列を初期化 a[i] = i / 2.0; } int count = 0; for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ ((float *)(intake_buf.buf))[i * n + j] = a[i * n + j]; printf("%d\n", count); // 420までで止まる。なぜ?? count = count + 1; } } return 0; }

bash

# 実行結果 $ gcc test1.c && ./a.out 1 2 3 ... 418 419 420 Segmentation fault: 11

元にしている実際に動かしたいコード

c

// dma_simple.h #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/types.h> #include <sys/mman.h> #define DMA_INTAKE_DMACR (0x0000) #define DMA_INTAKE_DMASR (0x0004) #define DMA_INTAKE_SA (0x0018) #define DMA_INTAKE_LENGTH (0x0028) #define DMA_OUTLET_DMACR (0x0030) #define DMA_OUTLET_DMASR (0x0034) #define DMA_OUTLET_DA (0x0048) #define DMA_OUTLET_LENGTH (0x0058) #define DMA_CR_RS (1u<<0) #define DMA_CR_RESET (1u<<2) #define DMA_SR_HALTED (1u<<0) #define DMA_SR_IDLE (1u<<1) #define DMA_SR_IOC_Irq (1u<<12) #define DMA_SR_ERR_Irq (1u<<14) static inline uint32_t regs_read32 (void* addr){ volatile uint32_t* regs_addr = (uint32_t*)(addr); return *regs_addr; } static inline void regs_write32 (void* addr, uint32_t data){ volatile uint32_t* regs_addr = (uint32_t*)(addr); * regs_addr = data; } static inline void dma_reset (void* regs){ regs_write32(regs+DMA_INTAKE_DMACR, DMA_CR_RESET); while(regs_read32(regs+DMA_INTAKE_DMACR) & DMA_CR_RESET); // この構文謎い regs_write32(regs+DMA_OUTLET_DMACR, DMA_CR_RESET); while(regs_read32(regs+DMA_OUTLET_DMACR) & DMA_CR_RESET); } static inline void dma_setup ( void* regs, unsigned long src_addr, unsigned long dst_addr ){ regs_write32(regs + DMA_OUTLET_DMACR, DMA_CR_RS); regs_write32(regs + DMA_OUTLET_DA , dst_addr); regs_write32(regs + DMA_INTAKE_DMACR, DMA_CR_RS); regs_write32(regs + DMA_INTAKE_SA , src_addr); } static inline void dma_intake_start (void* regs, unsigned int xfer_size){ regs_write32(regs + DMA_INTAKE_LENGTH, xfer_size); } static inline void dma_outlet_start (void* regs, unsigned int xfer_size){ regs_write32(regs + DMA_OUTLET_LENGTH, xfer_size); } static inline void dma_wait_irq (void* regs){ while (~regs_read32(regs + DMA_INTAKE_DMASR) & DMA_SR_IOC_Irq); while (~regs_read32(regs + DMA_OUTLET_DMASR) & DMA_SR_IOC_Irq); } static inline void dma_clear_status (void* regs){ regs_write32(regs + DMA_INTAKE_DMASR, DMA_SR_IOC_Irq | DMA_SR_ERR_Irq); regs_write32(regs + DMA_OUTLET_DMASR, DMA_SR_IOC_Irq | DMA_SR_ERR_Irq); } struct udmabuf { char name[128]; int file; unsigned char* buf; unsigned int buf_size; unsigned long phys_addr; unsigned long debug_vma; unsigned long sync_mode; }; int udmabuf_open (struct udmabuf* udmabuf, const char* name); int udmabuf_close (struct udmabuf* udmabuf);

c

// dma_simple.c #include "dma_simple.h" int udmabuf_open (struct udmabuf* udmabuf, const char* name){ char file_name[1024]; int fd; unsigned char attr[1024]; strcpy(udmabuf -> name, name); udmabuf -> file = -1; // phys_addr sprintf(file_name, "/sys/class/u-dma-buf/%s/phys_addr", name); if ( (fd = open(file_name, O_RDONLY)) == -1 ){ printf("Can not open %s\n", file_name); return (-1); } read(fd, (void*)attr, 1024); sscanf(attr, "%x", &udmabuf->phys_addr); close(fd); // size sprintf(file_name, "/sys/class/u-dma-buf/%s/size", name); if ( (fd = open(file_name, O_RDONLY)) == -1 ){ printf("Can not open %s\n", file_name); return (-1); } read(fd, (void *)attr, 1024); sscanf(attr, "%x", &udmabuf -> buf_size); close(fd); sprintf(file_name, "/dev/%s", name); if ( (udmabuf -> file = open(file_name, O_RDWR | O_SYNC)) == -1 ){ printf("Can not open %s\n", file_name); return (-1); } udmabuf -> buf = mmap(NULL, udmabuf -> buf_size, PROT_READ|PROT_WRITE, MAP_SHARED, udmabuf -> file, 0); udmabuf -> debug_vma = 0; udmabuf -> sync_mode = 1; return 0; } int udmabuf_close(struct udmabuf* udmabuf){ if (udmabuf -> file < 0) return -1; close(udmabuf -> file); udmabuf -> file = -1; return 0; }

c

// matrix.c #include "dma_simple.h" void main(){ int uio1_fd = open("/dev/uio4", O_RDWR); void *hls_regs = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, uio1_fd, 0); int uio2_fd = open("/dev/uio5", O_RDWR); void *dma_regs = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, uio2_fd, 0); struct udmabuf intake_buf; struct udmabuf outlet_buf; if (udmabuf_open(&intake_buf, "udmabuf0") == -1) exit (1); if (udmabuf_open(&outlet_buf, "udmabuf1") == -1) exit (1); dma_reset(dma_regs); regs_write32(hls_regs, 0x81); float a[32*32]; float b[32*32]; float c[32*32]; float cref[32*32]; int i, j, t; int m, n, k; m = n = k = 32; for (i = 0; i < m*n; i++){ a[i] = (float) i/2.0; b[i] = (float) i/3.0; c[i] = (float) 0; } for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ ((float *)(intake_buf.buf))[i*n + j] = a[i*n + j]; } } for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ ((float *)(intake_buf.buf))[i*n + j + m*m] = b[i*n + j]; } } dma_setup(dma_regs, intake_buf.phys_addr, outlet_buf.phys_addr); dma_outlet_start(dma_regs, m*m*4); dma_intake_start(dma_regs, m*m*2*4); dma_wait_irq(dma_regs); dma_clear_status(dma_regs); for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ c[i*n + j] = ((float*)(outlet_buf.buf))[i*n + j]; } } for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ float sum = 0; for (t = 0; t < k; t++){ sum += a[i*k + t] * b[t*n + j]; } cref[i*n + j] = sum; } } int cnt_ok = 0; int cnt_ng = 0; for (i = 0; i < m*m; i++){ if (c[i] == cref[i]){ cnt_ok++; } else { printf("NG: hw %f, sw %f\n", c[i], cref[i]); cnt_ng++; } } printf("OK: %d, NG: %d, Total: %d\n", cnt_ok, cnt_ng, m*m); udmabuf_close(&outlet_buf); udmabuf_close(&intake_buf); close(uio2_fd); close(uio1_fd); }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

セグメンテーション違反

セグメンテーション違反とは、ソフトウェア実行時に発生するエラーのひとつであり、許可されていないメモリにアクセスしたときに起きます。しばしば、ポインタの不適切な使用、またはバッファオーバーフローによって起こります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します