effizientes Bit-Setzen beim ARM7

Gast #677263
Lesenswert?
• ▲
▼
Hallo

Ich möchte beim ARM7, LPC2148 je nach Softwarekonfiguration einen 
digitalen Ausgang active low bzw. active high betreiben.
Aus Geschwindigkeitsgründen möchte ich jedoch nicht laufend die aktuelle 
Konfiguration, welche im Programverlauf geändert werde kann, abfragen

Als z.B. ein Konstrukt wie


if (EnabelPinActiveHigh != 0)
{
  if (EnableOn) FIO1SET = pfENABLE_MASK;
    else  FIOCLR = pfENABLE_MASK;
}
else
{
  if (EnableOn) FIO1CLR = pfENABLE_MASK;
    else  FIOSET = pfENABLE_MASK;
}

gibt es da vielleicht etwas effizienteres?

Vielen Dank

Frank
#677931
Lesenswert?
• ▲
▼
Letztlich wären das 2 Pointer, einen für's einschalten, einen für's 
ausschalten. Und die Frage ob "ein"=1 oder "ein"=0 entscheidet, ob der 
für's einschalten auf das "SET" oder das "CLR" Register zeigt.

Aber du kannst natürlich auch mit den Adressen rechnen. Immerhin 
unterscheiden sich die Adressen von FIOSET und FIOCLR in genau einem 
Bit, so dass du deine EnableXXX Variablen in dieses Bit der Adresse 
rein-exodern kannst.

Fertigen Code werde ich dir nicht liefern, bischen selber denken darfst 
du schon noch.
Gast #677953
Lesenswert?
• ▲
▼
Vielen Dank

Das könnte dann so klappen:
1
unsigned long* LED_REG_ON;                   
2
unsigned long* LED_REG_OFF;
3

4
void SetConfig(unsigned char ConfigValue)
5
{
6
    if ((ConfigValue & 0x01)!=0)
7
    {
8
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0SET
9
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
10
    }
11
    else
12
    {
13
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
14
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0CLR
15
    }
16
}
17

18
#define LED_MASK  1 << 10
19

20

21
int main()
22
{
23
  SetConfig(0);  // Led is active low
24
  LED_REG_ON = LED_MASK; // switch on led by clearing bit 10
25
  LED_REG_OFF = LED_MASK; // switch off led by setting bit 10
26
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.