2017-02-13 3 views
0

In this Python implementation für Mikrocontroller verwenden sie C-Makro wie folgt:Wie funktioniert dieses Makro?

MP_ROM_QSTR(MP_QSTR_mem16) 

mit:

#define MP_ROM_QSTR(q) MP_OBJ_NEW_QSTR(q) 

und:

#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 2) | 2)) 

Mein Problem ist: MP_QSTR_mem16 scheint zu nie definiert !

Also, wie funktioniert das?

+0

Also, wenn Ihre Frage über die Makrodefinition oder wo 'MP_QSTR_mem16' definiert werden könnte? –

Antwort

2

Das Makro funktioniert wie jedes Makro durch Textersetzung. Der ursprüngliche Code

MP_ROM_QSTR(MP_QSTR_mem16) 

wird in zwei Stufen ersetzt, zuerst wird sie zu einer verminderten

MP_OBJ_NEW_QSTR(MP_QSTR_mem16) 

dem diese schließlich zu dem C/C++ Kompilierer weitergegeben

((mp_obj_t)((((mp_uint_t)(MP_QSTR_mem16)) << 2) | 2)) 

reduziert wird.

Wenn Sie sagen, dass der Begriff MP_QSTR_mem16 "nie definiert" ist, dann kann dies wahr sein. Ob es definiert ist oder nicht, hängt nicht mit der Verwendung dieses Makros zusammen. Dieses Makro soll keine Definition oder Deklaration des Begriffs MP_QSTR_mem16 sein, aber stattdessen ist es eine Verwendung des Begriffs.

Das Makro einen Ausdruck erzeugt, der MP_QSTR_mem16 dem Typ mp_uint_t gegossen wird, dann ist es nach links verschiebt den resultierenden Wert durch zwei Bits, binär-ORS der sich ergebende Wert mit 2 und wandelt das Ergebnis in der Art mp_obj_t. Nichts davon definiert oder deklariert den Wert, mit dem es begonnen hat.

Sie möchten vielleicht herausfinden, woher der Wert MP_QSTR_mem16 kommen sollte.

EDIT

Nachdem auch Probleme bei der Suche die Deklaration von MP_QSTR_mem16 hatte einen Blick in die Quelle, die Sie verweisen auf ich. Es scheint mir, dass der Begriff Spezifizierer MP_QSTR_mem16 ist erstellt durch Verketten einiger Strings. Dies kann im C/C++ - Präprozessor mit dem Operator ## erfolgen. Wenn Sie MP_QSTR_ ## im Code zu suchen finden Sie mehrere Vorkommnisse wie diese:

./micropython-master/teensy/mk20dx256_prefix.c: .name = MP_QSTR_ ## p_port ## p_pin, \ 

effektiv, der Ort, wo MP_QSTR_mem16 ist eigentlich auch so etwas wie folgt aussehen definiert werden:

#define FOO(x) MP_QSTR_ ## x 

(... und später irgendwo ...)

int FOO(mem16); 

Aber trotz der Suche nach etwas Zeit in der Quelle habe ich keinen solchen Ort gefunden. Es kann sehr bösartig tief in der Makro-Logik versteckt sein.Ein geeigneter Weg, den Platz zu finden, kann sein, den Compiler zu optimieren, um das Ergebnis des Präprozessors auszugeben; In diesem sollten Sie in der Lage sein, es zu finden (aber das ist weit über das Thema dieser Frage hinaus, also, wenn Sie Probleme haben, diesen Ansatz zu verwenden, stellen Sie bitte eine andere Frage).

+0

Danke. Das hat mich auf den richtigen Weg gebracht. Es scheint, dass ein Makefile ein Python-Skript aufruft, das die Präprozessor-Ausgabe analysiert, um automatisch eine Header-Datei mit diesen fehlenden Definitionen zu generieren. Wenn jemand anderes neugierig ist, sieh es dir an: https://github.com/micropython/micropython/blob/master/py/makeqstrdefs.py – ARF

+0

Klingt ... seltsam, diplomatisch zu sein. Zutiefst beunruhigend war mein erster Schuss. – Alfe