PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strukturarray funktioniert nicht richtig



Marten83
04.11.2009, 08:58
Guten Morgen!

Ich habe ein Problem mit einem Array aus Strukturen.
Zuerst habe ich eine Struktur deklariert um einen neuen Typ zu erzeugen.
Diesen Typ habe ich dann als Array von 100 (soll später bis 255) Ebenen aufgezogen.
Nun möchte ich in einer Routine dieses Array wie folgt beschreiben:

/*
'AIS_search_data_section_put'
compares MMSI with those in the list and returns memory adress of the SRAM
-unoccupied sections are filled as early as possible
-list is expanded if new MMSI is recognised
-list can grow up to 'MAXVESSELS'
-'0xFFFF' (= ERROR) will be returned in case of
no MMSI match and full list */
uint16_t
AIS_search_data_section_put (const uint32_t comp_MMSI)
{
/*local variables*/
volatile uint8_t out = 0;
volatile uint8_t match = 0;
volatile uint16_t section = 0;
volatile uint8_t newsection = 0;
volatile uint8_t search_sec = 0;
volatile uint8_t temp_section = 0;

char puffer1 [20];

/*loop until MMSI found or new section occupied*/
do
{
/*check if section is occupied*/
if (AIS_data_section [search_sec].occupied != 0)
{
utoa (AIS_data_section [search_sec].occupied, puffer1, 10);
glcd_print (27, (search_sec + 2), &puffer1 [0]);

ultoa (comp_MMSI, puffer1, 10);
glcd_print (0, 3, &puffer1 [0]);

ultoa (AIS_data_section [search_sec].MMSI, puffer1, 10);
glcd_print (0, 4, &puffer1 [0]);


/*store memory adress if MMSI matches*/
if (AIS_data_section [search_sec].MMSI == comp_MMSI)
{
section = AIS_data_section [search_sec].section;
match = 1;
out = 1;
}
}
/*reserve first unoccupied section to store new AIS data
in case of no MMSI match*/
else
{
if (newsection == 0)
{
section = search_sec * 0x40;
temp_section = search_sec;
newsection = 1;
}
}

/*increment section to compare next MMSI...*/
if (search_sec < list_depth)
{
search_sec++;
}
/*...or expand list if necessary and leave loop*/
else
{
if (search_sec == list_depth)
{
if (list_depth < MAXVESSELS)
{
list_depth++;
}
}
out = 1;
}
}
while (out == 0);

/*store new data in list*/
if (match == 0 && newsection == 1)
{
AIS_data_section [temp_section].occupied = 1;
AIS_data_section [temp_section].MMSI = comp_MMSI;
AIS_data_section [temp_section].section = section;

ultoa (AIS_data_section [temp_section].MMSI, puffer1, 10);
glcd_print (30, (temp_section + 2), &puffer1 [0]);
}

/*ERROR if MMSI not found and list full*/
if (match == 0 && newsection == 0)
{
section = 0xFFFF;
}

return section;
}/*AIS_search_data_section_put*/
Zuerst hatte ich das Array nicht weiter klassifiziert und hatte das Problem, dass die Startwerte undefiniert waren.
So weit so gut, habe ich also dien Inhalt initialisiert.
Leider wurde mir während der Programmlaufzeit das Array teilweise wieder überschrieben.
Mit der Klassifizierung 'static' hat sich das Problem anscheinend behoben, allerdings werden nun anscheinend nur noch 5-6 Ebenen beschrieben und ausgewertet.
Hier nochmal die Deklaration des Arrays:

typedef struct
{
uint8_t occupied;
uint32_t MMSI;
uint16_t section;
}lookup_t;

static lookup_t AIS_data_section [MAXVESSELS];

Kann mir einer eine Erklärung darauf geben, warum dem so ist?

Vielen Dank im Vorraus!

MfG, Marten83

markusj
04.11.2009, 11:09
Kann es sein, dass dir evtl. der Stack in dein Array hineingelaufen ist? Immerhin hast du 100*7 = 700 Bytes allokiert.

mfG
Markus

Marten83
04.11.2009, 11:34
davon bin ich ausgegangen, als ich das array nicht 'static' deklariert habe.
Da hat er mir irgendwelche Werte reingeschrieben.
Wie kann ich denn das umgehen?
Und sollte das Array nicht durch 'static' einen festen Speicherbereich zugewiesen bekommen?

MfG, Marten83

Marten83
04.11.2009, 13:26
Hat vielleicht jemand eine Idee wie ich eine solche Liste anders und vielleicht auch sicherer gestalten kann?
Ich bin für jeden Hinweis dankbar.

MfG, Marten83

drew
14.11.2009, 17:43
Hallo,
ich hatte auch mal Probleme damit, dass mir der Stack meine Variablen überschrieben hat. Ich habe dann auf die erste Stelle nach meinen festen Variablen ein 0xA geschriegen und zyklisch im Programmablauf immer wieder abgefragt ob das 0xAA noch da ist. Ich kann dann immerhin feststellen, dass es eine Stack-Verletzung gab.


Hat vielleicht jemand eine Idee wie ich eine solche Liste anders und vielleicht auch sicherer gestalten kann?
Vielleicht kannst du die Struktur etwas optimieren? Brauchst Du wirklich 23Bit für MMSI? Falls es einen Wert von MMSI gibt der nicht vorkommen kann kannst Du diesen Wert verwenden ob das Element noch unbelegt ist und dir somit occupied sparen.

Du solltest erst mal mit einem kleineren Array anfängen.

Schau mal in dein *.map-File. Da kannst Du herraus finden, wieviel RAM noch frei ist.

Drew