Forum: Mikrocontroller und Digitale Elektronik MSP430 Error: Placement fails for object


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nico B. (nicoholic)


Lesenswert?

Hallo zusammen,

Ich versuche gerade unten stehendes Beispielprogramm von TI auf meinen 
MSP430F5438 zum Laufen zu bekommen.

Zum Compilieren verwende ich Code Composer Studio Core Edition, Version: 
4.1.0.02006.

Beim Linken erhalte ich immer folgenden Fehler:
1
"../lnk_msp430f5438.cmd", line 186: error: placement fails for object ".int55",
2
   size 0x4 (page 0).  Available ranges:
3
   INT55        size: 0x2          unused: 0x2          max hole: 0x2

Programm:
1
#include "msp430x54x.h"
2
3
#define   Num_of_Results   8
4
5
volatile unsigned int A0results[Num_of_Results];
6
volatile unsigned int A1results[Num_of_Results];
7
volatile unsigned int A2results[Num_of_Results];
8
volatile unsigned int A3results[Num_of_Results];
9
10
void main(void)
11
{
12
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
13
  P6SEL = 0x0F;                             // Enable A/D channel inputs
14
  ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8; // Turn on ADC12, extend sampling time
15
                                            // to avoid overflow of results
16
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;       // Use sampling timer, repeated sequence
17
  ADC12MCTL0 = ADC12INCH_0;                 // ref+=AVcc, channel = A0
18
  ADC12MCTL1 = ADC12INCH_1;                 // ref+=AVcc, channel = A1
19
  ADC12MCTL2 = ADC12INCH_2;                 // ref+=AVcc, channel = A2
20
  ADC12MCTL3 = ADC12INCH_3+ADC12EOS;        // ref+=AVcc, channel = A3, end seq.
21
  ADC12IE = 0x08;                           // Enable ADC12IFG.3
22
  ADC12CTL0 |= ADC12ENC;                    // Enable conversions
23
  ADC12CTL0 |= ADC12SC;                     // Start convn - software trigger
24
  
25
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, Enable interrupts
26
  __no_operation();                         // For debugger
27
  
28
}
29
30
#pragma vector=ADC12_VECTOR
31
__interrupt void ADC12ISR (void)
32
{
33
  static unsigned int index = 0;
34
35
  switch(__even_in_range(ADC12IV,34))
36
  {
37
  case  0: break;                           // Vector  0:  No interrupt
38
  case  2: break;                           // Vector  2:  ADC overflow
39
  case  4: break;                           // Vector  4:  ADC timing overflow
40
  case  6: break;                           // Vector  6:  ADC12IFG0
41
  case  8: break;                           // Vector  8:  ADC12IFG1
42
  case 10: break;                           // Vector 10:  ADC12IFG2
43
  case 12:                                  // Vector 12:  ADC12IFG3
44
    A0results[index] = ADC12MEM0;           // Move A0 results, IFG is cleared
45
    A1results[index] = ADC12MEM1;           // Move A1 results, IFG is cleared
46
    A2results[index] = ADC12MEM2;           // Move A2 results, IFG is cleared
47
    A3results[index] = ADC12MEM3;           // Move A3 results, IFG is cleared
48
    index++;                                // Increment results index, modulo; Set Breakpoint1 here
49
    
50
    if (index == 8)
51
    {
52
      (index = 0);
53
    }
54
  case 14: break;                           // Vector 14:  ADC12IFG4
55
  case 16: break;                           // Vector 16:  ADC12IFG5
56
  case 18: break;                           // Vector 18:  ADC12IFG6
57
  case 20: break;                           // Vector 20:  ADC12IFG7
58
  case 22: break;                           // Vector 22:  ADC12IFG8
59
  case 24: break;                           // Vector 24:  ADC12IFG9
60
  case 26: break;                           // Vector 26:  ADC12IFG10
61
  case 28: break;                           // Vector 28:  ADC12IFG11
62
  case 30: break;                           // Vector 30:  ADC12IFG12
63
  case 32: break;                           // Vector 32:  ADC12IFG13
64
  case 34: break;                           // Vector 34:  ADC12IFG14
65
  default: break; 
66
  }  
67
}

Scheinbar gibt es Probleme mit dem Interrupt. Ich verstehe nicht, wie 
ich das Problem beheben kann. Hat jemand eine Idee?

Besten Dank
Nico

von Yagan Ζ. D. (yagan)


Lesenswert?

Nico,

wäre vielleicht interessant in das Linker-Script "lnk_msp430f5438.cmd" 
hineinzuschauen, was da in Zeile 186 steht. An deinem Programm-Code kann 
ich nichts Ungewöhnliches entdecken.

Ciao, Yagan

von Pothead (Gast)


Lesenswert?

Sieht fast so aus als wenn er die Interrupt Routine im oberen Speicher 
(>64k) platzieren will und dafür eine >16Bit Adresse braucht bzw. 
verwenden will. Das Linker Script wäre aufschlussreich.

von Nico B. (nicoholic)


Angehängte Dateien:

Lesenswert?

Erstmal vielen Dank für die Antworten.

Das Linker-File habe ich angehängt. Hier ein paar Ausschnitte, die sich 
auf den Fehler beziehen:

Zeile 97 :
1
INT55: origin = 0xFFFE, length = 0x0002

Zeile 186:
1
.int55   : {} > INT55

Übrigens habe ich vergessen zu erwähnen, dass ich den MSP auf einem 
Experimentierboard verwende (MSP-EXP430F548).

von Pothead (Gast)


Angehängte Dateien:

Lesenswert?

Mhhh, also das sieht soweit gut aus. Ein Versuch ist es wert: Versuche 
mal das Script im Anhang. Viel Hoffnung habe ich aber nicht...

Kann man beim Composter ein Data-Model einstellen (16Bit vs 20Bit 
Adressen)?

von Yagan Ζ. D. (yagan)


Lesenswert?

Nico,

zum Test habe ich gerade deinen Quellcode in die Datei eines 
Beispielprojekts kopiert, auf MSP430F5438 eingestellt und übersetzen 
lassen. Es funktioniert alles fehlerfrei. Ich benutze allerdings die 
aktuelle Version: 4.1.2.00027.

Wie hast du denn dein Projekt erstellt?

Vielleicht ist irgendeine Option unpassend eingestellt, oder dein 
benutzter Code Composer hat ein Problem.

Versuche doch mal eines der mitgelieferten Beispielprojekte als 
Grundlage zu benutzen. Wenn das nicht hilft, würde ich den aktuellen 
Code Composer bei TI herunterladen und installieren.

Ciao, Yagan

von Nico B. (nicoholic)


Lesenswert?

Modifizierte cmd und CCS Update haben leider nichts geholfen, aber 
inzwischen konnte ich den Fehler finden.

Es handelt sich offenbar um einen Konflikt mit den Headerfiles, die das 
Board verwendet, auf dem ich meinen MSP betreibe. Ohne die Header läuft 
die A/D Wandlung.

Danke für eure Mühe :-)

von Achim B. (achimb)


Lesenswert?

Koennte es sein das in deinen Header Dateien der ADC12 Interrupt schon 
definiert ist.
Das selbe Problem hatte ich bei der Benutzung von den RF2500 und dem 
Simpliciti Protokoll. Dort war in den Simpliciti Code schon der Port 2 
Interrupt definiert, den ich dann in meinen Source code nochmal neu 
definiert habe. Nach der Auskommentierung der eine Interruptfunktion und 
Uebernahme des Codes. Funktioniert wieder alles wie gewuenscht.


Gruss

Achim

von Nico B. (nicoholic)


Lesenswert?

Achim, du hast Recht. Nach intensiver Recherche in den zig Board-Dateien 
habe ich nun endlich die doppelte Interruptbelegung gefunden. Nach der 
entsprechenden Anpassung funktioniert nun alles so wie gewünscht :-)

Besten Dank für eure Unterstützung!

Viele Grüße
Nico

von WA (Gast)


Lesenswert?

" ../lnk_msp430f5438.cmd ", line 176: error: for object placement fails 
. " int45 "
   size 0x4 (page 0). Available ranges:
   INT45 size: 0x2 unused : 0x2 max hole: 0x2
error: errors encountered during linking; " TrackBocs.out "built not

.....

Hi all,
I have a very similar problem as explained above Nico ..

Can some one help me to get rid of it ..
Please reply in english ....

Regards, WA

von Nico B. (nicoholic)


Lesenswert?

Have you already looked for double-defined interrupts in your code?

Are you using the MC stand-alone or integrated in an experimenter board?

von WA (Gast)


Lesenswert?

I am not sure what you exectly mean by "double -defined interrupts". Can 
you give some more clues?

The MC is integrated on Experimenter board..

von Geist in der Maschine (Gast)


Lesenswert?

Ich würde dir ja gerne Helfen aber das in Englisch schreiben kann ich 
nicht, auch wenn ich deine Frage gerade so verstehe.

von Nico B. (nicoholic)


Lesenswert?

@WA:

If you use headers from Texas Instrument for the experimenter board, 
some of the interrupt vectors will already be in use. If you use the 
same vector in your code (which is what i meant by saying 
"double-defined") you will get the error message.

In this case: try to find out which vectors are in use and use another 
interrupt vector in your code which is not used by the experimenter 
board

von WA (Gast)


Lesenswert?

after clearing the double definition of the interrupt vector the error 
is gone..

thanks

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.