2017-07-17 13 views
1

私はBeaglebone Black rev 3を使用してフェーザー測定ユニットを構築しようとしています。以下はコードです。それを実行すると、エラーとして与えながら:ビーグルボーンに例外を設定せずにエラーを返す

prussdrv_open open failed 
Traceback (most recent call last): 
    File "/var/lib/cloud9/pmu.py", line 36, in <module> 
    pru.open(0) # open connection to PRU 0 
SystemError: error return without exception set 

をコードはここに行く:

import pypruss as pru 
import mmap 
import numpy as np 
import struct 
import time 

## MEMORY LOCATIONS ## 

PRU_ICSS=0x4A300000 
PRU_ICSS_LEN=512*1024 

RAM_START=0x00000000 
RAM1_START=0x00002000 
RAM2_START=0x00012000 

TOTAL_BUFFER_LEN=0x00000FA0 
BUFFER_LEN=TOTAL_BUFFER_LEN/2 
BUFFER1_START=RAM2_START+4 
BUFFER2_START=BUFFER1_START+BUFFER_LEN 

## FUNCTION DEFINITIONS ## 
def processRawADC(value): 
    value=0x00000FFF&value 
    value=int(value) 
    value=(value*1.8)/(2^12) 
    return value 

def channelID(value): 
    value=0x000F0000&value 
    value=value>>16 
    return value 

## PRU SETUP ## 
pru.modprobe() # enable uio_pruss module 
pru.init() #initialize PRU 
pru.open(0) # open connection to PRU 0 
pru.pruintc_init() # configure interrupt handlers 
pru.exec_program(0,"./oneshot.bin") # load assembly file 

counter = 0 

f=open("/dev/mem","r+b") 
output=open("./results.txt","w") 

while counter<10 : 
start=time.time() 
pru.wait_for_event(0) 

ddr_mem=mmap.mmap(f.fileno(),PRU_ICSS_LEN,offset=PRU_ICSS) 
shared=struct.unpack('L ',ddr_mem[RAM2_START:RAM2_START+4]) 
print(shared[0]) 
if shared[0]==1 : 
    print ("buffer 1") 
    for i in range(0,500) : 
     fifo = struct.unpack ('L ' ,ddr_mem[BUFFER2_START+(i*4) 
:BUFFER2_START+4+(i*4)])[0] 
    value=processRawADC(fifo) 
    channelNum=channelID(fifo) 
    output.write(str(channelNum)+","+str(value)+"nn") 
    counter += 1 
    pru.clear_event(0) 

elif shared[0] == 2: 
     shared=struct.unpack('L ',ddr_mem[RAM2_START:RAM2_START+4]) 
print("buffer 2") 
for i in range(0,500): 
    fifo=struct.unpack('L',ddr_mem[BUFFER2_START+(i*4) :BUFFER2_START+4+ 
(i*4)])[0] 
    value = processRawADC(fifo) 
    channelNum = channelID(fifo) 
    output.write(str(channelNum)+","+str(value)+"nn") 
    counter +=1 
    pru.clear_event(0) 
    end=time.time() 
#print end-start 

f.close() 
output.close() 

pru.clear_event(0) 
pru.pru_disable(0) 
pru.exit () 

は私が見つけることができません、ここでミスがあります。助けてください。

答えて

0

PyPRUSSコードにバグがあるようです。 そのpypruss_open関数は例外情報を正しく設定しませんが、エラー表示(NULL)を返します。 Pythonは、関数がそうしているときに好きではありません。

pypruss_open sourceを見ると、prussdrv_openに失敗した場合はエラーが発生し、エラー表示として-1が返されます。それは、それ自体が(そのデバイスが既に開かれている場合)、または__prussdrv_memmap_initが失敗した場合に、失敗する可能性があります。 残念ながら、エラーの正確な理由についての情報を得る方法がないようです。

この問題をデバッグするにはどうすればよいですか?明らかなものが見つからない場合(pru.modprobe()を呼び出したあとに/dev/uid0が見つからない場合)、straceでスクリプトを実行して、エラーの前にどのシステムコールがあるか調べることができます。次に、私があなたに与えたリンクのもとでソースコードを見て、失敗がいつ起こるかを確かめます。

関連する問題