Forum: Mikrocontroller und Digitale Elektronik IAR ARM Compiler - wie wird intrinsics.h das compiliert ?


von Heimrich (Gast)


Lesenswert?

Guten Morgen,
IAR liefert in der Workbench sogenannte intrinsic-Functions 
(intrinsics.h) welche einem das Leben leichter machen sollen. Gerade was 
Critical Sections betrifft.

Wie finde ich denn am besten heraus, wie der IAR-Arm-Compiler folgenden 
Code umsetzt?
1
__istate_t isate = __get_interrupt_state();
2
__disable_interrupt();
3
...
4
__set_interrupt_state(istate);

Würde den Code gerne etwas portabler gestalten.

Gruß

von Oliver J. (skriptkiddy)


Lesenswert?

Heimrich schrieb:
> Wie finde ich denn am besten heraus, wie der IAR-Arm-Compiler folgenden
> Code umsetzt?
Das Assembler-Listing anschauen.

Gruß Oliver

von Karl H. (kbuchegg)


Lesenswert?

Heimrich schrieb:

> Wie finde ich denn am besten heraus, wie der IAR-Arm-Compiler folgenden
> Code umsetzt?

Was meinst du damit?

* Wie der Code dann letzten Endes auf der CPU abläuft, sprich was der
  Compiler daraus generiert?
  -> die meisten Compiler können ein Assembler Listing dessen erzeugen,
  was sie an Code generiert haben

* Wie man dem Compiler klar macht, was es an dieser Stelle Spezielles
  zu tun gibt. Sprich: wie die Dinge in der IAR-Erweiterung zur Sprache
  C formuliert sind.
  -> auch intrinsic.h ist ein Header File wie jedes andere. Also ein
  Textfile. Das kann man mit einem Editor aufmachen und sich ansehen
  wie die IAR Leute das implementiert haben. Dinge wie diese haben
  normalerweise das Zeug dazu, dass sie als inline Funktionen
  formuliert sind. D.h. die Chancen stehen ganz gut, dass du die
  komplette Implementierung von zb __disable_interrupt() in
  intrinsic.h findest.

> Würde den Code gerne etwas portabler gestalten.

Solche Sachen sind sowieso hochgradig unportabel. NOrmalerweise 
postuliert man, dass zumindest das Prinzip überall gleich ist und sich 
nur die Namen der Funktionen von Compiler zu Compiler verändern. D.h. 
man kapselt das mit ein paar Makros
1
#ifdef __IAR
2
#include <intrinsic.h>
3
#define I_STATE        __istate_t
4
#define GET_STATE      __get_interrupt_state()
5
#define CLI            __disable_interrupt()
6
#define RESTORE_STATE  __set_interrupt_state(istate)
7
#elseif _GCC
8
....
9
#endif

von Heimrich (Gast)


Lesenswert?

Ok, werde mir mal die intrinsics.h genauer anschauen...
Danke!

von Heimrich (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> -> auch intrinsic.h ist ein Header File wie jedes andere. Also ein
>   Textfile. Das kann man mit einem Editor aufmachen und sich ansehen
>   wie die IAR Leute das implementiert haben.

Also hier mal der Auszug aus intrinsics.h:
1
__ATTRIBUTES void    __no_operation(void);
2
3
__ATTRIBUTES void    __disable_interrupt(void);
4
__ATTRIBUTES void    __enable_interrupt(void);
5
6
typedef unsigned long __istate_t;
7
8
__ATTRIBUTES __istate_t __get_interrupt_state(void);
9
__ATTRIBUTES void __set_interrupt_state(__istate_t);

Das ist auch alles was ich zu den Funktionen finden kann. Kann es sein 
dass der IAR-Compiler das Schüsselwort "__ATTRIBUTES" erkennt und dann 
weis was zu tun ist?

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.