簡體   English   中英

使用ctypes時python中的分段錯誤

[英]Segmentation fault in python while using ctypes

我試圖用Python讀取硬件(FPGA)中的一些寄存器。 我已經有一個C代碼來讀取寄存器,它工作正常。 我想在使用ctypes的python中使用它們。

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;
}

在編譯並獲取可執行文件后,我只需執行以下操作即可獲得結果

./rdaxi 0x5a000008
AXI reg 0x5a000008 = 2

我想用Python做同樣的事情。我知道我必須使用Ctypes。 然后我為我的c文件創建了共享庫(.so)。以下是我編寫的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)

有關我的應用程序的更多信息 請看下面。 使用python在hw中讀取寄存器

謝謝

main()接受兩個參數argcargv ,但是你傳遞的是一個參數,即你的地址。

以下是您可以調用它的示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM