smartes printf

Microcontroller, Steuerungen, Protokolle und und und.

Moderators: thomasf, random

Post Reply
User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

smartes printf

Post by random » Fri 20 Oct, 2006 9:46 pm

Hi Leutz,

um hier mal wieder etwas Leben inne Bude zu bringen, veröffentliche ich hier mal ein sehr kleines printf.

Problem ist, dass man auf Mikrocontrollern zum schöneren debuggen nur die serielle schnittstelle nutzen kann.

Nun hab ich keinen Bock, die zeichen alle einzelnd rüberzschaufeln ...

Worum gehts ?
Ich hab ne Shell für Mirkrocontroller geschrieben. Diese Shell bietet Funktionalitäten wie eine DOS/Linux-Shell, und ermöglicht Funktionsprogrammierung zum debuggen a'la int test_func(int argc, char *argv).

Da sind viele printf's drin.
Dummerweise braucht ein normales printf aus einer uC-Lib so 5k oder mehr an code.
Nimmt man einen AVR, ist das meist bei den kleineren shcon sehr viel.

Daher hab ich mir Gedanken gemacht, und überlegt, was man eigendlich alles so printf'en muss:
text, %i, %c, %s sowie \n und \t sollten für die meisten Sachen ausreichen.

Variadic Functions ? va_xxx machts ;-)

Der Code ist stellenweise ziemlich gemein programmiert, aaaber:

Mit Keil uVision compiliert auf ARM Cortex M3 (Luminary Micro, Stellaris:
-O0: 240Byte ROM und 4Byte SRAM
-O3: 180Byte ROM und 4Byte SRAM

Wenn das man nicht geil ist ;-))

Parameter und Formatstring (mit o.g. Format-zeichen) wie printf...

Nehmts mir nciht übel, dass ich einen Pointer als Variable vergewaltige :twisted:

Das fputc stammt noch vom retargeting für das printf. Da die aber auch sehr klein ist (5 zeilen) behalte ich die ;-)


Wenn noch jemand was entdeckt, wie mans noch kleiner kriegt, her damit ;-)

Code: Select all

// Th printf

/*
Author: Thorsten de Buhr
mail: thorsten@lasertechnix.de

Use:
Use is free, could run or not  ;-) 

U may change every printf in cour code to thprintf, the rest is the same.

U may use:
%i, %s, %c
\n, \t

More is not implemented now.

Have fun with this very small print-function, it uses ~240 bytes of code
(printf uses >5k!)

*/

#include <stdarg.h>
#include "../src/main.h"
#include "../src/thprintf.h"





int thprintf(char *string, ...)
{
	va_list tag;
	int i=0;
	int *pointer=0;
	signed int int_tmp=0;


	va_start(tag, string);

	do
	{
		if(*string == '%')
		{
			switch(*(++string))
			{
				case 'i':
				{
					int_tmp = va_arg(tag, int);

					if(int_tmp <0)
					{
						fputc('-', 0);
						int_tmp*=-1;
					}


					pointer = (int*)int_tmp;
					for(i=MAX_NUM_DEC; i; i/=10)
					{

						if((int)pointer/i)
						{
							fputc((int_tmp/i)+48, 0);
							int_tmp%=i;
						}
					}
				} break;

				case 'c':
				{
					fputc((char)va_arg(tag, int), 0);
				} break;

				case 's':
				{
					pointer = (int*)va_arg(tag, char*);

					do
					{
						fputc(*pointer, 0);
					} while(*pointer++);
				} break;
			}
		} // end if '%'

		else if(*string == '\\')
		{
			switch(*(++string))
			{
				case 'n': fputc('\n', 0);
					break;

				case 't': fputc('\t', 0);
					break;
			}
		} // end if '\'

		else fputc(*string, 0);

	} while(*(++string));

	va_end(tag);

	return(0);
}
Last edited by random on Fri 20 Oct, 2006 10:16 pm, edited 2 times in total.
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Fri 20 Oct, 2006 9:50 pm

Ich nehm zum Debuggen

LCD Zu_pruefender_Wert :roll:

Gento
Image

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Fri 20 Oct, 2006 10:08 pm

Gento wrote:Ich nehm zum Debuggen

LCD Zu_pruefender_Wert :roll:

Gento
so hab ich auch mal angefangen :twisted:

Nee, ist schon echt komfortabel mit printf und ner shell, wo man die testfunktionen mit parametern aufrufen kann.
Incl. kommandoeditierung, history, zahl und reihenfolge der parameter egal, uvm.

Dies ist nur das printf daraus :lol:
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Fri 20 Oct, 2006 10:23 pm

Und für Flasche Cola holen fährst Du mit 60 Tonnen LKW los. :twisted:

Das sagt sowieso kaum jemanden was Arm und Dein C xyz+ Kauderwelsch.

Gento
Image

schobi
Posts: 272
Joined: Mon 26 Sep, 2005 9:28 am
Location: Regensburg
Contact:

Post by schobi » Sat 21 Oct, 2006 12:05 am

Und für Flasche Cola holen fährst Du mit 60 Tonnen LKW los.
60 Tonnen LKW ist genau das was DU benutzt Gento! C-Control und fertige LCD-Bibliotheken, das ist Verschwendung von CPU-Resourcen in Vollendung.

Was medra hier uns zeigen will ist, wie man EFFIZIENT auf einem µC programmiert. Er benutzt also den Fiat Panda :-)

@medra: nicht entmutigen lassen von Leuten, die nicht nur über "Wissensabsauger" schimpfen, sondern anscheinend auch über Wissensabgeber.

Gruß Tobias
Ich danke allen, die zur Sache nichts zu sagen hatten und trotzdem geschwiegen haben.

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Sat 21 Oct, 2006 12:31 am

Jo,

dies ist C-programmierung vom feinsten.

Wenn man in Basic print schreibt, sind bestimmt schon einige 100k wech ... bei libs sowiso...

Ich sehe immer zu, dass ich möglichst alles selber schreibe in C, und dazu sparsam mit platz und ressourcen umgehe.

Daher ist dies an alle gedacht, die gleiches tun!


Greetz,
medra
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Sat 21 Oct, 2006 3:24 pm

mit der C-Control II kostet die Ausgabe eines Word oder Integer DREI Byte Speicher in der CPU und keine 100K.
:D

Debug = Fehler suchen.

<zitat>Ich sehe immer zu, dass ich möglichst alles selber schreibe in C, und dazu sparsam mit platz und ressourcen umgehe.</Zitat>

Ein funktionieren Program benötigt keinen Debugcode sei er noch so effizient.
Kostet nur ressoursen wie Du selbst schreibst.

In 99,99 % aller Fälle reicht LCD Ausgabe aus oder Print über die RS232.

lg Gento
Image

User avatar
guido
Posts: 6452
Joined: Thu 20 Dec, 2001 12:00 pm
Do you already have Laser-Equipment?: Easylase, Netlase, Laser von 1..15W.
Entwickler von Dynamics + Mamba X4 .
Lasershow Hard / Software .
Location: 32469 Petershagen
Contact:

c

Post by guido » Sat 21 Oct, 2006 4:41 pm

@Gento,

was du da siehst ist etwas näher an der Hardware wie Basic und Co Compiler. Wenn du im BasCom mit LCD "TEXT" was ausgibts weisst du gar nicht was der Compiler daraus macht. Compilie mal nur diese Zeile und guck dir die Grösse an. Ein C oder Assemblerprogger wird das mit 15% der Grösse hinbekommen.

Compilier wie Bascom und Co sind nicht so effizient wie z.b. Keil . Aber das "Quick and Dirty" auch für eine Safety reicht hast du ja bewiesen.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Sat 21 Oct, 2006 5:28 pm

Das ist mir schon sehr klar Guido.
In der C-Control ist das Betriebssystem fest drin und so 'verschenkt' man nur 3 Byte.
Ich finde den Satz nur zu Genial (dies ist C-programmierung vom feinsten).

Gento
Image

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Sun 22 Oct, 2006 4:09 pm

Gento wrote:Das ist mir schon sehr klar Guido.
In der C-Control ist das Betriebssystem fest drin und so 'verschenkt' man nur 3 Byte.
Ich finde den Satz nur zu Genial (dies ist C-programmierung vom feinsten).

Gento

vielleicht solltest du mal C lernen, dann kannste das obige ja lesen :twisted:

Und deine safety käme mit einem viel kleineren proz hin!

Was du übersiehst ist, dass ich das, was du "Betriebssystem" nennst, zum 100% selber schreibe.
Wenn ich anfange, hab ich gar nix... Nur ein leeres flash :-)

Sag mal, bei bascom ... ist das ein Bytecode, der auf ner art "virtual machine" auf dem proz läuft (dein "betriebssystem") ähnlich wie java, läuft da ein Basic-Interpreter drauf oder wird der basic-code einmal com "compiler" interpretiert und die interpretierten routinen als asm-code zusammengelinkt ?


Greez,
medra
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Sun 22 Oct, 2006 5:08 pm

Schau mal übern Tellerrand @Medra und auch auf die Safety

Die C-Control läuft NICHT mit Bascom.
Über Token läuft die wo man auch ASM einbinden kann.

Bascom ist für AVR und Pic's und keine Motorola.
In Bascom läßt sich auch reines ASM schreiben.

Mit Bascom schreibt man auch ein eigenes Betriebssystem.
Sicher lassen sich Lib's einbinden.

Aber manche möchten halt das Rad zu hundersten mal neu selbst erfinden.

Gento

Bevor ich C Schreibe , ASM kann ich :wink:
Image

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Sun 22 Oct, 2006 6:18 pm

Gento wrote:Bascom ist für AVR und Pic's und keine Motorola.
Motorola ??


Meistens erfinde ich das Rad gerne neu, weil ich vllt nicht ein Rad brauche, welches 100 Speichen, Alu-Felgen, Mantel mit Spikes usw. brauche, sondern nur ein Rad, was sich dreht und rund ist :twisted:

Dafür ist das Rad dann sauschnell, klein, baucht wenig Energie usw. *grins*

Ein wenig programmiere ich auch in asm, aber meist bin ich zu faul dazu ;-)

Die "ganzen räder", die ich "neu erfinde" oder einfach nur abwandele bilden meine Bibliothek, die ich je nach Bedarf auf meinen Controller anpassen und nutzen kann.
D.h. ich habe eine Reihe von Spezial-Rädern, die sich sehr leicht an andere gegebenheiten anpassen lassen, und welche die Funktionalität bieten, die ich brauche (dafür halt sehr schnell und klein und sparsam) ;-)

Greetz,
medra
Last edited by random on Sun 22 Oct, 2006 7:25 pm, edited 2 times in total.
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
fst-laser
Posts: 764
Joined: Sat 02 Jun, 2001 12:00 pm
Location: Gersthofen bei Augsburg

Post by fst-laser » Sun 22 Oct, 2006 6:40 pm

Bevor ich C Schreibe , ASM kann ich
He he, lang lebe ASM! 8) :lol:

Auch als ASM'ler benutz ich (schon vorher programmierte) Module in leicht veränderter Form und füge dem Code noch spezielle Extras hinzu.

So wird das Rad nicht neu erfunden, aber aus verschiedenen Felgen und Reifen zu Variationen zusammengesetzt. Man sollte sich schon Gedanken zur Software machen, wenn man dadurch (enorm) an Hardware spart. Denn Hardware kostet Geld in der Produktion.

Soviel mein Senf dazu...
Gruß Flo
F S T Discohits, Laserrausch -
Laser Abheben in die Welt der Strahlen!

Suche einen Laser Physics - Reliant300WC Weißlichtlaser...

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Sun 22 Oct, 2006 7:36 pm

FST-Laser wrote:Man sollte sich schon Gedanken zur Software machen, wenn man dadurch (enorm) an Hardware spart. Denn Hardware kostet Geld in der Produktion.
Zurück zum printf-Beispiel:

Nam nehme ein kleines System mit Display-Ausgabe an.
Meistens wird sprintf verwendet, um einen formatierten String zu erzeugen, den man dann aufs Display schickt (standart-vorgehensweise).

In meiner Portierung des CT-Bot ist noch so ein ding drin, allerdings etwas "tiefer" mit vsnprintf(...).
Alles andere hab ich schon durch mein printf ausgetauscht.
Dieses Ding belegt z.Zt. noch über 6k Code-Speicher, also ROM. SRAM weiss ich gerad nich...

6k ROM ... da kriegt man ne Menge anderen Code unter bzw. käme oft mit nem kleineren uC hin ... spart kosten & performance meist auch noch!

Es lohnt also immer, sich vorher Gedanken zu machen über Projekte. Ich mache das bei jedem meiner Bastelprojekte, weil da halt schöne Libs bei rausfallen.
Bei einem Projekt kleiner Stückzahl (z.B. der Safety) ists egal, ob die nen zwanni mehr kostet oder nicht ... wenns aber in die 100derte geht ist das ein sehr wichtiger Aspekt.

Trotzdem, *staun* ich hätte nicht gedacht dass Basic solch einer Aufgabe gewachsen ist!
Da geht es ja schon um echtzeitfähige Firmware, da reicht es ja nicht, wenn ein INT irgendwann (nach Systemzeit gemessen) bearbeitet wird (man beachte LDM/STM atomic-instructions).


BTW: Gento, mich würde mal interessieren, wie du die Safety aufgezogen hast. Arbeitest Du mit den Comparatoren und INTs, oder wird alles per Software gerechnet? Gibt es "in HW und ISR gegossene" Notfallroutinen, welche unter Garantie abschalten (z.B. bei Scannerausfall bzw. zu langsamer Bewegung) ? Oder läuft das gesamte Programm Round-Robin ?
Das ist nicht als Kritik gedacht, mich würde es wirklich interessieren ...


Greetz,
medra


[quiz-scherz]
Wem kommt das hier noch bekannt vor ?
POKE 53280,0: POKE 53281,0: PRINT CHAR$(14)
irgendwie vergess ich son kram nich :lol: Schliesslich ein paar Jahre gemacht
[/quiz-scherz]
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Sun 22 Oct, 2006 7:55 pm

Ein paar abschließende Worte hier zum Thema.

Bemühe Dich mal das PDF zur Safety zu lesen und beachte die CPU die da drauf ist @medra

Dort erklären sich Deine Fragen von alleine.

Gento
Image

User avatar
jan
Posts: 484
Joined: Thu 07 Dec, 2000 12:00 pm
Location: 47652 Weeze

Re: smartes printf

Post by jan » Mon 23 Oct, 2006 8:29 am

medra wrote:Variadic Functions ? va_xxx machts ;-)
Was'n dat? Bitte Erklärung, versteh deinen Code sonst leider nicht.

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Re: smartes printf

Post by random » Mon 23 Oct, 2006 7:37 pm

JAN wrote:
medra wrote:Variadic Functions ? va_xxx machts ;-)
Was'n dat? Bitte Erklärung, versteh deinen Code sonst leider nicht.
printf ist eine Funktion mit variebler argumentenliste.
Das bedeutet, die Agrumente 2 - __irendwas__ sind optional, d.h. nur das erste Argument (der String, oder besser: Formatstring) muss übergeben werden.

printf("Hello, World %s %i", "\nThe number is: ", 23);

wäre z.B. eine mögliche Zeile für printf:
Hello, World
The Number is: 23

Da ich vorher nicht weiss, wie viele Argumente noch kommen hab ich erst mal grundlegend ein Problem. Normalerweise ist die Argumentenliste in C fest in Typ(en) und Anzahl.
Um das zu umgehen gibt es die variadic-geschichte.

das '...' bedeutet, das an dieser stelle beliebig viele argumente folgen können.
Diese landen dann auf dem call-stack für die aufzurufende routine (also das printf).
Warscheinlich liegen die einfach alle hintereinander, angefügt an den Formatstring.
Denn dieser wird von der va_start()-funktion gebraucht, um die adresse des ersten parameters z ermitteln.

Jetzt parst (also suchst nach zu interpretierenden Zeichen) du den Formatstring, weil du darüber erfahren kannst, um was für einen Datentyp es sich beim jeweils nächsten Argument handelt.
Genaugenommen musst du das sogar wissen, da du dich mit der Information durch die argumentenliste hangelst.

Wenn Du im Formatstring ein Zeichen gefunden hast (z.B. das 'i' hinter einem '%', dann sagst du der va_arg, dass du gerne aus dem argumentenstring (dessen adresse wohl in tag liegt), das nächste argument gerne als int ausgegeben hättest.
Dann holt va_arg dir 2 oder 4 bytes (je nach architektur) von der var. argumentenliste und gibt dir den wert als int zurück. Weiterhin setzt die va_arg ihren merker weiter, hinter das eben angefragte int.

Genauso gehts mit int*, char*, char, etc.


Das gemeine an dem Programm oben ist, dass ich viel mit zeigern arbeite und viel in einem schritt mache, z.B.:
while(*(++string)); (ganz unten)
++string erhöht den pointer auf mein nächstes Zeichen im Formatstring
* holt den Inhalt (zeichen), welches an aktueller stelle im formatstring gespeichert ist
da kommt dann irgendein_zeichen oder 0 (bzw. '\0', ist gleichwertig) zrück.

Bei '\0' endet die while, so wird der Formatstring bis zum Ende abgearbeitet.

Der Nummernparser ist in der Zahl seiner Stellen begrenzt (MAX_NUM_DEC).
Um nicht 8Byte für einen temp_string zu verschwenden arbeite ich die Zahl von vorne ab, also 1234 / 1000 = 1 (wird ausgegeben)
1234 % 1000 = 234
234 / 100 = 2 (ausgeben)
234 & 100 = 34
usw...

Um die führenden Nullen nicht mit auszugeben vergewaltige ich den pointer zm speichern einer zahl.
Ich caste den Wert der originalen zahl int_tmp nach adresse auch char (char*), um sie im pointer speichern zu können.
Schreiben darf ich auf diese adresse keinesfalls !!!
Aber das spart mir noch mal 2...4 Bytes ;-)

Die eigentliche Anwensdung von 'pointer' ist in dem ase für 's', also string.
Ich hole mit va_arg einen pointer auf char (also einen pointer auf einen string), und arbeite den wieder in einer while ab.

Ein kleiner Bug versteckt sich in dieser Version noch in dem Parser für int. Wer findet ihn ?


Greetz,
medra


PS: Wenn ihr wollt, ich hab noch andere schöne Sachen auf Lager *g*
Also Low-Level-C :lol:
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
jan
Posts: 484
Joined: Thu 07 Dec, 2000 12:00 pm
Location: 47652 Weeze

Post by jan » Tue 24 Oct, 2006 9:03 am

Ahja, jetzt begreif's ich, danke :idea: . Hab mir jetzt auch die entsprechenden Makros in der stdarg.h mal angesehen. Ist ähnlich "gemein" programmiert wie Teile deines Codes :( .

Was diesen kryptischen Programmierstil angeht: Kennst du die Geschichte, wonach C in Wirklichkeit nur als Scherz gedacht war? Zitat:

"Dennis (Ritchie) und Brian (Kernighan) entwickelten eine wirklich perverse Pascal-Version namens A. Als wir bemerkten, dass einige Leute tatsächlich versuchten, in A zu programmieren, fügten wir schnell einige zusätzliche Fallstricke hinzu und nannten es B, BCPL und schließlich C. Wir hörten damit auf, als wir eine saubere Übersetzung der folgenden Konstruktion erhielten:

for(: P("\n"),R-: P("I"))for(e=C:e-: P("_"+('u+ +/8)k2))P("I"+('u/4)k2)

Der Gedanke, dass moderne Programmierer eine Sprache benutzen würden, die solch eine Anweisung zuließ, lag jenseits unseres Vorstellungsvermögens. Wir dachten allerdings daran, alles den Sowjets zu verkaufen, um ihren Computerfortschritt 20 Jahre und mehr zu behindern."

In diesem Sinne... :wink:

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Wed 25 Oct, 2006 12:04 am

Tip: Das Ding oben funktioniert, weil da einige Makros drin versteckt sind.
Damit kann man gemeine Sachen machen, die den code zu lesen unmöglich machen, so sollte z.B. folgendes funktionieren:

Code: Select all

#define A         text[
#define B(x)      [x]
#define C		  
#define P(x)      printf("%i", x);
typedef unsigned int  CC;


int main()
{
       CC A 2]B(5)={{1,2,3,4,5}, {1,2,3,4,5}};
       P(A 1]B(2));
}
Wer will kanns mal ausprobieren, es funktioniert :lol: *grins*

Ergebnis ist "3" auf dem Bildschirm und 0 oder 1 als return.

noch was schönes (ein teil aus meiner shell):

Code: Select all

// test if Initialisation is given
		for(argument=1; argument<=args; argument++)
		{
			if (memcmp(&argv[argument], "-i" ,2) == 0)
			{
				j=0;
				adc_freq=0;
				while(argv[argument][j+2])
			    {             
				 		 // Here you can specify te max_length of the Number-string (6 is for 999999 max (+2 for -i))   
			             if(j>(6+2)) 
			             {
			                     printf("\nWrong ADC-Freq.!");
			                     return;
			             }                
						 
			             if(j) adc_freq*=10;                                // power        
			             adc_freq+=(((argv[argument][j+2])-48));            // extraction of Number in copmmandstring
			             j++;            
			     }
			     
			     //Limiter, lowest could be 500, highest 500000
			     if(adc_freq < 500) adc_freq = 500;
			     if(adc_freq > 500000) adc_freq = 500000;
			     
				 adc_init(adc_freq);
				 printf("\nADC Freq: %u\n", adc_freq);	     
			}
		}

Man beachte diese 3 zeilen:
if(j) adc_freq*=10; // power
adc_freq+=(((argv[argument][j+2])-48)); // extraction of Number in copmmandstring
j++;

Das Ding parst einen string und berechnet eine zahl an gegebener position (hier z.B. -i1000)
Ohne irgendwelche komplizierten Arrays oder temps anzulegen ;-)


Greetz,
medra
Last edited by random on Wed 25 Oct, 2006 9:05 am, edited 4 times in total.
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
jan
Posts: 484
Joined: Thu 07 Dec, 2000 12:00 pm
Location: 47652 Weeze

Post by jan » Wed 25 Oct, 2006 8:10 am

Naja, ich hoffe, du kannst deine eigenen Programme in ein paar Jahren noch lesen... 8)

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Wed 25 Oct, 2006 8:41 am

JAN wrote:Naja, ich hoffe, du kannst deine eigenen Programme in ein paar Jahren noch lesen... 8)

bisher immer :lol:
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
gento
Posts: 3973
Joined: Fri 17 Nov, 2000 12:00 pm
Do you already have Laser-Equipment?: Apollo 4a + 4b , Turbotrack 2 , Minisax +++ G120DT +++ G138DT +++
Raytrack 40 ,CT 6210 , CT 6800 , K12
Pangolin , LDS Dynamics ,Phoenix Premium , LDS 2010 ,LDS 2008 , HE
Gas RGB 2W , 800 mW , ALC60
RGB >1W +++
Location: D / NRW / Hamm

Post by gento » Wed 25 Oct, 2006 11:03 pm

In der Arbeitswelt habe ich Täglich mit Programiern zu tun.
In erster Linie sehr Hardwarenah in C.

Ich denke Deine Richtung was Du ausüben magst ist Soften @Medra.

Grundsatz aller Programierer muß ein gute Doku sein = Aussagekräftige Variablen & Kommentare im Code dazu.

Kein Chef kann es sich leisten ,wenn Du mal krank bist , einen zig Stunden zu gönnen, Deine 50 Zeilen zu verstehen, bis Jener Dein Projekt fortsetzen kann , das der Auftrag nicht platzt.

Das ist das 1x1 um Geld zu verdienen / seinen Job zu behalten.

Gento
Image

User avatar
chw9999
Posts: 961
Joined: Sun 18 Jan, 2004 9:34 pm
Do you already have Laser-Equipment?: .
Location: Deutschland/ Hessen/ Bensheim
Contact:

Post by chw9999 » Wed 25 Oct, 2006 11:51 pm

Für's Dokumentieren bekommt man Zeit? Ist mir neu - muss ich gleich mal meinen Cheffe sagen :-) Aber man lernt in diesem Berufszweig ja nie aus... ;-)

Echte Programmierer brauchen keine Kommentare, das Programm ist selbstdokumentierend.

Cheers
Christoph

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Thu 26 Oct, 2006 3:45 am

Oh gento,

ich glaube langsam, dass dir wirklich so langsam die argumente ausgehen.

Du suchst förmlich nach sachen,die du kritisieren kannst.

Unterscheide mal bitte nach dingen, die man aus spass macht (die nicht als c-code in einem programm stehen) und programmen, die geschrieben und weiterentwickelt werden.

Du lässt echt nach ...

Ich habe mit Hard- und Software zu tun und überlege mir schon, was ich in Hard- und was in Software aufbaue.


Da gintz genug beispiele ... eins poste ich demnächst noch... (was man auch anders lösen kann, dann aber nicht so effizient ist).
Hab ich nu kein bock zu, denn ich komm mit 2o/oo von ner Neueinzieherparty hier im Stuwo :twisted:
Grün ist blauer als Rot...
NetLase-LC Firmware.

User avatar
jan
Posts: 484
Joined: Thu 07 Dec, 2000 12:00 pm
Location: 47652 Weeze

Post by jan » Thu 26 Oct, 2006 8:40 am

Naja, zwar möchte ich Gentos persönliche Abneigung gegen deine Person nicht unterstützen oder gutheißen, aber sein letztes Argument ist sogar sehr stichhaltig. In meiner Firma gibt es Programmierrichtlinien, die genau das von ihm beschriebene aussagen. Sonst hat mein Arbeitgeber nämlich echt ein Problem, wenn ich mal mit dem Auto gegen einen Baum hämmere (Was ich nicht hoffen will :roll: ).
Wartbarkeit von Sourcecode hat in der Arbeitswelt tatsächlich einen nicht zu unterschätzenden Stellenwert, oftmals höher als Programmeffizienz. Letztere spielt im Zeitalter von noch mehr Speicher und noch mehr Prozessorspeed keine so große Rolle mehr. Okay, bei Embedded Anwendungen ist das (zum Glück) noch etwas anders. Mich gruselt die Vorstellung einen µC mit C++ zu programmieren :evil: ...

User avatar
chw9999
Posts: 961
Joined: Sun 18 Jan, 2004 9:34 pm
Do you already have Laser-Equipment?: .
Location: Deutschland/ Hessen/ Bensheim
Contact:

OT:

Post by chw9999 » Thu 26 Oct, 2006 10:04 am

Ohne hier Grundsatzdiskussionen vom Zaun brechen zu wollen: Es gibt in der Programmentwicklungswelt sehr wohl ein weit gestreutes Feld von unterschiedlichen Ansätzen, ob und wie Dokumentation in einem Programm auszusehen hat: vorgegeben von dedizierten Entwicklern, festgeschrieben in Abteilungs/Konzern-Programmierrichtlinien oder einfach nur, weil einige Entwickler gerne selber ihren Code wieder schnell lesen können wollen.

Die Praxis sieht aber doch häufig so aus, dass ob falsch ausgelegter Projektumfänge "plötzlich" die Programmentwicklung im Vordergrund steht und das Dokumentieren "zu einem späteren Projektzeitpunkt, wenn wir etwas mehr Luft haben" nachgeholt werden soll... :roll: Wobei jeder im Vornherein schon weiß, dass es sowas nicht gibt...

Besonders "Leiharbeiter" zeichnen sich manchmal in Großprojekten dadurch aus, eingenwilligen Code zu generieren, der nur durch sie zu warten ist. Das hat oft durchaus eine darwinistische Basis, den "Survival of the fittest" zu garantieren: "Keiner außer mir besitzt die Kenntnis, also schmeißt mich besser nicht raus...". Geht manchmal, aber nicht immer gut. Und manchmal liegt es auch einfach an "Nach mir die Sinnflut"... "Interne" sind oft nicht besser, aber Da heutzutage verhältnismäßig wenige Interne in Großbetrieben Hand an Programme legen dürfen/können (alles "Architekten"), habe ich mein Augenmerk mal auf die Externen gelenkt.

Ich begrüße Programmierrichtlinien sehr, solange sie sinnvoll sind (es gibt auch weniger sinnvolle), und wenn sie dazu führen, Zeit für Dokumentation im Projektplan bereitzuhalten. Aber die Erfahrung aus Großprojekten zeigt mir leider, dass solche Richtlinien sehr schnell ad acta gelegt werden, wenn die Bude brennt.

Kern der Sache: Generalisierung hilft hier nicht! Die Welt ist groß, es gibt Solche und Solche Projekte/Firmen/Entwickler, gute und weniger erfolgreiche, und was beim einen passt, funktioniert beim anderen noch lange nicht.

So, doch 'ne Grundsatzdiskussion? Aber wenn es schon so schön OT geworden ist, dann wenigstens richtig :-)

Meine Sicht der Dinge
Christoph

User avatar
nohoe
Posts: 3976
Joined: Mon 20 Feb, 2006 1:09 pm
Do you already have Laser-Equipment?: 9x RGB LASER
6 x Netlase(5 x LC) + 1x EL LC
Software: Dynamics + + Beyond
HE und sonstige
Location: 44795 Bochum

Post by nohoe » Thu 26 Oct, 2006 1:45 pm

Hallo

@chw9999
Du triffst den Nagel auf den Kopf.

Dokumentation ist unter Softwareentwicklern ein verhaßtes Thema. Doku im Programm macht es manchmal schwerer lesbar. Für Doku ist im Projekt nie Zeit.

Deshalb sollte der Code selber für andere Programmierer einfach lesbar sein. Klar kann man sich auf die Schulter klopfen für den kürzesten und kryptischsten Code den keiner mehr lesen kann. Nur wer so im Team programmiert ist schnell da raus. Deshalb gib es Richtlinien an die man sich grob halten sollte. Selbstsprechende Variablenbezeichnungen, Code entsprechend formartieren und auch ruhig mal eine Zeile mehr schreiben.
Gerade in C kann man so richtig unlesbares produzieren, es geht aber auch anders. Für die meisten Anwendungen haben Rechner seit Jahren Geschwindigkeiten ereicht wo es nicht mehr auf das kleinste Bit in der Schleife ankommt. Jeder Programmierer hat seinen individuellen Stil. Mancher Code mag auf den ersten Blick umständlich aussehen. Manches ist historisch gewachsen. Was funktioniert ist aber nicht falsch. Jeder hat auch seine Lieblingsprogrammiersprache von der andere wiederum sagen das man damit nicht programmieren kann.

Also Basic-, C- und Pascalprogrammierer lasst das Kriegsbeil ruhen.

Programmiere beruflich im Oracle Umfeld.
Privat früher Basic, C und und und, komme nur heute nicht mehr dazu.
(Habe früher in C auch so kryptisch programmiert bevor ich eine IT Ausbildung gemacht habe. Diese Programme kann ich heute kaum noch lesen)


Gruß
:) Norbert

User avatar
jan
Posts: 484
Joined: Thu 07 Dec, 2000 12:00 pm
Location: 47652 Weeze

Post by jan » Fri 27 Oct, 2006 8:03 am

Jepp, dem ist nichts mehr hinzu zu fügen. Is' gut jetzt!

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Fri 27 Oct, 2006 8:11 am

Hi leutz,

um da jetzt auch mit einzusteigen... ;-)

latürnich sorge ich für eine gute doku meines codes (da, wo es nötig ist, vielfach wird auch überdokumentiert)
Ich setze allerdings voraus, dass der leser die sprache (Basic, C, java, asm, ...) beherrscht :twisted:
Zur dokumentation benutze ich idR doxygen, so was ähnliches wie javadoc, und ist für c.

das thprintf und der "fiese zweizeiler" sind sachen, die mal so aus jux entstehen, und keinen (direkten) zusammenhang zu einem projekt haben.
auch ging es mir hier darum, interessante möglichkeiten aufzuzeigen, und dass sich die leute erst mal den lopf zerbrechen, wie das nun funzt (also pure absicht *gg*)

zum thema doku: ich habe idR. über jeder sub-func (die auch nur in seltenen fällen grösser als eine bildschirmseite ist) einen doxygen-header, in welchem eine grobe beschreibung sowie die parameter erklärt sind.

weitere kommentare kommen dann in der func selbst, falls benötigt.
ggf. ist sogar die ganze func im kopf erklärt.

hier hab ichs rausgenommen :twisted:

idee war, das forum hier mal wieder ein wenig aufleben zu lassen, und dass auch andere mit einsteigen ... so was hab ich nicht erwartet *g*

aber schade, dass man sich nicht einfach mal über was lustiges oder interessantes unterhalten kann, wenn es nicht perfekt an den masstäben anderer ist :-(


edit: jan, du warst ein paar minuten schneller ;-)
Grün ist blauer als Rot...
NetLase-LC Firmware.

Post Reply

Return to “Microcontroller & Steuerungen”

Who is online

Users browsing this forum: No registered users and 2 guests