在beaglebone上设置错误而无异常

时间:2017-07-17 15:04:50

标签: python

我正在尝试使用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 ( )

我无法找到,错误在哪里。请帮助。

1 个答案:

答案 0 :(得分:0)

看起来PyPRUSS代码中存在错误。 其pypruss_open函数未正确设置异常信息,但返回错误指示(NULL)。当函数不这样做时,Python并不喜欢。

查看pypruss_open source,如果prussdrv_open失败并以-1作为错误指示返回,则会以这种方式失败。反过来它本身也可能失败(如果该设备已经打开)或者__prussdrv_memmap_init失败。 不幸的是,看起来无法获得有关错误确切原因的信息。

您可以做些什么来调试此问题?如果您无法找到任何明显的内容(例如在调用/dev/uid0后丢失pru.modprobe()),那么您可以使用strace运行脚本,以查看错误发生之前的系统调用。然后你看看我上面给你的链接下的源代码,看看失败的确切时间。