Forum: Compiler & IDEs Auswirkung unterschiedlicher Architektur


von Array D. (array94)


Lesenswert?

Hallo liebes Forum,

Erstmal danke, dass ich hier meinen ersten Beitrag(Frage) verfassen 
darf.

Nehmen wir mal die ARM-Reihe. Was verändert sich für mich als C-Anfänger 
wenn ich eine andere Architektur verwende? Schließlich programmiere ich 
ja nicht in Assembler. Den Code den ich eingebe ist der Selbe, egal ob 
load/store Architektur oder nicht?
Ist in diesem Fall eigentlich nur der Compiler betroffen?

Mein Dozent meinte letztens,dass der neue Cortex R4 Atomare Befehle 
unterstützt. Deswegen die Anregung.


LG

von PittyJ (Gast)


Lesenswert?

Es ändert sich nichts.
Solange nicht auf Hardware zugegriffen wird.
Zu beachten ist, dass ints unterschiedluch groß sein können. Deshalb 
sollte man im Vorfeld schon Typen wie uint32_t oder size_t benutzen.

von Nop (Gast)


Lesenswert?

Array D. schrieb:

> Mein Dozent meinte letztens,dass der neue Cortex R4 Atomare Befehle
> unterstützt. Deswegen die Anregung.

Wenn Du auf das Level gehst, wo diese Eigenarten wichtig sind, dann mußt 
Du sowieso in Assembler programmieren, weil Du ansonsten keine Gewißheit 
hast, welche Befehle der Compiler am Ende überhaupt nimmt.

Gibt aus C-Sicht noch ein paar Feinheiten; neben den ints ist das auch 
die signedness des Datentyps char. x86 und ARM sind da per default genau 
umgedreht. Das ist aber egal, solange Du mit char nicht rechnest, 
sondern nur Zeichen speicherst. Zum Rechnen nimmt man einfach uint8_t 
bzw. int8_t.

Was man auch oft als Fehler sieht in C-Code, ist die implizite Annahme, 
ein Pointer müsse 4 Byte groß sein. Das geht bei 64bit-Code dann schief. 
Will man mal wirklich bitweise auf Pointern herumfummeln, dann gibt's 
dafür den Datentyp uintptr_t. Der gibt einem immer einen Integer, der 
einen Pointer fassen kann.

Dann hat man bei manchen, aber nicht allen ARMs das Alignment. Manche 
können keinen int auf einer ungeraden Adresse verarbeiten (gibt nen 
Absturz); andere können es, brauchen dafür aber zwei Zugriffe, zwischen 
denen auch noch ein Interrupt passieren kann. Eine weitere Folge ist, 
daß Structs sich auf manchen ARMs packen lassen, auf anderen nicht.

Endianess ist natürlich auch immer ein Thema, sobald man Daten zwischen 
verschiedenen Architekturen tauscht (man normiert das Format dann an den 
externen Schnittstellen).

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Dann hat man bei manchen, aber nicht allen ARMs das Alignment. Manche
> können keinen int auf einer ungeraden Adresse verarbeiten (gibt nen
> Absturz); andere können es, brauchen dafür aber zwei Zugriffe,

Bis einschliesslich ARMv5 (z.B. ARM7,ARM9) gibts weder einen Trap noch 
das, was man dabei haben will, sondern Datenmüll.

Beim Load wird das Wort an der Adresse gelesen und anhand der unteren 
beiden Adressbits rotiert. Byte-Load unterscheidet sich vom Word-Load 
nur in der Maskierung.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nop schrieb:
> ibt aus C-Sicht noch ein paar Feinheiten; neben den ints ist das auch
> die signedness des Datentyps char. x86 und ARM sind da per default genau
> umgedreht.

Das sind zwar Unterschiede, aber keine, die der jeweiligen 
Prozessorarchitektur anzulasten sind. Das liegt ausschließlich im 
verwendeten Compiler.

von Rolf M. (rmagnus)


Lesenswert?

A. K. schrieb:
> Nop schrieb:
>> Dann hat man bei manchen, aber nicht allen ARMs das Alignment. Manche
>> können keinen int auf einer ungeraden Adresse verarbeiten (gibt nen
>> Absturz); andere können es, brauchen dafür aber zwei Zugriffe,
>
> Bis einschliesslich ARMv5 (z.B. ARM7,ARM9) gibts weder einen Trap noch
> das, was man dabei haben will, sondern Datenmüll.

Also auf dem ARM7TDMI (ARMv4), den ich mal programmiert habe, wurde in 
so einem Fall eine Hardware-Exception ausgelöst.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Also auf dem ARM7TDMI (ARMv4), den ich mal programmiert habe, wurde in
> so einem Fall eine Hardware-Exception ausgelöst.

War Fehlinformation aus
https://www.heyrick.co.uk/armwiki/Unaligned_data_access

Das AARMv5 sagt, dass man bei implementiertem System Control Coprocessor 
einen Alignment-Trap einschalten kann. Die ersten ARM Versionen hatten 
das definitiv nicht.

von Nop (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das liegt ausschließlich im  verwendeten Compiler.

Richtig, und man kann das auf Wunsch auch mit einem Compiler-Switch 
ändern. Aber es ist definitiv ein potentieller Stolperstein für einen 
C-Anfänger, und wenn man da nicht drauf kommt, kann man ziemlich lange 
suchen.

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.