Forum: Mikrocontroller und Digitale Elektronik MSP430 ASM Datenstrukturen


von Uhu U. (uhu)


Lesenswert?

Wie vereinbart man im IAR-ASM für den MSP430 eine Datenstruktur?

Wenn ich es so mache:
1
ORG    0
2
I1:    DS8    1
3
I2:    DS8    1
4
5
ORG    0
6
C1:    DS8    1
7
C2:    DS8    1

dann mault der Linker, bei C1:

   Different parts of ASEG have overlapping code

von Meister E. (edson)


Lesenswert?

Hallo,

leider habe ich weder IAR noch MSP430 bisher eingesetzt. Aber die 
wiederholte Nutzung von ORG auf derselben Adresse kann kein mir 
bekannter Assembler durchgehen lassen.

Gibt es kein .equ, .equiv oder sowas, womit du Adressen neu benamen 
kannst?

Gruß,
Edson

von Uhu U. (uhu)


Lesenswert?

Meister Eder schrieb:
> leider habe ich weder IAR noch MSP430 bisher eingesetzt. Aber die
> wiederholte Nutzung von ORG auf derselben Adresse kann kein mir
> bekannter Assembler durchgehen lassen.

Zu seeligen 8080-Zeiten haben wir das immer so gemacht...

> Gibt es kein .equ, .equiv oder sowas, womit du Adressen neu benamen
> kannst?

Doch, das gibts, aber das ist doch ein Murx.

von Meister E. (edson)


Lesenswert?

>Zu seeligen 8080-Zeiten haben wir das immer so gemacht...

Naja, der zählt für mich zu den Unbekannten.


>Doch, das gibts, aber das ist doch ein Murx.

Warum, was hast du denn vor?

von Uhu U. (uhu)


Lesenswert?

Wenn dus mit EQU machst, must du die Offsets der Labels absolut angeben.

Wenn man jetzt aus irgendwelchen Gründen die Reihenfolge ändern muß, 
dann stimmt nichts mehr und man muß die Offsets neu ausrechnen.

Wenn man es mit ORG machen könnte, dann müßte man nur die betreffende(n) 
Zeile(n) verschieben und den Rest besorgt der ASM.

von Uhu U. (uhu)


Lesenswert?

Mit Macros kann man sich was basteln, was es tut:

1
STRUCT  MACRO  name
2
LEVEL$  SET  0
3
  ENDM
4
5
ALLOC  MACRO  name, length
6
name:  EQU  LEVEL$
7
LEVEL$  SET  LEVEL$+length
8
  ENDM
9
10
PADDING  MACRO  modul
11
  IF LEVEL$ % modul != 0
12
  LEVEL$:  SET  (LEVEL$ + modul) & ~ (modul - 1)
13
  ENDIF
14
  ENDM
15
16
; PLD_Data
17
  STRUCT PLD_Data
18
  ALLOC  PLD_Timer,            2
19
  ALLOC  PLD_State,            2
20
  ALLOC  PLD_RepCount,         1
21
  ALLOC  PLD_DtFlags,          1
22
23
; PLD_Header
24
  STRUCT PLD_Header
25
  ALLOC  PLD_DataPtr,          2
26
  ALLOC  PLD_DescList,         2
27
  ALLOC  PLD_t1SyncThreshold,  2
28
  ALLOC  PLD_Initializer,      2
29
  ALLOC  PLD_Setup,            2
30
  ALLOC  PLD_InterruptMask,    1
31
  PADDING  2
32
  PLD_HeaderLength:  EQU  LEVEL$

Es werden zwei Strukturen PLD_Data und PLD_Header definiert

von Meister E. (edson)


Lesenswert?

Beim MPASM gibt es die Anweisung udata_ovr, die überlappende 
Datenbereiche zulässt. In der IAR Doku hab ich auf die Schnelle nichts 
vergleichbares finden können(zum 1.mal reingeschaut). Dein Beispiel aus 
dem ersten Post sähe dann so aus:
1
same_var udata_ovr 0x80
2
i1   res 1
3
i2   res 1
4
5
same_var udata_ovr 0x80
6
c1   res 1
7
c2   res 1

Gegenüber deinem Makro sieht das doch richtig übersichtlich aus. Klar, 
hilft hier nix - aber du hast ja schon eine Lösung gefunden.

Grüße,
Edson

von Uhu U. (uhu)


Lesenswert?

Das letzte Beispiel für die Anwendung meiner Macros ist aus dem echten 
Leben.

Mein Beispiel vom Eingangsposting würde damit so aussehen:
1
; Struct I
2
       STRUCT I
3
       ALLOC  I1, 1
4
       ALLOC  I2, 1
5
6
; Struct C
7
       STRUCT C
8
       ALLOC  C1, 1
9
       ALLOC  C2, 1

Ist also auch nicht so viel unbersichtlicher, als die Syntax von MPASM.

Wobei der PADDING-Macro wohl besser so aussehen sollte:
1
PADDING  MACRO  modul
2
  IF LEVEL$ % modul != 0
3
  LEVEL$:  SET  (LEVEL$ + modul - 1) & ~ (modul - 1)
4
  ENDIF
5
  ENDM

modul muß eine 2er-Potenz sein.

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.