Forum: Mikrocontroller und Digitale Elektronik Bit-Zugriffe wie bei Microchip


von Schotter (schottre)


Lesenswert?

Hallo,

ich habe mich bei einem PIC-Projekt in deren Bit-Zugriff "verliebt" und 
hätte den natürlich gerne auf andere Projekte übertragen. Wenn ich mich 
nicht irre gehen die Xmegas z.B. auch in die Richtung, aber jetzt 
überlege ich, ob ich ein bestehendes Projekt nicht von "grausam" nach 
schön umziehen soll. Die PIC-Strukturen sehen so aus:
1
extern volatile unsigned int  IFS1 __attribute__((__sfr__));
2
typedef struct tagIFS1BITS {
3
  unsigned SI2C1IF:1;
4
  unsigned MI2C1IF:1;
5
  unsigned CMIF:1;
6
  unsigned CNIF:1;
7
  unsigned INT1IF:1;
8
  unsigned :4;
9
  unsigned OC3IF:1;
10
  unsigned OC4IF:1;
11
  unsigned T4IF:1;
12
  unsigned T5IF:1;
13
  unsigned INT2IF:1;
14
  unsigned U2RXIF:1;
15
  unsigned U2TXIF:1;
16
} IFS1BITS;
17
extern volatile IFS1BITS IFS1bits __attribute__((__sfr__));

In der Renesas iodefine.h steht:
1
typedef struct {
2
  unsigned char no0 :1;
3
  unsigned char no1 :1;
4
  unsigned char no2 :1;
5
  unsigned char no3 :1;
6
  unsigned char no4 :1;
7
  unsigned char no5 :1;
8
  unsigned char no6 :1;
9
  unsigned char no7 :1;
10
} __BITS8;
11
12
union un_p0 {
13
  unsigned char p0;
14
  __BITS8 BIT;
15
};
16
17
#define P0 (*(volatile union un_p0 *)0xFFF00).p0
18
#define P0_bit (*(volatile union un_p0 *)0xFFF00).BIT

Jetzt würde ich gerne wissen, ob so eine Umstellung

- ein Kinderspiel
- was größeres

ist, oder überhaupt nicht geht, weil man dabei ein Fass nach dem anderen 
aufmacht und man letztlich nach ein paar Versuchen eh nur frustriert das 
Handtuch wirft.

Danke,
Thorsten

von micha (Gast)


Lesenswert?

Das mit den structs sind "bitfields", d.h. Du kannst ganz genau sagen, 
wie viele Bits eine Variable ist. Allerdings sagt der Standard IMHO 
nichts darüber aus, ob und wie padding gemacht wird, d.h. so ein struct 
könnte auch für jedes Element ein Byte verbrauchen (aber nur ein Bit 
daraus nutzen) anstatt nur einem. Bei den meisten Compilern kann man das 
mit entsprechenden Attributen steuern (sprich, die Lösung wird auf jeden 
Fall Compiler-abhängig!). Dann ist die Frage, wie effektiv der Zugriff 
auf die einzelnen Bits ist. Kommt also auch auf den Compiler an. Ich 
meine hier im Forum gab es auch schon öfters entsprechende Diskussionen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

mmhmm ... ich frag mich ob der Compiler da soviel Möglichkeiten hat ...

Der union würde vmtl garnicht kompilieren, wenn es so wäre, wie in der 
vorherigen Antwort ... Also dass jedes Bit ein Byte belegt, aber nur 1 
Bit verwendet wird:
1
union un_p0 {
2
  unsigned char p0;
3
  __BITS8 BIT;
4
};

von Klaus (Gast)


Lesenswert?

Thorsten S. schrieb:
> - was größeres

Schon mal geschaut, wie groß die Headerfiles von den PICs sind? Das 
selbst von Hand fehlerfrei hinzubekommen, ist möglicherweise mehr 
Aufwand, als das Projekt mit einem PIC neu zu starten.

MfG Klaus

P.S. ich vermute, die PIC-Leute lassen sich die Files automatisch aus 
den Prozessordesigns erzeugen.

von Volker S. (vloki)


Lesenswert?

Klaus schrieb:
> Schon mal geschaut, wie groß die Headerfiles von den PICs sind?

Man muss ja nicht gleich alles komplett reinschreiben.
Einfach nur das was man gerade so braucht ergänzen.
Am besten gleich zu Anfang checken, was der Compiler da draus macht ;-)

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.