Code von IAR zu CCS portieren

Gast #6913322
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?
Gast #6913398
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
}

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