www.mikrocontroller.net

Forum: Compiler & IDEs RAM - Speicherproblem


Autor: Martin Langbein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab ein kleines Programm welches aus einer MMC 512 Bytes in einen
Buffer lesen soll. Aber der Compiler tut die angelegten Variablen im
RAM überschreiben.
Programm:

int main(void){
   USART_Init(51);
   SPIinit();
   MMC_Init();

   char buffer[512]={""};
   unsigned int p=0;<-- Variale ändert sich je nach Bufferinhalt von
                                                              buffer
   readPe1(buffer,&p);

   USART_LongInt_H(p);
}

kann es sein, wenn man am compiler irgendwas falsch eingestellt hat,
dass es dann so komische sachen macht!

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da kann der Compiler in 99,99999999999999999999999999999999999% nix
dafür, das ist üblicherweise ein index- oder pointerfehler im
programm.
Oder eventuell geht Dir der Speicher aus (Stack-Overflow). Leg doch
"buffer" und "p" mal als als globale variablen an und sehe nach was
der compiler zum RAMverbrauch sagt.

Autor: Martin Langbein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt variablen global:
Data:        550 bytes (53.7% Full)
(.data + .bss + .noinit)
1K hat der ATmega16
da muss eigendlich noch genug für den stack da sein.
aber mein programm funktioniert nicht mehr(also gar nicht mehr:) )

im listing steht am ende noch dies:

C:\DOKU...KALE~1\Temp/ccgtaaaa.s:23     .bss:00000000 p
C:\DOKU...KALE~1\Temp/ccgtaaaa.s:29     .data:00000000 buffer

C:\DOKU...KALE~1\Temp/ccgtaaaa.s:35     .text:00000000 USART_Init
C:\DOKU...KALE~1\Temp/ccgtaaaa.s:61     .text:00000014 Pause
C:\DOKU...KALE~1\Temp/ccgtaaaa.s:81     .text:0000001e
USART_Transmit
C:\DOKU...KALE~1\Temp/ccgtaaaa.s:98     .text:00000026 USART_Receive

ich nehme an da steht an welcher adresse die variable im ram angelegt
wird?!
aber warum fangen die variablen alle bei 0x00 an??

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber warum fangen die variablen alle bei 0x00 an??

Tun sie ja gar nicht, sondern nur zwei von denen, aber die sind
in unterschiedlichen sections (.bss vs. .data).  Der Linker
positioniert diese dann absolut im RAM.  Am besten, du guckst dir
die globale Symboltabelle (.sym) an (und besser nicht das linker
map file .map, das enthält viel zu viel an Infos).

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Langbein

<zitat>...mein programm funktioniert nicht mehr...</zitat>

Das deutet doch ganz extrem auf einen Programmfehler hin...

Autor: Martin Langbein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn ich ehrlich bin dann hoff ich dass es nur ein programmfehler
ist:
ich hau einfach mal kurz mein programm rein:



hab nur die wesentlichen funktionen:
/***************************************************************/
#define PART_ENTRY_ONE  0x1BE
struct tPartitionEntry{
  unsigned char  CurState;
  unsigned char  BegPartHead;
  unsigned int  BegPartSecCyl;
  unsigned char  TypeOfPart;
  unsigned char  EndOfPartHead;
  unsigned int  EndOfPartSecCyl;
  unsigned long  SecMBRFirstSec;
  unsigned long  SecInPart;
};

void readPe1(unsigned char *buffer,struct tPartitionEntry *pe){
  MMC_read_sector(0,buffer);
  pe = (struct tPartitionEntry *)&buffer[PART_ENTRY_ONE];
}


int main(void) {
  unsigned char buffer[512];
  struct tPartitionEntry pe;

  readPe1(buffer,&pe);
  return 0;
}
/*****************************************************************/
Die Funktion MMC_read_sector(0,&buffer[0]); tut auf jeden fall,
die hab ich schon getestet.

Des programm liest 512 Byte in buffer
dann wird ein pointer an die stelle gelegt die ich aus dem puffer lesen
will.

Ich hoffe das hie ein fehler drin is aber ich kann keinen finden.
ich hoffe ihr könnt mir weiter helfen

Gruß Martin

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du legst eben keinen Pointer dahin, sondern füllst das eine struct
damit aus.  Nicht sehr elegant, und möglicherweise auch nicht das,
was du willst.

Ich würde das eher so schreiben:
struct tPartitionEntry * readPe1(unsigned char *buffer){
  MMC_read_sector(0,buffer);
  return (struct tPartitionEntry *)&buffer[PART_ENTRY_ONE];
}


int main(void) {
  unsigned char buffer[512];
  struct tPartitionEntry *pe;

  pe = readPe1(buffer);
  return 0;
}

Allerdings wird der Compiler im Moment den Wert für `pe' gar nicht
erst zuweisen, da der offensichtlich ungenutzt ist.  Mach also besser
noch irgendwas damit, wenn du das Debuggen/Simulieren willst (oder
deklariere die Variable pe vorerst mal `volatile').

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.