Forum: Compiler & IDEs ARM-Assembler-Tutorial


von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hi,

ich habe (mal wieder :) ) ein Tutorial geschrieben und würde mich über 
Feedback hier im Thread freuen. Diesmal auf Englisch, vielleicht hilft 
es so mehr Leuten.

Es geht um das Programmieren von ARM-Cortex-M in Assembler. Auch wenn 
Hochsprachen wie C und C++ dort gut verfügbar sind, sind 
Assembler-Kenntnisse zum Debuggen und Low-Level-Code sinnvoll.

Zum Text: ARM-ASM-Tutorial
Beispiel-Code: https://github.com/Erlkoenig90/ArmAsmTutorial

Fragen und Anregungen können hier abgegeben werden :)

: Bearbeitet durch User
Beitrag #5998633 wurde von einem Moderator gelöscht.
von PSblnkd (Gast)


Lesenswert?

@erlkoenig
... Tutorials sind immer willkommen - auch für Assembler, aber warum nur 
in Englisch?

Sind wir schon soweit, dass wir das Deutsche verleugnen müssen?

Eine deutsche Version wäre mir (und vielleicht auch vielen Anderen) viel 
angenehmer.

Grüsse aus Berlin

PSblnkd

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

PSblnkd schrieb:
> aber warum nur
> in Englisch?

Damit mehr Menschen in aller Welt das lesen können.

PSblnkd schrieb:
> Eine deutsche Version wäre mir (und vielleicht auch vielen Anderen) viel
> angenehmer.

Vielen anderen Menschen, welche kein Deutsch können, wäre eine englische 
Version lieber.

von Wilhelm M. (wimalopaan)


Lesenswert?

PSblnkd schrieb:
> @erlkoenig
> ... Tutorials sind immer willkommen - auch für Assembler, aber warum nur
> in Englisch?

Damit es so gut wie jeden erreicht.

Jemand aus dem Bereich Technik/Informatik, der des Englischen zumindest 
lesend nicht mächtig ist, hat den Schuss nicht gehört.

>
> Sind wir schon soweit, dass wir das Deutsche verleugnen müssen?

Tut er doch gar nicht. Er nimmt einfacht die internationale lingua 
franca für Technik (s.o.).

>
> Eine deutsche Version wäre mir (und vielleicht auch vielen Anderen) viel
> angenehmer.

Mimimi, lern endlich Englisch, damit Du die Handbücher zu ARM auch lesen 
kannst.

von Walter T. (nicolas)


Lesenswert?

Niklas G. schrieb:
> ch habe (mal wieder :) ) ein Tutorial geschrieben

Wow. Danke.


Wenn es um Reichweite geht, würde vielleicht der Einstieg über 
Inline-Assembler oder Assembler-Funktionen noch breiteres Interesse 
finden als Projekte komplett in Assembler von Null aufzubauen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Wenn es um Reichweite geht, würde vielleicht der Einstieg über
> Inline-Assembler

Inline-Assembler ist recht komplex mit diversen Fallstricken. Damit 
sollte man sich lieber erst befassen nachdem man die Assembler-Sprache 
an sich beherrscht...

Walter T. schrieb:
> Assembler-Funktionen

Wie man Assembler-Funktionen aus C aufruft ist ja auch gezeigt. Die 
Kapitel über Startup-Code und Linker könnte man zwar überspringen wenn 
man Assembler-Funktionen in C-Projekte einbinden will, aber Kenntnis 
dieser Themen ist allgemein hilfreich wenn man mit Assembler arbeitet. C 
kann einem ziemlich dazwischen funken, weshalb es nicht ganz verkehrt 
ist erstmal nur Assembler und Linker zu nutzen...

von Roland F. (rhf)


Lesenswert?

Hallo
Niklas G. schrieb:
> und würde mich über Feedback hier im Thread freuen.

Vielen Dank für deine Arbeit. Ich persönlich halte allerdings ein 
weitere englische Anleitung zur Assemblerprogrammierung von 
ARM-Prozessoren für überflüssig. Für mich ist deine Arbeit daher leider 
nutzlos.

https://azeria-labs.com/writing-arm-assembly-part-1/
https://www.youtube.com/watch?v=ViNnfoE56V8
https://www.youtube.com/watch?v=Sm6v9UyhCkA
http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/DUI0068.pdf
http://www.peter-cockerell.net/aalp/html/frames.html
u.s.w.

rhf

von Gerd (Gast)


Lesenswert?

Ja danke ganz nett und interessant.
Bin trotzdem der Meinung dass Asm bei den 8Bittern viel besser 
aufgehoben ist.

von Bernd (Gast)


Lesenswert?

schöne Anleitung die Du da geschrieben hast, kommt für mich leider etwa 
ein Jahr zu spät....hab es mir aufwändig selbst beigebracht.

Deshalb hier noch einen Verbesserungsvorschlag:
Wenn die Register noch eigene Namen erhalten liest sich der Code fast 
wie von selbst...

//Arbeits-Register benennen
BASE   .req r0
OFFSET  .req r1
COUNTER  .req r2
POINTER .req r3
VALUE  .req r4
TEMP  .req r5
MASK   .req r6
DELAY  .req r7

//Funktions-Register benennen
.equ  RCC_AHB1ENR,    0x40023830

//Bitnamen für die Funktionsregister benennen
.equ GPIOAEN, 0
.equ GPIOGEN, 6

//TAKT für die Ports G und A einschalten
LDR POINTER, = RCC_AHB1ENR    //lade die Adresse in den Pointer
LDR VALUE,[POINTER]           //lade den Wert aus der aus der Adresse
LDR VALUE, = #((1<<GPIOGEN)|(1<<GPIOAEN))   //schreibe neuen Wert
STR VALUE,[POINTER]        //schreibe den Wert zurück in die Adresse

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Roland F. schrieb:
> https://azeria-labs.com/writing-arm-assembly-part-1/

Dieses Tutorial ist zwar gut gemacht, aber nicht sehr ausführlich und 
vernachlässigt die Toolchain (Linker, Linkerscripte...). Es zeigt auch 
nicht wie man konkret ein Mikrocontroller-Programm umsetzt.

Roland F. schrieb:
> Youtube-Video "Assembly Language Tutorial"

Kann in 38 Minuten wohl kaum die gleiche Menge an Inhalt wie mein 
Tutorial vermitteln.

Roland F. schrieb:
> Youtube-Video "ARM Assembly Language Tutorial - Part 1 - Setup ARM
> Tools"

In 11 Minuten auch nicht.

Roland F. schrieb:
> http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/DUI0068.pdf

Ist keine Schritt-Für-Schritt-Anleitung welche den Leser an konkrete 
Projekte heranführt. Funktioniert außerdem so nur mit den 
proprietären/teuren Tools von ARM selbst. Natürlich ist die ARM-Doku an 
sich aber sehr gut.

Roland F. schrieb:
> http://www.peter-cockerell.net/aalp/html/frames.html

Dito. Ist von 1987 und daher kaum relevant für Cortex-M MCUs.

Gerd schrieb:
> Bin trotzdem der Meinung dass Asm bei den 8Bittern viel besser
> aufgehoben ist.

Wie schon erwähnt sind Assembler-Kenntnisse für bestimmte Situationen 
erforderlich. Ganze Anwendungen wird man da nicht drin schreiben.

Bernd schrieb:
> Wenn die Register noch eigene Namen erhalten liest sich der Code fast
> wie von selbst...

Genau das passiert auch im Tutorial. Der .req Befehl wird gezeigt, aber 
ich halte es für nicht sehr flexibel, den Prozessor-Registern derart 
fixe Bedeutungen zuzuordnen.

von Markus M. (adrock)


Lesenswert?

Ist ganz interessant, aber hat mir gerade wieder gezeigt, dass mir ASM 
auf ARM mit dem Thumb(2) Befehlssatz keine Freude bereiten wird :)

In 68k Assembler konnte man tatsächlich sehr guten Code schreiben, der 
oft effizienter als C und dennoch übersichtlich war. Bei Thumb2 muss man 
viele triviale Sachen "zu Fuß" machen, das kostet Zeit und 
Übersichtlichkeit.

Aber zum Verstehen von übersetztem Code ist es natürlich schön das 
zumindest mal gesehen zu haben.

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Meinen Artikel zu QO-100 habe ich zuerst in deutsch verfasst und jetzt 
noch im englischen Forum https://embdev.net/articles gepostet. Das macht 
zwar etwas mehr Arbeit, aber dank automatischer Rohübersetzung ging das 
recht schnell. Die Stilblüten muss ich noch im Laufe der Zeit ausmerzen, 
ich hoffe, das mir kompetentere Mitleser dabei helfen.

Am ARM Assembler interessieren mich vor allem die DSP-Möglichkeiten. Es 
gibt anscheinend einige ARM-Typen, die z.B. MAC-Befehle und begrenzende 
mathematische Operationen beherrschen, also bei Überschreiten der 16- 
oder 32-Bit Grenze nicht ins negative rutschen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Markus M. schrieb:
> Ist ganz interessant, aber hat mir gerade wieder gezeigt, dass mir ASM
> auf ARM mit dem Thumb(2) Befehlssatz keine Freude bereiten wird :)

Ja, die Architektur ist darauf optimiert Hochsprachen-Code effizient 
ausführen zu können, nicht darauf, schönen Assembler-Code zu haben. Es 
sind einige clevere Tricks nötig, welche in Assembler nicht sehr schön 
sind, aber vom Compiler gut beherrscht werden können.

Christoph db1uq K. schrieb:
> Meinen Artikel zu QO-100 habe ich zuerst in deutsch verfasst und jetzt
> noch im englischen Forum https://embdev.net/articles gepostet.

Na, wenn es einmal schon auf Englisch vorliegt, ist es schon ziemlich 
universell. Wenn jemand Interesse hat das ins Deutsche zu übersetzen...

Christoph db1uq K. schrieb:
> Es
> gibt anscheinend einige ARM-Typen, die z.B. MAC-Befehle und begrenzende
> mathematische Operationen beherrschen

Ja, die Cortex-M4F haben das. Das sind die "saturating" Operationen. 
Bevor man sich damit auseinandersetzt sollte man aber erstmal die Basics 
kennen :)

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Laut Wikipedia wären das:
Atmel: SAM4-Familie (Cortex-M4)
Freescale: Kinetis-Familie (Cortex-M4 und Cortex-M4F)
STMicroelectronics: STM32-F3/F4-Familie (Cortex-M4F)
Infineon: XMC4000-Familie (Cortex-M4F)
Texas Instruments: MSP432, Stellaris-LM4F- und Tiva-TM4C-Familie 
(Cortex-M4F)
NXP Semiconductors: LPC4300-Familie (Cortex-M4)

Wie liegen die preislich, rentiert es sich, die speziell als low-cost 
DSP zu benutzen?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph db1uq K. schrieb:
> Wie liegen die preislich, rentiert es sich, die speziell als low-cost
> DSP zu benutzen?

Die meisten gibt es so im Bereich 3-10€. Das ziemlich beliebte 
STM32F407G Discovery Board mit Cortex-M4 inklusive Debug-Adapter gibt's 
für ca 15€.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die 15€ scheinen vom Billighuber zu sein, Reichelt will 25 und Digikey 
18+Steuer. Der billigste M4F von ST, STM32G441KBT6  bei Reichelt kostet 
4,30€ im LQFP32.

Ich habe mein altes DSP-Projekt schon mehrfach erwähnt, ein IIR-Hilpert 
als Breitband 90 Grad Phasenschieber zur SSB-Erzeugung. Passt mit Mühe 
noch in einen Arduino, aber 2 Bit mehr ADC und viel mehr Power in 
derselben Preislage wäre interessant. Das sind 8 IIR-Allpassfilter mit 
jeweils nur einer Multiplikation und ein paar Additionen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph db1uq K. schrieb:
> Die 15€ scheinen vom Billighuber zu sein, Reichelt will 25 und Digikey
> 18+Steuer.

Das war mal billiger, scheint wohl etwas vergriffen zu sein. Das 
NUCLEO-F446RE hat sogar noch etwas mehr Leistung, kostet aber weniger.

Christoph db1uq K. schrieb:
> Der billigste M4F von ST, STM32G441KBT6  bei Reichelt kostet
> 4,30€ im LQFP32.

Reichelt ist für sowas auch keine Referenz ;-)

von Mistel (Gast)


Lesenswert?

Niklas G. schrieb:
> ...

Ich wollte es nicht nochmal alles zitieren, aber ich sehe es zu 97% wie 
du.


Ergänzend :
Gerade bei dem Drumherum (binutils, Linker, Debugger, ASM) fehlt es 
meistens den Studenten die kommen. Ich habe den Eindruck das ist als 
Basics Einführung für Neueinsteiger genau richtig. Das braucht man nicht 
oft, aber es hilft wenn man eine Vorstellung von dem hat wie sich das 
ganze drum herum aufbaut und welche Möglichkeiten sich da evtl. bei 
bestimmten Problemstellungen ergeben.

An vielen Hochschulen ist es leider so, dass es ein vorgefertigtes 
Project Template gibt wo man nur noch hier und dorthin klickt ohne zu 
wissen was im Hintergrund passiert. Wir hatten hier schon Bewerber 
Embedded Abschlussarbeit die auf die Frage nach dem verwendeten Compiler 
Eclipse gesagt haben :(. Was ein elf/hex/bin File oder Assembler ist 
haben die auch nicht gewusst.

Wünschen würde ich mir auch einen Blick auf inline ASM ... vielleicht 
sollte ich mal selbst den Hintern hochbekommen.
Aber ich bin da auch immer wieder halb raus, nur für Assembler Code in 
meinem Team (10 Personen) zuständig macht ca. 1-4 Tage im Jahr Assembler 
schreiben und das auch noch auf unterschiedlichen Architekturen. Lesen 
deutlich häufiger, Debuggen von optimierten Code -O2/-O3/-Os ist ja 
manchmal etwas schwierig ohne Blick ins Disassembly, aber das kann ich 
zeitlich schlecht beziffern.

*Was mir sehr gut gefallen hat:*
.section .VectorTable, "a" + nachfolgende Beschreibung.
Vielleicht ergänzend:
Wenn man die Section hart auf eine Adresse setzt klappt es ohne 
allocable (übrigens ist da ein Tippfehler), wenn man die Section nur 
einem "MEMORY" zuweist fliegt es raus.
-> das schöne "a" fehlt leider schon mal im Code von ARM :(

Zum Schluss Daumen hoch

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Mistel schrieb:
> Ich wollte es nicht nochmal alles zitieren, aber ich sehe es zu 97% wie
> du.

Danke :)

Mistel schrieb:
> Wir hatten hier schon Bewerber
> Embedded Abschlussarbeit die auf die Frage nach dem verwendeten Compiler
> Eclipse gesagt haben :(. Was ein elf/hex/bin File oder Assembler ist
> haben die auch nicht gewusst.

Oje... Ja genau darum ging es.

Mistel schrieb:
> Lesen
> deutlich häufiger, Debuggen von optimierten Code -O2/-O3/-Os ist ja
> manchmal etwas schwierig ohne Blick ins Disassembly, aber das kann ich
> zeitlich schlecht beziffern.

Ja, es kommt bei mir auch deutlich häufiger vor dass Disassembly-Code 
gelesen wird. IMO lernt man Sprachen aber am Besten via 
Learning-By-Doing, daher kann man auch selber ein Paar Dinge in 
Assembler programmieren um es zu lernen, auch wenn man später nur noch 
Code liest.

Mistel schrieb:
> Wenn man die Section hart auf eine Adresse setzt

Wie meinst du das denn genau? Das Problem taucht nur auf wenn man der 
Section im Linkerscript eine eigene Output-Section zuweist, weil sonst 
das "Alloc"-Bit von anderen Input Sections kommt.

Mistel schrieb:
> übrigens ist da ein Tippfehler

Ups :)

Mistel schrieb:
> -> das schöne "a" fehlt leider schon mal im Code von ARM :(

Ja, ST hat ja teilweise auch Fehler in Linkerscripten - das ganze Thema 
ist wohl doch noch nicht so weit bekannt...

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Danke für das Tutorial, ich habe es mir ausgedruckt und geheftet. Wer es 
auch lieber in Papierform hat, hier das PDF.

Der Nucleo446 sieht gut aus, bei Conrad derzeit sogar etwas billiger 
(17,99€ im Laden) als Reichelt. Jedenfalls bei Händlern weit verbreitet.

Die Datenblatt-Links speziell zu diesem Controller:

PM0214 Programming manual
https://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

Zum Mikrocontroller STM32F446
https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html
->Resources->Technical Literature->Datasheet.

jeweils über 200 Seiten, das werde ich nicht ausdrucken.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph db1uq K. schrieb:
> Der Nucleo446 sieht gut aus, bei Conrad derzeit sogar etwas billiger
> (17,99€ im Laden) als Reichelt. Jedenfalls bei Händlern weit verbreitet.

Jo, wobei ich sagen würde dass es für Hobby nicht auf den letzten Euro 
ankommt. Das Tutorial ist für den STM32F4 aber nur bedingt anwendbar, 
die GPIO- und RCC-Peripherie ist anders (u.a.).

Christoph db1uq K. schrieb:
> jeweils über 200 Seiten, das werde ich nicht ausdrucken.

Die Tabelle mit den Condition Codes liegt immer ausgedruckt neben dem PC 
;-)

Viel Spaß beim Lesen!

von Nop (Gast)


Lesenswert?

Niklas G. schrieb:

> ich habe (mal wieder :) ) ein Tutorial geschrieben und würde mich über
> Feedback hier im Thread freuen.

Wow, das ist ja richtig ausführlich, und sogar inklusive Toolchain! 
Gerade wo GCC manchmal etwas hakelig einzurichten ist, ist das 
hilfreich.

> Fragen und Anregungen können hier abgegeben werden :)

Nur ein paar Typos hätte ich im Angebot:

2.1 Mikrocontroller -> microcontroller

Debug adapter: JTAG oder SWD -> JTAG or SWD

Writing GPIO pins: dafult -> default

Address space: addresses where used -> addresses were used

objcopy: createed -> created

Interfacing C and C++ code: neccessary -> necessary

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Danke :)

Nop schrieb:
> Nur ein paar Typos hätte ich im Angebot:

Ups, sind behoben!

Nop schrieb:
> Gerade wo GCC manchmal etwas hakelig einzurichten ist, ist das
> hilfreich.

Ja genau, da sind bestimmt schon ein paar Anfänger dran gescheitert.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Jatzt kann ich das auch in der Bahn lesen, was mir schon aufgefallen 
ist, der Cortex-M kann nur den T32 Thumb, nicht A32. Ich dachte das sind 
nur 16Bit-Instruktionen. Aber die DSP-Befehle (Multiply-accumulate) sind 
für 32 Bit.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christoph db1uq K. schrieb:
> Ich dachte das sind
> nur 16Bit-Instruktionen. Aber die DSP-Befehle (Multiply-accumulate) sind
> für 32 Bit.

Eine Sache, die ARM nicht kann, Dinge sinnvoll benennen :-)

T32 ist der Thumb-Instruction Set, welcher sich genau wie A32 auf eine 
32bit-CPU mit 32bit-Registern und 32bit-Adressraum bezieht.

Die meisten der T32-Befehle selbst sind 16bit groß, aber manche sind 
32bit. Als Programmierer merkt man von der Größe des Befehls selbst 
nicht so viel, die erkennt man im disassemblierten Code.

Christoph db1uq K. schrieb:
> Aber die DSP-Befehle (Multiply-accumulate) sind
> für 32 Bit.

Kommt drauf an welcher genau gemeint ist. Der "MLA" Befehl (Eine 32bit 
Multiplikation + Addition) ist auf ARMv7-M verfügbar, also 
Cortex-M3/4/7.

Der "SMLAD" Befehl (Zwei 16bit-Multiplikationen und Addition auf ein 
32bit-Register/Integer) ist Teil der DSP-Extension, und die gibt's nur 
auf ARMv7E-M, d.h. Cortex-M4/7.

Dann gibt's noch VMLA für Floating-Point, was nur auf ARMv7M + FPU 
verfügbar ist, also Cortex-M4/7 - mit 32bit "float", bei manchen M7 auch 
mit 64bit "double".

Alles etwas unübersichtlich, die Details entnimmt man dem ARMv7M 
Architecture Reference Manual. Damit hab ich mich auch noch nicht so 
genau auseinander gesetzt.

Auf A32 (ARMv7-A, Cortex-A), ggf. mit NEON-Extension, ist das alles 
nochmal anders...

von Janvi (Gast)


Lesenswert?

> auf die Frage nach dem verwendeten Compiler Eclipse gesagt haben

wir haben auch Kunden (Programmierer!) die beim Support anrufen und 
fragen zu was man einen Stack braucht ...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Christoph db1uq K. schrieb:
> der Cortex-M kann nur den T32 Thumb, nicht A32. Ich dachte das sind
> nur 16Bit-Instruktionen. Aber die DSP-Befehle (Multiply-accumulate) sind
> für 32 Bit.

In Thumb1 konnte man nur die ersten 7 Register direkt adressieren und 
alle Befehle waren 16Bit.
Bei Thumb2 gibts, wie richtig erkannt, auch 32Bit Befehle.
Die sind sogar unaligned über eine 4 Byte Grenze hinweg anzutreffen.
Ein load/store multiple zB ist auch ein 32Bit THumb2 Befehl, der sogar 
1zu1 wie das ARM32 pendant aufgebaut ist.

@Niklas G:
Wirklich ein sehr gutes Tutorial!

Jetzt könnt man noch die MPU in Betrieb nehmen falls man mal ausversehen 
auf NULL zugreift ;)

Exceptions kommen zwar als Überschrift vor, aber ich sehe keinen 
HardFault Handler?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Mw E. schrieb:
> Die sind sogar unaligned über eine 4 Byte Grenze hinweg anzutreffen.

Aber immer mindestens 2-Byte-Aligned.

Mw E. schrieb:
> In Thumb1 konnte man nur die ersten 7 Register direkt adressieren und
> alle Befehle waren 16Bit.

"mov" kann immer alle Register adressieren, zählt das als "indirekt"? 
"bl" war immer 32bit, aber auf Thumb1 ein Sonderfall und eine Art 
Kombination aus "add" und "b".

Mw E. schrieb:
> Wirklich ein sehr gutes Tutorial!

Danke ;-)

Mw E. schrieb:
> Jetzt könnt man noch die MPU in Betrieb nehmen falls man mal ausversehen
> auf NULL zugreift ;)

Die Adresse "0" ist aber gültig und ein Alias für das 0. Byte im 
Flash/SRAM (abhängig von den BOOT-Pins und/oder dem Remap-Register). Es 
gibt noch jede Menge Dinge die man vom Cortex-M erläutern könnte. Das 
würde aber IMO etwas zu weit führen für so ein Tutorial - wenn man 
erstmal die Grundlagen hat, kann man sich da auch selbst einarbeiten.

Mw E. schrieb:
> Exceptions kommen zwar als Überschrift vor, aber ich sehe keinen
> HardFault Handler?

Den könnte man noch einbringen, ja. Auf ARM ist "Exception" der 
Oberbegriff für (durch Peripherie ausgelöste) Interrupts und 
Unterbrechungen durch den Core selbst, wie eben HardFault. Daher ist die 
Überschrift "Exception" nicht falsch, nur weil die Fehler-Exceptions 
nicht behandelt werden :)

von W. (Gast)


Lesenswert?

Danke! Das hat bestimmt Tage gekostet.

(Muss aber auch gestehen, dass es mir auf deutsch lieber wäre).

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Ich habe mal das Tutorial mit Google Translate übersetzen lassen. Es 
funktioniert großenteils ordentlich, da könnte man was draus machen.

Ein paar Erkenntnisse, falls es jemand auch brauchen kann:

Per copy&paste kann man maximal 5000 Zeichen eingeben, mit ca. 200k Text 
wären das etwa 42 Einzeldateien geworden. Als Textdatei hochgeladen 
werden die ersten ca. 32k übersetzt, der Rest ist daran noch im Original 
angehängt. Mit 6-7 Teilen war der Aufwand erträglich.

Störend sind vor allem zusätzlich vom Übersetzer eingefügte Leerzeichen, 
die die Wiki-Anweisungen verhackstücken, z.B. in "</ source", aber das 
ist mit Suchen%Ersetzen schnell erledigt.
Und die Quelltextstücke werden leider auch übersetzt. Aus "kill-exit" 
wird "Töten - Verlassen". Da ist ein Rückgriff auf das Original nötig, 
also Handarbeit angesagt. Auch Tabellen werden durch Leerzeichen 
beschädigt.

Dass "Assembly" auch mal zur "Montage" wird, oder die 
"Uhrenkonfiguration" und ähnliche Stilblüten, da hilft auch nur 
manuelles Nacharbeiten.

Zum Ausprobieren gibt es hier unter "Artikel" die "Testseite", da kann 
man auch die Vorschau benutzen, ohne es dauerhaft zu speichern.
https://www.mikrocontroller.net/articles/Testseite
Einfach neben einer Überschrift "bearbeiten" klicken und da den Text 
reinkopieren, dann unten auf "Vorschau".

Ich hänge das vorläufige Ergebnis hier an, wenn Interesse besteht,kann 
ich es fortsetzen.

: Bearbeitet durch User
von Willi S. (willi_s)


Lesenswert?

... ein ASM-Tutorial in dem auf die Nutzung der sehr reichhaltigen 
OnChip-Pripherie eingegangen wird wäre sehr hilfreich ...

... und befenkt ... die ARM-Familie hat nur eine sehr eingeschränkte 
DSP-Funktionalität ... so fehlen RechenOperationen mit 2 gleichzeitigen 
Speicherzugriffen oder ein Schleifenkontrolle ohne Overhead ... oder 
.........

... wer sich für wirklich leistungsstarke DSPs mit einer interessanten 
Architektur interessiert muß sich die BlackFin Familie von Analog Device 
anschauen ... leider im Hobbybereich recht unbekannt ...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Willi S. schrieb:
> ... ein ASM-Tutorial in dem auf die Nutzung der sehr reichhaltigen
> OnChip-Pripherie eingegangen wird wäre sehr hilfreich ...

Das wäre dann ziemlich aufwendig. Mein Tutorial geht ein bisschen auf 
Peripherie ein, den Rest müsste man sich selbst anlesen. Zur Peripherie 
gibt es ja schon einige C-Tutorials, die kann man sich ja "übersetzen".

Willi S. schrieb:
> so fehlen RechenOperationen mit 2 gleichzeitigen
> Speicherzugriffen

Also Rechnen und Speicherzugriff gleichzeitig? Das widerspricht halt 
ziemlich dem Load-Store-Prinzip. Ansonsten können die DSP-Extensions und 
auch die NEON-Extensions schon einige Rechnungen parallel. Es gibt auch 
Intruktionen zum schnellen Laden/Speichern mehrerer Register.

Willi S. schrieb:
> ... wer sich für wirklich leistungsstarke DSPs mit einer interessanten
> Architektur interessiert

Darum ging's ja auch gar nicht.

von Volker A. (Gast)


Lesenswert?

hallo @erlkönig!


Erstmal danke für das Tutorial!


Ich hatte mich vor langer Zeit hobbymässig mit mobilen Robots 
beschäftigt und will das mal wieder aufnehmen.
Als uC Board verwendete ich damals die C Control II von Conrad mit der 
etwas speziellen Programmiersprache C Basic

Ich wollte das Ganze jetzt mal vernünftig programmieren und habe mich 
eine zeitlang mit den AVRs beschäftigt (Assembler + C mit der AVR GNU 
Toolchain und Arduino Uno)

Aber nun dachte ich, nehme ich mal lieber was ganz Modernes, also ARM 
Cortex-M und bin so auf dieses Tutorial gestossen.

Ich will natürlich nichts wirklich in Assembler programmieren, aber für 
tiefere Verständnis ist das Tutorial vielleicht ganz gut.
Linker Skripte, Makefiles und so sind Neuland für mich

Ich verwende wie vorgeschlagen das STM32F103RB Nucleo Board und die GNU 
ARM Embedded Toolchain + OpenOCD. Ein LED Blink Demo und einfache I/O 
über Push Button und LED laufen schon.


Aber so allmählich kommen bei mir die Fragezeichen.


Also frag ich mal:


Using RAM:  Example RAMVariables

Es wird Speicher alloziert und initialisiert durch   .word 0x20000400
In welcher Section bzw in welchem Speicherbereich findet das statt? 
.text (Flash), .data (SRAM)???
Wenn keine Section explizit angegeben wird, kann man dann von .text 
ausgehen?

Es handelt sich ja wohl um die Startadresse des Stackpointers, die man, 
wie ich durch Herumspielen herausgefunden habe, auch direkt ins Register 
r13 (sp) schreiben könnte (wird bei den AVRs ja auch so gemacht, aber 
bei den Cortex-M läuft das wohl anders?)

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Volker A. schrieb:
> Es wird Speicher alloziert und initialisiert durch   .word 0x20000400
> In welcher Section bzw in welchem Speicherbereich findet das statt?

Da das ganz am Anfang steht, geht das nach ".text", d.h. in den Flash. 
Die .word und .space Direktiven am Anfang erzeugen die Vector Table, die 
am Anfang im Flash stehen muss. Das wird erläutert in den Abschnitten

https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Defining_symbols_in_linker_scripts
https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Improved_vector_table

Volker A. schrieb:
> Es handelt sich ja wohl um die Startadresse des Stackpointers

Ja.

Volker A. schrieb:
> auch direkt ins Register r13 (sp) schreiben könnte

Kann man auch. Es ist gewissermaßen eine Komfort-Funktion, dass der 
Prozessor automatisch dieses erste Wort in das Stack Pointer Register 
lädt. Dadurch kann man den Startup-Code auch in C schreiben, weil der 
Stack sofort funktioniert. Man kann aber auch mit "mov" oder "ldr" werte 
in den SP laden, was man aber normalerweise nur für RTOS o.ä. braucht

von Volker A. (Gast)


Lesenswert?

Danke für die Antwort!

Ich muss leider englischsprachige Texte immer sehr konzentriert 
durcharbeiten. Mal eben auf die Schnelle querlesen funktioniert bei mir 
nicht.

Meine nächste Frage wäre gewesen, warum Du den Stack an Beginn des SRAM 
einrichtest. Aber ich sehe schon, im Kapitel The Stack wird das geklärt.

von vasx (Gast)


Lesenswert?

Ich bekomme das Beispiel "RamVariables" nicht zum Laufen. Object- und 
ELF File werden angelegt. aber das Flashen scheint nicht zu 
funktionieren

Hardware: STM Nucleo F103RB


Assembler Code ist wie im Tutorial

Ich verwende folgendes Build Skript
1
   rem   Assembler + Linker
2
   arm-none-eabi-as -g ram_variables_demo.s -o ram_variables_demo.o 
3
   arm-none-eabi-ld ram_variables_demo.o -o ram_variables_demo.elf -Ttext=0x08000000 -Tdata=0x20000000 
4
   
5
   rem   Flashen via ST-LINK
6
   openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program ram_variables_demo.elf verify reset exit"

Der Aufruf von openocd liefert u.a.

   Warnung:  no flash bank found for 0x20000000
   Error: Verify failed

Test mit dem Debugger liefert
   Reading symbols from ram_variable_demo.elf ...
   Remote Debugging  localhost:3333
   0x2000002e in ?? ()


Um zu sehen, ob da überhaupt was Lauffähiges übertragen wird, habe ich 
ein funktionierendes led_link_demo so verändert, das der 
Zähler-Startwert für die delay-Schleife in den RAM gespeichert und 
anschliessend von dort wieder  gelesen wird. Dasselbe Problem, die LED 
blinkt leider nicht mehr.

Das OpenOCD habe ich von der xPack Seite, der Download von der 
gnu-mcu-eclipse Seite ist depreciated
Ersetzen von stlink-v2.cfg durch stlink.cfg (wg. Warnung stlink-v2.cfg 
is depreciated please use  stlink.cfg) ändert auch nichts.

von Niklas Gürtler (Gast)


Lesenswert?

vasx schrieb:
> Der Aufruf von openocd liefert u.a.

Und was noch?

Klingt als würde er versuchen den RAM zu "flashen". Eigentlich müsste 
OpenOCD erkennen dass das RAM ist. Versuche es mal unter Verwendung 
eines Linker Script wie in weiteren Kapiteln erläutert. Da wird der RAM 
mit dem "NOLOAD" Attribut versehen, wodurch der dann nicht "geflasht" 
wird. Kann es jetzt gerade selbst nicht prüfen...

von Niklas Gürtler (Gast)


Lesenswert?

Du könntest auch mal versuchen das Programm via GDB zu flashen (OpenOCD 
als GDB-Server), der ist da vielleicht cleverer.

von vasx (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Und was noch?


Der Aufruf

  > openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 
"program linker_skript_demo_01.elf verify reset exit"


liefert:
1
xPack OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev (2019-07-17-11:28)
2
Licensed under GNU GPL v2
3
For bug reports, read
4
        http://openocd.org/doc/doxygen/bugs.html
5
WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
6
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
7
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
8
Info : clock speed 1000 kHz
9
Info : STLINK V2J29M18 (API v2) VID:PID 0483:374B
10
Info : Target voltage: 3.272871
11
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
12
Info : Listening on port 3333 for gdb connections
13
target halted due to debug-request, current mode: Thread
14
xPSR: 0x01000000 pc: 0x08000008 msp: 0x20005000
15
** Programming Started **
16
Info : device id = 0x20036410
17
Info : flash size = 128kbytes
18
Warn : no flash bank found for address 0x20000000
19
** Programming Finished **
20
** Verify Started **
21
Error: checksum mismatch - attempting binary compare
22
** Verify Failed **
23
shutdown command invoked

Ich werde mich mal zwischen den Feiertagen mit dem Thema Linker-Skripte 
näher befassen. Vielen Dank erstmal!

von vasx (Gast)


Lesenswert?

Sorry, der Aufruf lautet

> openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program 
ram_variables_demo.elf verify reset exit"

von vasx (Gast)


Lesenswert?

Folgendes etwas umständliches Verfahren funktioniert jetzt (ohne Linker 
Skript)


Erstmal die beteiligten Dateien



ram_variables_demo.s (wie im Tutorial)
1
   // ***   ram_variable_demo.s   ***
2
   
3
   
4
   .syntax unified
5
   .cpu cortex-m3
6
   .thumb
7
   
8
9
   .word 0x20000400                   // startwert sp
10
   .word 0x080000ed                   // adresse reset handler
11
   .space 0xe4
12
   
13
14
   // data segment ->  sram
15
   .data                              
16
      var1:
17
            .space 4                  // Reserve 4 bytes for memory block “var1”
18
      var2:
19
            .space 1                  // Reserve 1 byte for memory block “var2”
20
   
21
   
22
   // code segment ->  flash rom
23
   .text                              
24
             
25
            ldr r0, =var1             // Get address of var1
26
            ldr r1, =0x12345678
27
            str r1, [r0]              // Store 0x12345678 into memory block “var1”
28
29
            ldr r1, [r0]              // Read memory block “var1”
30
            and r1, #0xff             // Set bits 8..31 to zero
31
            ldr r0, =var2             // Get address of var2
32
            strb r1, [r0]             // Store a single byte into var2
33
34
            b .


build.bat
1
   rem  ***   build.bat   ***
2
   
3
   rem Assembler + Linker
4
   arm-none-eabi-as -g ram_variables_demo.s -o ram_variables_demo.o 
5
   arm-none-eabi-ld ram_variables_demo.o -o ram_variables_demo.elf -Ttext=0x08000000 -Tdata=0x20000000
6
   
7
   rem Flashen (Vrsg.: OpenOCD als GDB Server läuft)
8
   arm-none-eabi-gdb --eval-command="target remote localhost:3333" --ex="load" --ex="detach" ram_variables_demo.elf
9
10
   pause



openocd_gdb_server.bat
1
   rem  ***   openocd_gdb_server.bat   ***
2
3
   rem  OpenOCD als GDB Server starten (GDB: Debugger)
4
   rem  ->  Listening on Port 3333 for gdb Connections ... 
5
   openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg



gdb_debug.bat
1
   rem  ***   gdb_debug.bat   ***
2
   
3
   rem  Neues Terminal Fenster öffnen um eine GDB Session zu starten ...
4
   rem  GDB kommandos eingeben ...
5
   arm-none-eabi-gdb  --eval-command="target remote localhost:3333" ram_variables_demo.elf


Ablauf:

openocd_gdb_server.bat starten
build.bat

Alles schliessen

openocd_gdb_server.bat wieder starten
gdb_debug.bat  zum Debuggen

Fertig

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So, habe es bei mir mal nachgestellt und es geht tatsächlich nicht 
direkt per OpenOCD. Habe daher einen entsprechenden Hinweis im Text 
ergänzt. Danke!

von Gernot S. (Firma: Ing. Gernot Schreiner) (leuchtspirale)


Lesenswert?

Hallo erlkoenig!

Vielen Dank für dein Tutorial, das ich jetzt weitgehend durchgearbeitet 
habe. :-)
Mit über 30 Jahren Erfahrung im Assemblerprogrammieren, waren die 
Erklärungen des Befehlssatz für mich sehr leicht zu verstehen und eine 
sehr gute Ergänzung zum ARM-Manual, auch wenn der Cortex-M ein paar 
ungewöhnliche Eigenheiten hat (IT, BL ohne PUSH des PC).
Besonders hilfreich für mich war die Einführung in die Toolchain 
inklusive der Downloadlinks, da ich bisher noch nie mit der 
GNU-Toolchain gearbeitet habe (6502 am C=64, 68HC05 mit IAR, MC9S12X mit 
CodeWarrior, div. Microchips mit MPLAB).

Ein Satz ist mir besonders aufgefallen:
"The ISR first checks whether the interrupt flag in the timer register 
is set - this is necessary, since exceptions can sometimes occur 
“spuriously”, i.e. without an actual event causing it."
Gibt's diese Glitches beim ARM bzw. ST wirklich? Ich hab' in den letzten 
Jahrzehnten keine solchen Sicherheitsabfragen drinn und es sind keine 
Probleme aufgetreten (und die hätte ich sicher bemerkt, bei der Menge an 
Interrupts die ich pro Anwendung verwende).
Bei einer externen PIN-Quelle (also "normaler" Interrupt-Pin) ist es 
selbverständlich, nochmal zu prüfen ob da wirklich eine Flanke war. Aber 
gibt es wirklich Interrupts von internen Quellen, wobei des 
entsprechende Interruptflag nicht mal gesetzt ist?
Ist das eine Vorsichtsmassnahme von dir, oder gibt's da sonst noch 
irgendwelche Hinweise von Hersteller oder Nutzern?

Grüsse, Gernot Schreiner

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Gernot S. schrieb:
> Vielen Dank für dein Tutorial, das ich jetzt weitgehend durchgearbeitet
> habe. :-)

Danke, gern ;-)

Gernot S. schrieb:
> Gibt's diese Glitches beim ARM bzw. ST wirklich?

Ich hatte das so noch im Hinterkopf und nicht mehr genau nachgeprüft. 
Wenn überhaupt tritt das sowieso nur selten und vermutlich nur mit 
bestimmten Peripherie-Modulen/Konfigurationen auf, aber ich würde nicht 
garantieren dass es in "normalen" Anwendungsfällen absolut nie passiert, 
weshalb ich das zur Sicherheit immer einbaue.
Zudem sind bei vielen Peripherien (inkl. Timer) mehrere Ereignisse auf 
den selben IRQ gemappt, weshalb man, wenn man mehrere nutzt, ohnehin 
abfragen muss, welches Ereignis jetzt genau eingetreten ist. In 
Assembler ist das ganze natürlich etwas lästiger als in C, aber das ist 
dann eben so :-)

von Tom (Gast)


Lesenswert?

Great tutorial!!!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Gernot S. schrieb:
> auch wenn der Cortex-M ein paar
> ungewöhnliche Eigenheiten hat (IT, BL ohne PUSH des PC)

Das liegt daran, dass ARM allgemein eine Load and Store Architektur hat, 
also alle Befehle arbeiten nur auf Registern, AUßer eben spezielle Lade 
und Speicherbefehle.
Deswegen packt BL den PC ins Linkregister und wenn eine Unterfunktion 
selber BL nutzt muss der das aben auf den Stack packen.

IT ist son Spezialfall um die bedingte AUsführung der großen ARM Kerne 
auch auf den C-M eingeschränkt anzubieten.
Damit ein kleines if else nicht die Pipeline stallt durch Sprünge.

von Traveler (Gast)


Lesenswert?

Thank you for writing this tutorial. It was exactly the low level, 
progressive content I needed.

von Tobias P. (hubertus)


Lesenswert?

Christoph db1uq K. schrieb:
> Ich habe mein altes DSP-Projekt schon mehrfach erwähnt, ein IIR-Hilpert
> als Breitband 90 Grad Phasenschieber zur SSB-Erzeugung. Passt mit Mühe
> noch in einen Arduino, aber 2 Bit mehr ADC und viel mehr Power in
> derselben Preislage wäre interessant. Das sind 8 IIR-Allpassfilter mit
> jeweils nur einer Multiplikation und ein paar Additionen.

Aha aha! das klingt interessant. Kann man das irgendwo anschauen?
ich habe es mal analog gemacht. Funktioniert. Der Vergleich zur DSP 
Lösung wäre spannend.

Tobias

von bitflipser (Gast)


Lesenswert?

1000 Dank für dieses hervorragende Tutorium, einfach Klasse wie es 
Schritt für Schritt aufbaut. Damit ist der (sehnlichst gesuchte) 
Einstieg in ARM-ASM endlich gelungen.

Dank und Gruß
Stefan

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

>Kann man das irgendwo anschauen?
https://www.mikrocontroller.net/articles/Hilbert-Transformator_(Phasenschieber)_mit_ATmega
schon 10 Jahre her, aber die Mathematik hat sich nicht verändert.

Für QO-100 ist das wieder interessant geworden. Ein SSB-Sender 
herkömmlicher Art für 2,4 GHz braucht einiges an Filtertechnik und 
mehrfache Umsetzung, das wird mit der Phasenmethode wesentlich 
einfacher.
Zwischen Mikrofonverstärker und IQ-Aufwärtsmischer nur ein Arduino oder 
ARM als Phasensplitter, reine Niederfrequenztechnik.

von MaWin (Gast)


Lesenswert?

Niklas G. schrieb:
> Es geht um das Programmieren von ARM-Cortex-M in Assembler

Warum sollte man das tun? Ein guter Compiler optmiert 10mal besser als 
du. Warum? Weil die Jungs 8h an dem Ding feilen. ;-)

von MaWin (Gast)


Lesenswert?

8h pro Tag

von Niklas Gürtler (Gast)


Lesenswert?

bitflipser schrieb:
> 1000 Dank für dieses hervorragende Tutorium, einfach Klasse wie es
> Schritt für Schritt aufbaut. Damit ist der (sehnlichst gesuchte)
> Einstieg in ARM-ASM endlich gelungen.

Danke, freut mich dass es geholfen hat!

MaWin schrieb:
> Warum sollte man das tun?

Das ist hier nachzulesen:

https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Why_assembly.3F

von MaWin (Gast)


Lesenswert?

Cross posting? Nein Danke.

Assembler ist wie Autofahren a la Fred Feuerstein. Obwohl, das kommt 
wieder in Mode; die Leute haben zuviel lange Weile. :-(

von chris_ (Gast)


Lesenswert?

MaWin (Gast)
24.04.2021 21:27
>Warum sollte man das tun? Ein guter Compiler optmiert 10mal besser als
>du. Warum? Weil die Jungs 8h an dem Ding feilen. ;-)

Klingt nach logischem Schluss, ist aber keiner.

Man wird in C niemals die Maschine wie mit Assembler ausreizen können.
Wenn Du's nicht glaubst, programmiere das

Beitrag "17 Kanal Avr Synthesizer in Asm"

oder das

https://www.linusakesson.net/scene/craft/index.php

in C.

von chris_ (Gast)


Lesenswert?

Die hier gehört auch noch dazu:
Beitrag "Audio Spektrum Analyzer mit ATtiny85"

von MaWin (Gast)


Lesenswert?

chris_ schrieb:
> programmiere das

Kindchen, lies den Titel "... ARM ..." !

Nicht altes Kinderspielzeugs a la AVR. :-<<<

von chris_ (Gast)


Lesenswert?

>chris_ schrieb:
>> programmiere das
>Kindchen, lies den Titel "... ARM ..." !

Du darfst das geschriebene auf die ARM-Controller übertragen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Fairerweise muss man sagen, dass man bei ARM-Controllern in den 
allermeisten Fällen einfach einen 10% schnelleren Controller nehmen 
kann, um den ggf. vorhandenen Performance-Nachteil der Hochsprache 
auszugleichen, sofern denn überhaupt einer vorhanden ist. Wie im Artikel 
beschrieben sind Assembler-Kenntnisse eher zum Debuggen oder Schreiben 
von Startup-Codes, RTOSes o.ä. sinnvoll.

von In ASM denken ... (Gast)


Lesenswert?

Wer in ASM programmiert denkt auch in den Strukturen des Prozesses und 
wird seine Aufgabenstellung optimal auf diese Anpassen ... dabei gilt 
die Regel ... je komplexer / leistungsfähiger die Architektur des 
Prozessors - desto mehr EffizienzGewinn dur Assembler-Programmierung ... 
als Beispiel möchte ich die BlackFin-Familie von Analog Devices erwähnen 
... hier gilt es jeden Takt optimal zu nutzen - was auch möglich ist ... 
wo hingegen die ARM-Familie hier "grottenschlecht" anschneidet ... 
einfach viel zu viel unnütze "Penalty-Clocks" auf die der Programmier 
(fast) keinen Einfluß hat ...

von bitflipser (Gast)


Lesenswert?

Ich suche in Ergänzung zum Tutorial ein Register Definition Include für 
den STM32F103C8T6 auf dem BluePill-Board, also so etwas in der Art:
1
...
2
GPIOA      = 0x40010800
3
GPIOB      = 0x40010c00
4
GPIOC      = 0x40011000
5
GPIOD      = 0x40011400
6
7
GPIOx_CRL    = 0x000
8
GPIOx_CRH    = 0x004
9
GPIOx_IDR    = 0x008
10
GPIOx_ODR    = 0x00c
11
GPIOx_BSRR    = 0x010
12
GPIOx_BRR    = 0x014
13
GPIOx_LCKR    = 0x018
14
15
GPIOx_CRx_GP_PP_10MHz  = 0b0001
16
GPIOx_CRx_GP_PP_2MHz  = 0b0010
17
...

Dank und Gruß
Stefan

von MaWin (Gast)


Lesenswert?

In ASM denken ... schrieb:
> Wer in ASM programmiert denkt auch in den Strukturen des Prozesses und
> wird seine Aufgabenstellung optimal auf diese Anpassen

Totaler Schwachfug! Ein Mensch denkt immer in Objekten, Dinge die er 
sieht. Dinge, die in engem Zusammenhang stehen. So eine Binärmaschine 
bedarf eines hohen Abstraktionsvermögen zur Umsetzung in die Relaität. 
Bei den komplexen Zusammenhängen heute (ARM Cortex und der Realisierung 
von mehr als elektronischem Würfel oder Modell Ampelschaltung) lässt 
sich das nicht vernünftig in ASM umsetzen. Deine Vorarbeiten auf Papier 
kannste gleich in eine Hochsprache stecken. Je abstrakter, desto 
effizienter.

Beitrag #6692055 wurde von einem Moderator gelöscht.
von chris_ (Gast)


Lesenswert?

von MaWin (Gast)

>In ASM denken ... schrieb:
>> Wer in ASM programmiert denkt auch in den Strukturen des Prozesses und
>> wird seine Aufgabenstellung optimal auf diese Anpassen

>Totaler Schwachfug! ... Je abstrakter, desto
>effizienter.

Genau an dem Punkt liegst du ziemlich falsch. Optimierung findet auf der 
konkreten und nicht der abstrakten Ebene statt.

von (prx) A. K. (prx)


Lesenswert?

In ASM denken ... schrieb:
> je komplexer / leistungsfähiger die Architektur des
> Prozessors - desto mehr EffizienzGewinn dur Assembler-Programmierung ...

Auf der Ebene von Mikrocontrollern kann das noch funktionieren. Auf der 
Ebene von x86 oder Highend-ARM ist das mittlerweile sehr schwierig. Die 
Komplexität ist zu gross, die Doku zu ungenau, die einzurechnenden 
Faktoren zu vielfältig.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

chris_ schrieb:
> Genau an dem Punkt liegst du ziemlich falsch. Optimierung findet auf der
> konkreten und nicht der abstrakten Ebene statt.

Es gibt konkrete Optimierung auf Befehls- und Registerebene. Es gibt 
abstrakte Optimierung der Algorithmen (Theorie, à la Knuth/Wirth). Wurde 
die abstrakte Strategie aufs falsche Gleis gesetzt, sitzt man vielleicht 
so tief in der Tinte, dass konkrete Optimierung für die Katz ist.

Und es gibt dazwischen eine Optimierung der Algorithmen unter 
Berücksichtigung von Speicherzugriffszeiten und -Strategien aktueller 
Prozessoren (z.B. ist sequentieller Zugriff im RAM so viel schneller als 
zufälliger, dass einstmals für Bandbetrieb gute Algorithmen auch im RAM 
sinnvoll sein können. Das hatte Knuth nicht auf der Rechnung.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

(prx) A. K. schrieb:

> Auf der Ebene von Mikrocontrollern kann das noch funktionieren. Auf der
> Ebene von x86 oder Highend-ARM ist das mittlerweile sehr schwierig.

Aber immer noch möglich. Und kann zu kaum glaubhaften 
Performance-Vorteilen führen. Typisch natürlich vor allem dann, wenn man 
Maschinen-Features verwendet, die der verwendete Compiler schlicht noch 
garnicht kennt. So ist das, wenn man sich von den Werken Anderer 
sklavisch ergeben abhängig macht (und das auch noch gut findet)...

Aber auch ohne solchen "unfairen" Vorteile ist der Mensch immer noch 
besser als der Compiler. Wenn er halt gut genug ist.

Ja klar, es ist längst nicht mehr so einfach, richtig überragende 
Vorteile zu erzielen, wie es früher(tm) mal war. Die Compiler für die 
x86 und die ARMs sind wirklich in den letzten 20 Jahren sehr viel besser 
geworden. Aber ein paar Prozent (einstellig) mehr mit Asm gehen auch 
heute praktisch noch immer. Und das ohne allzu große Mühe. Wenn man es 
halt einfach kann...

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
... und du bist immer nur noch auf dem Tiny unterwegs? 🤣

von Walter T. (nicolas)


Lesenswert?

Niklas G. schrieb:
> Die Tabelle mit den Condition Codes liegt immer ausgedruckt neben dem PC
> ;-)

Ist damit diese Tabelle (ungefähr in der Mitte der Seite) gemeint, oder 
gibt es übersichtlichere Tabellen mit Befehlen und Condition Codes, die 
sich besser zum ausdrucken eignen?

https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/condition-codes-1-condition-flags-and-codes

Nachtrag: Für europäische Papierformate nicht so toll, aber 
verlinkenswert:
https://users.ece.utexas.edu/~valvano/Volume1/QuickReferenceCard.pdf
https://developer.arm.com/documentation/qrc0001/m/
Leider etwas aufgebläht, weil nicht nur Thumb2-Befehlssatz.

: Bearbeitet durch User
von Niklas Gürtler (Gast)


Lesenswert?

Walter T. schrieb:
> Ist damit diese Tabelle (ungefähr in der Mitte der Seite) gemeint

Ja, die gibt es noch mal im ARMv7M Architecture Reference Manual, das 
ist IIRC A4 Format.

von Walter T. (nicolas)


Lesenswert?

Niklas Gürtler schrieb:
> ARMv7M Architecture Reference Manual

Danke! Das ist noch einmal deutlich besser durchsuchbar als die 
Web-Hilfe.

von rbx (Gast)


Lesenswert?

Walter T. schrieb:
> Das ist noch einmal deutlich besser durchsuchbar als die
> Web-Hilfe.

Du kannst bzw. solltest diese dir entgegenkommende Übersicht auch selber 
machen, nach eigenem Gusto, es sind nur eine Handvoll Befehle, dazu 
Flags, Programmierregeln und -techniken, Spezialfälle, Kommunikation im 
lokalen Verbund, Undoku-Zeugs, konkretes Entwicklungskit usw.
Also eigentlich RISC..
https://developer.arm.com/documentation/dui0068/b/CIHEDHIF
https://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/

von Walter T. (nicolas)


Lesenswert?

@Niklas:

Sind eigentlich kleine Korrekturen/Ergänzungen gewünscht, oder willst Du 
das Tutorium lieber komplett unter Deinen Fittichen behalten?

Ich bin noch nicht ganz durch, aber war mir schon aufgefallen ist:
 - Links zu den entsprechenden Dokumenten des Instructions Sets wären 
sinnvoll
 - Bei den Immediates jeweils die Grenze benennen (um schnell ein Gefühl 
für die Größenordnung zu bekommen)
 - Das Verb "utilized" an unpassender Stelle ist mir ja immer ein Dorn 
im Auge :-)

Oder Änderungsvorschläge auf die Diskussionsseite?

Ansonsten finde ich bis jetzt alles ziemlich gut aufeinander aufgebaut 
(bin jetzt grob bei der Hälfte).

von Niklas Gürtler (Gast)


Lesenswert?

Walter T. schrieb:
> Sind eigentlich kleine Korrekturen/Ergänzungen gewünscht

Klar, deswegen ist es ja ein Wiki 😉 Größere Änderungen sollte man 
vielleicht vorher hier absprechen.

von Walter T. (nicolas)


Lesenswert?

Nachtrag: Die Sachen, die mich am Anfang gestört haben, tun es im 
Nachhinein nicht mehr.

An vielen Stellen war das, was mich gestört hat, wenn im Quelltext 
Konstrukte standen, die noch nicht erklärt waren. Das hat dann immer 
etwas Suche in den von ARM bereitgestellten Materialien gekostet, nur um 
es dann am Ende des jeweiligen Kapitels doch noch einmal erklärt zu 
finden.

Erst nutzen - dann erklären oder andersherum ist wohl eine Frage des 
persönlichen Stils und hat deswegen keinen Verbesserungsbedarf. Im 
Nachhinein ist das auch keine verschwendete Zeit gewesen. So ist man 
eben schon recht zügig mit der Doku von ARM vertraut gemacht worden und 
hat auch direkt seinen eigenen Spickzettel geschrieben. (Einen eigenen 
Spickzettel zu schreiben halte ich immer noch für einen wichtigen Faktor 
beim Lernerfolg.)

Ein wenig fehlt mir am Ende noch ein "Und jetzt ...", aber das wird wohl 
darauf hinauslaufen, Joseph Yius "Definitive Guide to ARM Cortex-M3 and 
Cortex-M4 Processors" noch einmal zu inhalieren.

Deswegen an Niklas: Danke für dieses nützliche Tutorial!

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Erst nutzen - dann erklären oder andersherum ist wohl eine Frage des
> persönlichen Stils und hat deswegen keinen Verbesserungsbedarf.

Ich find's immer etwas blöd erst alle Details haarklein zu erläutern und 
dann auf das "big picture" zu kommen - so blickt man auch nicht schnell 
durch, worum es geht. Wenn ein Hello World in C erläutert wird, kommt 
auch nicht zuerst eine Erklärung des "#include <stdio.h>".

Walter T. schrieb:
> Ein wenig fehlt mir am Ende noch ein "Und jetzt ...",
Stimmt, ein "Literatur"-Kapitel wäre nicht schlecht, vielleicht auch am 
Anfang.

Walter T. schrieb:
> Deswegen an Niklas: Danke für dieses nützliche Tutorial!
Danke ;-)

von Walter T. (nicolas)


Lesenswert?

Niklas G. schrieb:
> Ich find's immer etwas blöd erst alle Details haarklein zu erläutern und
> dann auf das "big picture" zu kommen - so blickt man auch nicht schnell
> durch, worum es geht.

Ich bin auch ein entschiedener Fan von "erst die Übersicht - dann der 
Kleinkram". Die sinnvolle Reihenfolge hängt auch immer ein wenig vom 
Lerntyp ab.

Ich habe immer versucht, den Assembler-Quelltext nach der Beschreibung 
vom Anfang erst einmal selbst zu schreiben, und habe deswegen auch die 
Teile immer in der Reihenfolge angegangen, wie ich normal eine 
Programmieraufgabe angegangen wäre. Wenn ich nicht weiterkam, wurde dann 
ein Blick auf die Vorlage geworfen. Und da stand dann (fast) immer ein 
Konstrukt, was ich nie zuvor gesehen habe.

Andere werden wahrscheinlich anders vorgehen.

Niklas G. schrieb:
> Wenn ein Hello World in C erläutert wird, kommt
> auch nicht zuerst eine Erklärung des "#include <stdio.h>".

Und das "Hello World" ist natürlich die Ausnahme von der Regel "erst 
selbst versuchen - dann abgucken.". Da geht es ja erst einmal darum, die 
Entwicklungsumgebung am Laufen zu haben.

Niklas G. schrieb:
> Stimmt, ein "Literatur"-Kapitel wäre nicht schlecht, vielleicht auch am
> Anfang.
Die Quick Reference Card wäre noch eine sinnvolle Ergänzung bei den 
Manuals am Anfang. Ich habe mir mal erlaubt, diese zu ergänzen, und die 
nicht mehr funktionierenden Links auf static.docs.arm.com wieder zu 
füllen.

von Nop (Gast)


Lesenswert?

Wieso ist bei Hex-Konstanten , die mit #0x... beginnen, eigentlich "#0" 
in grau geschrieben und alles ab dem 'x' in rot?

Im Gegensatz dazu sind Hex-Konstanten, die nicht in einem 
Assemblerbefehl stehen, sondern als Datenwort auftauchen (also ohne #), 
komplett in grau.

Auch Zahlen in Assemblerbefehlen, die nicht in Hex sind, z.B. "#1234", 
sind komplett in grau.

von Walter T. (nicolas)


Lesenswert?

Nop schrieb:
> Wieso ist bei Hex-Konstanten , die mit #0x... beginnen, eigentlich "#0"
> in grau geschrieben und alles ab dem 'x' in rot?

Wenn ich raten müsste: Die Foren-Software hat keine ASM-Formatierung, 
sondern nur "code" allgemein. Die "#" werden dann als Anfang einer 
HTML-Farbe interpretiert und ab dem "x" weiss der Interpreter, dass er 
falsch liegt.

von Andre (Gast)


Lesenswert?

Wow. Vielen Dank für dieses sehr aufschlussreiche, äußerst verständlich 
geschriebene und sehr gut aufgebaute Tutorial!!!

Ich selbst komme aus der Webentwicklung und beschäftige mich nur privat 
mit dem STM32G0. Meine kleinen Projekte basieren nicht auf kommerzielle 
Interesse, sondern auf dem Interesse an der Technologie und der 
Funktionsweise.

ST versucht mit CubeMX den Einstieg leicht zu machen und das geht nunmal 
nur, wenn man stark abstrahiert und automatisiert. Selbst bei Verzicht 
auf HAL wird man von dem generierten Projektordner erstmal erschlagen. 
Nach dem Motto: Hier ist der End-User-Bereich, tippe da dein Code rein 
und ignoriere alles, was oben und unten steht. Was wurde generiert, 
warum und wie genau hängt das alles zusammen? Warum habe ich das Gefühl, 
dass in dem Projektordner weit mehr Zeug generiert wurde, als ich für 
mein einfaches Projekt benötige?
Ich habe viele Tutorials gelesen, um solche Fragen für mich beantworten 
zu können. Mit Hilfe deiner Ausführungen bin ich jetzt endlich in der 
Lage, den LL-Bereich grundlegend nachzuvollziehen zu können. 
Insbesondere der Startup-Prozess des Controllers und die Zusammenhänge 
beim Kompilierprozess sind sehr verständlich dargestellt.
Vielen Dank für die Arbeit, die Du da reingesteckt hast. Für mich ist 
das das bisher beste Tutorial zum Thema.

P. S.: Dass hier teilweise über Sinn/Unsinn von ASM diskutiert wird, 
führe ich darauf zurück, dass einige Leute mit dem genannten 
End-User-Bereich entweder komplett OK sind oder es einfach nicht gerne 
sehen, wenn ihr mühsam erarbeitetes Know-how auf eine derart einfache 
Art beschrieben werden kann.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Andre schrieb:
> Wow. Vielen Dank für dieses sehr aufschlussreiche, äußerst verständlich
> geschriebene und sehr gut aufgebaute Tutorial!!!

Danke für die Blumen ;-)

Andre schrieb:
> ST versucht mit CubeMX den Einstieg leicht zu machen und das geht nunmal
> nur, wenn man stark abstrahiert und automatisiert. Selbst bei Verzicht
> auf HAL wird man von dem generierten Projektordner erstmal erschlagen.

Beim STM32 geht es eigentlich noch. Im Wesentlichen ist das auch nur ein 
Linkerscript, Startup-Code (der praktisch nur ein memcpy, ein memset und 
eine Schleife für die Konstruktoren enthält), und Clock-Initialisierung. 
Die HAL oder LL-Library kann man dann optional aufrufen, entweder mit 
eigenem oder generiertem Code.

Bei anderen Controller-Familien ist das noch viel schlimmer, wo man mal 
ein paar Wochen brauchen kann bis man eine Hello World (in C) kompiliert 
und geflasht hat, weil man erstmal über den Support herausfinden muss, 
welche der ganzen komplexen Tools überhaupt wie miteinander spielen und 
weil selbst der Demo-Code erstmal nicht kompiliert. Da sehnt man sich 
nach so einem handlichen genügsamen STM32H7 :)

von Jan (Gast)


Lesenswert?

Ich programmiere ja wirklich gerne in ASM, aber nachdem ich mir die 
ARM-Architektur angeschaut habe, musste ich zum Schluss kommen, dass 
dort ASM eine noch wesentlich masochistischere Ader vorraussetzt als 
AVR-ASM.

Beim AVR kann man durchaus darüber diskutieren, ob es sinnvoll ist oder 
nicht, Projekte komplett in Assembler zu schreiben, aber beim ARM sehe 
ich da wirklich keine Sinnhaftigkeit mehr.

In ASM bekommt man bei komplexeren Routinen immer schnell das Problem, 
dass es zu wenig Register gibt, so dass man gezwungen wird, Register 
doppelt zu belegen, also wiederzuverwenden. Sowas ist einem C-Compiler 
natürlich völlig egal, aber für das menschliche Gehirn wirds dann 
langsam kompliziert.

Glücklicherweise hat der AVR ja 32 Register. Da kann man als Mensch noch 
gut mit arbeiten. Der ARM hat, wenn ich das in meiner relativ kurzen 
Recherche richtig rausgefunden habe, jedoch nur 16, von denen man nur 12 
wirklich frei nutzen kann.

Mit 12 Registern haste net viel Spass...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Jan schrieb:
> Beim AVR kann man durchaus darüber diskutieren, ob es sinnvoll ist oder
> nicht, Projekte komplett in Assembler zu schreiben, aber beim ARM sehe
> ich da wirklich keine Sinnhaftigkeit mehr.

Ja, darum ging es auch nie. Das wäre wenn schon nur eine Knobelei "just 
for fun". Ich finde den ARM-Assembler allerdings angenehmer als den 
AVR-Assembler, einfach weil man viel mehr auf einmal erledigen kann. Das 
wird allerdings durch die üblicherweise komplexere Peripherie der 
meisten Cortex-M ausgeglichen, die mehr Register-Zugriffe braucht.

Jan schrieb:
> Der ARM hat, wenn ich das in meiner relativ kurzen
> Recherche richtig rausgefunden habe, jedoch nur 16, von denen man nur 12
> wirklich frei nutzen kann.

Es sind 13, es sei denn man belegt eines fix als Frame Pointer oder 
Basispointer für PIC o.ä. Die schräge Zahl kommt daher, dass viele 
Befehle einen 4bit-Wert für Register-Operanden haben, und es eben drei 
Spezial-Register gibt (r13=SP, r14=LR, r15=PC). Weil man alle Register 
einheitlich (mit Ausnahmen) über Instruktionen ansprechen möchte, sind 
diese drei Register eben Teil der möglichen 16, sodass 13 übrig bleiben. 
Dabei ist es so, dass r13 und r14 im Prinzip nahezu beliebig auch für 
Berechnungen genutzt werden können - wenn man aber sein Programm 
"normal" mit Funktionen, Stack, Rücksprüngen & Co strukturiert, darf man 
den r13=SP natürlich nicht "verlieren". Das r14=LR hingegen kann man auf 
dem Stack sichern, wenn man 14 Register braucht. Beim Zurückkehren kann 
man dann mit POP die Rücksprungadresse direkt ins PC holen.

z.B. die Funktion
1
.type test, %function
2
test:
3
  push { r4-r11, lr }
4
  
5
  @ Inhalt...
6
    
7
  pop { r4-r11, pc }

Kann alle 14 Register nutzen von r0-r12 sowie r14=LR, und kann mit der 
Standard ARM Calling Convention (AACPS) auch ganz normal von C-Code aus 
aufgerufen werden.

Jan schrieb:
> Mit 12 Registern haste net viel Spass...

Es geht eigentlich, schließlich braucht man ja auch nur eines für 
Pointer statt zwei wie beim AVR, und man hat viel weniger 
Zwischenergebnisse dank Offset-Adressierung. Für die typische 
Assembler-Routine die man mal als Glue-Code, Kontextwechsel für RTOS, 
Startup-Code, hochoptimiertes memcpy o.ä. braucht reicht das locker ohne 
Doppelbelegung.

: Bearbeitet durch User
von Klaus S. (kseege)


Lesenswert?

Jan schrieb:
> Mit 12 Registern haste net viel Spass...

Von wegen! Mit 4 Registern baue ich mir eine virtuelle 2-Stack-Maschine 
und mit 30 Befehlen in 1KB Assemblercode habe ich eine Hochsprache, die 
vieeeel Spaß macht :-)
Man muß aber Spaß am Denken haben, das liegt nicht jedem ;-(

Gruß
Klaus (der soundsovielte)

von Andre (Gast)


Lesenswert?

Niklas G. schrieb:
> Bei anderen Controller-Familien ist das noch viel schlimmer, wo man mal
> ein paar Wochen brauchen kann bis man eine Hello World (in C) kompiliert
> und geflasht hat, weil man erstmal über den Support herausfinden muss,
> welche der ganzen komplexen Tools überhaupt wie miteinander spielen und
> weil selbst der Demo-Code erstmal nicht kompiliert. Da sehnt man sich
> nach so einem handlichen genügsamen STM32H7 :)

Puh, zum Glück muss ich nicht soweit gehen :)
Die Idee ist, sich komplett auf eine Mainstream-Familie einzuschießen, 
von der man sich vorstellen kann, dass sie sämtliche eventuelle 
Anforderungen im Hobbybereich erfüllen kann (Gartenbewässerung, 
Rolladen- und Lichtsteuerung, etc.). Für diese dann eine sehr minimale 
und wiederverwendbare Grundstruktur in Hard- und Software aufzubauen und 
bedarfsgesteuert mit eigenentwickelten, stark zugeschnittenen und 
minimalistischen Bibliotheken zu erweitern. Angefangen von der Idee über 
die Platinenerstellung bis hin zur hoffentlich nützlichen 
Steuerungseinheit will ich den gesamten Prozess tiefgreifend verstehen 
und für meine Zwecke beherrschen können.
Der Weg ist das Ziel. Ich erwarte mir davon hunderte von Abendstunden 
voller freudebringender Erfolgsmomente und zu knackender Nüsse.
In dem Teilprozess der Softwareentwicklung halte ich die Beherrschung 
oder zumindest ein weitreichendes Verständnis des Low-Levels für 
unumgänglich. Ich werde in diesem Sinne in dem Tutorial immer und immer 
wieder nachschlagen, bis alle offenen Fragen geklärt und verinnerlicht 
sind.

Beste Grüße
Andre

von Jan (Gast)


Lesenswert?

Andre schrieb:
> Anforderungen im Hobbybereich erfüllen kann (Gartenbewässerung,
> Rolladen- und Lichtsteuerung, etc.).

äääh.... und dafür brauchst du einen ARM? Selbst mein 
selbstprogrammiertes Smart-Home Steuersystem über Funk, was nun wirklich 
alles notwendige hat (AES, CRC, EEPROM Raid1, time-sync, definierter 
Protokollstack) kommt noch mit einem attiny84A aus.

von Jan (Gast)


Lesenswert?

Gleich kommt der nächste und propagiert FPGAs für alles. Die sind 
nämlich noch viel cooler als die ARMs!!!!11111

von Walter T. (nicolas)


Lesenswert?

Perfekt. So eine "AVR vs. ARM"-Diskussion hat in diesem Thread über 
ARM-Assembler absolut gefehlt. Weiter so!

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Andre schrieb:
> Die Idee ist, sich komplett auf eine Mainstream-Familie einzuschießen,

Das würde ich nicht unbedingt so machen, früher oder später werden 
andere Controller vielleicht doch interessant. Das ist ja gerade das 
Tolle an ARM - man kann mit den selben Tools eine riesige Menge an den 
unterschiedlichsten Controllern abdecken. Die LPC11Cxx wären z.B. auch 
interessant wegen des integrierten CAN.

Einen Haken hat es: Die unterschiedlichen Controller haben 
unterschiedliche Befehlssätze, der genannte LPC ist ein Cortex-M0 mit 
ARMv6M-Befehlssatz. Wenn man den selben Code auf den unterschiedlichen 
Cortex-M laufen lassen möchte, muss man sich entweder auf ARMv6M 
beschränken (und Effizienz-Einbußen auf den größeren Controllern 
hinnehmen) oder halt eine Hochsprache verwenden.

Daher ist das mit "eine ganze komplexe Anwendung in Assembler schreiben" 
nicht so optimal.

von Andre (Gast)


Lesenswert?

Jan schrieb:
> äääh.... und dafür brauchst du einen ARM? Selbst mein
> selbstprogrammiertes Smart-Home Steuersystem über Funk, was nun wirklich
> alles notwendige hat (AES, CRC, EEPROM Raid1, time-sync, definierter
> Protokollstack) kommt noch mit einem attiny84A aus.

Nein. Brauche ich natürlich nicht, möchte ich aber :)
Mit dem atmega8 hatte ich vor einigen Jahren viel Spaß und habe ihn nie 
wirklich ausreizen können. Mir ist also vollkommen bewusst, dass 
Cortex-M selbst mit dem kleinsten Vertreter für den Moment ein Overkill 
ist.
Es ist so eine Abwägungssache: In welche Architektur oder in diesem Fall 
in welchen spezifischen Mainstream-Controller will man viel Zeit 
investieren, um möglichst bis über das Rentenalter hinaus von dem 
Gelernten zu profitieren ohne switchen zu müssen?
Und da sagt das Bauchgefühl einfach, dass man bei ARM besser aufgehoben 
ist. Die STM32G0-Reihe übertrifft den AVR in jeglicher Hinsicht. Ob es 
nun die Peripherie ist, die Performance oder das P/L-Verhältnis 
(zumindest vor der Chip-Krise). Dass der MC dann in den meisten Fällen 
komplett unterfordert ist, stellt für mich jetzt erstmal kein größeres 
Problem dar. Besser haben als brauchen (z.B.: RTC, DMA u.Ä.).
Was mich bspw. am AVR auch stört, ist die Quasi-Monopolstellung von 
Microchip seit Übernahme. Das ARM-Lizenzmodell scheint mir 
markttechnisch sehr viel robuster, da man sich aufgrund eines ganzen 
Netzwerks von Abhängigkeiten davor hüten wird irgendwelche 
einschneidenden Entscheidungen zu treffen. Wer weiß schon, was die 
Zukunft so bringt und wenns hart auf hart kommt, dann stelle ich mir ein 
Switch von ST zu bspw. NXP einfacher vor, als auf Architekturebene von 
AVR zu ARM.
Zudem werde ich einfach das Gefühl nicht los, dass die 
Daseinsberechtigung der ATMegas überwiegend nur noch auf Arduino 
zurückzuführen sind. Damit möchte ich niemandem auf die Füße treten, 
aber ich denke einfach, dass die Blütezeit der AVRs vorbei ist.

Beste Grüße
Andre

von Jan (Gast)


Lesenswert?

Andre schrieb:
> in welchen spezifischen Mainstream-Controller will man viel Zeit
> investieren, um möglichst bis über das Rentenalter hinaus von dem
> Gelernten zu profitieren ohne switchen zu müssen?

Naja, wenn du jetzt schon 60 bist, kannst du vielleicht so rechnen, aber 
es gibt sich mehrende Stimmen, die behaupten, dass RISC-V das neue ARM 
wird.

von Jan (Gast)


Lesenswert?

Andre schrieb:
> Zudem werde ich einfach das Gefühl nicht los, dass die
> Daseinsberechtigung der ATMegas überwiegend nur noch auf Arduino
> zurückzuführen sind.

[] Du weisst, wie der Halbleitermarkt funktioniert.

von Ron T. (rontem)


Lesenswert?

Andre schrieb:
> Was mich bspw. am AVR auch stört, ist die Quasi-Monopolstellung von
> Microchip seit Übernahme.

Die können aktuelle Typen aber liefern.
Im Gegensatz zu STM

Beitrag "STM32 - ST - Hinhaltetaktik oder Insolvenzverschleppung?"

Andre schrieb:
> Damit möchte ich niemandem auf die Füße treten, aber ich denke einfach,
> dass die Blütezeit der AVRs vorbei ist.

Das haben hier schon lange viele gedacht (gewünscht). Fakt ist aber, was 
langt, demzufolge eingesetzt wird, bleibt in Produktion. Ob das Jahr nun 
2000, 2022 oder 2042 heisst.

von Andre (Gast)


Lesenswert?

Walter T. schrieb:
> Perfekt. So eine "AVR vs. ARM"-Diskussion hat in diesem Thread über
> ARM-Assembler absolut gefehlt. Weiter so!

Uups, das war gar nicht die Absicht. Das werde ich nicht mehr anfeuern 
;)

Niklas G. schrieb:
> Einen Haken hat es: Die unterschiedlichen Controller haben
> unterschiedliche Befehlssätze, der genannte LPC ist ein Cortex-M0 mit
> ARMv6M-Befehlssatz. Wenn man den selben Code auf den unterschiedlichen
> Cortex-M laufen lassen möchte, muss man sich entweder auf ARMv6M
> beschränken (und Effizienz-Einbußen auf den größeren Controllern
> hinnehmen) oder halt eine Hochsprache verwenden.

Auf jeden Fall Hochsprache. Aber eben erst, wenn die grundlegenden 
Abläufe (Startup, Linker, Funktionsweise des Prozessors, Aufbau des 
Address-Space etc.) keine offenen Fragen mehr aufwerfen.
Ich habe mal gelesen, dass Startup-Scripts von Projekt zu Projekt 
"blind" kopiert werden und der Entwickler nicht wirklich weiß, wofür es 
da ist, solange es irgendwie damit funktioniert. Das ist nicht schön. 
Ausserdem habe ich in vielen Scripten und Beispielen "subs" und "adds" 
gesehen und habe das nie hinterfragt. Jetzt weiß ich, dass in einigen 
davon auch "sub" und "add" ihren Zweck erfüllt hätten, da der APSR 
anschließend weder direkt noch indirekt ausgewertet wird. Auch das ist 
nicht schön.

von Andre (Gast)


Lesenswert?

Jan schrieb:
> Naja, wenn du jetzt schon 60 bist, kannst du vielleicht so rechnen, aber
> es gibt sich mehrende Stimmen, die behaupten, dass RISC-V das neue ARM
> wird.

Ja, dem kann man wohl nicht widersprechen. Bis zum Rentenalter sind es 
bei mir noch 30 Jahre plusminus, je nach dem, wo das 
Renteneintrittsalter dann sein wird. Also eher plus. Eventuell lohnt 
sich irgendwann dann auch ein Blick über den Tellerrand in Richtung 
RISC-V. Mein aktuelles Problem ist, dass ich als Laie (noch) gar keinen 
Teller habe und mit einer Architektur anzufangen, über deren zukünftige 
Dominanz aktuell nur spekuliert wird, wäre suboptimal.

Jan schrieb:
> [] Du weisst, wie der Halbleitermarkt funktioniert.

Neee. Ist nur so n Bauchgefühl.

Ron T. schrieb:
> Die können aktuelle Typen aber liefern.
> Im Gegensatz zu STM

Bei Mouser gab es hin und wieder einige kurze Zeitfenster, in denen man 
abgreifen konnte und bei Ali habe ich letztens noch den G031F8P6 zum 
Vorkrisenzeitenpreis bestellt. Ich habe mindestens für die kommenden 5 
Jahre vorgesorgt ;)

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Andre schrieb:
> Ich habe mal gelesen, dass Startup-Scripts von Projekt zu Projekt
> "blind" kopiert werden und der Entwickler nicht wirklich weiß, wofür es
> da ist, solange es irgendwie damit funktioniert. Das ist nicht schön.

Das ist definitiv so, aber ich kann es den Leuten nicht verdenken - zum 
Assembler lernen hat keiner Zeit, Projekte haben Zeitpläne, oft vergeht 
schon genug Zeit bis die erste LED blinkt, da muss man nicht auch noch 
die Details vom schon fertigen Startup-Code (der übrigens so ziemlich 
das Gegenteil von einem Script ist) auseinander nehmen. Das Verhalten 
des Linkers wird sowieso in der Bildung und Literatur meistens 
ausgelassen.

Andre schrieb:
> Jetzt weiß ich, dass in einigen
> davon auch "sub" und "add" ihren Zweck erfüllt hätten, da der APSR
> anschließend weder direkt noch indirekt ausgewertet wird. Auch das ist
> nicht schön.

Na das ist verglichen mit den üblichen Problemen die viele Projekte so 
haben größenordnungstechnisch aber eher mit dem Mikroskop zu suchen!

von Andre (Gast)


Lesenswert?

Niklas G. schrieb:
> Das ist definitiv so, aber ich kann es den Leuten nicht verdenken - zum
> Assembler lernen hat keiner Zeit, Projekte haben Zeitpläne, oft vergeht
> schon genug Zeit bis die erste LED blinkt, da muss man nicht auch noch
> die Details vom schon fertigen Startup-Code (der übrigens so ziemlich
> das Gegenteil von einem Script ist) auseinander nehmen. Das Verhalten
> des Linkers wird sowieso in der Bildung und Literatur meistens
> ausgelassen.

Die Motivationen und die Umstände gehen da bei Amateuren (wie mir) und 
Profis weit auseinander. Da habe ich auch vollstes Verständnis für.
Ich kenne den Bildungsgang leider nicht, finde es aber sehr schade, dass 
der Linker und somit vermutlich auch der Rest des Kompilierprozesses 
nicht im Detail gelehrt wird.
Das würde vermutlich im Berufsleben viel Troubleshooting und etliche 
Fragezeichen einsparen.
Das mit dem "Script" sehe ich ein und nehme das zurück :)

Niklas G. schrieb:
> Na das ist verglichen mit den üblichen Problemen die viele Projekte so
> haben größenordnungstechnisch aber eher mit dem Mikroskop zu suchen!

Das ist in der Tat sehr penibel und ich bin sicherlich der letzte, der 
das beurteilen dürfte. Aber solche Momente motivieren umso mehr, bei den 
Details genauer hinzuschauen.
Ich kann meinen Urlaub kaum abwarten! Das Steckboard ist bereits fertig 
bestückt :)

von chris_ (Gast)


Lesenswert?

Niklas
>Das würde ich nicht unbedingt so machen, früher oder später werden
>andere Controller vielleicht doch interessant. Das ist ja gerade das
>Tolle an ARM - man kann mit den selben Tools eine riesige Menge an den
>unterschiedlichsten Controllern abdecken. Die LPC11Cxx wären z.B. auch
>interessant wegen des integrierten CAN.

Der einzige Grund Assembler machen zu wollen ist maximale 
Rechenzeitperformance aus einem Controller herausholen zu wollen. 
Assembler für alles andere kann man als Denksporthobby betreiben, was 
ansonsten unter Codeentwicklungszeitgesichtspunkten völlig unsinnig ist 
(das schreibe ich mit einiger Erfahrung. Ich habe mehr als 4 
verschiedene MCU- und DSP Architekturen und deren 
Assemblerprogrammierung hinter mir inclusive einiger 
selbstprogrammierter virtueller Maschinen der MCUs).

Andre
>Es ist so eine Abwägungssache: In welche Architektur oder in diesem Fall
>in welchen spezifischen Mainstream-Controller will man viel Zeit
>investieren, um möglichst bis über das Rentenalter hinaus von dem
>Gelernten zu profitieren ohne switchen zu müssen?

Wenn auf maximale Performance ankommt, ist das Arduino-Framework die 
einzig sinnvolle Wahl. Für keine andere Umgebung gibt es für so viele 
verschiedene Controllerfamilien so viele Libraries. Und die wird es auch 
in 10 Jahren noch geben, weil das Ganze immer noch auf der 
Wachstumskurve ist.

von Ron T. (rontem)


Lesenswert?

Andre schrieb:
> Bei Mouser gab es hin und wieder einige kurze Zeitfenster, in denen man
> abgreifen konnte und bei Ali habe ich letztens noch den G031F8P6 zum
> Vorkrisenzeitenpreis bestellt. Ich habe mindestens für die kommenden 5
> Jahre vorgesorgt ;)

Schön für Dich aber hier gibt es inzwischen einige Verzweifelte 
Threads...

chris_ schrieb:
> Der einzige Grund Assembler machen zu wollen ist maximale
> Rechenzeitperformance aus einem Controller herausholen zu wollen.
> Assembler für alles andere kann man als Denksporthobby betreiben

Das mag für Dich und mag für 32bittige Controller gelten.

chris_ schrieb:
> Wenn auf maximale Performance ankommt, ist das Arduino-Framework die
> einzig sinnvolle Wahl.

Und wieder viel zu absolut.

von Yes! (Gast)


Lesenswert?

chris_ schrieb:
> Der einzige Grund Assembler machen zu wollen ist maximale
> Rechenzeitperformance aus einem Controller herausholen zu wollen.

Unfug.
Asm hat in Zeiten sprach- und anwendungsbürokratisch völlig außer Rand 
und Band geratener Hochsprachen wieder das Potential, die Dinge zu 
vereinfachen und auf den Punkt zu bringen. Mit der Beschränkung auf 
wenige Controller-Typen, fertigen Code-Basics für vielbenötigte 
Schnittstellen I/O und etwas Erfahrung gelingt das durchaus in 
vergleichbarer Entwicklungszeit. Mit maximaler Gestaltungsfreiheit- ohne 
sich in Denkschablonen pressen lassen zu müssen.
Das kennt ja der typische Hochsprachen- Programmierer heutzutage meist 
gar nicht mehr...

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.