Forum: Mikrocontroller und Digitale Elektronik CortexM3 Assembler-Befehl für gesetztes Bit?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Hallo,

Gibt es einen Assembler Befehl, der aus den Bits:
1
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
2
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */
3
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /* Pin 2 selected */
4
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /* Pin 3 selected */
5
: : :

die Nummer des (zu erst) gesetzten Bits zurück gibt:
1
BitNr = ????(GPIO_Pin_0); // BitNr = 0
2
BitNr = ????(GPIO_Pin_1); // BitNr = 1
3
BitNr = ????(GPIO_Pin_2); // BitNr = 2
4
BitNr = ????(GPIO_Pin_3); // BitNr = 3
In der CMSIS habe ich jetzt nichts gefunden.
Auch wenn bei "GPIO_Pin_0" die BitNr 1 wäre, ist das mir auch recht.

Ich wollte nur nicht immer eine FOR Schleife machen um das heraus zu 
finden.

Grüße Markus.

von (prx) A. K. (prx)


Lesenswert?

GCC builtins:
Count leading zeroes:
  bit = __builtin_clz(value)
Find first set bit:
  bit = __builtin_ffs(value)

https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Other-Builtins.html#Other-Builtins

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

A. K. schrieb:

Dankeschön, genau das habe ich gesucht:
__builtin_ctz()


Schade dass es nicht in der CMSIS drin ist, ich muss hier mich mit dem 
Keil abfinden und da ist der Befehl nicht drin.
Jedenfalls weiß ich jetzt besser ich wie suchen kann.

von (prx) A. K. (prx)


Lesenswert?

Assembler: CLZ, wenn von links nach rechts. Wenn von rechts nach links 
gewünscht wird, dann vorher mit RBIT umdrehen.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Vielen Dank, das klappt bestens !

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.