2013-05-05 5 views
3

Я пытаюсь прочитать некоторые регистры в аппаратном обеспечении (FPGA) с помощью Python. У меня уже есть код C для чтения регистров, и он отлично работает. Я хочу использовать их в python, используя ctypes.Ошибка сегментации в python при использовании ctypes

rdaxi.c

#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 

#define NF10_IOCTL_CMD_READ_STAT (SIOCDEVPRIVATE+0) 
#define NF10_IOCTL_CMD_WRITE_REG (SIOCDEVPRIVATE+1) 
#define NF10_IOCTL_CMD_READ_REG (SIOCDEVPRIVATE+2) 

int main(int argc, char* argv[]){ 
    int f; 
    uint64_t v; 
    uint64_t addr; 

    if(argc < 2){ 
     printf("usage: rdaxi reg_addr(in hex)\n\n"); 
     return 0; 
    } 
    else{ 
     sscanf(argv[1], "%llx", &addr); 
    } 

    //---------------------------------------------------- 
    //-- open nf10 file descriptor 
    //---------------------------------------------------- 
    f = open("/dev/nf10", O_RDWR); 
    if(f < 0){ 
     perror("/dev/nf10"); 
     return 0; 
    } 

    printf("\n"); 

    v = addr; 
    if(ioctl(f, NF10_IOCTL_CMD_READ_REG, &v) < 0){ 
     perror("nf10 ioctl failed"); 
     return 0; 
    } 
    // upper 32bits contain the address and are masked away here 
    // lower 32bits contain the data 
    v &= 0xffffffff; 

    printf("AXI reg 0x%llx=0x%llx\n", addr, v); 

    printf("\n"); 

    close(f); 

    return 0; 
} 

После comilation и получить исполняемый файл, я просто сделать следующее, чтобы получить мой результат

./rdaxi 0x5a000008 
AXI reg 0x5a000008 = 2 

Я хочу сделать то же самое, используя Python.I пришел к знайте, что я должен использовать Ctypes. Затем я создал общую библиотеку (.so) для моего c-файла. Ниже приведен код python, который я написал. Я новичок в python, поэтому простите меня за мои ошибки. Я получаю ошибку сегментации. Как я могу решить эту проблему и прочитать реестры.

rdaxi.py

#!/usr/bin/env python 

# For creating shared library 
# gcc -c -Wall -fPIC rdaxi.c 
# gcc -shared -o librdaxi.so rdaxi.o 



import os 
import sys 
from ctypes import * 
print "opening device descriptor" 
nf = os.open("/dev/nf10", os.O_RDWR) 
print "loading the .so file" 
librdaxi=cdll.LoadLibrary('/root/Desktop/apps/librdaxi.so') 
librdaxi.main(nf,0x5b000008) 

Для получения более подробной информации о моем приложении. См. Ниже. reading registers in hw using python

благодаря

ответ

2

main() принимает два параметра, argc и argv, но вы передаете это единственный параметр, который является вашим адресом.

Вот пример того, как можно было бы назвать его:

librdaxi.main.argtypes = [c_int,POINTER(c_char_p)] 
argv=(c_char_p*2)() 
argv[0]='rdaxi' 
argv[1]='0x5a000008' 
librdaxi.main(2,argv) 
+0

На самом деле я был в состоянии прочитать только с этим один параметр (адрес), а затем я вдруг начал получать сегментации по умолчанию. – user2349460

+0

@ user2349460: Я обновил свой ответ на примере. –

+0

ты потрясающий .. Большое спасибо. Он работает сейчас. – user2349460

Смежные вопросы