Hallo! Kurz und knapp: mein Atmega besitzt einen 64kB großen Programmspeicher. Heißt das, das hex-file, was ich erzeuge und da rein schiebe, darf genau so groß sein oder spielt da noch mehr mit rein?
Stephan schrieb: > Heißt das, das > hex-file, was ich erzeuge und da rein schiebe, darf genau so groß sein nein, denn im hexfile stehen Hexzahlen und Zeilenumbrüche. Der code ist also kleiner als das Hexfile.
Peter II schrieb: > Der code ist > also kleiner als das Hexfile. Und wo sehe ich (mit AVRStudio arbeitend) wie groß mein Erguss denn nu ist?!
Stephan schrieb: > Und wo sehe ich (mit AVRStudio arbeitend) wie groß mein Erguss denn nu > ist?! kommt denn am ende keine Ausgabe vom Buildprocess?
Jedes mal im Fenster unten,wenn der Compiler gelaufen ist (F7).
Peter II schrieb: > kommt denn am ende keine Ausgabe vom Buildprocess? Hm. Da hätt ich jetzt auch selber drauf kommen können. Aber vllt hat sich gerade eine ander Problematik aufgetan. ich programmiere einen Atmega644, der nur für die Anzeige von Inhalten eines sehr, sehr dummen Grafikdisplays da ist. Den ganzen Schriftsatz usw habe ich in den Speicher des µC schreiben müssen. Dass der recht voll wird habe ich mir gedacht, und nun lese ich in der built-Ausgabe folgendes: Device: atmega644p Program: 4808 bytes (7.3% Full) Data: 4282 bytes (104.5% Full) Datenspeicher mehr als 100% voll? Kann man das ignorieren?
Stephan schrieb: > Datenspeicher mehr als 100% voll? Kann man das ignorieren? klar kann man das ignorieren - hast du doch bist jetzt auch getan. Nur wird das Programm nicht sinnvoll arbeiten. Optimierung auf -Os gestellt?
wenn mich jetzt nicht irre, dann ist der RAM das Problem Data: 4282 bytes (104.5% Full) das müsste der Ramverbraucht sein, da hilft auch keine Optimierung. Jetzt musst du uns wohl doch mal das Programm zeigen.
Könnte es sein dass mit LUT oder großen Array's gearbeitet wird? Eventuell kann man das eine oder andere Byte in den EEProm oder Flash verlegen.
@ Stephan (Gast) >eines sehr, sehr dummen Grafikdisplays da ist. Den ganzen Schriftsatz >usw habe ich in den Speicher des µC schreiben müssen. Ja, in den RAM. Im Flash ist er besser aufgehoben. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29 > Program: 4808 bytes (7.3% Full) > Data: 4282 bytes (104.5% Full) >Datenspeicher mehr als 100% voll? Kann man das ignorieren? Der RAM.
Peter II schrieb: > Jetzt musst du uns wohl doch mal das Programm zeigen. Gern: Hier die Zahlen von 0 bis 9, wie sie das Lascar- Display (32x100px) gerne hätte (und bekommt):
1 | static const unsigned char dmx_digit[10][100] = { |
2 | {0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0x7C,0x1C,0x1E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1E,0x7C,0xFC,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00, |
3 | 0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00, |
4 | 0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00, |
5 | 0x00,0x00,0x00,0x03,0x0F,0x1F,0x3F,0x3E,0x78,0x78,0x70,0x70,0x70,0x70,0x78,0x38,0x3E,0x1F,0x0F,0x07,0x01,0x00,0x00,0x00,0x00}, |
6 | |
7 | {0x00,0x00,0x00,0x00,0xE0,0xE0,0x70,0x70,0x38,0x3C,0x1C,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
8 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
9 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
10 | 0x00,0x00,0x00,0x00,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x7F,0x7F,0x7F,0x7F,0x70,0x70,0x70,0x70,0x70,0x70,0x00,0x00,0x00,0x00}, |
11 | |
12 | {0x00,0x00,0x00,0x00,0x70,0x78,0x3C,0x1C,0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1E,0x7C,0xFC,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00, |
13 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFF,0xFF,0x7F,0x1F,0x00,0x00,0x00,0x00, |
14 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0x78,0x3C,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, |
15 | 0x00,0x00,0x00,0x70,0x78,0x7C,0x7E,0x7F,0x77,0x73,0x71,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x00,0x00,0x00}, |
16 | |
17 | {0x00,0x00,0x00,0x00,0x70,0x78,0x3C,0x1C,0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1E,0x3C,0xFC,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00, |
18 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xF0,0xF8,0x3F,0x3F,0x1F,0x07,0x00,0x00,0x00,0x00, |
19 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x07,0x0F,0xFF,0xFE,0xFC,0xF0,0x00,0x00,0x00, |
20 | 0x00,0x00,0x00,0x1C,0x3C,0x38,0x38,0x78,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x38,0x3C,0x3E,0x1F,0x0F,0x07,0x01,0x00,0x00,0x00}, |
21 | |
22 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xFC,0x7E,0x1E,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, |
23 | 0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xFC,0x7E,0x1F,0x0F,0x03,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, |
24 | 0x00,0xF0,0xF8,0xFE,0xFF,0xEF,0xE3,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xFF,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0x00,0x00, |
25 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00}, |
26 | |
27 | {0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00, |
28 | 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00, |
29 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x07,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00, |
30 | 0x00,0x00,0x00,0x1C,0x3C,0x38,0x38,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x78,0x38,0x3C,0x1F,0x1F,0x0F,0x07,0x01,0x00,0x00,0x00}, |
31 | |
32 | {0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xF8,0x7C,0x3C,0x1C,0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1C,0x1C,0x00,0x00,0x00, |
33 | 0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0x87,0xC0,0xC0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00, |
34 | 0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0x83,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x07,0xFF,0xFF,0xFF,0xFC,0x00,0x00, |
35 | 0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0x3F,0x3C,0x78,0x70,0x70,0x70,0x70,0x70,0x70,0x38,0x3C,0x3F,0x1F,0x0F,0x07,0x01,0x00,0x00}, |
36 | |
37 | {0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0xCE,0xFE,0xFE,0xFE,0x7E,0x1E,0x00,0x00, |
38 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFE,0xFF,0x3F,0x0F,0x01,0x00,0x00,0x00,0x00, |
39 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFF,0x7F,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
40 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7C,0x7F,0x7F,0x3F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
41 | |
42 | {0x00,0x00,0x00,0xC0,0xF0,0xF8,0xFC,0x3C,0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x3C,0xFC,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00, |
43 | 0x00,0x00,0x00,0x07,0x1F,0x3F,0x3F,0x7C,0xF8,0xF0,0xE0,0xE0,0xC0,0xE0,0xF0,0xF0,0x7C,0x3F,0x1F,0x0F,0x03,0x00,0x00,0x00,0x00, |
44 | 0x00,0x00,0xE0,0xF8,0xFC,0xFC,0x1E,0x0F,0x07,0x03,0x03,0x01,0x03,0x03,0x07,0x07,0x0F,0x1E,0xFE,0xFC,0xF8,0xE0,0x00,0x00,0x00, |
45 | 0x00,0x00,0x03,0x0F,0x1F,0x3F,0x3C,0x38,0x78,0x70,0x70,0x70,0x70,0x70,0x70,0x78,0x38,0x3C,0x3F,0x1F,0x0F,0x03,0x00,0x00,0x00}, |
46 | |
47 | {0x00,0x00,0x80,0xE0,0xF0,0xF8,0x7C,0x3C,0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0x1E,0x3C,0xFC,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00, |
48 | 0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC1,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00, |
49 | 0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0xE1,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00, |
50 | 0x00,0x00,0x00,0x38,0x38,0x78,0x70,0x70,0x70,0x70,0x70,0x70,0x78,0x38,0x3C,0x3E,0x1F,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00} |
51 | };
|
Ich denke, da ist nicht viel mit Einsparen..
Stephan schrieb: > Ich denke, da ist nicht viel mit Einsparen.. doch, das zeug muss nicht im Ram liegen - das legt man in den Flash.
Falk Brunner schrieb: > Ja, in den RAM. Im Flash ist er besser aufgehoben. Landen Variable, die man verwendet, automatisch im RAM?
@ Stephan (Gast) >> Ja, in den RAM. Im Flash ist er besser aufgehoben. >Landen Variable, die man verwendet, automatisch im RAM? Wo sonst, es sind ja VARIABLEN. Siehe Speicher. Auch ein const allein nützt hier nix. Wie es geht steht oben im Link. Ist nicht schwer.
Peter II schrieb: > doch, das zeug muss nicht im Ram liegen - das legt man in den Flash. Bernd schrieb: > Eventuell kann man das eine oder andere Byte in den EEProm oder Flash > verlegen. Falk Brunner schrieb: > Im Flash ist er besser aufgehoben. Scheinbar ist man sich hier einig... ich werd mich wohl mal ans Tutorial setzen und ein bissel Flash-zugriff lernen. Danke vielmals! OT: Biertipp: Neumarkter Lammsbräu Edelpils.
So. Es hakt. Im Tutorial heißt es "GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit -std=gnu99 compiliert werden." Soweit so gut. Compilieren tut mein AVRStudio immer, wenn ich F5 drücke. Wie bringe ich ihm bei, dass er da "-std=gnu99" einbaut? Auf die Codezeile
1 | static const __flash int value = 10; |
antwortet er mit der Fehlermeldung expected '=', ',', ';', 'asm' or '__attribute__' before 'int'
@ Stephan (Gast) >"GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird >als GNU-C Erweiterung behandelt. Daher müssen C-Module, die >Address-Spaces verwenden, mit -std=gnu99 compiliert werden." >Soweit so gut. Irgendwie ist der Abschnitt ziemlich unübersichlich geworden. >static const __flash int value = 10; Mach es einfach mit PROGMEM und gut.
1 | #include <avr/pgmspace.h> |
2 | |
3 | static const unsigned char dmx_digit[10][100] PROGMEM = { |
4 | |
5 | i= pgm_read_byte(&dmx_digit[x][y]); |
Peter II schrieb: > welche Version von GCC hast du? Wenn ich bei den Infos zum AVRStudio nach den installierten Packages schaue und GCC Project auswähle, steht da 5.1.0.0. Ist das die Angabe die Du brauchst?
Falk Brunner schrieb: > Mach es einfach mit PROGMEM und gut. Ist das auch wirklich einfacher? Mir erscheint die Schreibweise
1 | static const __flash int value = 10; |
2 | |
3 | int get_value (void) |
4 | {
|
5 | return value; |
6 | }
|
intuitiver?!
Stephan schrieb: >> welche Version von GCC hast du? > > Wenn ich bei den Infos zum AVRStudio nach den installierten Packages > schaue und GCC Project auswähle, steht da 5.1.0.0. Ist das die Angabe > die Du brauchst? nein, du musst direkt den gcc (avr-gcc oder so) auf der Kommandozeile mit dem Parameter --Version startet. Denn das mit dem Flash geht erst ab 4.7.
Stephan schrieb: > Ist das auch wirklich einfacher? Nehme alles zurück. PROGMEM fängt an mir schlagartig zu gefallen..
Peter II schrieb: > nein, du musst direkt den gcc (avr-gcc oder so) auf der Kommandozeile > mit dem Parameter --Version startet. Ich hantiere schon ziemlich lange mit AVRs aber habe die Kommandozeile nicht ein einziges mal gebraucht (geschweigedenn vermisst). Mit den AVRStudio war alles immer so vorgekaut! Aber ich versuchs. Nur, wie zum Henker finde ich diese Kommandozeile bzw wie nennt Atmel die?
Stephan schrieb: > Ich hantiere schon ziemlich lange mit AVRs aber habe die Kommandozeile > nicht ein einziges mal gebraucht (geschweigedenn vermisst). Mit den > AVRStudio war alles immer so vorgekaut! Aber ich versuchs. Nur, wie zum > Henker finde ich diese Kommandozeile bzw wie nennt Atmel die? die Windows Kommandozeile (cmd)
Peter II schrieb: > die Windows Kommandozeile (cmd) Ich bin mit Windows 95 groß geworden. Ich habe NULL Plan was ich tippen soll um die Version vom AVR-GCC herauszufinden. Da steht nur C_USER_STEPHAN
Stephan schrieb: > Ich bin mit Windows 95 groß geworden. Ich habe NULL Plan was ich tippen > soll um die Version vom AVR-GCC herauszufinden. Da steht nur > C_USER_STEPHAN dann solltest du eventuell dir ein anderes Hobby/Beruf suchen. Als Programmierer sollte man gewisse Grundlagen kennen.
@ Stephan (Gast) >Ist das auch wirklich einfacher? Mir erscheint die Schreibweise >intuitiver?! Hast recht, geht aber nur mit dem neueren avr-gcc.
Peter II schrieb: > dann solltest du eventuell dir ein anderes Hobby/Beruf suchen. Als > Programmierer sollte man gewisse Grundlagen kennen. Das kann schon sein. Asche auf mein Haupt! Ich habe nie beklagt, dass AVRStudio so viel selber macht. Getreu dem Motto "keine schlafenden Hunde wecken". Wenn ich das mir beibrächte wäre das, als hätte man Boris Becker was über Impulserhaltung erklärt- am nächsten Tag ists wieder vergessen :)
Peter II schrieb: > scheint kleiner als 4.7 zu sein Ein wenig vielleicht. Auf http://www.mikrocontroller.net/articles/Atmel_Studio gibt´s neuere Versionen. Sind die selbstinstallierend? Wie "tauscht man die aus"?
Um das abzuschließen und, für den der´s auch braucht: hier die Anleitung zum Wechsel der toolchain bei AVRStudio: http://avrstudio5.wordpress.com/2012/03/05/changing-the-toolchain-in-atmel-studio-6-0-and-avr-studio-5-1/
In ASM legt man einfach eine Tabelle im .cseg(Flash) an. Vielleicht ist aber auch dein EEPROM groß genug dafür. Hätte den Vorteil das man beim Wechsel des Zeichensatzes nur das EEPROM neu brennen muss.
Und Stephan, läufts jetzt mit __flash? Also ich finde dieses Vorgehen viel einfacher und auch besser lesbar als die veraltete PROGMEM-Krücke...
Stephan schrieb: > 3.3.1.27 Das könnte die Version der Toolchain sein. Einfach mal im Atmel-Studio auf Help/About Atmel Studio gehen und da im Fenster die "View Installed Components" auf "Atmel AVR (8 bit) GNU Toolchain" verstellen. Bei mir steht dann das hier im Fenster: Installed Packages: Atmel AVR (8 bit) GNU Toolchain - 3.4.3.1005 AVR Toolchain 8 Bit Version: AVR8_Toolchain_Version:3.4.3.1072 GCC_VERSION:4.8.1 Package GUID: 2C7AA7CF-94C6-463C-81DA-4AA03B613C3B Company: Atmel HelpUrl: Release Description: AVR Toolchain For 8-Bit Devices Per Kommando-Zeile habe ich für AVR auch schon lange nichts mehr gemacht.
@ Henry (Gast) >Und Stephan, läufts jetzt mit __flash? >Also ich finde dieses Vorgehen viel einfacher und auch besser lesbar als >die veraltete PROGMEM-Krücke... Naja, man darf aber bitte nicht vergessen, dass es nur Kosmetik ist. Die Unterscheidung zwischen FLASH und RAM Variablen bleibt, es sieht nur schöner aus. Mit dieser __memx Trick macvht das FAST perfekt, aber soweit ich es verstehe auch nicht 100% wie bei normalem C. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Jenseits_von_flash
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.