- LiFePO4 Speicher Test         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 55

Thema: Tasterwerte an Hyperterminal übergeben

  1. #21
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Anzeige

    Praxistest und DIY Projekte
    Hallo Sternthaler,
    - Alle warnings wegen 'signedness' können hier ignoriert werden. Es erfolgt an keiner Stelle eine Nutzung des höchsten Bits. Ist nur Compiler-Overload
    - Die warnings wegen 'implicit declaration' können hier ignoriert werden. Bei keiner der Funktionen wird der (angenommene) int-Return-Wert überhaupt benutzt.
    Das ist richtig, das Programm wird auch ohne diese Castorgie richtig laufen,
    das Problem ist ja nur, wenn man die Warnings übersieht/ignoriert ignnoriert man auch richtig böse Warnings, wie 'make pointer from int' oder so.
    Das war nicht böse gemeint, genauso wie mit 'Käse'...


    @izaseba
    Sollte deine Funktion PrintChar() nicht eher PrintuChar() heißen, dann könnte man noch eine 'echte' PrintChar() mit Vorzeichenausgabe für 'signed char' machen?
    Ja Du hast wieder recht PrintuChar() wäre passender gewesen
    Es war eher aus der 'Ecke' 'wie komm ich ohne itoa aus...'

    hmmm, wie könnte dann PrintChar() in der einfachsten Form aussehen

    Vielleicht so (als erster Gedanke)

    Code:
    void PrintChar(unsigned char x)
       {
          char ergebnis[]  = {' ','0','0','0'};
          if (x<0) {
             ergebnis[0] = '-';
             x * = -1;
             }
          if (x >=100){
          ergebnis[1] = '1';
          x -=100;
          }
          while (x >= 10) {
          ergebnis[2]++;
          x -=10;
          }
          ergebnis[3] +=x;
          SerWrite(ergebnis,4);
       }
    Gefällt mir zwar nicht ganz, es ist aber 'der erste Gedanke'
    Wenn da Interesse bestehen sollte kann ich mir weitere Gedanken drüber machen, sonst lasse ich es einfach

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #22
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo izaseba,
    das mit dem Käse ist ja schon erledigt. m.a.r.v.i.n hat irgendwo im Forum ein Update angekündigt. Es kann sich also nur noch um Minuten handeln, bis der Käse gegessen ist

    Wenn du so weiter machst mit Print[u| ]Typen dann sollten wir bald dazu übergehen, dass du die printf()-Funktion reparierst.
    Ich weiß nicht, ob du Vorschlag für die lib: PrintFloat schon gesehen hast, aber da tun sich im Moment Abgründe auf. Angefangen hat es mit: M1.R hatte ich sprintf() mit %f zur Formatierung empfohlen. Dabei kam nur Schrott (manche würden von Käse reden ) zustande.
    Bis jetzt finde ich, dass deine Formatierungsfunktionen recht gut aussehen. Brutal, aber (sogar für mich) verständlich.

    Bei den warnings gebe ich dir uneingeschränkt Recht. Ein 'bösartiger' warning muss natürlich erst einmal erkannt werden. Deshalb hatte ich versucht zu erklären, warum es diesmal gut geht.
    OT: Das hatte ich mal, in Erinnerung an die Sprüche meiner Mutter, gedichtet: https://www.roboternetz.de/phpBB2/ze...=299067#299067

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Wenn du so weiter machst mit Print[u| ]Typen dann sollten wir bald dazu übergehen, dass du die printf()-Funktion reparierst.
    Ne, Du, das lasse ich lieber die printf funktioniert voll zu meiner Zufriedenheit itoa stört mich auch nicht weiter, aber wenn wir schon dabei sind...

    Hier eine verbesserte Version von PrintChar() (ohne führende Nullen)
    Ersparnis im Vergleich zu Wandlung mit itoa sagenhafte 90 Bytes (mit Minimalprogramm inkl. asurolib).

    Code:
    void PrintChar(signed char x)
       {
       char ergebnis[4];
       char *pointer = ergebnis;
       if (x < 0){
          	*pointer++ ='-';
    		x *=-1;
    	}
    	if (x>=100){
    		*pointer++='1';
    		x -=100;
    	}
    	if ( (x>=10) ||(*(pointer-1) == '1') ) {
    		*pointer = '0';
    		while(x>=10){
    			(*pointer)++;
    			x -=10;
    			}
    		pointer++;
    	}
    	*pointer++ = '0' + x;
    	SerWrite(ergebnis,pointer-ergebnis);
       }
    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #24
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    ich denke mal gnaz spontan, dass man es gerade neuen usern so einfach wie möglich machen sollte. deshalb sollten soweit es geht alle warnings, die bekannt sind, ausgemerzt werden, damit die compiler-ausgabe so gut wie möglich aussieht. ausserdem ist es schon wahr: lass einmal jemanden versuchen, andere werte als pollswitch auszugeben, welche das MSB nutzen: dann wars das mit der signedness, die wird dann plötzlich sehr wichtig..
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Schön wie sich die Funktion entwickelt.

    lass einmal jemanden versuchen, andere werte als pollswitch auszugeben, welche das MSB nutzen
    So auf Anhieb fällt mir grad keiner ein, der hier mit vorzeichenbehafteten Zahlen (signed) arbeitet. Die paar die es tun sind auch reif genug dafür und können das. Aber die asuro-Einsteiger wollen in erster Linie die Tasterwerte zum Terminal senden. Und denen werde ich in Zukunft mein einer-zehner-hunis-SerChar() aufdrängen. Das kann man dann auch sehr einfach auf 10 oder mehr Bits "aufbohren" oder führende Nullen unterdrücken. Offensichtlich gehts auch viel effizienter, aber übersichtlicher und für C-Neulinge verständlicher ist das auf keinen Fall.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #26
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    hmm das ist auch wahr. trotzdem ist die funktion recht speicherintensiv, und die warnings sollten wirklich verschwinden...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #27
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Optimierer,
    90 Byte gegenüber itoa() kann ja bestimmt einmal die Rettung sein. Allerdings muss auch ich sagen, dass man schon 2 mal auf die Funktion sehen muss um sie zu verstehen.
    izaseba hatte den rettenden Tip im Asuro-Lottozahlen-Thread, auch die printf_flt-Lib einzubinden wenn man fprintf mit %f-Formatierung nutzen möchte. Da kamen dann ca. 5000 Byte nur für zwei printf zusammen.
    So bleibe ich also doch dabei, das sich izaseba um die Optimierung kümmert . Da kannst du dich jetzt nicht mehr wehren, so gut wie du das hinbekommst.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  8. #28
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Da kamen dann ca. 5000 Byte nur für zwei printf zusammen.
    da hab ich was 'optimiert', dagegen sind die 90 Bytes wohl nichts

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo,

    Ich habe neues zu berichten und zwar habe ich die Asurolib PrintInt etwas verbesert.
    Ich denke das Ergebnis läßt sich sehen:

    Ein Minimalprogramm mit der originalen PrintInt kompiliert
    Code:
    #include <asuro.h>
    
    int main(void)
    {   
    Init();
    while(1)
          {  
          
    	 //PrintChar(x);
    	 PrintInt(-1000);
          }   
    	return 0;
    }
    Ergebnis
    section size addr
    .text 1160 0
    .bss 18 8388704
    Dann die geänderte PrintInt, die ich zwar noch PrintChar nenne, sie schluckt aber locker int
    Code:
    #include <asuro.h>
    
    void PrintChar(int x)
       {
       int b=0;
       if (x < 0) {
    	SerWrite('-',1);
    	x = -x;
       }
       if (x >= 10) {
    	while (x >= 10) {
    	b++;
    	x -=10;
    	}
    	PrintChar(b);
    
    	}
       SerWrite(x + '0',1);
       }
    	
       
    int main(void)
    {   
    Init();
    while(1)
          {  
          
    	PrintChar(-1000);
          }   
    	return 0;
    }
    Ergebnis
    section size addr
    .text 864 0
    .bss 18 8388704
    Ersparnis von 296 Bytes !
    Meine Funktion benutzt zwar Rekursion, was den Stack etwas belastet, aber ich denke, es ist nicht so schlimm oder ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #30
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    halte ich für besser. da die zahlenwerte nicht allzu lang sind sollte das kein problem darstellen...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test