Seite 2 von 3

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 26.09.2010, 13:49
von thoralt
Hallo Leute,
psclab38 hat geschrieben:Bevor Du eincheckst, synchronisiere Dich bitte mit Thoralt, den haben wir ja auch erst wieder aktiviert und wir sollten seinen Kreativitätschub positiv unterstützen :mrgreen:. Das TODO muß dann halt auch noch irgendwie verarztet werden.
Nun, ich habe derzeit kleine Änderungen in dds.h, dds-hw.h, main.c, timer.c sowie timer.h. Diese werden hoffentlich automatisch vom CVS gemerged. Größere Änderungen fanden bisher in dds-hw.c, panel.c und panel.h statt. Ich habe kein Problem damit, wenn Karsten erstmal eincheckt. Ich mache ein Backup von meinen Quellen und dann mal ein Update, mal sehen, was passiert. Die paar Kontrollen auf Konflikte an den für mich wichtigen Stellen habe ich dann schnell gemacht. Also, nur zu!
dg1vs hat geschrieben:Eine Sache habe ich noch offen, Macros für "Char" in sprintf oder ähnlichen Funktionen. Hat jemand einen guten Link zu dem Thema. Es geht um die "Sonderzeichen" die sich in Abhängigkeit vom benutzten Display unterscheiden. Und da sind wir auch bei den 2 Symbolen, wo eine Macroersetzung extrem hilfreich wäre. Auf die Schnelle ist mir nichts eingefallen.
Ich weiß nicht, ob ich das Problem richtig verstanden habe, aber wie wäre es mit einem Konstrukt wie folgendem:

Code: Alles auswählen

#define SONDERZEICHEN "\x05"
//#define SONDERZEICHEN "\x06"
//#define SONDERZEICHEN "\x07"
LCDOverwrite_P(... PSTR("Text" SONDERZEICHEN "Text");
Da kann man dann SONDERZEICHEN auf den passenden Wert definieren und das wird dann im String weiter unten mit eingebaut.

Viele Grüße
Thoralt

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 26.09.2010, 13:51
von dg1vs
psclab38 hat geschrieben:Hi Karsten,
dg1vs hat geschrieben:Eine Sache habe ich noch offen, Macros für "Char" in sprintf oder ähnlichen Funktionen. Hat jemand einen guten Link zu dem Thema. Es geht um die "Sonderzeichen" die sich in Abhängigkeit vom benutzten Display unterscheiden. Und da sind wir auch bei den 2 Symbolen, wo eine Macroersetzung extrem hilfreich wäre. Auf die Schnelle ist mir nichts eingefallen.
Diese Frage ist mir beim Review auch gekommen. Schade, daß man im String die #define-Konstanten nicht direkt einsetzen kann, zumindest wäre mir diese Möglichkeit noch nicht untergekommen.
Ich bleib dran. Angeblich ist der Präprozessor ja eine komplette Programmiersprache...
psclab38 hat geschrieben: Ich überleg mal grad so: Du hast ja die RAM-Zeichen des Displays für Deine Zwecke umdefiniert, aber eines (das erste) ist ja komplett leer. Und ein Leerzeichen gibt's aber schon im ROM des Displays; könnte man da nicht noch an die entsprechende Stelle bei 0x05 den Pfeil reinquetschen... und es wäre für beide Optionen zumindest hier gleich. Is' nur so eine Idee. Eine elegante Lösung für alle Optionen ist aber wohl nicht drin.
Mit der ersten Zeile ist ein Hack, der noch raus muss...

Trotzdem, sollte für die Sonderzeichen symbolische Werte benutzt werden. Das große Display hat ne Menge an sinnvollen Zeichen, da kommt das kleine nicht mit. ich hatte auch schon mit der Idee gespielt nach dem Start-Screen die RAM-Zeichen umzuladen. Trotzdem sollte es symbolisch gehen...

Im Anhang die Darstellungen, was im Code von gestern umgesetzt wurde (nur die fast sauberen Codeteile) und meine Wunschumsetzung, die aber so nicht in die Codebasis kann.

Schönen Sonntag noch

Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 26.09.2010, 13:53
von dg1vs
thoralt hat geschrieben:Hallo Leute,
psclab38 hat geschrieben:Bevor Du eincheckst, synchronisiere Dich bitte mit Thoralt, den haben wir ja auch erst wieder aktiviert und wir sollten seinen Kreativitätschub positiv unterstützen :mrgreen:. Das TODO muß dann halt auch noch irgendwie verarztet werden.
Nun, ich habe derzeit kleine Änderungen in dds.h, dds-hw.h, main.c, timer.c sowie timer.h. Diese werden hoffentlich automatisch vom CVS gemerged. Größere Änderungen fanden bisher in dds-hw.c, panel.c und panel.h statt. Ich habe kein Problem damit, wenn Karsten erstmal eincheckt. Ich mache ein Backup von meinen Quellen und dann mal ein Update, mal sehen, was passiert. Die paar Kontrollen auf Konflikte an den für mich wichtigen Stellen habe ich dann schnell gemacht. Also, nur zu!
dg1vs hat geschrieben:Eine Sache habe ich noch offen, Macros für "Char" in sprintf oder ähnlichen Funktionen. Hat jemand einen guten Link zu dem Thema. Es geht um die "Sonderzeichen" die sich in Abhängigkeit vom benutzten Display unterscheiden. Und da sind wir auch bei den 2 Symbolen, wo eine Macroersetzung extrem hilfreich wäre. Auf die Schnelle ist mir nichts eingefallen.
Ich weiß nicht, ob ich das Problem richtig verstanden habe, aber wie wäre es mit einem Konstrukt wie folgendem:

Code: Alles auswählen

#define SONDERZEICHEN "\x05"
//#define SONDERZEICHEN "\x06"
//#define SONDERZEICHEN "\x07"
LCDOverwrite_P(... PSTR("Text" SONDERZEICHEN "Text");
Da kann man dann SONDERZEICHEN auf den passenden Wert definieren und das wird dann im String weiter unten mit eingebaut.

Viele Grüße
Thoralt
Sowas in der Art, ich probier es heute Abend aus... Frau und Kinder... aber das kennst Du ja.
Einchecken auch!

Grüße Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 26.09.2010, 18:02
von dg1vs
Hallo Leute,

ich habe die Sachen in CVS eingecheckt. Diese Woche komme ich eh zu nichts mehr. Ich habe meine TODO's in der Liste fixiert und werde mich am nächsten Wochenende wieder intensiv dem Thema widmen.

Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 26.09.2010, 23:01
von psclab38
dg1vs hat geschrieben:ich habe die Sachen in CVS eingecheckt. Diese Woche komme ich eh zu nichts mehr. Ich habe meine TODO's in der Liste fixiert und werde mich am nächsten Wochenende wieder intensiv dem Thema widmen.
Hi Karsten,

habe gerade die obsoleten "Enter"-Markierungen bei insgesamt 5 Strings (nicht nur drei) aus dem Sweep-Untermenü entsorgt; das war noch eine Hausaufgabe meinerseits. Das File hab ich wieder ins CVS gestellt.

Grüße
Paul

PS: ich hatte mir angewöhnt, das Changelog.txt bei Uploads zu pflegen; da behält man die Übersicht.

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 27.09.2010, 07:37
von dg1vs
Hallo *
Hi Paul,
psclab38 hat geschrieben: PS: ich hatte mir angewöhnt, das Changelog.txt bei Uploads zu pflegen; da behält man die Übersicht.
Asche auf meine Haupt ....Ok, beim nächsten Mal.

Eigentlich müßte man die Sammlung an Änderungen taggen/labeln und das neue Label beschreiben. Dazu kenne ich mich mit CVS nicht mehr wirklich gut aus, obwohl ich vor x-jahren in meiner ersten Firma CVS eingeführt habe. Privat SVN, dienstlich MKS, und Clearcase gibt mir leider keiner zurück.

Ich habe das Thema MMI nochmal durchdacht, und kann meine Frage klarer formulieren (dauert manchmal länger). Dazu folgende Frage:

Ich versuche ja "Enter" und "Back" mit getrennten Symbolen anzuzeigen. Dazu muss an den passenden Stellen ein Aufruf erfolgen. OK, das ist "fast" einfach.
Schwierig ist es in der aktuellen Umsetzung zu unterscheiden, ob es "Enter" oder "Back" ist, da nur auf
if(null!=(void*)pgm_read_word(&g_currentMenuItem->pSubmenu))
geprüft wird. Und da habe ich dann gepfuscht.... und es irgendwie probiert. Deswegen die Unterschiede zwischen Wunsch und CVS-Stand.

Der zweite schwierige Teil ist das Rücksetzen der "Enter" / "Back"-Symbole, da dies implizit passiert. Beim Umzug in die 3 Zeile fehlt der explizite Aufruf, den ich bei jedem Aufruf von jobPanel(void) durch eine Löschaktion der zwei Zeichen realisiert habe, was mir aber nicht wirklich gefällt.

Letze Anmerkung/Frage
macht es Sinn die Funktionalität TextScrollen aus jobPanel(void) rauszunehmen und in eine eigene Funktion
Panel_DoMenuTextScrolling(menu_entry_t *g_currentMenuItem)
zu packen?

Ok, kostet etwas Speicher, aber der Compiler sollte clever sein zu erkennen dass die Funktion nur einmal verwendet wird und so den Funktionaufruf wegoptimieren. Wir können ihm ja mit static helfen.


Grüße Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 27.09.2010, 23:42
von psclab38
dg1vs hat geschrieben: Eigentlich müßte man die Sammlung an Änderungen taggen/labeln und das neue Label beschreiben. Dazu kenne ich mich mit CVS nicht mehr wirklich gut aus, ...
geht mir ähnlich. In den Changelog.txt kann man aber ausführlicher auflisten, als man das beim Einchecken machen würde. Außerdem ist die Info auch offline verfügbar.

dg1vs hat geschrieben: Ich versuche ja "Enter" und "Back" mit getrennten Symbolen anzuzeigen. Dazu muss an den passenden Stellen ein Aufruf erfolgen. OK, das ist "fast" einfach.
Schwierig ist es in der aktuellen Umsetzung zu unterscheiden, ob es "Enter" oder "Back" ist, da nur auf
if(null!=(void*)pgm_read_word(&g_currentMenuItem->pSubmenu))
geprüft wird. Und da habe ich dann gepfuscht.... und es irgendwie probiert. Deswegen die Unterschiede zwischen Wunsch und CVS-Stand.
Nur so 'ne Idee: die Menüebene mitzählen, in einer static-Variable. Wenn wir uns auch weiterhin auf eine Untermenüebene beschränken, dann wäre es einfach: wenn (Untermenü && Enter) dann Back. Wenn (Hauptmenü && Enter) dann Untermenü.

Übrigens noch so als Hinweis: es schließen sich Burst- und Sweepmodus gegenseitig aus. Ich glaube mich zu erinnern, daß der Sweep den Burstmodus implizit abschaltet; ich hab das aber jetzt nicht kontrolliert.

Grüße
Paul

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 28.09.2010, 21:04
von dg1vs
Hi Paul
psclab38 hat geschrieben:
dg1vs hat geschrieben: Ich versuche ja "Enter" und "Back" mit getrennten Symbolen anzuzeigen. Dazu muss an den passenden Stellen ein Aufruf erfolgen. OK, das ist "fast" einfach.
Schwierig ist es in der aktuellen Umsetzung zu unterscheiden, ob es "Enter" oder "Back" ist, da nur auf
if(null!=(void*)pgm_read_word(&g_currentMenuItem->pSubmenu))
geprüft wird. Und da habe ich dann gepfuscht.... und es irgendwie probiert. Deswegen die Unterschiede zwischen Wunsch und CVS-Stand.
Nur so 'ne Idee: die Menüebene mitzählen, in einer static-Variable. Wenn wir uns auch weiterhin auf eine Untermenüebene beschränken, dann wäre es einfach: wenn (Untermenü && Enter) dann Back. Wenn (Hauptmenü && Enter) dann Untermenü.
mal sehen, könnte funktionieren
psclab38 hat geschrieben: Übrigens noch so als Hinweis: es schließen sich Burst- und Sweepmodus gegenseitig aus. Ich glaube mich zu erinnern, daß der Sweep den Burstmodus implizit abschaltet; ich hab das aber jetzt nicht kontrolliert.
Ich habe den Code jetzt nicht kontrolliert, aber ich kann gleichzeitig Burst- und Sweepmodus anschalten.

Jetzt noch ne Idee:
Was haltet Ihr von folgendem Vorgehen:

Code: Alles auswählen

#define PANEL_STR_SWEEP_UP 			"Up"
#define PANEL_STR_SWEEP_DOWN 			"Down"
#define PANEL_STR_SWEEP_UPDOWN 		"Up+Down"

#define PANEL_MENU_STR_FREQUENCY		"Frequency"
und hier die zwei Nutzungsmöglichkeiten.

Erste Variante:

Code: Alles auswählen

menu_entry_t PROGMEM MenuFrequency = {
		.cName = PANEL_MENU_STR_FREQUENCY,
		.pEncoderFunction = FrequencyEncoderFunction,
		.pEnterFunction = FrequencyEnterFunction,
		.pUpdateDisplayFunction = FrequencyUpdateDisplayFunction,
		.pSubmenu = null,
		.pPrevious = (void*)&MenuSettings,
		.pNext = (void*)&MenuLevel,
		.iEI1 = 250, .iEI2 = 50, .iEI3 = 10, .iEI4 = 1,
		.pParam = &(Params.dFrequency), .ucIdentifier = MENU_FREQUENCY};
Damit wäre hier die einfache Anpassungen an Landessprachen möglich. Obwohl DDS in kyrillisch :shock:

Interessanter ist aber folgende Nutzung:

Code: Alles auswählen

void SweepSlopeUpdateDisplayFunction(uint8_t ucForceUpdate,
		void *pParam __attribute__((unused)))
{
	if((LastParams.ucSweepSlope!=Params.ucSweepSlope)||ucForceUpdate)
	{
		// display new setting
		switch(Params.ucSweepSlope)
		{
			case SWEEP_UP:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UP)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UP)-1), PSTR(PANEL_STR_SWEEP_UP));
				break;
			case SWEEP_DOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_DOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_DOWN)-1), PSTR(PANEL_STR_SWEEP_DOWN));
				break;
			case SWEEP_UPDOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UPDOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UPDOWN)-1), PSTR(PANEL_STR_SWEEP_UPDOWN));
				break;
		}
	}
}

Auch wenn es jetzt erstmal chaotischer aussieht, ich bekomme aber so die redundante Nutzung der Längeninformation weg. Letztlich wird 3 mal die Information über den String benutzt, 2 x mal die Länge und einmal der String. Damit es schön wird, müßte man dass Ganze noch in ein Gesamtmakro packen. Nachteil: einmal + einmal -.

Grüße Karsten

PS: sizeof wird zur Compile-Zeit ausgewertet.

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 28.09.2010, 21:12
von dg1vs
Das kommt raus -> DDSFirmware.lss:

Code: Alles auswählen

000009e1 <__c.2162>:
     9e1:	55 70 2b 44 6f 77 6e 00                             Up+Down.

000009e9 <__c.2159>:
     9e9:	44 6f 77 6e 00                                      Down.

000009ee <__c.2155>:
     9ee:	55 70 00                                            Up.
und

Code: Alles auswählen

			case SWEEP_UP:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UP)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UP)-1), PSTR(PANEL_STR_SWEEP_UP));
    63fa:	86 e0       	ldi	r24, 0x06	; 6
    63fc:	61 e0       	ldi	r22, 0x01	; 1
    63fe:	42 e0       	ldi	r20, 0x02	; 2
    6400:	2e ee       	ldi	r18, 0xEE	; 238
    6402:	39 e0       	ldi	r19, 0x09	; 9
    6404:	05 c0       	rjmp	.+10     	; 0x6410 <SweepSlopeUpdateDisplayFunction+0x36>
				break;
			case SWEEP_DOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_DOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_DOWN)-1), PSTR(PANEL_STR_SWEEP_DOWN));
    6406:	84 e0       	ldi	r24, 0x04	; 4
    6408:	61 e0       	ldi	r22, 0x01	; 1
    640a:	44 e0       	ldi	r20, 0x04	; 4
    640c:	29 ee       	ldi	r18, 0xE9	; 233
    640e:	39 e0       	ldi	r19, 0x09	; 9
    6410:	0c 94 49 16 	jmp	0x2c92	; 0x2c92 <LCDOverwrite_P>
				break;
			case SWEEP_UPDOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UPDOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UPDOWN)-1), PSTR(PANEL_STR_SWEEP_UPDOWN));
    6414:	81 e0       	ldi	r24, 0x01	; 1
    6416:	61 e0       	ldi	r22, 0x01	; 1
    6418:	47 e0       	ldi	r20, 0x07	; 7
    641a:	21 ee       	ldi	r18, 0xE1	; 225
    641c:	39 e0       	ldi	r19, 0x09	; 9
    641e:	0c 94 49 16 	jmp	0x2c92	; 0x2c92 <LCDOverwrite_P>
    6422:	08 95       	ret
Grüße Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 29.09.2010, 21:17
von psclab38
dg1vs hat geschrieben:
psclab38 hat geschrieben: Übrigens noch so als Hinweis: es schließen sich Burst- und Sweepmodus gegenseitig aus. Ich glaube mich zu erinnern, daß der Sweep den Burstmodus implizit abschaltet; ich hab das aber jetzt nicht kontrolliert.
Ich habe den Code jetzt nicht kontrolliert, aber ich kann gleichzeitig Burst- und Sweepmodus anschalten.
Anschalten schon, aber der Burstmodus dominiert und es kommt nur der Burst aus der Buchse. Die Sweepfunktion ist inaktiv, solange der Burstmodus an ist. Schaltet man den Burst wieder ab, dann ist der Sweep wieder da. Das SweepMenü zeigt aber immer "On"... . Wenn das irritieren sollte, dann kann man da ja eine gegenseitige Abschaltung für Burst und Sweep nachrüsten.
dg1vs hat geschrieben:Jetzt noch ne Idee:
Was haltet Ihr von folgendem Vorgehen:
...

Code: Alles auswählen

void SweepSlopeUpdateDisplayFunction(uint8_t ucForceUpdate,
		void *pParam __attribute__((unused)))
{
	if((LastParams.ucSweepSlope!=Params.ucSweepSlope)||ucForceUpdate)
	{
		// display new setting
		switch(Params.ucSweepSlope)
		{
			case SWEEP_UP:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UP)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UP)-1), PSTR(PANEL_STR_SWEEP_UP));
				break;
			case SWEEP_DOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_DOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_DOWN)-1), PSTR(PANEL_STR_SWEEP_DOWN));
				break;
			case SWEEP_UPDOWN:
				LCDOverwrite_P((SPALTEN_MAX + 1 - sizeof(PANEL_STR_SWEEP_UPDOWN)), DISPLAY_LINE_1, (sizeof(PANEL_STR_SWEEP_UPDOWN)-1), PSTR(PANEL_STR_SWEEP_UPDOWN));
				break;
		}
	}
}
Auch wenn es jetzt erstmal chaotischer aussieht, ich bekomme aber so die redundante Nutzung der Längeninformation weg. Letztlich wird 3 mal die Information über den String benutzt, 2 x mal die Länge und einmal der String. Damit es schön wird, müßte man dass Ganze noch in ein Gesamtmakro packen. Nachteil: einmal + einmal -.
Jaaa, schon. Aber der Aufwand zur Vermeidung von ein wenig Kopfrechnen oder Buchstabenzählen? :roll: Also wenn Du das in ein optisch ansprechendes Makro verpacken kannst, dann von mir aus... so isses fast unübersichtlicher als vorher.

Grüße
Paul

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 02.10.2010, 21:01
von dg1vs
Hallo,

anbei die "Mechanik"-Files. Die Diskussion ist zwar in die Softwareecke abgerutscht, deswegen hier Schaltung, Leiterplatte und Frontplatte zum Nachbauen.

Schönes Wochenende

Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 10.10.2010, 20:50
von dg1vs
Hallo *,
speziell Thoralt und Paul,

ich habe aktuell einen Stand, der ungefähr dem entspricht, was ich mir als erste Version vorgestellt habe. Die Version passt auch in den Standard µC. Bei der Version mit dem große Display habe ich über Macro die Kombination mit ENCODER_NAVIGATION verboten, da die Zeichensätze aktuell nicht vorhanden (Start-Screen) sind. Wenn Bedarf besteht, baue ich einen zweiten Zeichensatz mit ein.

Aktuell versuche ich noch den Code etwas bezüglich Speicher zu optimieren. Mit PWM und großen Display liege ich auf dem ATMEGA32 bei:
Program: 32066 bytes (97.9% Full). Compiler ist der WinAVR-20100110.

Was noch auf der Agenda liegt, ist die Verriegelung von Burst/Sweep/PWM. Ist diese schon angedacht, oder habe ich bei der Darstellung nen Fehler gemacht? Ich habe es noch nicht geschafft da reinzuschauen.

Schöne Woche und Grüße

Karsten

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 10.10.2010, 23:23
von psclab38
dg1vs hat geschrieben: Aktuell versuche ich noch den Code etwas bezüglich Speicher zu optimieren. Mit PWM und großen Display liege ich auf dem ATMEGA32 bei:
Program: 32066 bytes (97.9% Full). Compiler ist der WinAVR-20100110.
Hi Karsten,

probier' mal den WinAVR 20080610. Alle neueren schleppen eine deutlich größere libc mit sich rum.
dg1vs hat geschrieben:Was noch auf der Agenda liegt, ist die Verriegelung von Burst/Sweep/PWM. Ist diese schon angedacht, oder habe ich bei der Darstellung nen Fehler gemacht? Ich habe es noch nicht geschafft da reinzuschauen.
Die gegenseitige Abschaltung würde ich in main.c in der Funktion jobExecute() unterbringen, wie schon offline besprochen. Da werden die gegenseitigen Abhängigkeiten abgeglichen; ich würde bei der Auswahl einer der drei Optionen einfach die beiden anderen abschalten. M. E. können die sowieso nicht kombiniert werden.
Ich hatte bislang den Eindruck, daß Thoralt und Du das unter Euch ausmacht. Ich wollte da nicht auch noch Verwirrung stiften, indem ich als dritter am Code arbeite.

Grüße
Paul

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 11.10.2010, 09:10
von thoralt
dg1vs hat geschrieben:Aktuell versuche ich noch den Code etwas bezüglich Speicher zu optimieren.
Ich hatte mal vor einiger Zeit das bisherige Minimum (allerdings mit neuem Compiler/neuer libc) mit folgendem Compileraufruf erreicht:

Code: Alles auswählen

avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -I /usr/local/AVRMacPack/include -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wextra -Werror -Wstrict-prototypes -Wa,-adhlns=uart.lst  -std=gnu99 -fno-inline-small-functions -fno-split-wide-types -fno-tree-scev-cprop -ffreestanding -ffunction-sections -fdata-sections -mcall-prologues --combine -fwhole-program -Wl,--relax,--gc-sections,-Map=dds.map,--cref,-u,vfprintf -MD -MP parser.c timer.c dds-hw.c dds-parser.c encoder.c i2c.c i2creg.c lcd.c panel.c main.c uart.c --output dds.elf -lprintf_flt -lm
Der Trick ist hier, dass alles in einem Durchgang und als eigenständiges Programm (-fwhole-program) übersetzt wird. Das spart bei mir gegenüber der herkömmlichen Art mit Makefile nochmal 400 Bytes.

Viele Grüße
Thoralt

Re: Bedienpanel mit 20x4 und Softkeys

Verfasst: 11.10.2010, 18:47
von psclab38
thoralt hat geschrieben: Der Trick ist hier, dass alles in einem Durchgang und als eigenständiges Programm (-fwhole-program) übersetzt wird. Das spart bei mir gegenüber der herkömmlichen Art mit Makefile nochmal 400 Bytes.
Ich komme auf folgende Ergebnisse, mit dem DDS-C-Codestand von heute aus dem CVS:

normal compiliert (AVR-Studio)
WinAVR-20080610: 30986

allinone compiliert
WinAVR-20080610: 30796
WinAVR-20090313: 31700

Das all-in-one bringt 190 Byte, mit dem guten "alten" WinAVR-20080610.

Grüße
Paul