www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Masked Access bei LPC13xx


Autor: Albert ... (albert-k)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
#include "gpio.h"

int main(void) {

  GPIOInit();  //Initialisiere GPIO Ports

  LPC_GPIO0->DIR |= (1<<7);  //Setze P0_7 auf Output

  LPC_GPIO0->DATA &= ~(1<<7);  //Setze P0_7 auf 0
  LPC_GPIO0->DATA |= (1<<7);  //Setze P0_7 auf 1


  /*
  LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (1<<7);  //Setze P0_7 auf 1
  LPC_GPIO0->MASKED_ACCESS[(1<<7)] = (0<<7);  //Setze P0_7 auf 0
  */

  // Enter an infinite loop, just incrementing a counter
  volatile static int i = 0 ;
  while(1) {
    i++ ;
  }
  return 0 ;
}

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?

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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
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).

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Albert ... (albert-k)
Datum:

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

Autor: willibald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.