Forum: Mikrocontroller und Digitale Elektronik [SS] Fehler beim anlegen von Array


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
MPLAP mit C18 Compiler, PIC 18F4550

unsigned char BusSpiOutput[128];
unsigned char BusSpiInput[128];

möchte zwei Array anlegen mit einer Größe von je 128 Byte
Bekomme aber eine Fehlermeldung.
MPLINK 3.90, Linker
Copyright (c) 2004 Microchip Technology Inc.
Error - section '.udata_UsbBusSpiTransfer.o' can not fit the section. 
Section '.udata_UsbBusSpiTransfer.o' length=0x0000010f
Errors    : 1
Wenn ich das eine Array mit 64 Bytes und das andere mit 128 anlege, 
funktioniert es.

Gruß Siegfried

von Falk B. (falk)


Lesenswert?

Der RAM ist endlich. Dein IC hat scheinbar keine 256 Byte RAM. Ein 
bisschen braucht auch der Stack, kann man einstellen, irgendwo.

MFG
Falk

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
habe Memory Usage Gauge aufgerufen.

Programm 16384 / 882

Data 2048 / 453

"Dein IC hat scheinbar keine 256 Byte RAM." kann doch nicht beim 18 
F4550 sein?
Der Stack benötigt doch nicht ca 80% vom Data Memory?

Gruß Siegfried

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Der uC hat 2kByte RAM, nur am RAM allein kanns also nicht liegen...

Welche Linker-Direktiven sind im Makefile vorgegeben?
Wie sind die Sections eingestellt?
Was ist das für eine Variable UsbBusSpiTransfer?
Sind die Arrays global oder lokal?
Sourcecode?

von Εrnst B. (ernst)


Lesenswert?

Hat der Pic nicht diese Memory-Page Krankheit?
Und hat evtl. dein Compiler noch die Dumme Idee gehabt, alle Variablen 
aus einem .c File in einem Page unterzubringen?

Versuch mal, entweder den "Verbesserten" Modus des 18Fs zu aktivieren 
(Geht über so ein Config-Bit), oder leg das zweite Array mal in einem 
Seperatem .c-File an, das danach dazugelinkt wird.

von Siegfried S. (dieleena)


Angehängte Dateien:

Lesenswert?

ups, kann zu allem keine Antwort geben. So genau kenne ich mich nicht 
aus.

das erstellte Makefile habe ich als Anhang beigefügt.

UsbBusSpiTransfer ist der Name des Sourcecode.

Array ist lokal.

Fehler erscheint alleine schon beim anlegen der Array.

Die Zeilen zum löschen des Array ist nicht nötig, um beschriebenen 
Fehler zu erhalten.
for ( AdrCount = 0; AdrCount <= (MaxBusSpiInOut-1); AdrCount ++ )
{
BusSpiOutput[AdrCount] = 0;
BusSpiInput[AdrCount] = 0;
}


für Infos zum Einstellen bin ich dankbar.

Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo,
habe eine weitere *.c erzeugt und eingebunden

das geht
unsigned char BusSpi_Output[128];
unsigned char BusSpi_Input[128];

dieses nicht mehr
unsigned char BusSpi_Output[128];
unsigned char BusSpi_Input[256];


welche Bit's sind das?

Versuch mal, entweder den "Verbesserten" Modus des 18Fs zu aktivieren
(Geht über so ein Config-Bit)

gruß Siegfried

von Εrnst B. (ernst)


Lesenswert?

Siegfried Saueressig wrote:

> Array ist lokal.
>
Lokal zu was?
Der Funktion, dem File, dem Namespace, der Schleife?

Zeig doch mal deinen Quelltext, zumindest den Teil wo die Arrays 
angelegt werden, mit etwas Kontext.

> dieses nicht mehr
> unsigned char BusSpi_Output[128];
> unsigned char BusSpi_Input[256];

Klar. Mit dem Pic im "Kompatibilitäts"-Modus kann der Compiler keine 
Arrays > 256 Bytes anlegen.
Exakt 256 müssten gehen, aber dann muss das nochmal in ein getrenntes 
File (Scheint ein recht seltsamer Kompiler zu sein...)
Mit der Fausregel "Maximal 256Bytes Ram pro .c - Datei" solltest du dein 
Projekt so aufspalten können, dass es passt.

von Siegfried S. (dieleena)


Lesenswert?

hallo,

Arbeite mit MPLAP mit C18 Compiler, PIC 18F4550
Welche Macken der C Compiler von Microchip hat, weis ich noch nicht. 
Eine habe ich ja zu spüren bekommen.

in seperaten File funkioniert es wie folgt.

das geht
unsigned char BusSpi_Output[128];
unsigned char BusSpi_Input[128];

dieses nicht mehr
unsigned char BusSpi_Output[128];
unsigned char BusSpi_Input[256];

"length=0x0000010f" kann unter Umstände die Anzahl/Länge der 
Übeschreidung von den 256 Bytes pro c File sein.


-------------  Source Code  ------------

ob der Code in den Schleifen richtig funktioniert, weiß ich noch nicht.


//---------------------------------------------------------------------
//  Projekt:    StellpultUsbPc.mcs
//
//  File:      InitUsbBusSpi.c
//
//  PIC:      18F4550
//
//
//---------------------------------------------------------------------

#include  <p18f4550.h>        // Register definitions
#include   <stdlib.h>
#include   <string.h>
#include   <timers.h>          // Timer library functions
#include   <delays.h>          // Timer library functions
#include   <spi.h>

#include "UsbPcGlobal.h"
#include "PortModul.h"

//---------------------------------------------------------------------
// Variable declarations
//---------------------------------------------------------------------
unsigned int AdrCount;
unsigned int BusSpiCount_1;
unsigned int BusSpiCount_2;
unsigned int BusSpiCount_3;
unsigned int BusSpiCount_4;
//
unsigned char BusSpiOutput[64];
unsigned char BusSpiInput[64];
unsigned int MaxBusSpiInOut = 8;
unsigned int MaxBusSpiModule = 8;
unsigned int MaxBusSpiBytes = 8;

//---------------------------------------------------------------------
// Function Prototypes
//---------------------------------------------------------------------
void InitUsbBusSpi(void);            //  initialize USB Bus SPI
void ConnectUsbBusSpi(void);          //  Connect USB Bus SPI
void RunUsbBusSpi(void);            //  Run USB Bus SPI
void AdrUsbBusSpi(void);            //  Adresse USB Bus SPI
void DeleteUsbBusSpi(void);            //  lösche Register

//---------------------------------------------------------------------
// externe Function Prototypes
//---------------------------------------------------------------------

#pragma code



/*  ******************************************************************* 
*/
//  ConnectUsbBusSpi() Run USB Bus SPI
//
void ConnectUsbBusSpi(void)
{
//
AdrCount = 0;
AdrUsbBusSpi();
ProzessStatus SET_BIT BIT_1;


//  bit          76543210
    SSPSTAT =   0b01000000;
//  bit          76543210
    SSPCON1   = 0b00100010;
//
  SPI0_EN = 1;


SPI0_EN = 0;
BusSpiCount_3 = 0;
  for ( BusSpiCount_1 = 0; BusSpiCount_1 <= (MaxBusSpiModule-1); 
BusSpiCount_1 ++ )
  {
    for ( BusSpiCount_2 = 0; BusSpiCount_2 <= (MaxBusSpiBytes-1); 
BusSpiCount_2 ++ )
    {
    SSPSTATbits.BF = 0;
      SSPBUF = BusSpiOutput[BusSpiCount_2];
      while(SSPSTATbits.BF == 1);
      SSPSTATbits.BF = 0;
      BusSpiInput[BusSpiCount_3] = SSPBUF;
    BusSpiCount_3 ++;
    }
  }
SPI0_EN  = 1;
//
BusSpiCount_3 = 0;
  for ( BusSpiCount_1 = 0; BusSpiCount_1 <= (MaxBusSpiModule-1); 
BusSpiCount_1 ++ )
  {
    for ( BusSpiCount_2 = 0; BusSpiCount_2 <= (MaxBusSpiBytes-1); 
BusSpiCount_2 ++ )
    {
      if (BusSpiOutput[BusSpiCount_2] == BusSpiInput[BusSpiCount_3])
      {
BusSpiCount_4 ++;
      }
    BusSpiCount_3 ++;
    }
  }
SPI0_EN  = 1;
}
/*  **********  END ConnectUsbBusSpi()  */

gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Habe eine eigne C Datei angelegt. Damit funktioniert es.

Wie kann ich dieses umgehen ?
" Mit der Fausregel "Maximal 256Bytes Ram pro .c - Datei" solltest du 
dein
Projekt so aufspalten können, dass es passt. "

Tritt diese auch bei anderen Compiler z.B. CCS auf ?

Gruß Siegfried

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.