Forum: Compiler & IDEs AVR GCC, Fehlersuche, Harvard Architektur


von EDUARDO Mario (Gast)


Lesenswert?

Hallo alle,

Ich habe die Harvard Architektur und den GCC noch nicht ganz verstanden.

In meinem Programmsystem habe ich irgendwann zufällige Programmaufrufe.
Nach meiner Erfahrung geht das nur mit "Stacküberschreibern" und 
"Interruptvektorüberschreibern".

Stacküberschreiben in C tut man mit Varargs. Verwende ich nicht, gibts 
noch eine Möglichkeit ?
Wie müßte ein Code in C aussehen, der den Interruptvektor ändert?

Wie ist das mit  "(void *) 0" an eine Funktion als Basisadresse eines 
Arrays übergeben, und dann auf das X-te Element zugreifen? Schreibt das 
Programm Code oder Datencode? Und liegen die IVs im Programmbereich?

Oder ist das alles ganz anders mit Harvard ...

Danke für Tips, Mario

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stacküberlauf hat mit Harvard nix zu tun. Wenn der Stack nicht ausreicht 
und in andere Daten wächst und diese überschreibt (oder andere daten 
damit Stack-Inhalte überschreiben), wächst er eben in andere Daten... ob 
Harvard oder nicht.

von Rolf M. (rmagnus)


Lesenswert?

EDUARDO Mario schrieb:
> Stacküberschreiben in C tut man mit Varargs. Verwende ich nicht, gibts
> noch eine Möglichkeit ?

Zu große lokale Variablen, Schreiben hinter ein Array-Ende, Benutzung 
von nicht/falsch initialisierten Zeigern oder Array-Indizes, zuviele 
globale Variable, zuviel dynamische Speicheallokation, ...

> Wie müßte ein Code in C aussehen, der den Interruptvektor ändert?

Gibt's nicht, zumindest nicht aus Versehen.

> Wie ist das mit  "(void *) 0" an eine Funktion als Basisadresse eines
> Arrays übergeben, und dann auf das X-te Element zugreifen? Schreibt das
> Programm Code oder Datencode?

Zuerst kommen die normalen Register, dahinter die I/O-Register, dann das 
RAM.

> Und liegen die IVs im Programmbereich?

Auf Programmspeicher kannst du beim avr-gcc nur über spezielle 
C-Funktionen zugreifen.

von Oliver (Gast)


Lesenswert?

EDUARDO Mario schrieb:
> Oder ist das alles ganz anders mit Harvard ...

Mal es dir halt mal auf. Du hast einen Speicherbereich (Flash) für das 
Programm, und einen zweiten (SRAM) für die Daten. Beide fangen bei 
Adresse 0 an.

Am Anfang des Flashs liegen die Interruptvektoren. Schreiben kann man 
das Flash aus dem Programm zwar prinzipiell auch, aber nicht 
unbeabsichtigt.

In den Anfang des SRAM sind die Register des Prozessors gemappt, im 
weiteren SRAM dann die globalen und statischen Variablen, vom Ende her 
wächst der Stack.

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Oder einfach mal ins Datenblatt schauen. Da ist genau so ein Bild schon 
drin.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hier ist ein Bildchen, das das Speichermodell von avr-gcc zeigt:

http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc

von Oliver (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Oder einfach mal ins Datenblatt schauen.

Wer macht denn sowas? Doku lesen ist doch uncool, da schreibt man lieber 
mal schnell eine noob-Frage ins Forum ;)

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.