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

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.