- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: Strukturarray funktioniert nicht richtig

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    Strukturarray funktioniert nicht richtig

    Anzeige

    Praxistest und DIY Projekte
    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:
    Code:
    /*
    '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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Kann es sein, dass dir evtl. der Stack in dein Array hineingelaufen ist? Immerhin hast du 100*7 = 700 Bytes allokiert.

    mfG
    Markus

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    160
    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


Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test