-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: GNU C-compiler, Atmega und Array kontrolle

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531

    GNU C-compiler, Atmega und Array kontrolle

    Anzeige

    Hallo,

    Frohes Weihnachten!

    Ich benutze Programmers Notepad2 mit GNU gcc.exe compiler und Atmega8 (Asuro Roboter).

    Jetzt mochte ich Messdaten realtime speichern und spater auslesen.

    Die Atmega8 hat 1Kb static ram.

    wenn ich programmiere:

    unsigned char MeinArray[2000];
    gibt es kein compiler meldung dass die speicher im Atmega8 zu klein ist und wird mein Program einfacht ausgefuht wobei andere variabelen uberschrieben werden.

    Wie konnte ich dies kontrolieren?

    Gruss,

    Henk

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wie konnte ich dies kontrolieren?
    Einfach: 27-mal durchlesen und mitdenken.
    Die erste und oberste Kontroll-Instanz bist du selber. Der Speicher wird ja auch dynamisch vom Stack verbraten, sodaß eine automatische Kontrolle sowieso nur teilweise hilfreich sein kann.
    Ich nehme an, daß "2000" ein Schreibfehler ist, und das ist wenigstens einer der Sorte, die recht schnell auffällt. Da gibt's trickreichere Fehler, die sich besser verstecken.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo.

    die '2000' ist kein schreibfehler sondern nur ein Beispiel wie man falsch programmieren kan ohne das die compiler ein fehlermeldung gibt.

    ich denke vielleicht sollte mann 'allocmem()' oder sonstiges verwenden, nur weiss ich nicht ob dass functioniert oder dass ein 'false' zuruck gegeben wird wenn nicht genug speicher da is.

    Gruss

    Henk

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich hab gedacht, es ist ein Schreibfehler, denn ein Programmdesign mit 2000-Byte arrays für eine Mega8 ist doch recht bedenklich.
    false/allocmem etc. könnten zur Laufzeit was dazu sagen, richtig.
    aber:
    char xy[2000] legst du ja dem kompiler vor die Nase. Du kannst bestenfalls mit dem Präprozessor mit RAMEND oder ähnlichem
    vergleichen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    "die '2000' ist kein schreibfehler sondern nur ein Beispiel wie man falsch programmieren kan ohne das die compiler ein fehlermeldung gibt."

    Im Datenblatt des AVR steht drin, wieviel Speicher man nutzen kann....
    Der Progger sollte dran denken.
    Beim proggen sollte man mitdenken.

    Der Gnu ist halt Freeware, was verlangst du davon...Perfektion umsonst.. nein.

    Castle

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Hi,

    Ich habe auch ein Problem!

    Ich programmiere gerade mein Grafik-LCD im ATMega8535.
    Ich möchte das programmtechnisch so realisieren, dass die Pixel zunächst in einem Bildspeicher geschrieben werden.

    Wenn eine Veränderung des Bildspeichers vorliegt, wird der gesamte Bildspeicher zum LCD übertragen.

    Das LCD hat 128x64 Pixel. Also wollte ich dafür ein Array verwenden:

    uint64_t LCD_BILD[128];

    64 sind 8Byte,
    8Byte * 128 ergibt 1024Byte, also 1KB.

    Der Compiler bringt keine Fehlermeldung. Auch die größe des zu flashenden Programms ist bei rund 2-3 KB (von 8KB ).

    Doch das Programm hängt dann bei: uint64_t LCD_BILD[128];

    Ich habe auch ein anderes Array, welches eine Schriftart enthält.
    ( uint8_t FONT1[660]; ). Da gibds kein Problem.

    Ich hoffe jemand kann mir da weiterhelfen...
    Gruß,
    Franz

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Hab schon umgeschrieben auf ein Mehrdimensionales Array:

    uint8_t BILDSPEICHER[8][128];

    Aber, gehd auch nicht. Sind ja auch 1KB

    ? WHY IS IT NOT FUNZING ?
    Gruß,
    Franz

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Tut mir leid wegen dem Massenposting

    Also, innerhalb der main-Funktion kann ich es Deklarieren.

    Ausserhalb nicht!!!

    WARUM? das versteh ich nun wirklich nicht...

    uint8_t BILDSPEICHER[8][128];
    Gruß,
    Franz

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Vieliel RAM hat denn der 8535? AFAIK het er 1kByte, und das ist zu wenig für ein Array von 1k, weil noch andere Sachen im RAM stehem müssen (Stack, globale Variablen, etc).

    Übrigens: GCC ist zwar freie Software, aber deshalb nicht automatisch kostenlos. Und auch von freier Software kann man verlangen oder erwarten, daß sie fehlerfrei ist bzw. Fehler abfängt oder anmeckert.

    Allerdings kann ein Compiler solche Sachen nicht melden, das kann bestenfalls ein Linker oder Locator. Ein C-Compiler weiß ja nicht, für welchen Controller übersetzt wird (z.B., wenn man Module in eine Lib tut, und zum Linken wieder entnehmen will).

    Daß der Linker nicht meckert ist zumindest ein Schnatzer. Es bietet sich dann an, mit avr-size die Großen zu kontrollieren. Ggf kann man das auch automatisieren im Makefile, die Größen berechnen lassen und nen Fehler werfen, wenn .data+.bss+.noinit zu groß sind.
    Disclaimer: none. Sue me.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Hm...
    Aber das Komische ist folgendes:

    Programm:

    So gehts nicht:
    Code:
    // AVR-Includes
    #include <avr/io.h> 
    
    uint8_t BILDSPEICHER[8][128];
    
    int main (void)
    {
    	
    while(1){
    }
    }
    Und so geht es:
    Code:
    // AVR-Includes
    #include <avr/io.h> 
    
    int main (void)
    {
    
    uint8_t BILDSPEICHER[8][128];	
    
    while(1){
    }
    }
    Gruß,
    Franz

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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