2016-04-29 11 views
1

Ich plane, OS auf meinem ARM-Board zu setzen, um zusätzliche Einrichtung wie Speicherverwaltung, Dateisystem usw. zu bekommen.
Zum Beispiel wenn ich einen Wert an Port schreiben will x blinkend kann ich schreiben (int *) 0x00458 = 1 ohne Betriebssystem. Aber wenn ich mit OS gleich schreibe (int *) 0x00458 = 1.
Der Speicher besteht aus virtuellem Speicherbereich oder Realspeicheradresse.
Tut mir leid, ich weiß nicht, wie ich meine Frage ausdrücken soll, entschuldigen Sie mich dafür.
Mein Ziel ist es, OS auf meinem ARM-Board zu setzen und LED-Blink-Programm ohne Treiberbibliothek zu schreiben.Wenn das Betriebssystem auf der ARM-Karte installiert ist? Der Aufruf der Adresse des Ports wird der realen Adresse oder virtuellen Adresse zugeordnet?

+0

Wenn Sie die MMU aktiviert haben, müssen Sie die physikalische Seite, auf der sich 0x00458 befindet, dem Adressraum des Programms zuordnen, von dem die LED verwendet werden soll. Dann können Sie die LED blinken lassen, wie Sie möchten. – fuz

+0

@Bhav Beachten Sie außerdem, dass Geräte-E/A normalerweise von den meisten Betriebssystemen für Benutzermodus-Anwendungen nicht zulässig ist. Möglicherweise müssen Sie einen Kernel-Treiber/ein Kernelmodul schreiben, um eine Schnittstelle zu Benutzermodus-Anwendungen zu ermöglichen –

+0

@FUZxxl Wenn Sie Links kennen um zu lernen, wie man diese Art von Sachen macht, kannst du bitte teilen. Vielen Dank im Voraus –

Antwort

0

Es hängt vom Betriebssystem ab, mit Linux können Sie mmap verwenden, um das Betriebssystem zu bitten, Ihnen ein Loch mit Berechtigungen zuzuordnen, das von der Anwendungsebene auf diese physikalische Adresse durchschlägt.

Windows gab es die Geitio Sache für I/O, und wahrscheinlich eine Möglichkeit, einen Kernel-Treiber zum Durchstanzen mit Memory-Mapped I/O zu schreiben.

Es ist stark Betriebssystem abhängig, so dass Sie Ihr Betriebssystem betrachten müssen. Sie haben linux getaggt, also beginnen Sie mit mmap, es sollte bereits einige Beispiele geben, wie Sie dies in Stackoverflow-Antworten tun können. Wie auch anderswo, benötigt nur ein paar Zeilen Code, um den Zeiger zu bekommen (beachten Sie bitte, dass ein größerer Platz wie 0x10000000 Bytes einen Zeiger eher als 0x1000 Bytes zum Beispiel bekommt).

+1

Ja, die Adresse ist virtuell, das Betriebssystem (sicherlich Linux und Windows) benutzt das MMU, so dass Sie eine virtuelle Adresse erhalten, die Ihrer gewünschten physischen Adresse mit Ihren Berechtigungen zugeordnet ist. Beachten Sie, wenn Ihr Ding bei 0x12345678 ist, als mmap für 0x10000000 mit einer Größe von sagen 0x10000000, dann greifen Sie auf den zurückgegebenen Zeiger + 0x02345678, fragen Sie nicht nach 0x12345678 und fragen Sie nicht nach 4 Bytes wert. –

+1

Ich habe diesen Ansatz unzählige Male benutzt. –

0

Da Sie 1 in den Speicher schreiben möchten, ist dies (int *) 0x00458 = 1 falsch.
Verwendung volatil zu verhindern Compiler von der Optimierung der Code aus:

Sie im Speicher

*(volatile int*)0x00458=1 

schreiben verwenden.

benutzten eine auf Portadresse 0x65 zum Beispiel LED blibk:

#include <stdint.h> 
while (1) 
{ 
    //PORTG^=1; 
    *(volatile uint32_t*)0x65 ^= 1; 
    //delay 
} 

diese Anweisung kompilieren Assembler-Code zu korrigieren, unabhängig davon, gibt es OS oder nicht. der einzige Hinweis für os ist: Wenn Ihre ARM-CPU-Hase für Adresse neu zuordnen müssen Sie neue Adresse finden, wieder wird diese Anweisung korrekt sein. Für Details zu Ihrem Betriebssystem können Sie die Dokumentation lesen. Hoffe, das hilft.