Forum: Mikrocontroller und Digitale Elektronik #01 Dark Side of Code C&P Culture


von C&P_Hunter (Gast)


Lesenswert?

Hi,
ich starte heute mit Episode #01 zur "Dark Side of Code C&P Culture", wo 
ich aufzeige warum c&p nicht immer der Anfang sondern auch das End "vom 
Denken" bedeuten kann. Ich werde dazu regelmäßig C Code Snippets aus den 
Embedded Bereich sezieren ... und diesen wesentlich verbessern.

#01c&p, Arduino shiftIn(), shiftOut()
Diese Funktionen sind besondern auf Small Machines grausam inefficient 
bzgl. Code Size and Speed, weil hier "dynamic shifts" wie <<i/<<(7-i) 
verwendet werden. Die leicht einzusehende bessere Lsg verwendet "static 
shifts" !
1
// the original, x-times c&p in a lot of projects 
2
3
#include <Arduino.h>
4
5
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
6
  uint8_t value = 0;
7
  uint8_t i;
8
9
  for (i = 0; i < 8; ++i) {
10
    digitalWrite(clockPin, HIGH);
11
    if (bitOrder == LSBFIRST)
12
      value |= digitalRead(dataPin) << i;
13
    else
14
      value |= digitalRead(dataPin) << (7 - i);
15
    digitalWrite(clockPin, LOW);
16
  }
17
  return value;
18
}
19
20
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
21
{
22
  uint8_t i;
23
24
  for (i = 0; i < 8; i++)  {
25
    if (bitOrder == LSBFIRST)
26
      digitalWrite(dataPin, !!(val & (1 << i)));
27
    else
28
      digitalWrite(dataPin, !!(val & (1 << (7 - i))));
29
30
    digitalWrite(clockPin, HIGH);
31
    digitalWrite(clockPin, LOW);
32
  }
33
}
1
// improved implementation
2
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
3
  uint8_t val = 0;
4
5
  for (uint8_t = 0; i != 8; ++i) {
6
    digitalWrite(clockPin, HIGH);
7
    if (bitOrder == LSBFIRST)
8
      val = (val>>1) | (digitalRead(dataPin)<<7);
9
    else
10
      val = (val<<1) | digitalRead(dataPin);
11
    digitalWrite(clockPin, LOW);
12
  }
13
  return val;
14
}
15
16
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {
17
  for (uint8_t i = 0; i != 8; i++)  {
18
    if (bitOrder == LSBFIRST)
19
      digitalWrite(dataPin, val & 0x01), val >>= 1;    
20
    else
21
      digitalWrite(dataPin, !!(val & 0x80)), val <<= 1;
22
23
    digitalWrite(clockPin, HIGH);
24
    digitalWrite(clockPin, LOW);
25
  }
26
}

: Gesperrt durch Moderator
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Arduino-Müll vorführen ist wie einem Baby den Lutscher klauen. Also was 
soll das?

von Zahnarzthelfer (Gast)


Lesenswert?

Hannes J. schrieb:
> Arduino-Müll vorführen ist wie einem Baby den Lutscher klauen. Also was
> soll das?

Es soll verhindern, daß das Baby schlechte Zähne bekommt.

von Einer K. (Gast)


Lesenswert?

Zumindest shiftOut() ist keine Verbesserung zum original Arduino Code.
Im Gegenteil.
Der hier ohne jede Not verwendete (also überflüssige) 
Ausdrucksverkettungsoperator, machts nur schlimmer/hässlicher.



Außerdem bleibt der Löwenanteil der Zeit (und auch der 
Speicherverbrauch) nicht beim Schieben hängen, sondern bei den 
digitalWrite() und digitalRead() Funktionen.
Bei einem µC mit Barrell Shifter ist das sowieso alles wurscht.


Tipp:
Falls wirklich Interesse daran besteht den Arduino Code  zu verbessern, 
dann ist hier der falsche Ort.

von Philipp K. (philipp_k59)


Lesenswert?

C&P_Hunter schrieb:
> Die leicht einzusehende bessere Lsg verwendet "static
> shifts" !

Ist der Pull Request schon durch?

https://github.com/arduino/ArduinoCore-avr/blob/2f67c916f6ab6193c404eebe22efe901e0f9542d/cores/arduino/wiring_shift.c

Gibts ja nicht es sah mal so ähnlich aus vor einigen Dateiversionen..

https://github.com/arduino/ArduinoCore-avr/commit/649f978224d79947d679612e4bcb326280f4f963#diff-2228e887b64ce2b5b6988c253d21fe48

: Bearbeitet durch User
von zitter_ned_aso (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Ich werde dazu regelmäßig C Code Snippets aus den
> Embedded Bereich sezieren ... und diesen wesentlich verbessern.

Hört sich sehr interessant an.

von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ausdrucksverkettungsoperator, machts nur schlimmer/hässlicher.

Mir scheint, du kennst dich mit hässlichen Dingen gut aus!?

Vorschauprogram:
In Episode #2 zeige ich den interessierten Kindern, z.B. wie shiftout() 
weiter verbessert werden kann bzgl. Speed um z.b via SW SPI mit OLED/TFT 
zu bespielen.

Ab Episode #3 gehts dann mal um Code hier bekannter Projekte 
Wordclock/Transistortester/...

Gerne würde ich auch ein SW/HW Projekt von Arduino Fanboy D. sezieren. 
Gibt es da was zu finden, oder kann dieser Zuschauer mal eines seiner 
besseren Projekte posten?


Also bleibt eingeschaltet!

von Martin (Gast)


Lesenswert?

> ... und diesen wesentlich verbessern.

Gähn. Wieder einer dieser Weltverbesserer bzw. Besserwissis. Die sind 
wie Kacke am Schuhhacken. Die wird man nicht so einfach wieder los. kwt.

von Erklehr Behr (Gast)


Lesenswert?

C&P_Hunter schrieb:
> In Episode #2 zeige ich den interessierten Kindern, z.B. wie shiftout()
> weiter verbessert werden kann bzgl. Speed um z.b via SW SPI mit OLED/TFT
> zu bespielen.

Das ist auch dringend nötig, denn Soft-SPI mit den Funktionen
digitalRead(..) und digitalWrite(..) zu vermauscheln ist schon
wahrhaft Digitale Perversion.

von Johannes S. (Gast)


Lesenswert?

Wenn es konkrete Probleme sind dann kann man die als Issue und Pull 
Request bei den Entwicklern einbringen. Da muss man sich aber etwas 
gepflegter Ausdrücken, sonst fliegt man da gleich wieder raus. Alles 
andere ist Wichtigtuerei und Kinderkacke.
Und hier wird diese Position schon vom C-Hater eingenommen. Oder hast du 
dir nur einen x. Nick zugelegt?

von C&P_Hunter (Gast)


Lesenswert?

Martin schrieb:
> Gähn. Wieder einer dieser Weltverbesserer bzw. Besserwissis. Die sind
> wie Kacke am Schuhhacken. Die wird man nicht so einfach wieder los. kwt.

... für Kinder, wie Martin, die lieber aus dem Fenster schauen wollen, 
bitte stört nicht die anderen!

Oder Martin, liegt vielleicht die Ursache deiner Brandrede darin, dass 
du zu wenig Aufmerksamkeit empfängst?
Dann würde ich dir gerne z.B. das Thema der Episode #2 oder #3 
übergeben, interessiert oder spielst du lieber mit Molotowcocktail? Weil 
dein Ton und deine Sprache lässt nichts Gutes vermuten.

von C&P_Hunter (Gast)


Lesenswert?

Johannes S. schrieb:
> Da muss man sich aber etwas
> gepflegter Ausdrücken, sonst fliegt man da gleich wieder raus. Alles
> andere ist Wichtigtuerei und Kinderkacke.
> Und hier wird diese Position schon vom C-Hater eingenommen. Oder hast du
> dir nur einen x. Nick zugelegt?

Der Leidensdruck einiger Zuschauer ist beeindruckend, die praktizierte 
Sprache eher weniger.

Die Motivation der Sendung ist überschaubare Code Snippets zu verbessern 
und davon zu lernen ...


stay tuned!

von Johannes S. (Gast)


Lesenswert?

Leidensdruck? Melde mal dich mal hier an, dann siehst du was auch andere 
von deiner Sendung halten.

von spess53 (Gast)


Lesenswert?

Hi

>Die Motivation der Sendung ist überschaubare Code Snippets zu verbessern
>und davon zu lernen ...

Und warum machst du das dann nicht in einem Arduino Forum?

MfG Spess

von Falk B. (falk)


Lesenswert?

Erklehr Behr schrieb:
> Das ist auch dringend nötig, denn Soft-SPI mit den Funktionen
> digitalRead(..) und digitalWrite(..) zu vermauscheln ist schon
> wahrhaft Digitale Perversion.

Nö, es ist die offizielle Abstraktionsebene der Arduino-Libs. Wenn man 
es denn WIRKLICH effizient machen wöllte, würde man separate 
Assemblerdateien mit handoptimiertem ASM für JEDE Arduino-Architektur 
verwenden.

von Falk B. (falk)


Lesenswert?

C&P_Hunter schrieb:
> Diese Funktionen sind besondern auf Small Machines grausam inefficient
> bzgl. Code Size and Speed, weil hier "dynamic shifts" wie <<i/<<(7-i)
> verwendet werden. Die leicht einzusehende bessere Lsg verwendet "static
> shifts" !

Schön und gut, aber wenn man schon zeigen will daß es besser ist, dann 
bitte auch mit einer Messung in der realen Welt. Sprich, mittels Oszi 
oder Logicanalyzer deine Versionen vergeleichen.

von Falk B. (falk)


Lesenswert?

Allerdings kann man es auch mit dem offiziellen Arduino-Konzept DEUTLICH 
schneller machen, auch ohne ASM. Dazu braucht man die Macros ind 
Arduino.h
1
// Get the bit location within the hardware port of the given virtual pin.
2
// This comes from the pins_*.c file for the active board configuration.
3
// 
4
// These perform slightly better as macros compared to inline functions
5
//
6
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
7
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
8
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
9
#define analogInPinToBit(P) (P)
10
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
11
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
12
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
1
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
2
  uint8_t value = 0;
3
  uint8_t i;
4
  volatile uint8_t *p2Data = portOutputRegister(digitalPinToPort(dataPin));
5
  volatile uint8_t *p2Clk  = portOutputRegister(digitalPinToPort(clockPin));
6
  uint8_t maskData = digitalPinToBitMask(dataPin);
7
  uint8_t maskClk  = digitalPinToBitMask(clockPin);
8
9
  for (i = 0; i < 8; i++) {
10
    *p2Clk |= maskClk;    // clk HIGH
11
    if (bitOrder == LSBFIRST) {
12
      value >>= 1;
13
      if ( *p2Data &  maskData) {
14
      value |= 0x80;
15
      }
16
  } else {
17
      value <<= 1;
18
      if ( *p2Data &  maskData) {
19
      value |= 0x01;
20
      }
21
    }
22
    *p2Clk &= ~maskClk;    // clk LOW
23
  }
24
  return value;
25
}

Beitrag #6299201 wurde vom Autor gelöscht.
von C&P_Hunter (Gast)


Lesenswert?

Erklehr Behr schrieb:
> Das ist auch dringend nötig, denn Soft-SPI mit den Funktionen
> digitalRead(..) und digitalWrite(..) zu vermauscheln ist schon
> wahrhaft Digitale Perversion.

... das Thema zur Beschleunigung von Shiftout() wird nicht im direkten
Sinn IO-Read/Write sein, das wurde ja schon oft genug besprochen und die
reflektorischen Reaktionen einiger Zuhörer bestätigen das ja auch.

Es geht um eine andere viel zu wenig genutzte Technik, die gerade bei
Datentransfers zu einem Grafikdisplay immer genutz werden kann und
relativ die Übertragungsperformance beachtlich verbessert.


Stay tuned!

von C&P_Hunter (Gast)


Lesenswert?

Falk B. schrieb:
> Allerdings kann man es auch mit dem offiziellen Arduino-Konzept DEUTLICH
> schneller machen, auch ohne ASM. Dazu braucht man die Macros ind
> Arduino.h

Danke Falk, für deinen inhaltlichen Beitrag so macht der Blog Sinn für 
mich!
Ich hoffe, die Makro-Hasser lesen hier nicht mit :-)!

von Philipp K. (philipp_k59)


Lesenswert?

Die Frage ist ja jetzt irgendwie wieso wurde die hier vorgeschlagene 
Änderung ursprünglich geändert.


Es  muss ja auch seine Gründe haben. Begründung waren ja "minor 
optimizations"

: Bearbeitet durch User
von C&P_Hunter (Gast)


Lesenswert?

Philipp K. schrieb:
> Es  muss ja auch seine Gründe haben. Begründung waren ja "minor
> optimizations"

... sollte uns das interessieren? Minor ist sehr relativ, für mich war 
der Issue nur ein Beispiel und Arduino stand nicht und steht nicht im 
Focus.

Auf einem ATtiny war die Code Size/Speed Reduction relevant. Es geht mir 
aber auch um Esthetik, weil Coding ist auch Art, wie Kochen auch, und 
benötigt auch Talent. Auch wenn jeder denkt er könne das alles, nur die 
Realität sieht anders dazu aus.

von Vincent H. (vinci)


Lesenswert?

dataPin, clockPin und vor allem bitOrder sind in der Regel 
Compilezeit-Konstanten und Arduino ist meines Wissens nach C++. Da wäre 
also durch

- Pin-Definitionen durch Konstanten ersetzen und
- Loop-Unrolling durch C++17 Fold-Expressions

noch eine Menge Luft nach oben. Nachdem ich von AVR keine Ahnung hab hab 
ich das grad für einen ARMv7me ausprobiert und da fällt branchless Code 
raus der handgeschriebenem Assembler vermutlich sehr nahe kommt.

von Einer K. (Gast)


Lesenswert?

Vincent H. schrieb:
> und Arduino ist meines Wissens nach C++.
Bisher C++11

C++17 ist nachrüstbar, noch kein Standard

von Einer K. (Gast)


Lesenswert?

Hab mich mal dran gesetzt....
Noch nicht ganz optimal, aber deutlich schlanker als der Kram vom 
C&P_Hunter

Vincent H. schrieb:
> - Pin-Definitionen durch Konstanten ersetzen und
Done!

Vincent H. schrieb:
> - Loop-Unrolling durch C++17 Fold-Expressions
Noch nicht.


1
#include <CombiePin.h>
2
3
4
5
using DataPin  = Combie::Pin::OutputPin<3>;
6
using ClockPin = Combie::Pin::OutputPin<4>;
7
8
9
template<typename Data, typename Clock, uint8_t bitOrder>void shiftOut(const uint8_t val);
10
11
template<typename Data, typename Clock, uint8_t bitOrder>
12
void shiftOut(uint8_t val)
13
{
14
  switch(bitOrder)
15
  {
16
    case LSBFIRST: for(uint8_t m = 1; m; m<<=1)
17
                   {
18
                     Data() = val & m;
19
                     Clock()=1;
20
                     Clock()=0;
21
                   }
22
                   break;
23
24
    case MSBFIRST: for(uint8_t m = 0x80; m; m>>=1)
25
                   {
26
                     Data() = val & m;
27
                     Clock()=1;
28
                     Clock()=0;
29
                   }
30
                   break;
31
32
  }
33
}
34
35
36
int main() // leer 134 Byte | mit inits+shift 166
37
{
38
 
39
  ClockPin().init();
40
  DataPin().init();
41
42
  shiftOut<ClockPin,DataPin,LSBFIRST>(22);
43
44
  for(;;);
45
}
46
47
// Kompilat mit shift:
48
/*
49
50
00000080 <main>:
51
  80: 54 9a         sbi 0x0a, 4 ; 10
52
  82: 53 9a         sbi 0x0a, 3 ; 10
53
  84: 88 e0         ldi r24, 0x08 ; 8
54
  86: 90 e0         ldi r25, 0x00 ; 0
55
  88: 21 e0         ldi r18, 0x01 ; 1
56
  8a: 32 2f         mov r19, r18
57
  8c: 36 71         andi  r19, 0x16 ; 22
58
  8e: 39 f0         breq  .+14      ; 0x9e <main+0x1e>
59
  90: 5c 9a         sbi 0x0b, 4 ; 11
60
  92: 5b 9a         sbi 0x0b, 3 ; 11
61
  94: 5b 98         cbi 0x0b, 3 ; 11
62
  96: 22 0f         add r18, r18
63
  98: 01 97         sbiw  r24, 0x01 ; 1
64
  9a: b9 f7         brne  .-18      ; 0x8a <main+0xa>
65
  9c: ff cf         rjmp  .-2       ; 0x9c <main+0x1c>
66
  9e: 5c 98         cbi 0x0b, 4 ; 11
67
  a0: f8 cf         rjmp  .-16      ; 0x92 <main+0x12>
68
69
000000a2 <_exit>:
70
  a2: f8 94         cli
71
72
000000a4 <__stop_program>:
73
  a4: ff cf         rjmp  .-2       ; 0xa4 <__stop_program>
74
75
*/

von Philipp K. (philipp_k59)


Lesenswert?

C&P_Hunter schrieb:
> Minor ist sehr relativ, für mich war
> der Issue nur ein Beispiel und Arduino stand nicht und steht nicht im
> Focus.

liest sich im Eröffungspost aber komplett anders.

Ich denke mal das ist wie beim ESP32..

Wenn ich Geschwindgkeit brauche benutze ich direkt das IDF im Arduino.

Das gleiche klappt genauso beim AVR und das wurde in den letzten 10 
Jahren bestimmt 1000 mal durchgekaut. Arduino ist auch ein schlechtes 
Beispiel.

ArduinoFan benutzt anscheinend die "Combie" Funktionen..(Vielleicht ist 
er das ja sogar) die dem Anfänger auch noch das letzte Verständnis zum 
Code rauben. Fehlen nur noch For schleifen als Library für das bessere 
Verständnis.

von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Noch nicht ganz optimal, aber deutlich schlanker als der Kram vom
> C&P_Hunter

.. auweh, das Kellerkind taucht wieder auf!
Mit deiner negativen Attitude kann ich mir dir nur als Einzelgänger 
vorstellen und das wäre Strafe genug.

Der Code wäre auch nicht optimal bzgl. Speed, da fehlt dir noch ein 
wesentlicher Gedanke.


Speed Acceleration Ranking (relative):

1. unrool loop
2. Episode #2
3. IO-Access


stay runed!

von Einer K. (Gast)


Lesenswert?

Philipp K. schrieb:
> ArduinoFan benutzt anscheinend die "Combie" Funktionen..(Vielleicht ist
> er das ja sogar) die dem Anfänger auch noch das letzte Verständnis zum
> Code rauben.
Es ist ok, dass dir das nicht schmeckt.

Ein kleiner Vergleich:
Ich nenne es mal "SPI Takt".
Verwendet wird ein UNO, also ATMega328P mit 16MHz

Da kommt meine Variante auf ca 925kHz
Die die von C&P_Hunter "optimierte" Variante auf ca 40,6kHz
(womit dann auch klar wäre, wie toll er optimieren kann)

Ach ja, der Flash Verbrauch steigt mit der von  C&P_Hunter "optimierte" 
Variante auf insgesamt 404 Byte, das sind mal eben 238 Byte mehr.

Dass das nicht ganz ohne Klimmzüge abgeht, sollte doch klar sein, oder?
Schließlich wollen ja auch noch die Arduino Pinnummern zu den AVR Port 
und Pin Adressierungsnotwendigkeiten umgeschlüsselt werden.


Philipp K. schrieb:
> ....

Zeige wie du die Umschlüsselung und die Schieberei genau so schnell hin 
bekommst, und dann bitte so, das es für Anfänger leicht verständlich 
ist.

Merke:
Meckern und rumkritisieren kann jeder.
Besser machen ist da schon deutlich schwieriger, nicht wahr?

von Erklehr Behr (Gast)


Lesenswert?

C&P_Hunter schrieb:
> stay runed!

Ok, stay ruined.

von C&P_Hunter (Gast)


Lesenswert?

Philipp K. schrieb:
> liest sich im Eröffungspost aber komplett anders.

Ich denke, das liegt an der Konnotation die dem Wort Arduino hier 
verleiht wird. Arduino scheint ein Reitzwort für einige Zuhörer zu sein.
Mir persönlich gefällt Arduino, die vielen Lib's sind immer wieder eine 
gute Startbasis.

Der Titel war ungünstig gewählt und wird zukünftig "Dark Side of Coding" 
lauten.

"Dark Side" ist doppeldeutig gemeint, darunter subsummiere ich pros and 
cons Beispiele. Bedeutet, es werden kleine interessante Snippets/Ideen 
vorgestellt, die mir irgendwann/irgendwo begegnet sind. Es werden Code 
Snippets seziert und bessere Lsg. gesucht.
Wahrscheinlich starte ich mit der Wordclock ... da ist schon reichlich 
Improvement Potential drin.

Allgemeinwissen ist doch, dass SW immer besser gemacht werden kann, 
historisch wächst und es nicht um Leben und Tot geht, wie einige hier zu 
denken scheinen.

Ich hoffe auch, dass die Wadenbeisser irgendwann alle satt und müde 
werden!

Ich werde keine fertigen Kochrezepte anbieten, es soll immer um die 
Grundidee gehen ohne Ideologie. Ich habe auch keinen pädagogischen 
Anspruch, wer doof sterben will - nur zu!


stay tuned!

von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Da kommt meine Variante auf ca 925kHz
> Die die von C&P_Hunter "optimierte" Variante auf ca 40,6kHz
> (womit dann auch klar wäre, wie toll er optimieren kann)
>
> Ach ja, der Flash Verbrauch steigt mit der von  C&P_Hunter "optimierte"
> Variante auf insgesamt 404 Byte, das sind mal eben 238 Byte mehr.

... interessant, dann lass uns mal die Nebenbedingungen abklären,
z.B. Compiler Version, ...

Mit positiver Denke könnte dir auffallen, das diese kleinen Änderungen 
zum Original diese von dir genannten Zahlen nicht begründen sollten.

Viele unnette Zuhören versammeln sich hier und gehen scheinbar auf die 
Jagt, ist schon bissle krank.

Aber hoffentlich nicht ansteckend!


stay tuned!

von Erklehr Behr (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Ich hoffe auch, dass die Wadenbeisser irgendwann alle satt und müde
> werden!

Ich hoffe auch, dass deine Rächdschraipunk noch etwas besser wird.

C&P_Hunter schrieb:
> Ich denke, das liegt an der Konnotation die dem Wort Arduino hier
> verleiht wird. Arduino scheint ein Reitzwort für einige Zuhörer zu sein.
> Mir persönlich gefällt Arduino, die vielen _Lib's_ sind immer wieder eine
> gute Startbasis.

Zu viele bewusste Falsch-Schreibungen.
Zu "Lib's" solltest auch du dich bei

http://www.deppenapostroph.info

schlau machen.

Stay ruined!

von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Zeige wie du die Umschlüsselung und die Schieberei genau so schnell hin
> bekommst, und dann bitte so, das es für Anfänger leicht verständlich
> ist.
>
> Merke:
> Meckern und rumkritisieren kann jeder.
> Besser machen ist da schon deutlich schwieriger, nicht wahr?

Ich glaube, du bist hier im falschen Kino, wie können wir dich loswerden 
ohne deinen Schmerz zu erforschen?!

von C&P_Hunter (Gast)


Lesenswert?

Erklehr Behr schrieb:
> Ich hoffe auch, dass deine Rächdschraipunk noch etwas besser wird.

Was ist dir schlimmes passiert, ach neh will ich doch nicht wissen!
Wenn das alles hier so schlimm ist, dann als Idee - mach die Augen/Ohren 
zu und gehe über die Strasse. Dann ist sicher vielen Menschen geholfen 
die dich bösen Kerl kennen und nicht lieben.

von Einer K. (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Der Code wäre auch nicht optimal bzgl. Speed,
Ach, ja ....
Das muss mir einer sagen, der bei shiftOut() nicht mal einen einzigen 
Taktzyklus gegenüber dem Originalen Arduino Code herausgeholt hat.
nicht einen
NULL

Weit über Faktor 20 Geschwindigkeitssteigerung sind es bei mir!

C&P_Hunter schrieb:
> // improved implementation
Null Zugewinn.
Das nennst du "improved implementation".
Was für ein jämmerliches versagen.
Welche eine Blamage.

Mehr als heiße Luft kommt nicht bei dir...
Jämmerlich und aufgeblasen.
Der klassische Blender.

Beitrag #6299709 wurde vom Autor gelöscht.
von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> as muss mir einer sagen, der bei shiftOut() nicht mal einen einzigen
> Taktzyklus gegenüber dem Originalen Arduino Code herausgeholt hat.
> nicht einen
> NULL
>
> Weit über Faktor 20 Geschwindigkeitssteigerung sind es bei mir!

Bravo, dann wäre das Ziel von Episode#1 erfüllt, zumindest scheinbar!
Wer hat dir eigentlich beigebracht, dass Krieg spielen Spaß machen 
soll?!

Ich mag deine Denke, Einstellung und Sprache nicht, aber sonst bis du 
ganz ok, als Kontrastprogram zu den vielen guten Menschen.

von Johannes S. (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Es geht mir
> aber auch um Esthetik, weil Coding ist auch Art,

Rechtschreibung ist auch Art.

von C&P_Hunter (Gast)


Lesenswert?

Johannes S. schrieb:
> Rechtschreibung ist auch Art.

Was motiviert dich zu diesen unnett gemeinten Kommentar, 
Kleingeistigkeit oder so?

Damit du ruhig schlafen kannst, bin da ganz bei dir. Aber schnell runter 
gehackt und keine Möglichkeit zur Korrektur machen das möglich.

Für die anderen, die mein English oder Deutsch "beneiden", zur Info
es hat gereicht zum Uni Abschluss in UK und 2xGE.

Die geistige Enge an deutschen FH könnte mir als Grund einfallen , warum 
ihr Kontemplation verwechselt mit hier im Forum rumhängen.


stay tuned!

von Veit D. (devil-elec)


Lesenswert?

Hallo,

also wenn mich jemand fragen würde und ich raten dürfte, dann ist
1
C&P_Hunter == Snafu

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Johannes S. schrieb:
> Rechtschreibung ist auch Art.

> Kluge Worte zu schreiben, ist schwer.
> Schon ein einziger Buchstabendreher, kann alles urinieren.
(Aus der Ratgeber-Schriftrolle)

Veit D. schrieb:
> C&P_Hunter == Snafu
Sicherlich...
Ihm hangelt sich von Versagen zu Versagen.

von Kinderkacke Entsorger (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Coding ist auch Art

Nein, Programmieren ist keine Kunst, programming is engineering.
Also eher mit Handwerk als mit Kunst vergleichbar. Insbesonders wenn es 
um Nutzbarkeit geht, ist 'Ästhetik' eher eine schlechte Ausrede. So wie 
ein Turmbau voller filigraner Verschönerungen, der zwar schön anzusehen, 
aber statisch misslungen ist:
https://de.wikipedia.org/wiki/Schiefer_Turm_von_Pisa#/media/Datei:The_Leaning_Tower_of_Pisa_SB.jpeg

von Philipp K. (philipp_k59)


Lesenswert?

Ich meine ja nur ihr diskutiert hier über Sachen....

Das ist alles vielleicht sogar schon ein Jahrzehnt Alter Hut und 
aufgewärmter Brei das es schon in "Offtopic" fällt.

Arduino Fanboy D. schrieb:
> Zeige wie du die Umschlüsselung und die Schieberei genau so schnell hin
> bekommst, und dann bitte so, das es für Anfänger leicht verständlich
> ist.

Das Problem ist, im Prinzip gibt es vielleicht eine Handvoll Lösungen 
die wahrscheinlich schon jeder gesehen hat. Bzw. Jeder zweite fragt sich 
"Wie soll das auch anders gehen", da müsste man schon mit "Wow, auch 
nicht schlecht" Code auffahren und nicht irgendwelchen Basics der 
letzten Pull Requests eines Arduino Codes.

Bei dem SPI Ding bin ich mal gespannt ob das irgendnem Jahre alten 
Tutorial ähnelt.

von C&P_Hunter (Gast)


Lesenswert?

Kinderkacke Entsorger schrieb:
> Insbesonders wenn es
> um Nutzbarkeit geht, ist 'Ästhetik' eher eine schlechte Ausrede.

Nutzbarkeit ist das Schlüsselwort, dass man hier in die Köpfe 
implementiert, damit die Arbeitsklaven gut funktionieren. Aesthetic soll 
da natürlich nicht vorkommen, das stört bei dem Thema Endcharakter der 
Arbeit, schon mal gehört?

Beitrag #6299775 wurde von einem Moderator gelöscht.
von C&P_Hunter (Gast)


Lesenswert?

Philipp K. schrieb:
> Das Problem ist, im Prinzip gibt es vielleicht eine Handvoll Lösungen
> die wahrscheinlich schon jeder gesehen hat.

Denkbar, sollte so sein!

Bzw. Jeder zweite fragt sich
> "Wie soll das auch anders gehen", da müsste man schon mit "Wow, auch
> nicht schlecht" Code auffahren und nicht irgendwelchen Basics der
> letzten Pull Requests eines Arduino Codes.

Warum suchst du und wohl auch die anderen immer nach einen Wow Effekt, 
vielleicht zuviel Scheinwelt aus der Klotze?

Das engt das Denken nur ein!


Das Thema wäre gewesen, dass die SW-SPI Transferrate nur besser werden 
kann, wenn die SPI-Clk Rate z.B. relativ/dynamisch höher wird.

Wie soll das gehen, wenn wir annehmen, das der IO-Accress optimal von 
Super Arduino Fanboy D. implementiert ist?
Offensichtlich nur, wenn wir einige IO-Zugriffe auslassen können.

Wie soll das möglich sein?
Wenn keine Bitzustandsänderung im Datenstrom stattfindet.

Bedeutet, die SPI-Clk Rate ist nicht mehr konstant sondern ändert sich 
im Charakter des Datenbitstroms. Um so mehr Daten übertragen werden um 
so besser der relative Performancegewinn. Daher besonders nützlich, wenn 
wir an ein Interface mit Grafikdisplay denken.


Der Code dazu ist real ein Dreizeiler und setzt ein heute
fast immer anzutreffenes IO-Feature voraus.


Vorschläge/Ideen?!

Das sollte eine recht einfache Aufgabe für jene sein, die sich hier als 
humane Codiermaschinen offenbart haben, weil denken muss man jetzt nicht 
mehr so viel, sondern nur noch "nützlich" sein.


stay tuned

von C&P_Hunter (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Da kommt meine Variante auf ca 925kHz
> Die die von C&P_Hunter "optimierte" Variante auf ca 40,6kHz
> (womit dann auch klar wäre, wie toll er optimieren kann)
>
> Ach ja, der Flash Verbrauch steigt mit der von  C&P_Hunter "optimierte"
> Variante auf insgesamt 404 Byte, das sind mal eben 238 Byte mehr.

Ich habe mir deine Variante bis jetzt nicht angeschaut und referenziere 
daher erstmal nur gegen das Arduino Orignal.

Bekannterweise gibt es viele Parameter, Plattform, Compiler Ide, ...
und was du wie gemessen hast wird zu klären sein. Auch im Sinne von wer 
misst misst Mist.

So viele schöne Zahlen ..., da müssen wir ganz sicher noch genauer drauf 
schauen!

Weil gute Ideen sollten ganz ganz ganz am Anfang mal im Focus stehen, 
aber dann ist diese Trampelherde hier ausgebrochen.


stay tuned

Beitrag #6299830 wurde von einem Moderator gelöscht.
von Roland F. (rhf)


Lesenswert?

Hallo,
C&P_Hunter schrieb:
> Was motiviert dich zu diesen unnett gemeinten Kommentar,
> Kleingeistigkeit oder so?

Ich kenne Johannes zwar nicht, ich könnte mir aber vorstellen das er 
dadurch motiviert war diesen Kommentar zu schreiben, weil Johannes (wie 
ich z.B. auch) erwarten würde, das man von jemandem, der sich hier 
derart herablassend, arrogant und überheblich auslässt, erwarten würde 
das er sich der deutschen Sprache adäquat zu bedienen weiß.

> Aber schnell runter gehackt und keine Möglichkeit zur Korrektur machen
> das möglich.

So, so, "schnell runter gehackt und keine Möglichkeit zur Korrektur". 
Passt aber irgend wie nicht zu deinem oberlehrerhaften Anspruch, findest 
du nicht auch?

> Die geistige Enge an deutschen FH könnte mir als Grund einfallen , warum
> ihr Kontemplation verwechselt mit hier im Forum rumhängen.

Du solltest daraus deine Schlüsse ziehen und dich mehr in der geistigen 
Weite ausländischer Bildungseinrichtungen aufhalten.

rhf

von Felix (Gast)


Lesenswert?


von Kopfschüttelnder (Gast)


Lesenswert?

Diesen unnützen und im Ton extrem unangenehmen Thread sollte man so bald 
wie möglich entsorgen! Diesen Umgangston brauchen wir hier nämlich 
nicht. Von der Thematik her nützt der Inhalt sowieso kaum jemandem.

Die wirklich hilfsbereiten, bekannten Forenteilnehmer vergreifen sich 
kaum jemals so am Ton und bieten anstatt von Steinen, Brote an.

Ich hoffe, daß dieser Thread so bald wie möglich gesperrt und in den 
Müll landert wo er hingehört.

von MaWin (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Der hier ohne jede Not verwendete (also überflüssige)
> Ausdrucksverkettungsoperator, machts nur schlimmer/hässlicher.

Vor allem: Falsch. Denn es ist in C nicht definiert, welcher Ausdruck 
zuerst abgearbeitet wird. Der Compiler könnte je nach Optimierungen und 
Umfeld, oder je nach Version, auch mal die Reihenfolge umdrehen.

digitalWrite(dataPin, val & 0x01), val >>= 1;

könnte auch

val >>= 1, digitalWrite(dataPin, val & 0x01);

sein und ergibt dann ein anderes Ergebnis.

C&P_Hunter schrieb:
> stay tuned!

Lieber nicht.

Felix schrieb:
> Mir scheint das hier die Ursache für das Auftreten des TE zu sein:

Möglich.

Falk B. schrieb:
> Allerdings kann man es auch mit dem offiziellen Arduino-Konzept DEUTLICH
> schneller machen, auch ohne ASM. Dazu braucht man die Macros ind
> Arduino.h

Durchaus. Und wenn man die Bitorder Geschichte aus der Schleife 
herauszieht (was der Compiler nicht unbedingt schafft), dann wird es 
noch schneller und übersichtlicher. Es gibt immer Luft nach oben.

von Kinderkacke Entsorger (Gast)


Lesenswert?

C&P_Hunter schrieb:
> Kinderkacke Entsorger schrieb:
>> Insbesonders wenn es
>> um Nutzbarkeit geht, ist 'Ästhetik' eher eine schlechte Ausrede.
>
> Nutzbarkeit ist das Schlüsselwort, dass man hier in die Köpfe
> implementiert, damit die Arbeitsklaven gut funktionieren. Aesthetic soll
> da natürlich nicht vorkommen, das stört bei dem Thema Endcharakter der
> Arbeit, schon mal gehört?

Falsches Forum, du suchst:
https://kpf.die-linke.de/start/

von Martin (Gast)


Lesenswert?

Kinderkacke Entsorger schrieb:
> C&P_Hunter schrieb:
>> Kinderkacke Entsorger schrieb:
>>> Insbesonders wenn es
>>> um Nutzbarkeit geht, ist 'Ästhetik' eher eine schlechte Ausrede.
>>
>> Nutzbarkeit ist das Schlüsselwort, dass man hier in die Köpfe
>> implementiert, damit die Arbeitsklaven gut funktionieren. Aesthetic soll
>> da natürlich nicht vorkommen, das stört bei dem Thema Endcharakter der
>> Arbeit, schon mal gehört?
>
> Falsches Forum, du suchst:
> https://kpf.die-linke.de/start/

Ein Brauner, der seine niedrige Gesinnung bereits im Nick ankündigt. 
Vermutlich einer der Lieblinge der Ausbeuterklasse, weil er die 
pawlowschen Reflexe des Kapitals so schön gelernt und verinnerlicht hat.

von Kinderkacke Entsorger (Gast)


Lesenswert?

Martin schrieb:
> Ein Brauner, der seine niedrige Gesinnung bereits im Nick ankündigt.

Immer wieder amüsant 'Godwin's Law' betätigt zu wissen:

https://de.wikipedia.org/wiki/Godwin%E2%80%99s_law


Für Dich und Deine Kumpels zum Abreissen und Abheften:
1
 ____   ____   ____   ____   ____   ____   ____
2
/  __) (____) (____) (____) (____) (____) (__  \
3
|_|                                          |_|
4
 _      _                    _       _        _
5
| |    / |       _ __   ___ (_)_ __ | |_     | |
6
| |    | |      | '_ \ / _ \| | '_ \| __|    | |
7
|_|    | |      | |_) | (_) | | | | | |_     |_|
8
 _     |_|      | .__/ \___/|_|_| |_|\__|     _
9
| |             |_|                          | |
10
| |                                          | |
11
|_|     ____           _          _          |_|
12
 _     / ___| ___   __| |_      _(_)_ __      _
13
| |   | |  _ / _ \ / _` \ \ /\ / / | '_ \    | |
14
| |   | |_| | (_) | (_| |\ V  V /| | | | |   | |
15
|_|    \____|\___/ \__,_| \_/\_/ |_|_| |_|   |_|
16
 _                                            _
17
| |__   ____   ____   ____   ____   ____   __| |
18
\____) (____) (____) (____) (____) (____) (____/

PS:
So was passiert halt, wenn man Programmieren nicht als bloßes Handwerk 
versteht, sondern als 'Kunst' mit der der 'Künstler' seinen Anspruch als 
'Geschenk Gottes an die Menschheit' belegen will ...

von Yalu X. (yalu) (Moderator)


Lesenswert?

MaWin schrieb:
> digitalWrite(dataPin, val & 0x01), val >>= 1;
>
> könnte auch
>
> val >>= 1, digitalWrite(dataPin, val & 0x01);

Nein, der Komma-Operator stellt einen Sequence-Point dar (s. Abschnitt
6.5.17 in ISO/IEC 9899:2017).


Da hier ansonsten nur noch mit Dreck herumgeschmissen wird, dürfte das
Thread-Thema zur Genüge ausdiskutiert sein.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.