Forum: Compiler & IDEs Befehlssatz von Mikrocontrollern auslesen


von Achim (Gast)


Lesenswert?

Hi,

Ich programmier gerade einen Code, der sowohl auf einem STM32F4 als auch 
F0 und vermutlich später ein paar mehr laufen soll. Zum optimieren des 
ganzen würde ich gerne ein paar inline Assembler Befehle nutzen, 
allerdings wären das je nach Coretex andere Befehle.

Zum Beispiel ein Bitswap:
Also bit0 -> bit31 bit1 -> bit30 , ... , bit31 -> bit0
Verwendet habe ich dazu den Code von hier:
http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious
1
  // swap odd and even bits
2
  a = ((a >> 1) & 0x55555555) | ((a & 0x55555555) << 1);
3
  // swap consecutiae pairs
4
  a = ((a >> 2) & 0x33333333) | ((a & 0x33333333) << 2);
5
  // swap nibbles ...
6
  a = ((a >> 4) & 0x0F0F0F0F) | ((a & 0x0F0F0F0F) << 4);
7
  // swap bytes
8
  a = ((a >> 8) & 0x00FF00FF) | ((a & 0x00FF00FF) << 8);
9
  // swap 2-byte long pairs
10
  a = ( a >> 16             ) | ( a               << 16);

GCC weiß allerdings nicht, dass es sich dabei um einen Bitswap handelt, 
also wird auf einem Cortex M4 nicht RBIT und bei einem M0 zumindest die 
Hälfte mit einem REV "abgekürzt" 
(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489h/Cihjgdid.html)

Habe noch ein paar andere Fälle, in denen ich die DIV Operation anders 
behandeln könnte, wenn es diese (beim M0) nicht gibt.

Also jetzt zu meiner Frage, Gibt es die Möglichkeit in GCC schon über 
Preprozessor-Anweisungen nach den unterstützen Befehlen zu Fragen?
Ich könnte natürlich auch Fragen, ob es sich um einen Cortex M0 oder M4 
handelt, dann müsste ich das aber für jeden Prozessor machen, der später 
dazu kommt. Oder wäre das die allgemeine Vorgehensweise.

von preprocessor (Gast)


Lesenswert?

Ja, man über setzt den Code für jeden Core.Im Quelltext definierst du 
dss entsprechend. #define TARGETCORE CortexM0 // M3 M4 ...

An den gewünschten Stellen wird dann bedingt compiliert.
#ifdef TA... = ...
...
#elseifdef TA... = ...
...

von Dr. Sommer (Gast)


Lesenswert?

Was der Cortex-M0 (F0) kann, kann der M3 (F1) auch, und was der kann 
kann der M4 (F3, F4) auch. Wenn dir die Geschwindigkeit vom M0 reicht, 
kannst du einfach dessen Instruktionen nehmen.

von (prx) A. K. (prx)


Lesenswert?

Vielleich ist da was passendes dabei:
   arm-...-gcc -dM -E -x c /dev/null | grep -i arm

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.