error return without exception set on beaglebone

1

I am trying to build a Phasor Measurement Unit using Beaglebone Black rev 3. The following is the code. While running it gives an error as:

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

The code goes here:

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 ( )

I am unable to find, where is the mistake lies. Please Help.

python
asked on Stack Overflow Jul 17, 2017 by Gurudatta Panda • edited Jul 17, 2017 by Thomas Fritsch

1 Answer

0

Looks like there is a bug in PyPRUSS code. Its pypruss_open function does not properly set exception information but returns an error indication (NULL). Python doesn't like when a function does so.

Looking at the pypruss_open source, it will fail in such way if prussdrv_open fails and returns -1 as an error indication. It in turn might fail either itself (if that device is already opened) or if __prussdrv_memmap_init fails. Unfortunately, looks like there is no way to get information about the exact reason of the error.

What can you do to debug this issue? If you won't be able to find anything obvious (like missing /dev/uid0 after calling pru.modprobe()) then you can run your script with strace to see which system calls precede an error. Then you look at the source code under links I gave you above and see when exactly does the failure happen.

answered on Stack Overflow Nov 28, 2017 by MarSoft

User contributions licensed under CC BY-SA 3.0