Hallo,
ich verwende das AVR-Studio-5 von Atmel und dessen Bibliothek um per
lokal-bus auf die GPIOs zuzugreifen. Die CPU ist der UC3.
In Atmels lib sind diese Funktionen als Inline-Funktionen beschrieben.
Dessen Aufruf um z.B. den Eingang zu lesen sieht dann z.B. so aus:
1 | #if (defined __GNUC__)
|
2 | __attribute__((__always_inline__))
|
3 | #endif
|
4 | static inline int gpio_local_get_pin_value(uint32_t pin)
|
5 | {
|
6 | return (AVR32_GPIO_LOCAL.port[pin >> 5].pvr >> (pin & 0x1F)) & 1;
|
7 | }
|
Wie vorgeschrieben ist mein clock für den Port genauso groß wie der
CPU-Takt. Rufe ich nun ein paar mal diese Funktionen zum Setzen, Löschen
und Einlesen einiger Pins auf, funktioniert alles wunderbar und ich kann
auch im Debug-Modus sehen die CPU an die richtige Stelle springt.
Füge ich nun ein paar mehr von diesen Aufrufen auf (unter anderem in
Schleifen), macht die CPU plötzlich gar nichts mehr. Im Debug-Modus kann
ich sehen, wie die Verbindung plötzlich bei simplen Befehlen (ein paar
Zeilen vor den Inlinebefehlen) abreißt und die JTAG-Leitung neu
connectet werden muss.
Ersetze ich nun diese Befehle durch die Befehle aus der Lib, läuft alles
gut. Also so hier:
1 | // das hier:
|
2 | //gpio_local_clr_gpio_pin(CLK_PIN);
|
3 | //wird ersetzt durch:
|
4 | AVR32_GPIO_LOCAL.port[CLK_PIN >> 5].ovrc = 1 << (CLK_PIN & 0x1F);
|
Es funktioniert nun zwar, aber kann mir irgend jemand erklären warum die
normalen Aufrufe fehl schlagen?