Befehlssatz von Mikrocontrollern auslesen

Gast #3650476
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.
Gast #3650544
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... = ...
...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren