www.mikrocontroller.net

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


Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Siegfried Saueressig (dieleena)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.