Forum: Mikrocontroller und Digitale Elektronik Code von IAR zu CCS portieren


von Master-Jimmy (Gast)


Lesenswert?

Ich würde gerne eine bestehende Firmware portieren.

Im bestehenden Code hat es einen Header mit einer Reihe von "Defines" im 
folgenden Stil:
1
#define O_LED_1 (P3OUT_bit.P3OUT_0)
Diese Ausgänge werden dann im Weiteren folgendermassen benutzt:
1
if(is_shutter_closed()) {
2
  O_LED_1 = 1;
3
else
4
  O_LED_1 = 0;
Das Problem ist nun, dass dieser bitweise Zugriff auf Port-Pins 
IAR-spezifisch ist. Ich könnte also nun entweder den ganzen Code 
durchgehen und umschreiben:
1
#define LED1_ON  (P3OUT |= BIT0)
2
#define LED1_OFF (P3OUT &= ~(BIT0))
1
if(is_shutter_closed()) {
2
  LED1_ON
3
else
4
  LED1_OFF
Oder aber ich "rüste" den bitweisen Zugriff nach. Dafür wollte ich etwas 
in der folgenden Art und Weise definieren:
1
volatile union {
2
  struct {
3
    unsigned char P1OUT_0 : 1;
4
    unsigned char P1OUT_1 : 1;
5
    unsigned char P1OUT_2 : 1;
6
    unsigned char P1OUT_3 : 1;
7
    unsigned char P1OUT_4 : 1;
8
    unsigned char P1OUT_5 : 1;
9
    unsigned char P1OUT_6 : 1;
10
    unsigned char P1OUT_7 : 1;
11
  };
12
  unsigned char P1OUT;
13
} P1OUT_bit;
Dummerweise erschaffe ich so aber ein neues Bitfeld namens "P1OUT" in 
Zeile 12. Wie kann ich das mit dem bestehenden P1OUT verknüpfen?

von Jim M. (turboj)


Lesenswert?

Vorsicht: Der Bitfield Zugriff ist read-modify-write und damit nicht 
mehr atomar. Das knallt wenn es P3 Zugriffe im Interrupt gibt.

Daher ist die Macro Methode vorzuziehen.

von 900ss (900ss)


Lesenswert?

So sollte es gehen.
Beitrag "Re: Direkter Portzugriff beim Arduino"

Hier nochmal das gleiche von Peter D.
Beitrag "Re: Einfachere Schreibweise gesucht"

Das Problem atomar oder nicht hat auch schon vorher existiert, je nach 
Architektur.
Aber sollte man beachten.

von Master-Jimmy (Gast)


Lesenswert?

Vielen Dank für den Hinweis bzgl. "atomar". Muss ich mir noch anschauen, 
ob das in meinem Fall nun ein Problem ist oder nicht.

Ich konnte mittlerweile testweise eine LED auf einem MSP-EXP430FR5739 
blinken lassen. Das ist evtl. für den nächsten ganz informativ, wenn er 
auf diesen Thread stossen sollte:
1
#include <msp430.h>
2
3
#define FOREVER (1)
4
5
typedef union {
6
  struct {
7
    volatile unsigned char _0 : 1;
8
    volatile unsigned char _1 : 1;
9
    volatile unsigned char _2 : 1;
10
    volatile unsigned char _3 : 1;
11
    volatile unsigned char _4 : 1;
12
    volatile unsigned char _5 : 1;
13
    volatile unsigned char _6 : 1;
14
    volatile unsigned char _7 : 1;
15
  } pin;
16
  volatile unsigned char PORT;
17
} port_t;
18
19
volatile port_t *port_j = (volatile port_t*)(0x0320 + 0x02);
20
21
#define O_LED_1 (port_j->pin._0)
22
23
void main(void) {
24
  WDTCTL = WDTPW + WDTHOLD;
25
  PM5CTL0 &= ~LOCKLPM5;
26
27
  PJOUT = 0;
28
  PJDIR |= BIT0;
29
30
  while(FOREVER) {
31
    volatile unsigned short i = 40000;
32
33
    if(PJOUT & BIT0) {
34
      O_LED_1 = 0;
35
    } else {
36
      O_LED_1 = 1;
37
    }
38
39
    do {
40
      --i;
41
    } while(i != 0);
42
  }
43
}

von Master-Jimmy (Gast)


Lesenswert?

Master-Jimmy schrieb:
> volatile port_t *port_j = (volatile port_t*)(0x0320 + 0x02);

Die "Magic Numbers" entnimmt man dem Datenblatt - im Falle des 
MSP430FR5739 ist dies konkret die Tab. 6-24:
https://www.ti.com/lit/gpn/msp430fr5739

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.