Statisch bedeutet, dass die Variable sowohl für diese Datei / Funktion / diesen Codebereich isoliert ist. Der Ort, an dem es definiert ist, ist sowohl nur dort sichtbar als auch bei Verwendung auf Nicht-Globalen wird diese Variable aus Speichersicht im Wesentlichen zu einer globalen Variablen. Eine lokale Variable mit einer statischen Definition bedeutet, dass ich diesen Wert nicht von einem Aufruf dieser Funktion an einen anderen verlieren möchte. Daher muss er für diese Funktion global gespeichert werden. Normalerweise befindet sich eine lokale Variable auf dem Stapel, damit die Funktion erneut ausgeführt werden kann Teilnehmer (eine neue Kopie der lokalen Variablen für jeden Eintrag in die Funktion). Statische Globale sind also sowieso global, statische Lokale sind lokal, werden aber zusammen mit den Globalen gespeichert. In so genannten .data können Toolchains jedoch unterschiedliche Namen haben.
int x = 7;
sind gelagert. Globale Variablen oder statische Lokale, die bei der Definition nicht initialisiert werden
int y;
sind in dem, was oft .bss genannt wird. Dies ist ein weiterer Teil des Lese- / Schreibspeichers, aber dieser Speicher vor dem Start von main () wird für Sie auf Null gesetzt, sodass diese Variablen gemäß der Spezifikation oder Annahme beim Starten Ihres Programms Null sind.
const ist eine Art zu sagen, dass ich dies als schreibgeschützte Variable deklariere. Ich plane nicht, dass jeder Speicher darauf nur gelesen wird. Der Compiler kann also wählen (tatsächlich ist es der Programmierer, der letztendlich vorschreibt, was der Linker tut, wobei häufig das Standard-Linker-Skript verwendet wird und dieser Job nicht übernommen wird), ob dies auf Flash oder RAM geht. Er kann entweder an einen Ort gehen und funktionieren Alles gut.
Für Mikrocontroller und andere Orte, an denen Sie booten und aus dem nichtflüchtigen Speicher (Flash / Rom / usw.) starten müssen. Zunächst muss das Programm selbst in etwas nichtflüchtigem gespeichert werden. Als nächstes das .data-Zeug, Dinge, die Sie in Ihrem Code beim Definieren der Variablen initialisiert haben, Dinge, die zur Kompilierungszeit bestimmt werden können. muss sich auch im nichtflüchtigen Speicher befinden, aber diese Daten werden letztendlich gelesen / geschrieben, damit der Bootstrap-Code, der vor main () ausgeführt wird, die .data-Blöcke in den Lese- / Schreibspeicher kopiert. Der .bss-Code oder globale oder statische lokale Variablen, die nicht initialisiert werden und beim Start als Null angenommen werden, benötigen keinen nichtflüchtigen Speicher, nur den Speicherort und wie viel, und daraus kann der Bootstrap den Wert / lesen. Speicher schreiben.
Es gibt Gründe, warum wir mit Begriffen wie .text, .data, .bss, .rodata usw. kommunizieren. Weil wir sehen, dass die Tools Elemente unseres Programms an diesen Orten platzieren und dann sehen können, wo diese Orte in Nicht-Orten leben müssen -flüchtiger Speicher und dann zur Laufzeit, wenn das anders ist. .text obwohl doof, ist unser Programm, der Maschinencode und andere zugehörige Daten. .data sind Variablen aus unserem Programm, die vor dem Beginn ungleich Null initialisiert werden. Sie müssen daher in einem nichtflüchtigen Speicher gespeichert und dann vor ihrer Verwendung zum Lesen / Schreiben verschoben werden. .bss sind Variablen aus unserem Programm, die beim Start als Null angenommen werden. Daher müssen Menge und Position nichtflüchtig gespeichert werden, und der Boostrap kann die Nullung durchführen (oder manchmal werden sie nur als eine Reihe von Nullen in gespeichert das Flash / Rom auch). .
Dann gibt es die Begriffe Heap und Stack, die bei Bedarf häufig nach Ihrem Programm .bss und .data eine gewisse Menge RAM verbrauchen, häufig von den unteren Adressen aufwärts. dann wird der Rest dieses RAMs in Heap und Stack aufgeteilt, manchmal ohne eine durchgezogene Linie zwischen ihnen. Bei schlecht benommenen Programmen können Heap und Stack kollidieren und einen Absturz verursachen. Stapel ist oft von oben nach unten und Haufen ist oft von unten nach oben, aber dies sind keine festen Regeln.
Wo sind diese auf deinem Board? Nun, es hängt sowohl vom Chip als auch vom Board ab, welche Optionen es gibt. Letztendlich liegt es an Ihnen, dem Programmierer, zu entscheiden, wie Sie den Kompilierungs- und Verknüpfungsprozess steuern. Die meisten Leute erhalten ein Beispiel oder eine Toolchain, die sich mit Ihrem System auskennt, und Sie belassen die Standardeinstellungen. Aber Sie sind äußerst verantwortlich. Damit ein Mikrocontroller booten kann, muss dies möglich sein. In der Regel handelt es sich dabei je nach MCU um einen Flash-On- oder Off-Chip. Das oben genannte nichtflüchtige Material muss dort oder an einem anderen nichtflüchtigen Ort aufbewahrt werden . Ebenso haben Sie einen RAM, den Sie mit den Lese- / Schreib-Dingen aufteilen müssen, die Sie benötigen, einschließlich Stapel und Heap, wenn Sie mutig genug sind, ihn in einem solchen System zu verwenden (nicht weise). Bei einigen Prozessoren ist der Stack Teil des Designs und Sie müssen sich keine Sorgen machen, andere tust du. Wenn Sie ein Vielfaches dieser Dinge haben, nichtflüchtig oder Lese- / Schreib-RAM, können Sie auswählen, wo die Dinge abgelegt werden sollen.
Wenn Sie eine Toolchain von jemandem verwenden oder Zugriff auf andere haben, gibt es keinen Grund anzunehmen, dass diese mit ihrem Programm mit ihrem Standard-Linker-Skript genau dasselbe tun. Normalerweise bieten Toolchains Kartendateien oder andere Möglichkeiten, um zu sehen, wo sie Dinge für Sie platziert haben.
Ist es sicherlich möglich, ein Mikrocontroller-basiertes System ohne Blitz zu haben, wenn man von einer Maus oder Tastatur hört? Einige der zusammen mit vielen anderen Produkten können ohne solche Dinge funktionieren. Einige haben beispielsweise in der Logik des Chips die Möglichkeit, die USB-Aufzählung zu verwalten. Dann enthält der Betriebssystemtreiber für dieses Produkt die Firmware, lädt die Firmware herunter, um sie auf das Gerät zu rammen, startet den Prozessor und zählt den USB möglicherweise neu auf dass es jetzt eine Maus ist oder was auch immer. Nicht jeder macht es, aber es wird manchmal gemacht. Ebenso haben Sie möglicherweise ein anderes Design, bei dem eine andere Hardware oder Lösung das Programm in den Chip / RAM herunterlädt, bevor Sie den Prozessor effektiv starten, sodass das Gefühl entsteht, dass dieser Prozessor keinen Flash hat. Aber Sie haben immer noch den gleichen .text, .data ,.