Forum: Compiler & IDEs Raspberry Pi: C- und Python-Code zusammenbringen


von Transistorfips (Gast)


Lesenswert?

Hab hier nen Raspi mit standardmäßg neuestem Noobs und möchte mit dem 
Hardware-PWM Modul exerimentieren.
Dazu habe ich das hier https://pythonhosted.org/RPIO/pwm_py.html 
runtergeladen und installiert. Funzt.
Den C Source hab ich zum Testen vorsichtshalber mal nur an einer 
Textzeile geändert und mit dem zugehörigen Makefile compiliert.
Dabei gab's ein paar Unklarheiten, zB. war Python.h nicht in dem 
Unterverzeichnis in dem das Makefile danach gesucht hatte. Hab das 
geändert, danach ließ sich _PWM.so erzeugen.


Anschließend habe ich diese mit der installierten Datei im Verzeichnis
pi@raspberrypi 
/usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg 
g/RPIO/PWM
einfach ausgetauscht.

Beim Aufruf bekomme ich:
pi@raspberrypi ~/raspi-stuff $ sudo python pwm_1.py
Traceback (most recent call last):
  File "pwm_1.py", line 7, in <module>
    from RPIO import PWM
  File 
"/usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.e 
gg/RPIO/PWM/__init__.py",  line 60, in <module>
    from RPIO.PWM import _PWM
ImportError: 
/usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg 
g/RPIO/PWM/_PWM.so:  undefined symbol: _Py_InitPyPyModule
pi@raspberrypi ~/raspi-stuff $ cd 
/usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg 
g/RPIO/PWM

Hier der Auszug aus dem Makefile:
pwm:
        gcc -Wall -g -O2 -o pwm pwm.c
py:
        mkdir -p build
        gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall 
-Wstrict-prototypes -fPIC -I/usr/lib/pypy-upstream/include -c pwm.c -o 
build/pwm.o
        gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall 
-Wstrict-prototypes -fPIC -I/usr/lib/pypy-upstream/include -c pwm_py.c 
-o build/pwm_py.o
        gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions 
-Wl,-z,relro build/pwm.o build/pwm_py.o -o _PWM.so
        rm -rf build



Was ist eine Datei mit der Endung .so?
Was hat es mit dem Fehler: undefined symbol: _Py_InitPyPyModule oauf 
sich bwohl alles doch eigentlich wie vorher sein sollte?

von Karl Käfer (Gast)


Lesenswert?

Hi,

Transistorfips schrieb:
> Was ist eine Datei mit der Endung .so?

Das ist ein "shared object", also eine dynamisch ladbare Bibliothek. 
Unter Windows heißen solche Dinger .dll.

> Was hat es mit dem Fehler: undefined symbol: _Py_InitPyPyModule oauf
> sich bwohl alles doch eigentlich wie vorher sein sollte?

"undefined symbol" heißt, daß der Code auf ein Symbol mit diesem Namen 
verweist, dieses aber nicht finden kann.

Warum liegt Deine Python-Installation unter /usr/local? Warum versuchst 
Du sowas mit Pypy, statt ein Standard-CPython dafür zu benutzen? Hast Du 
eine der Installationsanleitungen RPIO ausprobiert, und wenn ja: welche?

Liebe Grüße,
Karl

von Transistorfips (Gast)


Lesenswert?

>Warum liegt Deine Python-Installation unter /usr/local?
Ich bin wie immer unschuldig, alles ist default installiert.

PWM hab ich so installiert:
$ sudo apt-get install python-setuptools
$ sudo easy_install -U RPIO

>Warum versuchst Du sowas mit Pypy, statt ein Standard-CPython dafür zu benutzen?
CPython, Pypy - Was'n das? Muß ich erst mal nachguggen...

Wie gesagt: Ich habe im Moment weder von der Verwaltung unter Linux - 
noch unter der von Python groß Ahnung -.-

Eine weitere SD-Karte mit dem neuesten, 3.3G fetten Raspian Image könnte 
ich probieren, vielleicht erledigt sich dann das ein oder andere 
Problem.

von Karl Käfer (Gast)


Lesenswert?

Hi Transistorfips,

Transistorfips schrieb:
>>Warum liegt Deine Python-Installation unter /usr/local?
> Ich bin wie immer unschuldig, alles ist default installiert.

Oh, mein Fehler: scheint nur das RPIO-egg dorthin installiert worden zu 
sein. Das ist auch ok, da gehört es hin. Bitte entschuldige.

Aber angelegentlich wirft das eine andere Frage auf: warum hast Du eine 
Zeile des C-Code geändert? Welche? Und was hast Du geändert?

> PWM hab ich so installiert:
> $ sudo apt-get install python-setuptools
> $ sudo easy_install -U RPIO
>
>>Warum versuchst Du sowas mit Pypy, statt ein Standard-CPython dafür zu 
>>benutzen?
> CPython, Pypy - Was'n das? Muß ich erst mal nachguggen...

Für die Skriptsprache Python gibt es Interpreter in unterschiedlichen 
Sprachen. Die Standardversion ist CPython, in C implementiert. Zudem 
gibt es Jython in Java und eben PyPy, das anfangs in Python selbst wurde 
und heute in einem Subset von Python namens RPython entwickelt wird. 
Diese Implementierungen unterscheiden sich erheblich.

Um Python-affine Software zu installieren, also solche, die gegen Python 
linkt, installierst Du sinnvollerweise das Paket "python-dev" -- das ist 
das Entwicklerpaket für CPython, und das hat auch die korrekte Python.h.

So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket 
"python-dev" benutzt, sondern einfach die aus 
/usr/lib/pypy-upstream/include/. Das ist vermutlich nicht die richtige 
Python.h, wobei ich allerdings ein wenig erstaunt bin, daß das 
funktioniert hat...

> Wie gesagt: Ich habe im Moment weder von der Verwaltung unter Linux -
> noch unter der von Python groß Ahnung -.-

Beides kann man lernen. ;-)

> Eine weitere SD-Karte mit dem neuesten, 3.3G fetten Raspian Image könnte
> ich probieren, vielleicht erledigt sich dann das ein oder andere
> Problem.

Das wäre jedenfalls ein definierter Anfang... würde aber vermutlich je 
nach Raspi-Modell auch nicht funktionieren. Ich hab' das nämlich gerade 
auf einem Raspberry Pi 2 installiert und erhalte die Fehlermeldung, daß 
das Modul nur auf einem Raspberry Pi funktioniert... scheint den neuen 
Raspi2 wohl noch nicht zu unterstützen. 'Schguggma.

Liebe Grüße,
Karl

von Transistorfips (Gast)


Lesenswert?

Danke für's mithelfen.

>Um Python-affine Software zu installieren, also solche, die gegen Python
>linkt, installierst Du sinnvollerweise das Paket "python-dev" -- das ist
>das Entwicklerpaket für CPython, und das hat auch die korrekte Python.h.
Das probier ich aus.

>So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket
>"python-dev" benutzt, sondern einfach die aus
>/usr/lib/pypy-upstream/include/. Das ist vermutlich nicht die richtige
>Python.h, wobei ich allerdings ein wenig erstaunt bin, daß das
>funktioniert hat...
Ich hab mit find -name Python.h danach gesucht und dann kaltblütig 
genommen was ich halt hatte.
Im Code von pwm_py.c steht
1
#include "Python.h"
Keine Ahnung, warum die richtige nicht im Verzeichnis dabei war. 
Vielleicht sollte ich eine andere Installationsvariante ausprobieren. 
Auf der Webseite steht:
You can also get RPIO from Github repository, which is usually a step 
ahead of pypi:
Vielleicht bedeutet "a step ahead" in diesem Fall ja "in die richtige 
Richtung"...

von Transistorfips (Gast)


Lesenswert?

>So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket
>"python-dev" benutzt
Hab eben python-dev auf raspian installiert, ebenso die git Version des 
Moduls und nochmal compiliert mit dem Makefile. Lief sauber durch.
Danke.

Nebenbei: Ist das normal, daß
1
#include "Python.h"
 auch ausserhalb des Verzeichnisses gesucht wird? Kenn ich so nicht.

von Karl Käfer (Gast)


Lesenswert?

Hallo,

Karl Käfer schrieb:
> Das wäre jedenfalls ein definierter Anfang... würde aber vermutlich je
> nach Raspi-Modell auch nicht funktionieren. Ich hab' das nämlich gerade
> auf einem Raspberry Pi 2 installiert und erhalte die Fehlermeldung, daß
> das Modul nur auf einem Raspberry Pi funktioniert... scheint den neuen
> Raspi2 wohl noch nicht zu unterstützen. 'Schguggma.

Habschgeguggt. Sorry, hat was länger gedauert. Also: in 
source/c_gpio/cpuinfo.c(38) gibt es eine Funktion 
get_cpuinfo_revision(), die danach schaut, ob in /proc/cpuinfo ein 
BCM2708 mit der Revision 000[2-...] vorhanden ist. Auf meinem RasPi2 mit 
BCM2709 schlägt das latürnich fehl. Das ist jetzt a bisserl blöd.

Aber ok, ich hab' noch 'nen Raspi1B und ein paar 1B+. Bei Grabthars 
Hammer, jetzt ist er dran! Und siehe da, in /proc/cpuinfo:
1
processor       : 0
2
model name      : ARMv6-compatible processor rev 7 (v6l)
3
Features        : swp half thumb fastmult vfp edsp java tls 
4
CPU implementer : 0x41
5
CPU architecture: 7
6
CPU variant     : 0x0
7
CPU part        : 0xb76
8
CPU revision    : 7
9
10
Hardware        : BCM2708
11
Revision        : 000e

Na dann wollen wir mal:
1
sudo apt-get update
2
sudo apt-get dist-upgrade
3
sudo reboot
4
sudo apt-get install python-dev python-setuptools
5
sudo easy_install -U RPIO
6
cat <<EOF >>servo.py
7
#!/usr/bin/python
8
# -*- coding: utf-8 -*-
9
10
from RPIO import PWM
11
12
if __name__ == '__main__':
13
    servo = PWM.Servo()
14
15
    # Set servo on GPIO17 to 1200µs (1.2ms)
16
    servo.set_servo(17, 1200)
17
18
    # Set servo on GPIO17 to 2000µs (2.0ms)
19
    servo.set_servo(17, 2000)
20
21
    # Clear servo on GPIO17
22
    servo.stop_servo(17)
23
EOF
24
chmod a+x servo.py
25
sudo ./servo.py

Ausgabe von "servo.py":
1
Using hardware: PWM
2
PW increments:  10us
3
Initializing channel 0...
4
add_channel_pulse: channel=0, gpio=17, start=0, width=120
5
init_gpio 17
6
clear_channel_gpio: channel=0, gpio=17
7
add_channel_pulse: channel=0, gpio=17, start=0, width=200
8
clear_channel_gpio: channel=0, gpio=17
9
shutting down dma channel 0
10
clear_channel: channel=0

Siehe da: kaum macht man's richtig, schon funktionierts. ;-)

HTH,
Karl

von Transistorfips (Gast)


Lesenswert?

Hmm. Isch wees nid ob Python die Sprache meiner Wahl ist...
Schon dieses textuelle Einrücken bei Schleifen... da juckt's mich immer.

Hab am WE nen LinuxMint KDE-Rechner mit schicker retro CDE 
(Solaris-like) aufgesetzt um darauf Eclipse mit der gcc arm-bcm2708 
toolchain auszuprobieren - die wird justamente grad installiert.

Mal guggen wie das läuft.

von Karl Käfer (Gast)


Lesenswert?

Hi,

Transistorfips schrieb:
> Hmm. Isch wees nid ob Python die Sprache meiner Wahl ist...
> Schon dieses textuelle Einrücken bei Schleifen... da juckt's mich immer.

So hab' ich am Anfang auch gedacht. Mittlerweile weiß ich: das zwingt 
den Programmierer dazu, sauber strukturierten und lesbaren Code zu 
schreiben. Insofern ist das gewöhnungsbedürftig, aber letztlich ein 
prima Feature.

> Hab am WE nen LinuxMint KDE-Rechner mit schicker retro CDE
> (Solaris-like) aufgesetzt um darauf Eclipse mit der gcc arm-bcm2708
> toolchain auszuprobieren - die wird justamente grad installiert.

Das hat dann allerdings einen vollkommen anderen Fokus als Python.

HTH,
Karl

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.