60924
現在、interface(2019年１月号)を参考にultra96でyolov3の高速化をしています。dma_simple.hとdma_simple.cを含めてmakeを行うとwarningが出ました。

warning

```

    ./src/dma_simple.c: In function 'udmabuf_open':
    ./src/dma_simple.c:18:12: warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness [-Wpointer-sign]
         sscanf(attr, "%x", &udmabuf->phys_addr);
                ^~~~
    In file included from /usr/include/features.h:423:0,
                     from /usr/include/bits/libc-header-start.h:33,
                     from /usr/include/stdio.h:27,
                     from ./src/dma_simple.h:1,
                     from ./src/dma_simple.c:1:
    /usr/include/stdio.h:400:12: note: expected 'const char * restrict' but argument is of type 'unsigned char *'
     extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
                ^
    ./src/dma_simple.c:18:20: warning: format '%x' expects argument of type 'unsigned int *', but argument 3 has type 'long unsigned int *' [-Wformat=]
         sscanf(attr, "%x", &udmabuf->phys_addr);
                       ~^   ~~~~~~~~~~~~~~~~~~~
                       %lx
    ./src/dma_simple.c:27:12: warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness [-Wpointer-sign]
         sscanf(attr, "%d", &udmabuf->buf_size);
                ^~~~
    In file included from /usr/include/features.h:423:0,
                     from /usr/include/bits/libc-header-start.h:33,
                     from /usr/include/stdio.h:27,
                     from ./src/dma_simple.h:1,
                     from ./src/dma_simple.c:1:
    /usr/include/stdio.h:400:12: note: expected 'const char * restrict' but argument is of type 'unsigned char *'
     extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
                ^
    
```

おそらくudmabufの型の形が一致してないことでなっているかと思いますが、どこを修正すべきかわかりません。

dma_simple.h

```

    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);
    
    
```

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;
    
        sprintf(file_name, "/sys/class/udmabuf/%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);
    
        sprintf(file_name, "/sys/class/udmabuf/%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, "%d", &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;
    }
    
    
```
CC BY-SA 4.0
2019-11-26T08:26:59.067
60855
2019-11-28T13:14:08.770
2019-11-26T09:12:00.227
31304
31304
question
c makefile fpga
Makefileでwarningが起こる
simple.c:18行目 第一引数のattrの型が一致しない  
stdio.h:400行目 const char * とunsigned char *の不一致  
simple.c:18行目 unsigned int * とlong unsigned int *の不一致  
みたいな感じかな。  
ソースがないので詳しくはわかりませんが、
CC BY-SA 4.0
2019-11-26T08:57:32.617
60860
2019-11-26T08:57:32.617
24490
60855
answer
void * へのキャスト含めて全てのキャストを除去し、それぞれどうあるべきか、を考えてみましょう。  
キャストはどうやっても解決できないことが明確な場合の最終手段です。

Cの標準ライブラリの文字列は char * です。  
attr は unsigned char である必要はないので単に char を使うようにしましょう。

```

    char attr[1024];
    
```

次に

```

    sscanf(attr, "%x", &udmabuf->phys_addr);
    
```

この処理は unsigned long 型の変数の値を書き換えるために unsigned int 型のための入力変換指定子 `%x`
を使っていることが問題です。これだと long が 64bit の場合に問題となる可能性があります。それを避けるには、こうします。

```

    sscanf(attr, "%lx", &udmabuf->phys_addr);
    
```
CC BY-SA 4.0
2019-11-28T13:14:08.770
60924
2019-11-28T13:14:08.770
4388
60855
answer