Unterschiede bei der Verwendung von c benutzerdefinierten Funktionen auf PC und ARM

Ich bin neu in der Programmierung in C und auch in ARM, also vergib mir diese dumme Frage. Ich würde gerne Antworten im Internet finden, anstatt Sie zu stören, aber es gibt nicht viele Materialien im Internet. Ich verwende Arduino Due Board mit Atmel SAM3X8E, ARM Cortex M3 und Atmel Studio 6 anstelle von Arduino IDE.

Ich wollte ein einfaches Programm erstellen, das auf der Schlaffunktion basiert, um die Diode zu blinken. Sicher, es macht keinen Sinn, die Sleep-Funktion anstelle von Timern zu verwenden. Ich wollte gerade überprüfen, ob das funktioniert, und mich mit Interrupts vertraut machen. Aber es geht nicht...

Denn wie ich hier herausgefunden habe, gibt es keine Verzögerungsfunktionen für ARM, also habe ich meine eigene erstellt. Wenn ich die for-Schleife in die Hauptfunktion setze (an den Stellen, die ich in Kommentaren zeige), ist alles in Ordnung, Dioden blinken abwechselnd. Wenn ich mySleep() verwende, blinken beide kontinuierlich. Ich habe ein ähnliches Programm in CodeBlocks auf dem PC mit stdio.h und printf anstelle von asf.h und PIO-Registern generiert. Das funktioniert wie ich wollte. Hier ist Code unten:

#include <asf.h>

void mySleep(void);

int main (void)
    {
    PIOB->PIO_PER = PIO_PB26;
    PIOB->PIO_OER = PIO_PB26;
    PIOB->PIO_PUDR = PIO_PB26;
    PIOA->PIO_PER = PIO_PA14;
    PIOA->PIO_OER = PIO_PA14;
    PIOA->PIO_PUDR = PIO_PA14;

    while(1)
    {
        PIOB->PIO_SODR = PIO_PB26;
        PIOA->PIO_CODR = PIO_PA14;
        mySleep();
        //for(unsigned long long i=0;i<1000000;i++);    
        PIOB->PIO_CODR = PIO_PB26;
        PIOA->PIO_SODR = PIO_PA14;
        mySleep();
        //for(unsigned long long i=0;i<1000000;i++);
    }
}

void mySleep(void)
{
    for(unsigned long long i=0;i<1000000;i++);
}

Das Programm wird ohne Fehler erstellt. Hier ist meine Frage. Was ist der Unterschied zwischen der Programmierung auf PC und ARM? Was sollte ich tun, um benutzerdefinierte Funktionen zum Laufen zu bringen? Wird eine zusätzliche Bibliothek benötigt?

Vielen Dank im Voraus.

Wenn alles wie erwartet funktioniert, was ist die eigentliche Frage? Die Fragen, die Sie gestellt haben, sind viel zu allgemein, um sie hier zu beantworten.

Antworten (2)

Der Unterschied liegt nicht in der Plattform.

Der Unterschied besteht darin, dass CodeBlocks bei der Debug-Einstellung wahrscheinlich zu keiner Optimierung kompiliert, während viele, wenn nicht die meisten eingebetteten Compiler - wie sie standardmäßig konfiguriert sind - Funktionsaufrufe wegoptimieren, die keinen makroskopischen Effekt haben.

Wenn Sie in den Debug-Modus wechseln, werden Sie sehen, dass Sie keine Haltepunkte in mySleep() einfügen können. Dies liegt daran, dass der Compiler entschieden hat, es nicht in den begrenzten Coderaum Ihres Prozessors aufzunehmen, da darin nichts passiert.

Allerdings verfügt Atmel über Delay(), Delay_ms() und Delay_us(), die eine ASM VOLATILE nop-Schleife verwenden, um garantierten Verzögerungen sehr nahe zu kommen, wenn die CPU-Geschwindigkeit richtig eingestellt ist.

Sie können auch Inline-ASM-Code (googlen Sie ihn, wenn Sie möchten) als VOLATILE in Ihre Schleife einfügen, sodass er eine einzelne NOP-Anweisung ausführt (NOP = No Operation = Do nothing). Für ARM GCC zitiert ein Online-Kochbuch:

asm volatile("mov r0, r0");

Flüchtig bedeutet "nicht anfassen!" oder sonst "Nicht für mich wegoptimieren!".

Ich bin zu faul zum Überprüfen, aber ich glaube, ARM hat auch die NOP-Anweisung.


Sie können wahrscheinlich auch die Einstellungen für die Optimierung ändern, aber das bedeutet, dass Ihr Code sehr schnell sehr umfangreich wird, wenn Sie gerade erst anfangen.

Vielen Dank für Ihre Zeit! Ja, der Unterschied lag in den Compiler-Einstellungen, ich habe die Optimierung deaktiviert und jetzt funktioniert es wie erwartet. Atmel hat Verzögerungsfunktionen, aber sie sind nur für AVR gemacht. Das haben meine Recherchen gesagt, aber ich könnte gescheitert sein. Ja, ARM hat NOP-Anweisungen, ich werde bald darauf zurückkommen. Ich muss mich erst mit grundlegenderen Dingen auseinandersetzen. Danke für Informationen dazu.

Sie sagen nie, was Ihr Fehler tatsächlich ist, aber ich vermute, dass Ihre Funktion, da sie im Wesentlichen nichts tut, von Ihrem Compiler optimiert wird. Versuchen Sie, mit deaktivierter Optimierung zu kompilieren

Das ist es. Das Deaktivieren der Optimierung hat mein Problem gelöst. Danke