Forum: Mikrocontroller und Digitale Elektronik Masked Access bei LPC13xx


von Albert .. (albert-k)


Angehängte Dateien:

Lesenswert?

Hallo zusammen
Ich arbeite derzeit mit dem LPCXpresso. Als Device verwende ich einen 
LPC1343. Nun ist mir eine Frage bezüglich der GPIO Ports aufgekommen:

Was ist der Unterschied/Vorteile von Masked Access beim GPIO Data 
Register im gegensatz zum direkten Zugriff auf dieses Register?

Zur verdeutlichung mal ein Codebeispiel
1
#include "gpio.h"
2
3
int main(void) {
4
5
  GPIOInit();  //Initialisiere GPIO Ports
6
7
  LPC_GPIO0->DIR |= (1<<7);  //Setze P0_7 auf Output
8
9
  LPC_GPIO0->DATA &= ~(1<<7);  //Setze P0_7 auf 0
10
  LPC_GPIO0->DATA |= (1<<7);  //Setze P0_7 auf 1
11
12
13
  /*
14
  LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (1<<7);  //Setze P0_7 auf 1
15
  LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (0<<7);  //Setze P0_7 auf 0
16
  */
17
18
  // Enter an infinite loop, just incrementing a counter
19
  volatile static int i = 0 ;
20
  while(1) {
21
    i++ ;
22
  }
23
  return 0 ;
24
}

Die ausgeklammerte Variante ist der Zugriff via Masked Access. Beide 
Codevarianten funktionieren. Zur vollständigkeit halber habe ich auch 
mal den Abschnitt aus dem Datenblatt mit Masked Access als png 
angehängt.

Ich habe das mit dem Masked Access wie folgt verstanden:
Wenn das Adress Bit auf 1 steht wird das zugehörige Bit im Dataregister 
aktualisiert. Wenn das Adressbit auf 0 steht wird es nicht angefasst und 
bleibt auf dem alten Wert.
Dies erreiche ich aber auch durch die Bit Operationen wie man sie vom 
AVR gewohnt ist.
Der einzige Unterschied der mir aufgefallen ist, das Masked Access 
weniger Code benötigt (Kein ODER oder UND Befehl notwendig und weniger 
MOV). Gibt es sonst noch Unterschiede die mir jetzt so nicht klar 
geworden sind?

von Mars (Gast)


Lesenswert?

>Der einzige Unterschied der mir aufgefallen ist, das Masked Access
>weniger Code benötigt (Kein ODER oder UND Befehl notwendig und weniger
>MOV). Gibt es sonst noch Unterschiede die mir jetzt so nicht klar
>geworden sind?

Andere Unterschiede gibt es nicht. Was hast du den erwartet.

Mit dem Mask-Access brauchst du nur einen STR-Befehl, mehr nicht.
Mit dem Data-Access braucht du einen LDR, (AND | OR), und einen STR 
Befehl.

Ersteres ist schneller, braucht weniger Befehle und ist auch noch atomar 
anwendbar.

von Albert .. (albert-k)


Lesenswert?

Mars schrieb:
> Andere Unterschiede gibt es nicht. Was hast du den erwartet.

Ich dachte mir das, wenn es sonst keine Unterschiede gibt, der gcc (wird 
von LPCXpresso in angepasster Form als Compiler verwendet) das setzen 
von Bits immer per Masked Access realisiert. Er also erkennt das ich per
1
LPC_GPIO0->DATA = |= (1<<7);
ein Bit setzen möchte und dieses gleich als Masked Access umschreibt. Da 
er dies nun nicht tut dachte ich mir gibt es vl. noch andere relevante 
unterschiede. Aber höchstwahrscheinlich ist dies so einfach nicht 
inplementiert, oder kann auch gar nicht so inplementiert werden (stelle 
es mir zumindest als Syntac erkennung schwierig vor).

von Mars (Gast)


Lesenswert?

Das könnte man zwar u.U. dem Compiler beibringen, macht aber doch keinen 
Sinn. Kannst ja auch gleich direkt in C das MASK-Register beschreiben.

von Albert .. (albert-k)


Lesenswert?

Ok, dann ist soweit alles geklärt. Danke für deine Antwort.

von willibald (Gast)


Lesenswert?

Mars schrieb:
> Das könnte man zwar u.U. dem Compiler beibringen,
> macht aber doch keinen Sinn.

Unter Umständen wäre es sogar verboten. Nämlich dann, wenn die 
Deklaration von LPC_GPIO0->DATA ein "volatile" enthält und der in C 
beschriebene Zugriff 1:1 in Maschinenbefehle abgebildet werden muss.

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.