Reputation: 31
I'm using Python to display a bitmap image on a LCD display (Raspberry Pi). This works quite well but it seems that I've created myself a huge memory leak. This piece of code seems to be the culprit:
def displayBitmap(self):
spi.open(0,0)
f = open("data/565.bmp", "rb")
imgdata = f.read()
f.close()
self.setAddress(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1)
k = 0
for i in range(0, (LCD_WIDTH*LCD_HEIGHT)):
dt = (ord(imgdata[k]) | (ord(imgdata[k+1]) << 8))
self.spiOutData(dt,2)
k +=2
imgdata = None
spi.close()
...
def spiOutData(self, data, bytes=1):
io.digitalWrite(15, io.LOW)
io.digitalWrite(16, io.HIGH)
io.digitalWrite(self.dcPin, io.HIGH)
if (bytes == 1):
spi.xfer2([(data)])
else:
spi.xfer2([(data>>8)])
spi.xfer2([(data)])
It runs fine for some time, but at some point it terminates due to lack of memory. My guess is that the contents of imgdata
never get deleted but my Python knowledge seems to be too bad to be able to find the reason.
Could you give me a hint, please? Thank you very much.
Upvotes: 0
Views: 563
Reputation: 31
So here is what I have found out:
py-spidev
module (or some part of spidev itself) seems to be the problem. py-spidev
is incredibly slowI've now got rid of py-spidev
and write to /dev/spidev0.0
directly via file handle. No more excessive memory usage and SPI communication now needs about two seconds, that's about a tenth of the time it needed before.
Upvotes: 1