2017-06-08 1 views
-1

Zuerst das Szenario, meine Hostumgebung ist Linux, Ziel ist MAX10 FPGA und läuft RISCV Softprozessor und Schreibsoftware dafür. Ich schreibe einen einfachen Bootloader, in dem ich eine Datei main.c habe, in der alle Funktionen definiert sind, und eine andere Datei led.c, die eine eigenständige Anwendung ist. Jetzt möchte ich von main.c zu led.c gehen mit einer Adresse sagen 0x08000000. Dies wird durch Verwendung des folgenden Codes erreicht!Zugreifen auf Zeigervariable einer .c-Datei in einer anderen Standalone-.c-Datei ohne Verwendung der .h-Datei

void (*func_ptr)(void); 
func_ptr = (void*)0x08000000; //starting address of led routine      
func_ptr(); 

In diesem main.c ich Adressen von zwei LEDs, die an der Spitze wie dieser

volatile int* ledr = (volatile int*)(0x10000010); 
volatile int* ledg = (volatile int*)(0x10000020); 

deklariert Ich Umwandlung dieses led.c Format .srec und es in die FPGA-RAM Download nach dem Parsen.

Bis hier funktioniert es perfekt !! Es geht um diese Anwendung. Aber leider in led.c, weiß es nicht die Adresse von LEDs, wo ich blinkendes LED-Programm geschrieben habe. Obwohl die Funktion delay() zwar funktioniert, aber soweit ich feststellen kann, dass led.c Adressen nicht kennt, kann ich auf meinem FPGA keine blinkenden LEDs sehen. Blinkende LEDs Programm ist unter dem vollständig led.c Datei

volatile int* led0 = (volatile int*)(0x10000010); 
volatile int* led1 = (volatile int*)(0x10000020); 

static void delay() 
{ 
    volatile int i; 
    for(i=0; i<1000000; i++) 
    { 
    } 

} 

int main(void) 
{ 

    *led0=0; 
    *led1=0; 
    while(1) 
    { 

    *led0=1; 
    delay(); 
    *led0=0; 
    *led1=1; 
    delay(); 
    *led1=0; 
    } 

} 

Jeder hier kann die geben mir Idee, dass was falsch ist hier und was soll ich tun? Ihre Hilfe wird geschätzt !!

P.S. Wenn es in dieser Anwendung geht, bleibt es in der while-Schleife und das bedeutet, es funktioniert ordnungsgemäß, aber nicht blinkt LEDs. Ich habe dieses Ding doppelt überprüft!

+1

Folgen Sie dieser [vorherige Frage] (https://stackoverflow.com/questions/44412356/writing-a-c-program-to-call-another-program-witout-using-any-built-in-libraries). –

+0

Bitte erläutern Sie den Unterschied zwischen dieser und der von WeatherVane gefundenen Frage. Ohne Hilfe sehe ich den Unterschied nicht. Dann erkläre anhand des Unterschieds, warum die Antwort, die du angenommen hast, hier nicht hilfreich ist. – Yunnosch

+1

@Yunnosch: Die vorherige Frage war, die Kontrolle an eine bestimmte Speicheradresse zu übergeben. Bei dieser Frage geht es darum, warum seine LEDs nicht blinken, obwohl er glaubt, dass der Code dafür ausgeführt wird. –

Antwort

-1

Nein, Sie benötigen eine Datei von Drittanbietern, entweder eine periphere "Treiber" -Datei, die beide Programme verwenden, oder eine Header-Datei. Ich nehme an, dass Sie inzwischen verstehen, dass main.c und led.c nicht Ihr ganzes Programm sind, es gibt zumindest einen Bootstrap, wenn nicht anderen Code, den die Toolchain hinzufügt, um ein komplettes Programm zu erstellen.

Verwenden Sie entweder eine dritte gemeinsame Datei oder stellen Sie denselben Code/beide Informationen bereit. das hat nichts mit arm oder fpgas, elemetary C programming zu tun.

Verwandte Themen