Forum: Compiler & IDEs Einführung in ASM auf STM32F4


von Christopher S. (shalec)


Lesenswert?

Hallo allerseits,

Ich möchte demnächst lernen mit asm für den Microkontroller  zu 
programmieren. Dabei strebe ich aber nur Berechnungen an. Kann mir dafür 
jemand eine gute Quelle nennen?

Ich habe keine Grundkenntnisse und möchte ein paar in C 
selbstgeschriebene Funktionen on ASM schreiben und ggf dadurch 
optimieren.

Viele Grüße und vielen Dank

von Pete K. (pete77)


Lesenswert?

Warum kein C? Es gibt Compiler, die übersetzen das für Dich in 
Maschinencode.

von Christian R. (cris06)


Lesenswert?

Pete K. schrieb:
> Warum kein C? Es gibt Compiler, die übersetzen das für Dich in
> Maschinencode.

Weil es teilweise hilfreich ist ASM zu können? Gerade wenn man Fehler 
sucht oder zeitkritische Aufgaben hat ist eine optimieren ab und zu 
hilfreich.

Heist ja nicht, dass man das komplette Programm in ASM schreiben muss

von Jan K. (jan_k)


Lesenswert?

Uhoh, heikles Thema.

ASM auf dem Cortex M4 ist schon ne Hausnummer. Ich sage nicht, dass es 
nicht möglich ist, aber es ist komplex, einfach weil die Initialisierung 
des Kerns und der Peripherie nicht so einfach ist wie beispielsweise 
beim AVR und die Teile insgesamt viel mehr können.

Was für Berechnungen willst du durchführen? Ggf. kommt dann noch die 
floating point unit dazu, da muss man auch eine Reihe an Sachen 
beachten.

Ohne Erfahrung wird das schwierig!

von egbert (Gast)


Lesenswert?

Pete K. schrieb:
> Warum kein C? Es gibt Compiler, die übersetzen das für Dich in
> Maschinencode.

Abgesehen von der Tatsache, das sich "c" nicht für seriöse und 
ernsthafte Programmprojekte eignet:

Hast Du die Frage nicht verstanden?

Wenn Dich jemand nach einem Friseur fragt, antwortest Du dann auch mit 
der Adresse eines Schlachters?

von Andreas M. (amesser)


Lesenswert?

Christopher S. schrieb:
> Hallo allerseits,
>
> Ich möchte demnächst lernen mit asm für den Microkontroller  zu
> programmieren. Dabei strebe ich aber nur Berechnungen an. Kann mir dafür
> jemand eine gute Quelle nennen?
> Ich habe keine Grundkenntnisse und möchte ein paar in C
> selbstgeschriebene Funktionen on ASM schreiben und ggf dadurch

Nimm dir einen Debugger und schaue dir den Code an den der
Compiler generiert. Dazu dann noch das ARM Machine Instruction
Manual zum verstehen. Programmieren würde ich mit GCC Inline
Assembler anfangen, da gibt es diverse Tutorials im Netz zu

> optimieren.

Christian R. schrieb:
> Weil es teilweise hilfreich ist ASM zu können? Gerade wenn man Fehler
> sucht oder zeitkritische Aufgaben hat ist eine optimieren ab und zu
> hilfreich.

Auf jeden Fall hilfreich beim Debuggen von kniffligen Problemen. 
Optimieren, naja falls man zusätzliches Hintergrundwissen über die 
mathematische Operation hat, also etwas was der Compiler nicht weis, 
dann kann man da manchmal was machen. Auch bei den DSP Instruktionen 
kann man manchmal was rausholen, für die hat der GCC aber builtin 
Funktionen und spezielle Datentypen, Assembler also eigentlich unnötig.

Die Pipepline der CPU kennt der Compiler aber meist besser, da gewinnt 
der Mensch nur schwerlich gegen den Compiler. Bei AVR8 sieht das etwas 
anders aus.

von Pete K. (pete77)


Lesenswert?

egbert schrieb:
> Abgesehen von der Tatsache, das sich "c" nicht für seriöse und
> ernsthafte Programmprojekte eignet:

Blödsinn. (siehe z.B. Linux Kernelentwicklung)

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Lesenswert?

> GCC Inline Assembler

Das ist ja nun die absolute Hilfskruecke.

Der GNU-Assembler heisst gas.

von Dr. Sommer (Gast)


Lesenswert?

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag 
#5125132:
>> GCC Inline Assembler
>
> Das ist ja nun die absolute Hilfskruecke.
> Der GNU-Assembler heisst gas.
Was kann der Inline Assembler denn nicht, was der gas kann? Beim Inline 
Assembler ists sehr praktisch dass man sich (oft) nicht mit Calling 
Conventions / ABI's herumplagen muss, und sich vom Compiler alles schön 
zurecht legen lassen kann. Die Syntax ist aber etwas fummelig und nicht 
gut dokumentiert...

von Shalec#Guest (Gast)


Lesenswert?

Mein Ziel ist die endliche Körperarithmetik über einen Galoiskörper.

Ich muss auch generell sagen, dass ich Mathematiker bin, der einen 
kleinen Ausflug in die µC Welt macht und ein Projekt darin realisieren 
muss. Da mir die Performance wichtig ist, bin ich der Meinung, dass man 
da doch "einiges" durch ASM rausholen kann.

Mein Plan war auch erst den durch C-generierten ASM heranzuziehen und 
daran zu "entwickeln".

Als Compiler nehme ich den ARM-NONE-EABI-gcc Compiler. Aktuell habe ich 
nur eine Lib für die Ausgabe über USART erzeugt und taste mich langsam 
an den Prozessor ran (Interpretierung und Speicherung von Werten.) Dabei 
ist mir Aufgefallen, dass 2^31 als -2^31 ausgegeben und ab da an gegen 0 
"runtergezählt" wird, im Datentyp long long. Intern werden die Werte 
wohl weiterhin als >0 behandelt.

Entwicklungs Plattform ist Windows-10, Notepad ++ und Makefile. Ausgabe 
lese ich in einer VM mit Ubuntu aus.

Im übrigen werde ich mit Zahlen rechnen, die aus 11*32-Bit bestehen. Ich 
weiß nur nicht welcher Datentyp hierfür intelligent gewählt ist: 
short[22*16-Bit] oder int[11*32-Bit]. In jedem Fall muss ich das 
Ergebnis im größeren (int resp. long long) Casten und den Übertrag im 
Carry nutzen und im nächsten Berechnungsschritt aufsummieren. (Alle 
Datentypen als unsigned.)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Du musst in der Assemblerprogrammierung schon ziemlich gut sein, um den
GCC zu schlagen. Das heißt nicht, dass der vom GCC erzeugte Code nicht
weiter optimierbar ist, aber wenn du frisch mit Assembler beginnst,
wirst du wirst einige Zeit dafür investieren müssen. Evtl. gelingt es
dir in weniger Zeit, deinen C-Code besser zu schreiben und damit einen
ähnlichen Geschwindigkeitszuwachs zu erzielen.

Shalec#Guest schrieb:
> Dabei ist mir Aufgefallen, dass 2^31 als -2^31 ausgegeben und ab da an
> gegen 0 "runtergezählt" wird, im Datentyp long long. Intern werden die
> Werte wohl weiterhin als >0 behandelt.

Es gibt in C sowohl signed als auch unsigned Integer-Typen. Ein
(signed) int hat auf dem ARM den Wertebereich [-2^31, 2^31-1], ein
unsigned int hingegen [0, 2^32-1].

Shalec#Guest schrieb:
> Im übrigen werde ich mit Zahlen rechnen, die aus 11*32-Bit bestehen. Ich
> weiß nur nicht welcher Datentyp hierfür intelligent gewählt ist:
> short[22*16-Bit] oder int[11*32-Bit].

Es gibt diverse Big-Integer-Bibliotheken (bspw. GNU MP), so dass du das
Rad nicht unbedingt neu erfinden musst.

von S. R. (svenska)


Lesenswert?

egbert schrieb:
> Abgesehen von der Tatsache, das sich "c" nicht für seriöse und
> ernsthafte Programmprojekte eignet:

Unfug.

> Wenn Dich jemand nach einem Friseur fragt, antwortest Du dann auch mit
> der Adresse eines Schlachters?

Wenn er nach Schnitzeln fragt, ja.

Shalec#Guest schrieb:
> Ich muss auch generell sagen, dass ich Mathematiker bin, der einen
> kleinen Ausflug in die µC Welt macht und ein Projekt darin realisieren
> muss.

Das heißt, dass du von Mikroarchitektur eher wenig Ahnung hast...

> Da mir die Performance wichtig ist, bin ich der Meinung, dass man
> da doch "einiges" durch ASM rausholen kann.

...und das wiederum heißt, dass du gegen den Compiler verlierst. 
Optimiere deine Algorithmen, schmeiße dem Compiler keine Steine in den 
Weg (prüfe also den generierten Code) und du wirst ein besseres Ergebnis 
erhalten, als du es mit Asm selbst hättest erzeugen können.

Shalec#Guest schrieb:
> Dabei ist mir Aufgefallen, dass 2^31 als -2^31 ausgegeben und
> ab da an gegen 0 "runtergezählt" wird, im Datentyp long long.

Dann hast du bei printf() den falschen Formatspezifier benutzt. "int" 
und "unsigned long" und "long long" sind verschiedene Typen. Baue deinen 
Code mit "-Wall -Wextra" und achte auf Compilerwarnungen.

Bedenke, dass "long long" ein anderer Typ ist als "unsigned long long".

Shalec#Guest schrieb:
> Entwicklungs Plattform ist Windows-10, Notepad ++ und Makefile. Ausgabe
> lese ich in einer VM mit Ubuntu aus.

B'scheuert. Du kannst Entwicklung mit beidem machen, du kannst die Werte 
auch mit beidem auslesen.

Shalec#Guest schrieb:
> Im übrigen werde ich mit Zahlen rechnen, die aus 11*32-Bit bestehen. Ich
> weiß nur nicht welcher Datentyp hierfür intelligent gewählt ist:
> short[22*16-Bit] oder int[11*32-Bit].

Der richtige Typ ist:
1
uint32_t val[11];

Und wenn du ordentlich arbeiten möchtest, besorgst du dir eine 
Bibliothek, mit der du arbitrary precision machen willst. Wenn der Code 
läuft und korrekt arbeitet, und dann noch zu langsam ist, fängst du mit 
der Optimierung an. Vorher nicht.

Das Carry-Flag macht der Compiler bzw. die Library für dich.

von Shalec#Guest (Gast)


Lesenswert?

Sind diese auch optimiert auf den M4? Oder wäre das eine generische 
Übersetzung? Das Nutzen einer solchen Lib wäre mir deutlich lieber. (Rad 
neu erfinden und so ist natürlich unnötig. Ich möchte aber gerne die 
Lib-Funktionen "nachvollziehen" können.)

Ich habe durchgehend nur unsigned verwendet. Also Initialisierung war:
1
unsigned int a,b;
2
unsigned long long c;
3
4
c= (unsigned long long) a*b;
5
6
print_int(c); //nicht von "int" durcheinander bringen lassen. 
7
// Dieser wird mittels sprintf in einen Char gewandelt und dann ausgegeben.

Ausgabe war dann selbst bei
1
a= pow(2,31);
2
print_int(a); // -> -pow(2,31)
3
4
a=pow(2,32)-1; //Eingabe nicht berechnen lassen, sondern als Zahl gespeichert
5
print_int(a); // -> -1

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Shalec#Guest schrieb:
> Mein Ziel ist die endliche Körperarithmetik über einen Galoiskörper.

Würd ich in C anfangen, da kannst du dann auch in Assembler 
implementierte Funktionen aufrufen.
1
extern int asmfunc (int a, int b);
und du hast ein Framework, das den µC initialisert, die Funktion mit 
Werten versorgt, einfach Rückhabewerte anzeigen / testen kann etc.

Dazu musst du natürlich das vom Compiler verwendete ABI kennen und 
beachten, also wie Datentypen aufgebaut sind, wo wie welche Werte 
übergeben werden, welche Register eine Funktion zerstören darf und 
welche nicht, etc.

Selbst wenn es ein reines Asm-Projekt wird oder werden muss, kann es 
vorausschauend sein, C-ABI zu verwenden um später die hoffentlich 
schnellen Routinen übergangslos von C(++) aus verwenden zu können: Alles 
was du dort dann noch brauchst sind Prototypen für die Funktionen.

Wenn du mit Arithmetik über GF anfängst dann interessiert dich 
vermutlich entweder der Fall GF(2^n) oder große Primzahlen.  In 
Charakteristik 2 kannst du am ehesten einen (spürbaren) Vorteil durch 
Asm erwarten, allerdings kann C keine Asm-Funktionen inlinen.  Wenn du 
also z.B. auf einem ARM Arithmetik über GF(2^32) in packed Darstellung 
implementierst, dann ist eine Addition a+b einfach a XOR b.  Dafür eine 
(nicht-inlinebare) Funktion zu verwenden ist nicht sinnvoll, wenn's um 
Performance geht.

> dass 2^31 als -2^31 ausgegeben

Dann fehlt irgendwo ein unsigned oder ein %u anstatt %d bei der Ausgabe,

> Ich weiß nur nicht welcher Datentyp hierfür intelligent gewählt ist:
> short[22*16-Bit] oder int[11*32-Bit].

Weder noch.  Auf jeden fall ein unsigned Typ wie uint32_t, kein signed.

Welche Operationen sollen es werden? Auch kompliziertere Sachen wie 
diskrete Wurzel und Log?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Shalec#Guest schrieb:
> Sind diese auch optimiert auf den M4?

In der GNU-MP-Bibliothek sind die Grundfunktionen (Addition,
Multiplikation, Division usw.) für eine Vielzahl von Prozessoren, u.a.
für ARM in Assembler implementiert und dürften damit deutlich schneller
als entsprechende C-Funktionen sein.

Aus dem Readme in gmp-6.1.2/mpn/arm:
1
This directory contains mpn functions for ARM processors.  It has been
2
optimised mainly for Cortex-A9 and Cortex-A15, but the code in the
3
top-level directory should run on all ARM processors at architecture
4
level v4 or later.

Ich kenne mich mit ARM-Prozessoren nicht so gut aus, deswegen kann ich
nicht sagen, wie gut die Routinen auf einem M4 laufen. A9 und A15 haben
die Architektur ARMv7-A, der M4 ARMv7-M. Der für reine Berechnungen
relevante Hauptunterschied scheint zu sein, dass ARMv7-M nur den Thumb-
Instruktionsatz unterstützt, der aber m.W. aus demselben Assembler-
Quellcode generiert wird.

Ich würde die Bibliothek einfach mal ausprobieren (geht schneller als
Assembler zu lernen) und schauen, wie groß der Geschwindigkeitszuwachs
gegenüber deinen handgeschriebenen Funktionen ist.

von Christopher S. (shalec)


Lesenswert?

Insgesamt wird am Ende ein kryptographisches Pairing stehen. Die 
Primzahl p hat 339-Bit und ich arbeite in GF(p^16). Wobei die Elemente 
als Array über GF(p) aufgefasst werden mit 16 Einträgen. Dadurch habe 
ich dann auch Homomorphismen in einer super schnellen Form für die 
p-Potenzierung (also den p-Frobenius) zur Verfügung stehen.

Einzelne Elemente sollen dann entsprechend in ASM (falls möglich) 
geschrieben werden. D.h. egtl. nur die Multiplikation, Addition, 
Subtraktion und co. :) Das einzige, was ich noch brauche, sind schnelle 
Quadrierung und Inversion. Wobei eine Inversion in einigen Fällen ja 
auch eine Konjugation ist. Das gibt aber meine Primzahl nicht her. (p = 
5 mod 8, = 13 mod 32)

Ich werde mir definitiv die Lib anschauen.


Wegen %u und %d, das wird sehr wahrscheinlich der Fehler sein. :) Ich 
bin aber auch noch ein Frischling in C. Das sind quasi meine ersten 
Gehversuche :D Ich habe bislang nur ein Buch dazu gelesen und die 
FourQlib für ARM (Cortex-M4) von Microsoft durchforstet. Dadurch konnte 
ich einiges lernen.

Bzgl ASM lernen: Mein Arbeitgeber beauftragt mich auch zeitgleich mit 
einem Projekt, bei dem ich ebenfalls ASM lernen soll ;) Da er das 
"mitbekommen" hat, dass ich in 2-3 Wochen anfangen wollte, dies für 
meine Masterarbeit zu lernen.

Bzgl. Performance werde ich sowieso erstmal alles mit C schreiben und 
dann, wenn das Produkt fertig ist, optimieren, was das Zeug hält. (Nach 
einer Dokumentation des Codes)

Gibt es irgendwelche Benchmark-Tools?

Gibt es noch irgendwo einen sehr günstigen Anbieter für das 
Discoveryboard mit einem F417 draufgelötet? (Möglichst ohne Bildschirm, 
da ich sonst meine USART-Lib-Config ändern müsste) Ich entwickle auf 
einem CJMCU Board mit dem STM32F407VGT6. (Preis ca. 11€ aus China)

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Christopher S. schrieb:
> Insgesamt wird am Ende ein kryptographisches Pairing stehen. Die
> Primzahl p hat 339-Bit und ich arbeite in GF(p^16). Wobei die Elemente
> als Array über GF(p) aufgefasst werden mit 16 Einträgen. Dadurch habe
> ich dann auch Homomorphismen in einer super schnellen Form für die
> p-Potenzierung (also den p-Frobenius) zur Verfügung stehen.
>
> Einzelne Elemente sollen dann entsprechend in ASM (falls möglich)
> geschrieben werden. D.h. egtl. nur die Multiplikation, Addition,
> Subtraktion und co. :) Das einzige, was ich noch brauche, sind schnelle
> Quadrierung und Inversion. Wobei eine Inversion in einigen Fällen ja
> auch eine Konjugation ist. Das gibt aber meine Primzahl nicht her. (p =
> 5 mod 8, = 13 mod 32)

Kann es sein, daß Du Dir einfach den falschen Prozessor ausgesucht hast?
Die STM32 sind µCs, bei denen Berechnungen je nach Typ und bezogen auf 
ihre Controller-Hardware recht schnell ablaufen. Wenn aber nur mit 
Zahlen 'gewürfelt' werden soll, wären doch Prozessoren mit 
Taktfrequenzen im GHz-Bereich nebst leistungsfähiger FPU angesagt.

Christopher S. schrieb:
> Gibt es noch irgendwo einen sehr günstigen Anbieter

Die Kosten sollten erst einmal nicht das Problem sein, solange nicht 
klar ist, ob die erwartete Lösung/Leistung erreicht wird.

von Christopher S. (shalec)


Lesenswert?

Der Prozessor war vorgegeben :) Wegen des Anbieters hatte ich gefragt, 
da ich absolut keine Quelle für solche Boards mit dem Prozessor fand.

Ein Pairing ist ist eine bilineare Funktion, die auf der einen Seite 
elliptische Kurven Arithmetik und auf der anderen Seite endliche Körper 
Arithmetik nutzt. Die sog. Miller loop stellt das Herz der OP und die 
sog. Final Exponentiation den "Rattenschwanz" dar.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Shalec#Guest schrieb:
> Sind diese auch optimiert auf den M4?

Für die Architektur (ARM) definitiv, für die Mikroarchitektur vermutlich 
nicht. Es wird trotzdem schneller sein, als dein handgeklöppeltes Zeugs.

> (Ich möchte aber gerne die
> Lib-Funktionen "nachvollziehen" können.)

Die sind im Quelltext verfügbar. Ob sie gut lesbar sind, weiß ich nicht.

Christopher S. schrieb:
> Einzelne Elemente sollen dann entsprechend in ASM (falls möglich)
> geschrieben werden. D.h. egtl. nur die Multiplikation, Addition,
> Subtraktion und co. :)

Schreibe deinen Quelltext so, dass sämtliche mathematischen Operationen 
als Funktionen ausgeführt sind und achte darauf, dass der Compiler diese 
grundsätzlich inlined (also im Ergebnis kein Funktionsaufruf mehr 
stattfindet).

Das ist einer der wenigen Fälle, wo man Code (Funktionen als "static 
inline", vielleicht auch mit "__attribute__((always_inline))") in einem 
Header haben sollte.

Diese Funktionen kannst du später mit inline-Assembler umschreiben, wenn 
dir die Standardfunktion / Bibliotheksfunktion nicht ausreichen sollte.

Christopher S. schrieb:
> Gibt es irgendwelche Benchmark-Tools?

Für deinen Anwendungsfall auf deinem Prozessor wird das eher auf 
Mikrobenchmarks hinauslaufen, die du dir sinnvollerweise selbst 
schreibst (nur du weißt, welche Werte relevant sind). Ein frei laufender 
Timer ist auf solchen Controllern dafür optimal geeignet.

Christopher S. schrieb:
> Der Prozessor war vorgegeben :)

Ich habe irgendwie das Gefühl, dass du die Mathematik hinter einer Art 
"Bluetooth-Pairing" implementieren sollst oder soetwas in der Art. 
Könnte das hinkommen?

Reicht für die Entwicklung nicht auch ein ähnlicher Prozessor (quasi ein 
beliebiger STM32F4)? Ein Energiesparwunder ist das Ding eh nicht, und 
die Chips unterscheiden sich ja nicht in der Performance, sondern in der 
verfügbaren Peripherie usw.

von Lothar (Gast)


Lesenswert?

Jan K. schrieb:
> ASM auf dem Cortex M4 ist schon ne Hausnummer

ARM Assembler lernen geht schon einfacher auf einem Pi mit RTOS. Da gibt 
es haufenweise Seiten mit Beispielen und sogar ein Buch. Das lässt sich 
dann alles weitgehend auf den M4 übertragen, auch DSP und FPU. Aber man 
kann sich eben z.B. einfach eine Grafik plotten und nicht über UART 
gehen.

https://www.amazon.de/Raspberry-Assembly-Language-Beginners-2014-02-06/dp/B01FIYK7F0/ref=asap_bc?ie=UTF8

Beim uC ist erstmal das Problem, dass es umständlich ist, jedesmal neu 
zu assemblieren und zu flashen / debuggen. Dann noch der Unterschied 
Ausführung im Flash / RAM. Von Waitstates, Modi, MPU erst gar nicht zu 
reden.

Ein M0 wäre zum Einstieg einfacher z.B. LPC810 gibt es sogar als DIL. Da 
braucht es erstmal keinen Startup-Code.

von hänschen (Gast)


Lesenswert?

Soweit ich das mitbekommen habe, benutzt die C-Umgebung den Stack um 
ständig  benutzte Register (in Schleifen etc.) zu retten und 
wiederherzustellen.

Wenn du da ein Assembler-Programm reinfunzeln willst musst du bestimmt 
aufpassen dass du nicht dem restlichen Programm dazwischenfunkst, also 
den Stack und vielleicht andere Register am Ende so lassen wie er war.

von S. R. (svenska)


Lesenswert?

hänschen schrieb:
> Wenn du da ein Assembler-Programm reinfunzeln willst musst du bestimmt
> aufpassen dass du nicht dem restlichen Programm dazwischenfunkst, also
> den Stack und vielleicht andere Register am Ende so lassen wie er war.

Das Stichwort nennt sich ABI und ist in der Regel Teil der 
Compiler-Dokumentation.

von Shalec#Guest (Gast)


Lesenswert?

Ein Bluetooth-Pairing wird das nicht.

Insgesamt sieht es so aus, dass ich über eine for-Schleife ein bisschen 
EC und FF Arithmetik aufrufe (Punktmultiplikation, Addition, 
Sekante/Tangente an Punkt auswerten; Multiplikation, Quadrierung, 
Inversion) und das Ergebnis am Ende der Funktion wird nochmal mit 
(p^16-1)/r potenziert. p hat 339 Bits r etwas weniger.

Diese Zahl, die am Ende dabei rauskommt, ist dann das sog. Pairing und 
kann für eine Vielzahl (ID-basierte Verschlüsselung, Signaturen, ...) 
kryptographischer Mechanismen verwendet werden.

von Christopher S. (shalec)


Lesenswert?

Btw. der STM32F417 war nur noch von Interesse wegen der verbauten 
Cryptounit. Laut STM haben der F407 und der F417 jeweils einen TRNG an 
board. Den würde ich ebenfalls gerne nutzen.

Soll ich für diese Hardwarebzeugsfrage einen neuen Thread machen? Welche 
Rubrik wäre das?

von Arc N. (arc)


Lesenswert?

Shalec#Guest schrieb:
> Ein Bluetooth-Pairing wird das nicht.
>
> Insgesamt sieht es so aus, dass ich über eine for-Schleife ein bisschen
> EC und FF Arithmetik aufrufe (Punktmultiplikation, Addition,
> Sekante/Tangente an Punkt auswerten; Multiplikation, Quadrierung,
> Inversion) und das Ergebnis am Ende der Funktion wird nochmal mit
> (p^16-1)/r potenziert. p hat 339 Bits r etwas weniger.
>
> Diese Zahl, die am Ende dabei rauskommt, ist dann das sog. Pairing und
> kann für eine Vielzahl (ID-basierte Verschlüsselung, Signaturen, ...)
> kryptographischer Mechanismen verwendet werden.

Erstmal zum ursprünglichen Thema:
Kurzreferenz der ASM-Befehle gibt im Technical Reference Manual:
http://infocenter.arm.com/help/topic/com.arm.doc.100166_0001_00_en/arm_cortexm4_processor_trm_100166_0001_00_en.pdf 
zusätzlich werden da einige grundlegende Dinge beschrieben wie Bit 
Bending, NVIC, FPU oder MPU.
Gibt's auch etwas aufgeräumter von ST:
"STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual"
http://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf

Kryptoalgorithmen selbst implementieren? Kann man zum Spaß machen. 
Wenn's in die freie Wildbahn gehen soll, sollte man aber sehr gut wissen 
was man tut.
Für den Einsteig: Side Channel Cryptanalysis Lounge
https://www.emsec.rub.de/research/projects/sclounge/
(ist zwar nicht mehr ganz up to date, liefert aber aber genügend für 
weitergehende Recherchen)

von F. F. (foldi)


Lesenswert?

Jungs, könnt ihr erst am Samstag mit dem Thema weiter machen. Da habe 
ich dann Bier und Popcorn hier.
Und dann sind auch die C++ler dabei.

SCNR

von Dr. Sommer (Gast)


Lesenswert?

Tjo. Manche brauchen Jahre um sich in so komplexe Dinge wie die 
ARM-Architektur, Kryptographie-Algorithmen, Assembler, ABI's, 
Mikrocontroller-Programmierung/Debugging einzuarbeiten und dabei besser 
als ein Compiler und bestehende Libraries zu sein. Andere machen das mal 
eben für ein Projekt ohne auch nur mal vom 2er-Komplement gehört zu 
haben ;-)

von Lothar (Gast)


Lesenswert?

hänschen schrieb:
> Soweit ich das mitbekommen habe, benutzt die C-Umgebung den Stack um
> ständig  benutzte Register (in Schleifen etc.) zu retten und
> wiederherzustellen

Auf einem Cortex A/R ist das so. Der Cortex M nutzt 
Hardware-Autostacking. Jeder Stackfehler führt sofort zum Hardfault:

http://www.keil.com/forum/59365/stacking-and-interrupts/

von F. F. (foldi)


Lesenswert?

Na ja ...

Dr. Sommer schrieb:
> Andere machen das mal eben für ein Projekt ohne auch nur mal vom
> 2er-Komplement gehört zu haben ;-)

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Lothar schrieb:
> Auf einem Cortex A/R ist das so. Der Cortex M nutzt
> Hardware-Autostacking. Jeder Stackfehler führt sofort zum Hardfault:

Hä? Der C-Compiler legt auch auf einem Cortex-M den Frame auf den Stack 
(und nutzt dann SP-relative Adressierung, um an die lokalen Variablen zu 
kommen).

Stackfehler führen nicht automatisch zu einem Hardfault - woher auch?

von Lothar (Gast)


Lesenswert?

S. R. schrieb:
> Stackfehler führen nicht automatisch zu einem Hardfault - woher auch?

Auf einem Cortex A/R wird z.B. bei einem Interrupt oder SVC die 
Registerbank (teilweise) gewechselt, dafür braucht es keinen Stack. Der 
Cortex M hat keine Registerbänke und muss bestimmte Register auf einen 
Stack schieben. Das hat mit dem C Compiler nichts zu tun, es ist 
Hardware-Autostacking. Und wenn der Stack dafür nicht reicht, gibt es 
Hardfault:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Babedgea.html

von S. R. (svenska)


Lesenswert?

Lothar schrieb:
> Und wenn der Stack dafür nicht reicht, gibt es Hardfault:

Der Stack wächst aber in aller Regel von oben nach unten... und damit 
reicht der Stack eigentlich immer, um die Register zu pushen. Eher gehen 
deine Daten (Heap, .bss und .data - meist in dieser Reihenfolge) kaputt, 
und der Hardfault ist eine Konsequenz dessen.

Zuviel poppen führt schon eher zum Tilt, aber eben auch nicht immer.

von Christopher S. (shalec)


Lesenswert?

Dr. Sommer schrieb:
> Tjo. Manche brauchen Jahre um sich in so komplexe Dinge wie die
> ARM-Architektur, Kryptographie-Algorithmen, Assembler, ABI's,
> Mikrocontroller-Programmierung/Debugging einzuarbeiten und dabei besser
> als ein Compiler und bestehende Libraries zu sein. Andere machen das mal
> eben für ein Projekt ohne auch nur mal vom 2er-Komplement gehört zu
> haben ;-)

Ich bin halt Mathematiker mit Vertiefung in der Crypto und schreibe 
meine MA in der Informatik/Mathematik ohne Vorkenntnisse bzgl. 
Programmierung und co. (PHP und CAS zählen da nicht :D )

Das mit den Compilern und Makefile musste ich auch erstmal lernen, 
genauso C. Wie der Prozessor exakt läuft weiß ich noch nicht, kommt aber 
langsam. (Learning by doing) Wie lässt sich denn USART in Win auslesen? 
Ich habe die libopencm3 genutzt und die monitor.sh des FourQ builds von 
Patrick Longa bei Github.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Ich würde auch empfehlen, dass Du in C codierst und mit 
Optimierungsstufen des Compilers experimentierst.

Der Cortex Kern ist nicht unbedingt intuitiv, was Performanz angeht. 
Eine der wesentlichen Eigenarten des Kernels ist z.B. dass Operationen 
rein im Kernel um Grössenordnungen schneller sind als auf dem Bus 
operierende, und auf den internen Bussen (iCode und dCode) operierende 
wesentlich schneller sind als die, die auf dem externen Bus operieren.

Du wirst z.B. merken, dass ein auf Geschwindigkeit optimerter Compiler 
ein Schleife durch "unfolding" auflöst. Er wird also z.B. eine Schleife 
mit n Iterationen in n/4 Durchläufe derselben Schleife übersetzen, wobei 
jede Iteration vier mal denselben Code enthält,dabei aber mit vier 
verschiedenen Registersätzen seine Zwischenvariablen vorhält. Dadurch 
werden Datenbuszyklen minimiert. Der Geschwindigkeitsgewinn kann 
gigantisch sein (ich diskutiere das ansatzweise in Kapitel 2 meines 
Buches). Die Zahl 4 ist dabei variabel; je nachdem, wieviel Register 
frei sind, werden mehr oder weniger Iteration aufgefaltet.

Eine andere "Falle" ist z.B., dass der Cortex M7 Kern auf Parallelität 
optimiert ist, d.h. die Anordnung der Maschinenbefehle macht einen 
Riesenunterschied - zwei aufeinanderfolgende, voneinander unabhängige 
Operationen können durch die 5 stage pipeline im selben Zyklus 
abgearbeitet werden.

All diese Dinge weiss ein fähiger Compiler, aber Du musst es lernen und 
kannst dabei mglw. Mehr Zeit im Verständnis der Architektur verbringen 
als Du brauchst, um dein Problem zu lösen.

von Christopher S. (shalec)


Lesenswert?

> Schreibe deinen Quelltext so, dass sämtliche mathematischen Operationen
> als Funktionen ausgeführt sind
So mache ich das auch, dass ich möglichst wenig in einer Funktion 
verarbeite und diese Teilfunktionen dann in einer Hauptfunktion aufrufe.

> und achte darauf, dass der Compiler diese
> grundsätzlich inlined (also im Ergebnis kein Funktionsaufruf mehr
> stattfindet).

Das mit dem Inlinen habe ich nicht ganz nachvollziehen können. Das Buch, 
das ich zum Lernen von C las, hat sowas nicht behandelt, wenn ich mich 
recht erinnere.

> Das ist einer der wenigen Fälle, wo man Code (Funktionen als "static
> inline", vielleicht auch mit "__attribute__((always_inline))") in einem
> Header haben sollte.
>
> Diese Funktionen kannst du später mit inline-Assembler umschreiben, wenn
> dir die Standardfunktion / Bibliotheksfunktion nicht ausreichen sollte.

d.h. ich habe dann z.B. in einer Lib die Funktion "void add(unsigned int 
a, unsigned b, long long *c)"

Diese macht zum Beispiel: a+b und speichert das Ergebnis im Speicherort 
von c. Hier sehe ich keine Zerspaltungsmöglichkeit. Aber nehme ich z.B.
1
#typedef int gf_t[11]
2
#typedef gf_t gf16_t[16]
3
void add_gf16(gf16_t a, gf16_t b, gf16_t c)

Diese macht das Gleiche, wie zuvor, aber diesmal mit Arrays. (Nennt man 
die überhaupt so an dieser Stelle?)

Hier würde ich per for-Schleife über jeden Eintrag iterieren. Nach Speed 
optimiert, wäre noch ein Test a_i == 0 || b_i == 0 dabei. Constant-Time 
nicht. (Kann man in C auch, wie in PHP, a_i  || b_i == 0 schreiben? Oder 
äquivalentes?) Innerhalb der for-Schleife würde ich dann
1
static inline add_gf(gf_t a, gf_t b, gf_t c_i)
aufrufen (habe mal meiner Vermutung nach "static inline" einfach davor 
gestellt.) Diese Funktion wäre wieder eine For-Schleife, die ich dann 
über obiges "static inline add(int,int,long long)" definiert hätte. Wäre 
das eine korrekte/vorgestellte Anwendung?

von Christopher S. (shalec)


Lesenswert?

@Ruediger Asche

Da gebe ich Dir recht. Ich habe hier auch ein buch "The definitive guide 
to ARM Cortex-M3 and [...] M4 Processors". Meine Erwartungen an das Buch 
waren ursprünglich, dass ich auf Programmierebene durch die Eigenheiten 
des Prozessor geleitet werde, aber von Programmierung ist darin kaum 
eine Spur. :)

Insgesamt habe ich einen groben Plan, wie der Code auf einer 32-Bit 
Basis erzeugt werden muss, damit er läuft. Die Performance versuche ich 
durch Vorüberlegungen zu erzeugen.

Mein Plan ist sowieso erstmal alles in C soweit zu schreiben, dass es 
darin für mein (auf den Zeitpunkt bezogen) Verständnis nicht weiter in C 
optimiert werden kann. Danach würde ich einige Elemente in ASM versuchen 
zu schreiben. Orientiert an den Compilerausgaben. Dazu gehört für mich 
erstmal zu verstehen (ganz im Allgemeinen natürlich immer ;) ) wie die 
ASM-Befehle Arbeiten und abgearbeitet werden. Erst wenn ich weiß wie der 
vorliegende Code überhaupt arbeitet, kann ich ja erst in der Lage sein 
seine Schwach-/Verbesserungsstellen zu entdecken.

Am liebsten wäre mir zum Verständnis erlernen erstmal ein Buch, dass auf 
Basis des M4 (oder wenigstens im Kern anwendbar auf den M4 ist) den 
ASM-Code einführt, vorstellt und vervollständigt. Ist der Befehlssatz 
egtl. für alle Prozessoren der Architektur STMv7-M identisch? (Ich hoffe 
ich schreibe die Architektur richtig..ist halt die des M4 und anderen, 
ohne Vectoring)

: Bearbeitet durch User
von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Christopher S. schrieb:
> @Ruediger Asche
>
>
> Am liebsten wäre mir zum Verständnis erlernen erstmal ein Buch, dass auf
> Basis des M4 (oder wenigstens im Kern anwendbar auf den M4 ist) den
> ASM-Code einführt, vorstellt und vervollständigt.

Ich kenne so ein Buch nicht und würde es auch nicht selber schreiben 
(dazu ist die daran interessierte Ziegruppe zu klein).

> Ist der Befehlssatz
> egtl. für alle Prozessoren der Architektur STMv7-M identisch? (Ich hoffe
> ich schreibe die Architektur richtig..ist halt die des M4 und anderen,
> ohne Vectoring)

Du meinst, ob M4 und M7 Befehlssätze identisch sind? Jein. M7 hat Double 
Precision FPU Befehlssätze, die auf dem M4 mit FPU nicht zur Verfügung 
stehen, aber solange Du Dich auf den M4 Befehlssatz beschränkst, kannst 
Du kompatible Befehle verwenden. Wie sie sich verhalten, ist aber wie 
gesagt durch die 6 stage Pipeline nicht unbedingt identisch.

Ein hilfreicher Vergleich zwischen den Architekturen findet sich hier:

http://chipdesignmag.com/sld/blog/2014/10/24/this-is-not-your-father%E2%80%99s-mcu/

von Markus (Gast)


Lesenswert?

Christopher S. schrieb:
> Ich möchte demnächst lernen mit asm für den Microkontroller  zu
> programmieren.

vs.

> Dabei strebe ich aber nur Berechnungen an.

beißt sich schon mal erheblich. Mach die Berechnungen in C, dafür ist 
das optimal. Den Aufwand erst Asm zu lernen und hinterher zeitintensiv 
damit zu codieren rentieren eventuelle, keineswegs sichere 
Effizienzgewinne in den seltensten Fällen. Und dann Asm auch noch für 
komplexe Architekturen wie ARM... Assembler zu verwenden macht höchstens 
auf einfachen 8Bittern Sinn.

von Hans (Gast)


Lesenswert?

Schau mal in den Technical Reference Manuals nach...

Cortex M3:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337h/index.html

Von dort aus kommst du auch zu den anderen manual.

Nachdem der instruction dispacher im compiler die ganzen timings kennt, 
glaube ich nicht, dass du wesentlich schnelleren code bauen kannst.

viel wichtiger als die instruktionen sind z.b. die berücksichtigung der 
cache-line größen und vor allem der algorithmen.

im aller besten fall bekommst du duch reine ASM implementierungen 
geschwindigkeitszuwächste im niedrigen einstelligen prozentbereich (wenn 
du den compiler entsprechend optimieren lässt.. Stichword LTO, 
loop-unrolling,...).

73

von Arc N. (arc)


Lesenswert?

Ruediger A. schrieb:
> Christopher S. schrieb:
>> @Ruediger Asche
>>
>>
>> Am liebsten wäre mir zum Verständnis erlernen erstmal ein Buch, dass auf
>> Basis des M4 (oder wenigstens im Kern anwendbar auf den M4 ist) den
>> ASM-Code einführt, vorstellt und vervollständigt.
>
> Ich kenne so ein Buch nicht und würde es auch nicht selber schreiben
> (dazu ist die daran interessierte Ziegruppe zu klein).
>
>> Ist der Befehlssatz
>> egtl. für alle Prozessoren der Architektur STMv7-M identisch? (Ich hoffe
>> ich schreibe die Architektur richtig..ist halt die des M4 und anderen,
>> ohne Vectoring)
>
> Du meinst, ob M4 und M7 Befehlssätze identisch sind? Jein. M7 hat Double
> Precision FPU Befehlssätze, die auf dem M4 mit FPU nicht zur Verfügung
> stehen,

Ja und nein... das ist mal wieder ein optionales Feature 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0489d/CACHBAHH.html
Bspw. haben die STM32F7x3 und STM32F7x2 oder der F745 und die F7x6 nur 
Single Precision, die anderen aus der Reihe (F7x7, 7x8 und 7x9 ebenso 
der 765) dagegen Double Precision.
Spielt bei dem Projekt aber keine Rolle, da nur Integer-Arithmetik 
verwendet werden dürfte und die Befehlssätze ansonsten afaik identisch 
sind. Unterschiede ansonsten u.a. Bit Band, dass es nur auf M4s gibt 
(außer der Hersteller hat für den M7 selber was gebastelt) und beim M4 
kann man zw. 32- und 64-Bit Stack Alignment wählen, beim M7 ist es immer 
64-Bit

von Stefan K. (stefan64)


Lesenswert?

Für sehr viel Mathematik gibt es in der CMSIS DSP lib passende 
Funktionen:

http://arm-software.github.io/CMSIS_5/DSP/html/index.html

Das Zeug ist von ARM geschrieben und in Assembler handoptimiert.

Den Aufruf dieser Funktionen würde ich getrost dem C-Compiler 
überlassen, schneller als der bekommt man das wohl kaum hin.

Viele Grüße, Stefan

von Arc N. (arc)


Lesenswert?

Markus schrieb:
> Christopher S. schrieb:
>> Ich möchte demnächst lernen mit asm für den Microkontroller  zu
>> programmieren.
>
> vs.
>
>> Dabei strebe ich aber nur Berechnungen an.
>
> beißt sich schon mal erheblich. Mach die Berechnungen in C, dafür ist
> das optimal. Den Aufwand erst Asm zu lernen und hinterher zeitintensiv
> damit zu codieren rentieren eventuelle, keineswegs sichere
> Effizienzgewinne in den seltensten Fällen. Und dann Asm auch noch für
> komplexe Architekturen wie ARM...

Seit wann ist ARM komplex? ;)

> Assembler zu verwenden macht höchstens
> auf einfachen 8Bittern Sinn.

Bei den meisten Sachen heute würde ich zustimmen, aber nicht bei dem 
speziellen Fall hier... siehe oben
> Side Channel Cryptanalysis Lounge
> https://www.emsec.rub.de/research/projects/sclounge/

Einige der nötigen Gegenmaßnahmen machen es u.U. erforderlich, die 
Algorithmen in Assembler zu implementieren oder zumindest dem 
Compiler/Optimizer sehr, sehr genau auf die Finger zu schauen.
Mal eben den Lehrbuch-Algorithmus in C runterschreiben ist bei 
kryptographischen Algorithmen/Protokollen eher keine gute Idee.

Stefan K. schrieb:
> Für sehr viel Mathematik gibt es in der CMSIS DSP lib passende
> Funktionen:
>
> http://arm-software.github.io/CMSIS_5/DSP/html/index.html
>
> Das Zeug ist von ARM geschrieben und in Assembler handoptimiert.

Die Lib rechnet nicht mit großen Integern wie sie bei den Verfahren hier 
nötig sind.

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Angehängte Dateien:

Lesenswert?

Ich finde den MOOC "Embedded Systems Shape the World" bei edx.org gar 
nicht so schlecht. Genau genommen gibt es zwei Stück, wobei der eine auf 
dem anderen aufbaut. Hier mal ein paar Auszüge, die dich vielleicht 
etwas weiterbringen:

Registers:
https://youtu.be/VB8iLtfy3Cc

Assembly Language:
https://youtu.be/F9HZfJWdV-A

Interrupt Processing:
https://youtu.be/Kt_pVkFPj3c

Auch ansonsten werden im Kurs sehr gut die Zusammenhänge zwischen C und 
Assembler verdeutlicht, siehe Screenshots. Der Autor des Kurses hat auch 
ein Buch geschrieben, was Cortex-M4 in der Tiefe behandelt:
https://www.amazon.de/Embedded-Systems-Introduction-CortexTM-M-Microcontrollers/dp/1477508996/ref=sr_1_3?ie=UTF8&qid=1504099591&sr=8-3&keywords=Jonathan+Valvano

Sehr hilfreich fand ich persönlich auch
http://www.davespace.co.uk/arm/introduction-to-arm/
bzw.
http://www.davespace.co.uk/arm/efficient-c-for-arm/

Ansonsten unbedingt empfehlenswert finde ich das oben schon genannte 
"The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors". Da 
wird das komplette Kapitel 5 für Assembler verwendet ("Instruction 
set"), wobei das eher als Referenz zu sehen ist. Wenn man vorher noch 
nichts mit Assembler gemacht hat wird man daraus vielleicht nicht 
unbedingt schlau. Als Student kannst du das Buch eventuell kostenlos 
herunterladen.

Schlussendlich muss ich aber meinen Vorrednern zustimmen, dass es sehr 
sehr schwer sein wird, den Compiler zu schlagen. Viel Erfolg dabei.

von Hans (Gast)


Lesenswert?

Arc N. schrieb:
> Bei den meisten Sachen heute würde ich zustimmen, aber nicht bei dem
> speziellen Fall hier... siehe oben
>> Side Channel Cryptanalysis Lounge
>> https://www.emsec.rub.de/research/projects/sclounge/
>
> Einige der nötigen Gegenmaßnahmen machen es u.U. erforderlich, die
> Algorithmen in Assembler zu implementieren oder zumindest dem
> Compiler/Optimizer sehr, sehr genau auf die Finger zu schauen.
> Mal eben den Lehrbuch-Algorithmus in C runterschreiben ist bei
> kryptographischen Algorithmen/Protokollen eher keine gute Idee.

Ähm... Side Channel Attacks haben zu 99.99% nichts mit der 
Programmiersprache zu tun!

Timing-Analysen kann man z.B so unmöglich machen, dass du einen Timer 
startest wenn die Anfrage kommt und das ergebnis erst beim Ablauf zurück 
gibst => immer idente Laufzeit.

Gegen Angriffe über Stromaufnahme und/oder Abstrahlung hilft die 
möglichst alles im Chip dauerhaft zu beschäftigen (oder eben ein Chip 
der auf sowas hin optimiert wurde). Zusätzlich könnte man ja den 
Algorithmus in zufälligen Abständen einfach unterbrechen und z.B. 
nebenbei Pi berechnen....

Wenn überhaupt würde ich für einige teile eine funktionale sprache 
verwenden um implementierungsfehler zu verringern... angeblich sei mit 
denen bei der implementierung von algorithmen die häufigkeit von fehlern 
geringer... kann ich aber für mich nicht bestätigen :o)

was ich sagen will: Die Sprache ist wurscht für Geschwindigkeit, 
Side-Channel-Attacks,... Wichtiger ist das Design vom Gesamtsystem - und 
das ist total unabhängig davon.

73

von Christopher S. (shalec)


Lesenswert?

Markus schrieb:
> Christopher S. schrieb:
>> Ich möchte demnächst lernen mit asm für den Microkontroller  zu
>> programmieren.
>
> vs.
>
>> Dabei strebe ich aber nur Berechnungen an.
>
> beißt sich schon mal erheblich. Mach die Berechnungen in C, dafür ist
> das optimal. Den Aufwand erst Asm zu lernen und hinterher zeitintensiv
> damit zu codieren rentieren eventuelle, keineswegs sichere
> Effizienzgewinne in den seltensten Fällen. Und dann Asm auch noch für
> komplexe Architekturen wie ARM... Assembler zu verwenden macht höchstens
> auf einfachen 8Bittern Sinn.

Leider gehts aber auch um µs Zeitgewinn. :)

von Lothar (Gast)


Lesenswert?

Markus schrieb:
> Und dann Asm auch noch für komplexe Architekturen wie ARM...
> Assembler zu verwenden macht höchstens auf einfachen 8Bittern Sinn

Also die Komplexität ist erstmal 8051 < ARM < PIC < AVR :-)

ARM Assembler kommt schliesslich vom 6502 da ist gar nichts komplex.

Was beim STM32 komplex ist, ist nicht der ARM Kern, sondern die 
merkwürdige Peripherie, dabei ist DMA oder ART noch gar nicht gemeint.

von Dr. Sommer (Gast)


Lesenswert?

Lothar schrieb:
> Also die Komplexität ist erstmal 8051 < ARM < PIC < AVR :-)
Äh... Also ich konnte den AVR-Instruction Set nach einiger Nutzung 
schnell auswendig, bei ARM muss ich immer noch nachschlagen...

von Vincent H. (vinci)


Lesenswert?

Christopher S. schrieb:
> Leider gehts aber auch um µs Zeitgewinn. :)

Nur um dich ein wenig auf den Arbeitsaufwand vorzubereiten...
Ich hab letztes Jahr ein paar kleine Assembler Funktionen geschrieben um 
Audio-Daten verschiedener Bitbreiten und Abtastraten linear(!!!) 
interpoliert auf verschiedene Zielformate aufzublasen. Selbst jener 
absurd simple Code hatte am Ende 2200 Zeilen. Der Aufwand war einzig und 
allein dadurch zu rechtfertigen, dass der Code in jener Form für das 
kommende Jahrzehnt wiederverwendet werden soll und auf teilweise sehr 
schwachbrüstigen Prozessoren laufen muss, wo ein paar µs tatsächlich weh 
tun.

Bei deinen Posts weiter oben versteh ich teilweise nicht einmal die 
Ausdrücke, also möcht ich mir gar nicht erst ausmalen wie komplex die 
Berechnungen teilweise sein werden...

Bei einem derart "Algorithmen"-lastigen Projekt würde ich mir vermutlich 
sogar überlegen nicht gleich in Python oder was ähnlich "hohem" 
anzufangen.

von Christopher S. (shalec)


Lesenswert?

Hans schrieb:
> Timing-Analysen kann man z.B so unmöglich machen, dass du einen Timer
> startest wenn die Anfrage kommt und das ergebnis erst beim Ablauf zurück
> gibst => immer idente Laufzeit.

Problem sind da aber kombinierte Angriffe. Timing-Attacks sind ja schon 
leicht abzuwehren, wenn man dann noch Power-Analysis fährt hilft nur

> Gegen Angriffe über Stromaufnahme und/oder Abstrahlung hilft die
> möglichst alles im Chip dauerhaft zu beschäftigen (oder eben ein Chip
> der auf sowas hin optimiert wurde). Zusätzlich könnte man ja den
> Algorithmus in zufälligen Abständen einfach unterbrechen und z.B.
> nebenbei Pi berechnen....
Sinnlose oder weitere Berechnungen. Die Frage ist dann ob nicht interne 
Mechanismen Additionen/Multiplikationen mit 0 ohnehin ohne Berechnungen 
unter den Tisch fallen lassen würden. Dafür müsste man aber vorher 
tiefer in die Sets gucken :(

> Wenn überhaupt würde ich für einige teile eine funktionale sprache
> verwenden um implementierungsfehler zu verringern... angeblich sei mit
> denen bei der implementierung von algorithmen die häufigkeit von fehlern
> geringer... kann ich aber für mich nicht bestätigen :o)

Da kenne ich jetzt nur Haskell. Schöne Sprache, wird mir aber bei meinem 
Projekt zu viel :D

> was ich sagen will: Die Sprache ist wurscht für Geschwindigkeit,
> Side-Channel-Attacks,... Wichtiger ist das Design vom Gesamtsystem - und
> das ist total unabhängig davon.

+ EMS Messungen lassen sich ja auch auf einer bestimmten Distanz 
erfolgreich durchführen. Dagegen hilft nur eine Hardwarehärtung -> 
Farradayscher Käfig/Blei... :D Oder entsprechend Cryptounits. Der BSI 
gibt hierfür ja auch Hardware frei.

von Christopher S. (shalec)


Lesenswert?

Vielen Dank für die Ausführungen. Helfen werden sie gewiss.

Christopher J. schrieb:
> Ansonsten unbedingt empfehlenswert finde ich das oben schon genannte
> "The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors". Da
> wird das komplette Kapitel 5 für Assembler verwendet ("Instruction
> set"), wobei das eher als Referenz zu sehen ist. Wenn man vorher noch
> nichts mit Assembler gemacht hat wird man daraus vielleicht nicht
> unbedingt schlau. Als Student kannst du das Buch eventuell kostenlos
> herunterladen.

Das Buch habe ich hier im Regal stehen, ist allerdings für einen 
blutigen Anfänger mit Systemen, Programmieren und co. echt ne Hausnummer 
zu hoch und viel zu speziell. Die Version ausschließlich für M3 lässt 
sich übrigens auch als Direkdownload über Google finden ;)

von Christopher J. (christopher_j23)


Lesenswert?

Das Buch von Joseph Yiu ist auch mehr ein Nachschlagewerk als etwas, was 
man von Anfang bis Ende durcharbeitet. Für letzteres wäre wohl eher das 
Buch von Jonathan Valvano geeignet. Das steigt auf einem sehr tiefen 
Level ein. Die Kapitel über GPIO und co kannst du ja erstmal 
überspringen. Da es dir eigentlich nur um die Berechnungen geht kannst 
du die ja mit jedem CM4 durchführen, egal ob der jetzt von TI oder STM 
kommt. Ich denke aber nach wie vor, das du erstmal den Kram in C 
implementieren solltest und erst danach die Sache in ASM angehen 
solltest. Was nutzt dir denn eine ASM-Implementierung wenn du keine 
Messlatte hast?

PS: Ich würde sogar soweit gehen, den Algorithmus erstmal nur auf dem PC 
zu implementieren. Wenn du dir bei den Datentypen ein bisschen Mühe 
gibst, dann ist der C-Code 1:1 portabel. Entwickeln und debuggen direkt 
am PC ist aber erstmal deutlich einfacher als auf einem Mikrocontroller.

: Bearbeitet durch User
von Christopher S. (shalec)


Lesenswert?

Christopher J. schrieb:
> Das Buch von Joseph Yiu ist auch mehr ein Nachschlagewerk als etwas, was
> man von Anfang bis Ende durcharbeitet. Für letzteres wäre wohl eher das
> Buch von Jonathan Valvano geeignet. Das steigt auf einem sehr tiefen
> Level ein. Die Kapitel über GPIO und co kannst du ja erstmal
> überspringen. Da es dir eigentlich nur um die Berechnungen geht kannst
> du die ja mit jedem CM4 durchführen, egal ob der jetzt von TI oder STM
> kommt. Ich denke aber nach wie vor, das du erstmal den Kram in C
> implementieren solltest und erst danach die Sache in ASM angehen
> solltest. Was nutzt dir denn eine ASM-Implementierung wenn du keine
> Messlatte hast?

So mache ich es sowieso. Es sollte erstmal ein Produkt stehen, erst 
danach macht es Sinn an "Optimierung" zu denken ;)

> PS: Ich würde sogar soweit gehen, den Algorithmus erstmal nur auf dem PC
> zu implementieren. Wenn du dir bei den Datentypen ein bisschen Mühe
> gibst, dann ist der C-Code 1:1 portabel. Entwickeln und debuggen direkt
> am PC ist aber erstmal deutlich einfacher als auf einem Mikrocontroller.

So viel einfacher wird es nicht unbedingt, der Aufwand reduziert sich um 
eine Kommandozeileneingabe erhöht sich aber auf zwei Makefiles :)

Ich habe das Board über einen STlink-v2 und einem PL2303 (mit altem 
Treiber, der neue hatte das Ding unbrauchbar gemacht) mit Windows und 
einer VM mit Ubuntu 16.04 LTS verbunden. Über Windows kompiliere ich zur 
*.bin (mein gcc in Ubuntu läuft nicht, anstelle der Zeitaufbringung zum 
Fixen habe ich es lieber so gelassen und einen Shared-Ordner 
eingerichtet. Läuft auch Prima. :) )

Über Ubuntu flashe ich mit "st-flash write <dir/file.bin> 0x8000000" 
wobei ich nicht weiß, warum ich genau 0x80000000. Ich wusste es aber mal 
ganz genau :( Hatte irgendwas mit dem reservierten nicht-beschreibbaren 
Speicher zu tun, wenn ich mich richtig erinnere. Habe hier übrigens auch 
ein grünes Script, das von TI  und Cortex M4 handelt.

Btw. das Buch "The Definitive Guide..." hatte ~23€ + Versand gekostet.

von Arc N. (arc)


Lesenswert?

Hans schrieb:
> Arc N. schrieb:
>> Bei den meisten Sachen heute würde ich zustimmen, aber nicht bei dem
>> speziellen Fall hier... siehe oben
>>> Side Channel Cryptanalysis Lounge
>>> https://www.emsec.rub.de/research/projects/sclounge/
>>
>> Einige der nötigen Gegenmaßnahmen machen es u.U. erforderlich, die
>> Algorithmen in Assembler zu implementieren oder zumindest dem
>> Compiler/Optimizer sehr, sehr genau auf die Finger zu schauen.
>> Mal eben den Lehrbuch-Algorithmus in C runterschreiben ist bei
>> kryptographischen Algorithmen/Protokollen eher keine gute Idee.
>
> Ähm... Side Channel Attacks haben zu 99.99% nichts mit der
> Programmiersprache zu tun!
>
> Timing-Analysen kann man z.B so unmöglich machen, dass du einen Timer
> startest wenn die Anfrage kommt und das ergebnis erst beim Ablauf zurück
> gibst => immer idente Laufzeit.

Wäre eine Möglichkeit, führt aber je nach Häufigkeit zu erheblicher 
unnützer Systemlast und schlechtem Durchsatz...
"Efficient Cache Attacks on AES, and Countermeasures"
https://www.tau.ac.il/~tromer/papers/cache-joc-20090619.pdf

> Gegen Angriffe über Stromaufnahme und/oder Abstrahlung hilft die
> möglichst alles im Chip dauerhaft zu beschäftigen (oder eben ein Chip
> der auf sowas hin optimiert wurde).

Alles beschäftigen reicht nicht, erhöht zwar das Rauschen und damit die 
Dauer des Angriffs unterbindet den aber nicht (ausreichend).

> Zusätzlich könnte man ja den
> Algorithmus in zufälligen Abständen einfach unterbrechen und z.B.
> nebenbei Pi berechnen....

Kann reichen, muss nicht, kann es sogar verschlimmern

> Wenn überhaupt würde ich für einige teile eine funktionale sprache
> verwenden um implementierungsfehler zu verringern... angeblich sei mit
> denen bei der implementierung von algorithmen die häufigkeit von fehlern
> geringer... kann ich aber für mich nicht bestätigen :o)

Es geht bei diesen Seitenkanalangriffen darum, eine formal korrekte 
Implementation anzugreifen...
Ansonsten wird das Thema funktionale Sprachen hier "etwas" zu sehr OT ;)

> was ich sagen will: Die Sprache ist wurscht für Geschwindigkeit,
> Side-Channel-Attacks,... Wichtiger ist das Design vom Gesamtsystem - und
> das ist total unabhängig davon.

Unabhängig würde ich nicht sagen, denn bei einigen Sprachen besteht 
gerade keine Möglichkeit ausreichend auf den generierten Code (zur Not 
eben durch Einsatz von handgeschriebenem Assemblercode) Einfluss zu 
nehmen, um einige der Angriffe unterbinden zu können. Ansonsten ist das 
Design natürlich das wichtigste bspw. um erst mal überhaupt zu 
sehen/festzulegen, gegen welche Angriffe das System abgesichert werden 
muss/soll.

von Lothar (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Was kann der Inline Assembler denn nicht, was der gas kann?

Das geht ja schon los mit ".syntax unified" um dem SUB / SUBS Schleifen 
Crash bei gemeinsamem Code für M0 und M4 entgegen zu wirken.

> bei ARM muss ich immer noch nachschlagen

Ich meinte Cortex A/R bzw. klassische ARM sind einfach. Beim Cortex M 
muss ich auch nachschlagen bzw. nutze halt viele Befehle nicht, wenn ich 
mich grade nicht dran erinnern kann.

von D.Sperber (Gast)


Lesenswert?

Lothar schrieb:
> Was beim STM32 komplex ist, ist nicht der ARM Kern, sondern die
> merkwürdige Peripherie, dabei ist DMA oder ART noch gar nicht gemeint.

Zu dumm daß das eine nicht ohne das andere zu bekommen ist.

von Arc N. (arc)


Lesenswert?

D.Sperber schrieb:
> Lothar schrieb:
>> Was beim STM32 komplex ist, ist nicht der ARM Kern, sondern die
>> merkwürdige Peripherie, dabei ist DMA oder ART noch gar nicht gemeint.
>
> Zu dumm daß das eine nicht ohne das andere zu bekommen ist.

Deshalb sind auch einige Hersteller auf die Idee gekommen Software zu 
schreiben, die einem, zumindest am Anfang, diese ganze 
Konfigurationsorgien abnehmen... CubeMX von ST halte ich da immer noch 
für eine der besten Lösungen (Diskussionen über die Libs besser in einem 
anderen Thread...). Umschreiben und optimieren und sich in die Details 
der div. Peripherie einarbeiten kann man dann immer noch bzw. überlässt 
am Anfang eben dem generierten Code die Arbeit und macht nur das, was 
man sich gerade aneignen will.

von Lothar (Gast)


Lesenswert?

D.Sperber schrieb:
>> Was beim STM32 komplex ist, ist nicht der ARM Kern, sondern die
>> merkwürdige Peripherie, dabei ist DMA oder ART noch gar nicht gemeint.
>
> Zu dumm daß das eine nicht ohne das andere zu bekommen ist.

Die NXP LPC hatten mal einen 8051 Kern und jetzt haben sie einen ARM 
Kern. Die Peripherie ist gleich einfach geblieben. Es gibt sogar 
bitaddressierbaren Speicher ganz ohne Bitbanding.

Beitrag #5128913 wurde von einem Moderator gelöscht.
von Arc N. (arc)


Lesenswert?

Norbert schrieb im Beitrag #5128913:
> Arc N. schrieb:
>> Deshalb sind auch einige Hersteller auf die Idee gekommen Software zu
>> schreiben, die einem, zumindest am Anfang, diese ganze
>> Konfigurationsorgien abnehmen
>
> Da ersetzt das eine nur das andere. Hier noch eine zusätzliche Software,
> da noch eine Hochsprache. Framworks, Tools wohin das Auge blickt. Alles
> will richtig beherrscht und konfiguriert werden. Statt immer mehr
> bürokratischen vereinfachungsvortäuschendem Wasserkopf lieber das Übel
> an der Wurzel packen und gleich möglichst einfache Hard-und Software
> verwenden!

Aufgrund der Andeutungen des TO zu den eigentlichen 
Berechnungen/Algorithmen kann man zumindest schließen, dass sich AVRs 
etc. dazu heute nicht mehr eignen (außer man will schauen wie sich so 
was auf Smartcards etc. macht)...

> Asm auf STM32 fällt jedenfalls nicht in diese Kategorie.

Warum nicht? Alles was nicht extrem optimiert werden muss wird wie 
üblich in einer Hochsprache gemacht. Die kritischen Algorithmen erst mal 
ebenso und wenn das nicht reicht oder um zu sehen was machbar ist, dann 
u.U. die Optimierung mit handgeschriebenem Assembler.
Komplizierter als AVR-Assembler ist Assembler auf Cortex-M ebenso nicht. 
Eher einfacher

Beitrag #5129743 wurde von einem Moderator gelöscht.
von Christopher S. (shalec)


Lesenswert?

Zum Glück muss ich mich mit der Hardware nicht sonderlich rumschlagen :D 
Selbst die LED's sind mir egal. :-)

So lange USART läuft, läufts. Ich werde wohl noch einen F429_USART 
schreiben, damit mein zweiter Mikrocontroller auch die Ausgaben 
auswerfen kann. :) Es liegt vermutlich nur an Adressen, die der 
STM32F429 für das on-Board-Display verbraucht hat.


Apropos On-Board-Display: Gibt es dafür eine Lib, sodass ich darauf 
einfach (Ohne viel Aufwand meinerseits) Text schicken kann, der mir dann 
dargestellt wird? <- Neuer Thread?

von egbert (Gast)


Lesenswert?

Pete K. schrieb:
> egbert schrieb:
>> Abgesehen von der Tatsache, das sich "c" nicht für seriöse und
>> ernsthafte Programmprojekte eignet:
>
> Blödsinn. (siehe z.B. Linux Kernelentwicklung)

Welcher Teil von "ernsthafte Programmprojekte" ist unverständlich?

von F. F. (foldi)


Lesenswert?

egbert schrieb:
> Welcher Teil von "ernsthafte Programmprojekte" ist unverständlich?

Dann hau doch mal einen raus und nenne uns einmal eines deiner 
ernsthaften Projekte, wenn dir Linux schon zu trivial ist!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Christopher S. schrieb:
> Die Primzahl p hat 339-Bit und ich arbeite in GF(p^16).

Woher kommen eigentlich p und GF und die elliptische Kurve?

Ist das alles hausbacken oder implementiert das ein bekanntes, 
beschriebenes System?

M.W. Nicht alle Darstellungen von GF (vermutlich per Adjunktion einer 
formalen Nullstelle eines irr. Polynoms vom Grade 16 über GF(p)) sind 
kryptographisch gleichwertig.

Wenn es um Performace geht und GF "frei" gewählt werden kann, dann wäre 
auch über GF(2^n) nachzudenken — EC über GF(2^n) sind ja kein Hexenwerk 
(und wenn bist du der Hexer).  Über den Daumen gepeilt wäre n > 5000, 
ziemlich viel für ein auf EC basierenden System...

> Einzelne Elemente sollen dann entsprechend in ASM (falls möglich)
> geschrieben werden. D.h. egtl. nur die Multiplikation, Addition,
> Subtraktion und co.

Die meiste Laufzeit werden Multiplikation und Division verschlingen, + 
und + sind da Pillepalle ;-)  Wichtig ist auf jeden fall, kritische 
Daten in schnellen Speicher zu lokatieren; lahmer Speicher kann 
Algorithmen mehr ausbremsen als suboptimaler Code.

Zu bedenken ist auch, dass Asm-Code, der schnell "aussieht", nicht 
unbedingt schnell ist. Wenn du dich nicht genau mit Pipelining, Caching, 
Scheduling etc. auskennst, kann es gut sein, dass ein "schlecht" 
aussehender, von einem Compiler erzeugter Code deinem "optimierten" 
Asm-Code aussticht...

: Bearbeitet durch User
Beitrag #5130176 wurde von einem Moderator gelöscht.
Beitrag #5130195 wurde von einem Moderator gelöscht.
Beitrag #5130202 wurde von einem Moderator gelöscht.
Beitrag #5130207 wurde von einem Moderator gelöscht.
von Christopher S. (shalec)


Lesenswert?

Johann L. schrieb:
> Christopher S. schrieb:
>> Die Primzahl p hat 339-Bit und ich arbeite in GF(p^16).
>
> Woher kommen eigentlich p und GF und die elliptische Kurve?

https://eprint.iacr.org/2017/334
KSS16 mit der 35-Bit Primzahl. Btw. mein "Bit-Zähl-Algorithmus" hat das 
LSB ausgelassen. p hat tatsächlich 340 Bit, was aber keinen Unterschied 
macht.

> Ist das alles hausbacken oder implementiert das ein bekanntes,
> beschriebenes System?

Kommt drauf an. KSS16 Kurven waren kaum bis kein Gegenstand der 
Forschung. Das "optimal Ate-Pairing" hingegen schon. Auch sind die 
verwendeten Methoden bis zum Ende ausgereizt, laut Experten aus dem 
Bereich. Es gibt keine Sicht auf mathematischen Fortschritt in dieser 
Richtung.

> M.W. Nicht alle Darstellungen von GF (vermutlich per Adjunktion einer
> formalen Nullstelle eines irr. Polynoms vom Grade 16 über GF(p)) sind
> kryptographisch gleichwertig.

Ich betrachte F_p[x]/(X^16 -2). Auch habe ich dafür bereits den 
Frobenius-Endomorphismus ausgerechnet. Nun bin ich dabei erstmal die 
Operationen für GF(p^16) zu schreiben, die dann auf GF(p) 
koeffizientenweise basieren. Bei der Multiplikation bin ich mir derzeit 
noch nicht sicher, wie ich das angehe. Dazu gibt es ja einige Paper. 
Auch weiß ich noch nicht, ob ich Montgomery oder Karatsuba verwenden 
werde. Für beide Algos fehlen mir noch Informationen bzw. eine 
Gegenüberstellung. Aktuell würde ich Karatsuba verwenden, wobei ich 
weiß, dass Montgomery in den letzten Jahren immer mehr implementiert 
wurde.

> Wenn es um Performace geht und GF "frei" gewählt werden kann, dann wäre
> auch über GF(2^n) nachzudenken — EC über GF(2^n) sind ja kein Hexenwerk
> (und wenn bist du der Hexer).  Über den Daumen gepeilt wäre n > 5000,
> ziemlich viel für ein auf EC basierenden System...

Ja, zur Charakteristik 2 würden sich einige Berechnung wirklich 
beschleunigen lassen, da es da (Fallabhängig) nur Bitschupsen wäre. 
Leider ist es vorgeschrieben.

>> Einzelne Elemente sollen dann entsprechend in ASM (falls möglich)
>> geschrieben werden. D.h. egtl. nur die Multiplikation, Addition,
>> Subtraktion und co.
>
> Die meiste Laufzeit werden Multiplikation und Division verschlingen, +
> und - sind da Pillepalle ;-)  Wichtig ist auf jeden fall, kritische
> Daten in schnellen Speicher zu lokatieren; lahmer Speicher kann
> Algorithmen mehr ausbremsen als suboptimaler Code.

Ich kenne mich mit den Speichertypen gar nicht aus, habe quasi kein 
Wissen aus der Informatik. Ich versuche nur mein einwöchiges 
C-Buchlesen, etwas Mathematik und Lesen von Algorithmen zu verbinden und 
daraus eine Abgabe zu erschaffen, die wenigistens von den Überlegungen 
her valide erscheint ;) Mit Vorwissen in C und 
Architekturen/Speicherarten und entsprechendes mathematisch vertieftes 
Vorwissen wäre die Arbeit wirklich ein 2 Wochenprojekt. Mein 
(mathematischer) Background liegt bei ca. 60 Seiten bestehend aus für 
mich zu 90% neuem Inhalt.
Als Prozessor habe ich ja den STM32F407VGT6 auf einem CJMCU Board. 
(Bilder hatte ich mal in einem anderen Thread gepostet, den ich auch 
angefangen hatte, um eine LED auf dem Board blinken zu lassen. Was 
übrigens bis heute nicht funktioniert aber auch egal ist, seitdem ich 
USART auslesen kann.)

> Zu bedenken ist auch, dass Asm-Code, der schnell "aussieht", nicht
> unbedingt schnell ist. Wenn du dich nicht genau mit Pipelining, Caching,
> Scheduling etc. auskennst, kann es gut sein, dass ein "schlecht"
> aussehender, von einem Compiler erzeugter Code deinem "optimierten"
> Asm-Code aussticht...

Ja, gute Punkte. Ich werde mich mit ASM auch erst auseinander setzen, 
wenn ich wirklich nichts mehr in C machen kann. Ich hoffe noch im 
September fertig zu werden.
Ich nutze auch viel das Buch von Mrabet "Guide to Pairing-Based 
Cryptography" und eine Vielzahl aktuellerer Paper.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Christopher S. schrieb:
> Ich kenne mich mit den Speichertypen gar nicht aus, habe quasi kein
> Wissen aus der Informatik.

Gibt hier
  * https://www.mikrocontroller.net/articles/Speicher
einen guten Artikel für dem Bereich embedded - mit Vergleich - dazu.

mfg

Olaf

von S. R. (svenska)


Lesenswert?

egbert schrieb:
> Welcher Teil von "ernsthafte Programmprojekte" ist unverständlich?

Wie wäre es mit Windows?
Ist größtenteils in C geschrieben, ebenso wie MS Office.

Arc N. schrieb:
> Aufgrund der Andeutungen des TO zu den eigentlichen
> Berechnungen/Algorithmen kann man zumindest schließen, dass sich AVRs
> etc. dazu heute nicht mehr eignen (außer man will schauen wie sich so
> was auf Smartcards etc. macht)...

Da habe ich mal einem Vortrag von NordicSemi (zu IoT) beiwohnen dürfen, 
wo es u.a. darum ging, was man braucht, um erträgliche Zeiten für 
Bluetooth (Pairing und Verbindung herstellen) bei minimalem 
Energieverbrauch zu erreichen. Das war schon ziemlich beeindruckend, und 
definitiv nix mehr für einen AVR.

von F. F. (foldi)


Lesenswert?

Statt ASM sollten die Hersteller der gesamten µC sich darauf 
konzentrieren, dass das Programmieren viel einfacher wird und somit eine 
viel breitere Masse diese Teile nutzen kann. Erstmal würden dann 
vielleicht viele neue und wichtige Errungenschaften aufkommen (da nicht 
jeder brillante Kopf ASM auf einem Cortex lernen will), die so nie das 
Licht der Welt erblicken.

Und diese ganzen "man muss das von der Picke auf lernen" Typen, sind 
doch auch nur Heuchler. Sie haben auch nicht das Erz ausgegraben, 
eingeschmolzen und aus dem Stahl ein Messer geschmiedet, nur damit sie 
morgens ihr Brötchen scheiden und mit Butter bestreichen können.
Wie viele von diesen Typen können ihr Auto komplett zerlegen, instand 
setzen und dann wieder zusammen bauen. Bin mir sicher, dass die meisten 
nicht mal alle Flüssigkeiten kontrollieren könnten.

von F. F. (foldi)


Lesenswert?

F. F. schrieb:
> egbert schrieb:
>> Welcher Teil von "ernsthafte Programmprojekte" ist unverständlich?
>
> Dann hau doch mal einen raus und nenne uns einmal eines deiner
> ernsthaften Projekte, wenn dir Linux schon zu trivial ist!

Wo bleiben jetzt deine "ernsthaften Projekte"?

von S. R. (svenska)


Lesenswert?

F. F. schrieb:
> Statt ASM sollten die Hersteller der gesamten µC sich darauf
> konzentrieren, dass das Programmieren viel einfacher wird und somit eine
> viel breitere Masse diese Teile nutzen kann.

hust Arduino hust

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.