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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren