[SS] Fehler beim anlegen von Array

OP #949068
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
#949110
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.
OP #949118
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
Angehängte Dateien:
OP #949122
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
#949123
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.
OP #949147
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

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