Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert Harwareprogrammierung normalerweise ?


von Raphael K. (wolly300)


Lesenswert?

Hallo zusammen,

ich hätte hier mal ein paar Fragen an eingefleischte 
Harwareprogrammierer.
Ich bin jetzt am Ende meiner Ausbildung und wurd sozusagen vor 1 - 1,5 
Jahren in das Thema Hardwareprogrammierung mit C hinein geworfen.

Ich programmiere einen ARM Prozessor (STM32F429BI) mit der "JumpStart C 
for Cortex-M" IDE von Imagecraft. Diese IDE hat mir vorallem am Anfang 
den Arsch mit der jsapi.h Library gerettet.

Dort waren wichtige FUnktionalitäten wie USART oder I2C schon als ferige 
Funktionen verfügbar, die mir am Anfang den Arsch gerettet haben.(Habe 
mittlerweile I2C selber nochmal nachgebaut)

Jetzt, wo ich jedoch schon weiter bin, frage ich mich, wie das andere 
Firmen/Programmierer machen. Was machen die besser/anderst und wie kann 
ich damit meinen Code verbessern. Ich will jetzt einmal alles anhand 
meines/eines ARM Prozessor abarbeiten.

Programmieren andere Firmen I2C, USART oder SPI komplett selber, oder 
greifen die auch auf Bibliotheken zurück ? Wenn ja, auf welche genau?

Wie programmiert man normalerweise ein Delay (z.B. für ein UART oder I2C 
als Clock Takt)? Ich habe da schon sehr viele Varianten gehört. ASM und 
NOP, oder auch eine for-Schleife. Aber wie macht man das richtig, das 
man z.B. mit dem der Clock Frequenz des Mikrocontrollers oder einem 
Quarz eine exakte Uhr/Delay erstellt?

Aktuell greife ich auch mit den Funktionen der Bibliothek auf die Pins 
zu, ich habe es auch schon mit dem Ansteuern der Register probiert, 
musste aber feststellen, das ich insgesammt deutlich mehr Code Zeilen 
benötige. Wie ist das in großen Firmen gehandhabt ?

Und als letzte Frage, könnt Ihr mir ein Buch zur Hardwareprogrammierung 
in C empfehlen, in der ich alles geballt lernen/lesen kann?

Wo alles drin steht, der Funktion von Assert, über Interrupts, über 
wichtige Tipps zur Codesicherheit, bis hin zu schnellen 
Hardwarezugriffen mit einem FPGA.

von Energieverheizer (Gast)


Lesenswert?

Lern Assembler für deine CPU.
Noch direkter geht es nicht.

von minifloat (Gast)


Lesenswert?

Raphael K. schrieb:
> Programmieren andere Firmen I2C, USART oder SPI komplett selber

Meistens.

Raphael K. schrieb:
> oder greifen die auch auf Bibliotheken zurück ?

Z.B. ein Bootloader wird bei Automotive z.B. bei Vector oder KPIT 
bestellt.
Dann kann man von manchen Firmen Bibliotheken zum produktiveinsatz 
lizensieren, wie z.B. CAN-Stack oder Regelungstechnik-Gedöns.
Kostet aber einen...
Raphael K. schrieb:
> Arsch
...voll Kohle, da meist pro produziertem Gerät was den Kunden erreicht, 
Lizenzgebühren anfallen können.

Raphael K. schrieb:
> Wie programmiert man normalerweise ein Delay (z.B. für ein UART oder I2C
> als Clock Takt)? Ich habe da schon sehr viele Varianten gehört. ASM und
> NOP, oder auch eine for-Schleife.

Gar nicht. Man verwendet einen Mikrocontroller mit entsprechender 
eingebauter Peripherie. Zumindest verwendet man einen Timer und tut in 
der Main-Loop was Sinnvolles, statt mit NOPs Rechenlast zu erzeugen.

Raphael K. schrieb:
> Aber wie macht man das richtig, das
> man z.B. mit dem der Clock Frequenz des Mikrocontrollers oder einem
> Quarz eine exakte Uhr/Delay erstellt?

Uhrenquarz oder Abgleich des Quarzoszillators oder 
https://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC 
nach Kalibrierung oder oder oder...

Raphael K. schrieb:
> Aktuell greife ich auch mit den Funktionen der Bibliothek auf die Pins
> zu, ich habe es auch schon mit dem Ansteuern der Register probiert,
> musste aber feststellen, das ich insgesammt deutlich mehr Code Zeilen
> benötige.

Hast du eine vorkompilierte Bibliothek benutzt, siehst du die "deutlich 
mehr Code Zeilen" nicht.

Raphael K. schrieb:
> Wie ist das in großen Firmen gehandhabt ?

Modulare Software
a) Nicht schützendwerter Quellcode, da trivial: "deutlich mehr Code 
Zeilen" direkt sichtbar im Quellcode des Moduls, wenig Application- und 
Config-Code
b) Schützenswerter Quellcode, da Intellectual Property (soll z.B. für 
Chinesische oder Amerikanische Kollegen nicht sichtbar sein):
"deutlich mehr Code Zeilen" im Quellcode des Moduls => Vorkompilieren => 
vorkompilierte Library => wenig Application- und Config-Code

mfg mf

von PittyJ (Gast)


Lesenswert?

Raphael K. schrieb:
> Wie programmiert man normalerweise ein Delay (z.B. für ein UART oder I2C
> als Clock Takt)? Ich habe da schon sehr viele Varianten gehört.

Das machen die Prozessoren doch selber. Die haben eine (oder mehrere) 
Hardware I2C Einheit, und die arbeitet das im Hintergrund ab.
Ich habe noch nie einen Delay dafür programmiert.

Assert habe ich auch noch nie benutzt.

Und FPGA ist ein Thema, mit dem man sich 1 Jahr beschäftigen muss, bevor 
man irgendetwas brauchbares hin bekommt. Das ist etwas vollkommen 
anderes als Programmieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Raphael K. schrieb:
> eingefleischte Harwareprogrammierer.
Da fehlt ein -d-. Durchgehend.

Das, was du beschreibst ist lediglich "hardwarenahe Programmierung". 
Nämlich die Konfigurierung der µC-Komponenten auf eine Art, dass dann 
mit Low-Level-Routinen auf die Aussenwelt oder µC-Peripherie zugegriffen 
werden kann.

> bis hin zu schnellen Hardwarezugriffen mit einem FPGA.
Wie spielt hier ein FPGA  mit rein?

Die "Hardwareprogrammierung" eines FPGAs ist keine Programmierung im 
Sinne eines Programms für einen µC. Beim µC müssen "nur" fertige 
Komponenten richtig initialisiert und bedient werden, dann läuft der 
Laden.

Bei der FPGA Entwicklung musst du aber erst eine Schaltung ausdenken, 
und die dann mit einer HardwareBESCHREIBUNGSsprache HDL wie Verilog oder 
VHDL beschreiben. Aus dieser Beschreibung macht dann der Synthesizer 
deine Hardware. Im RTL (Register Transfer Level) Schaltplan kannst du 
dann nachschauen, ob der Synthesizer deine Beschreibung richtig 
verstanden und die entsprechende Schaltung daraus gemacht hat. Diese 
Schaltung wird dann von den nachfolgenden Komponenten der Toolchain 
(Mapper, Place&Route, Bitstreamgenerator) in eine Konfiguration 
umgesetzt, die beim Powerup in das FPGA geladen wird.

Und vor allem die Debugging-Strategien unterscheiden sich bei der 
hardwarenahen Programmierung und der Hardwarbeschreibung signifikant: 
während beim µC einfach mal ein Breakpoint gesetzt werden kann, der die 
Programmausführung stoppt, wird eine HDL-Beschreibung im Simulator gegen 
eine Testbench laufen gelassen und das Verhalten mit Meldungen oder im 
Waveform-Viewer analysiert.

von A. S. (Gast)


Lesenswert?

Nur zum Timing:meist gibt es ein oder zwei "Herzschläge", in deren Takt 
delays etc. billig sind. Z.b. 1ms als Ticker. Eine Pause von 1,2, ...n 
ms kostet dann kaum Overhead.

Schlimm ist dann alles deutlich darunter aber deutlich über 
Quarzfrequenz: z.b. 10us delay bei 100MHz Takt. Für Task-Wechsel zu 
kurz, eigener timer-Interrupt zu individuell, für nops zu lang. Wenn das 
50 Mal pro ms vorkommen kann, geht dein Rechner in die Knie.

Wenn dein Controller das dann nicht per Auftragspuffer und DMA in HW 
erledigt, dann musst Du das individuell frickeln.

von Stefan F. (Gast)


Lesenswert?

Raphael K. schrieb:
> Jetzt, wo ich jedoch schon weiter bin, frage ich mich, wie das andere
> Firmen/Programmierer machen.

Ich hatte damals mit einem kleinen Prozessor (Z80, nicht 
Mikrocontroller) angefangen. Zuerst habe ich auf einem fertige 
Heimcomputer dessen Programmierung gelernt, danach hatte ich ihm mit 
RAM, ROM-Emulator und Peripherie auf eigenen Platinen verwendet.

Das ist Schnee von gestern, heute verwendet man Mikrocontroller, so wie 
du. Bei denen gehe ich so vor: Ich kaufe mir fertige Platinen, wo die 
Programmierschnittstelle und minimale Bestückung schon drauf ist. Dann 
nehme ich mir das Datenblatt (und Referenzhandbuch) vor und benutze 
einfache Schnittstellen (LED Blinken, Temperatur mit ADC messen, 
Serielle Kommunikation). Ich probiere anfangs nicht alle Details aus, 
denn das kommt kommt später mit konkreten Anwendungen. DMA ist zum 
Beispiel eine Sache, die ich auf Mikrocontrollern bisher noch gar nicht 
verwendet habe.

Frameworks wie Arduino und Cube HAL umgehe ich Anfangs, denn sie 
behindern das Lernen so wie Stützräder am Fahrrad oder Schwimmflügel im 
Schwimmbad. Ich habe es versucht, bin aber mehrfach auf Bugs gestoßen, 
die ich nicht lösen konnte, weil mir die Grundlagen fehlten und die 
Struktur der Frameworks zu komplex war.

Mittlerweile bin ich bei AVR fit und kann das Arduino Framework sinnvoll 
einsetzen und erweitern. Das Arduino Framework selbst bringt mir keinen 
Mehrwert, wohl aber einige 3rd party Libraries die darauf aufbauen. 
Deswegen nutze ich Arduino doch ab und zu.

Ähnlich sieht es bei Cube HAL aus. Die Grundlagen der STM32 (Cortex M0, 
M3, M4) Controller habe ich inzwischen gelernt und ich habe mich mit der 
Eclipse basierten IDE vertraut gemacht. Mittlerweile kann ich 
mutmaßliche und echte Fehler in der HAL analysieren und beheben. Dazu 
habe ich hier im Forum großartige Hilfe gefunden - alleine wäre ich 
nicht so weit gekommen.

Für die HAL habe ich allerdings noch keine echte Anwendung gefunden. 
Bisher habe ich alles, was ich machen wollte, ohne HAL realisiert. Ich 
fühle mich dabei wohler, weil ich so besser unter Kontrolle habe, was 
unter der Haube passiert. Außerdem habe ich das Gefühl, dass die HAL 
massiv RAM, Flash und Leistung verheizt. So ist das halt, wenn man 
eierlegende Wollmilchsäue baut.

Du hast so viele blutige Anfänger Fragen. Vielleicht fängst du erstmal 
mit einem Tutorial an, das in die ersten Schritte der Programmierung 
ohne HAL einführt: http://stefanfrings.de/stm32/index.html

> Wie programmiert man normalerweise ein Delay?

Zwei Varianten sind üblich:
a) Eine blockierende Warteschleife (wie hier: 
http://stefanfrings.de/stm32/stm32f1.html#delayloop), macht nur selten 
Sinn.
b) Indem man einen Timer verwendet, der einen Zähler fortlaufend erhöht 
(Sekundentakt oder kleinere Intervalle). Arm Cortex Controller haben 
dazu alle den Systick Timer: 
http://stefanfrings.de/stm32/stm32f1.html#systick

In Multi-Threaded Anwendungen sind Warteschleifen der Form a) weitgehend 
tabu. Siehe http://stefanfrings.de/multitasking_arduino/index.html (gilt 
auch für nicht-Arduino Projekte)

> Aktuell greife ich auch mit den Funktionen der Bibliothek auf die Pins
> zu, ich habe es auch schon mit dem Ansteuern der Register probiert,
> musste aber feststellen, das ich insgesammt deutlich mehr Code Zeilen
> benötige.

Dann musst du irgend etwas grob falsch gemacht haben. Schau Dir das oben 
verlinkte delay Beispiel an, da blinkt eine LED, dazu dann noch diese 
Erklärung: http://stefanfrings.de/stm32/stm32f1.html#digital

> Aber wie macht man ... eine exakte Uhr/Delay erstellt?

Siehe http://stefanfrings.de/stm32/stm32f1.html#rtc

> Und als letzte Frage, könnt Ihr mir ein Buch zur
> Hardwareprogrammierung in C empfehlen, in der ich alles geballt
> lernen/lesen kann?

Die Programmiersprache lernt man meiner Meinung nach besser auf einem 
PC. Erst danach würde ich mich an Mikrocontroller heran wagen. Für AVR 
Mikrocontroller habe ich ein Buch geschrieben, was die Programmierung in 
C recht detailliert erklärt: 
http://stefanfrings.de/mikrocontroller_buch/index.html Ich kann das nur 
empfehlen - auch wenn es wegen der 8bit Technik schon etwas angestaubt 
ist. Diese kleinen AVR Controller haben ein wesentlich übersichtlicheres 
Datenblatt und weniger Funktionen, weswegen sie einfacher zu 
programmieren sind. Die Grundlagen, die du dabei lernst, gelten zu 95% 
auch für 32bit ARM Controller. Alles, was anders ist, habe ich meine 
Homepage geschrieben.

Dort findest du übrigens auch meine weiterführenden Buch-Empfehlungen.

Assert und FPGA habe ich noch nie benutzt, dazu musst du mal die 
Antworten der anderen abwarten. Mein Gefühl sagt mir, dass FPGA nichts 
für Anfänger sind.

Da diese Fragen immer wieder gestellt werden und ich sie ebenfalls 
selbst hatte, habe ich Antworten, die ich gut fand, auf meiner Homepage 
gesammelt. Anfangs war die Seite noch lückenhaft und enthielt falsche 
bzw schlechte Tipps. Im Laufe von vielen Jahren habe ich sie aber immer 
weiter verfeinert. Das ist der Vorteil des Internet im Vergleich zu 
gedruckten Büchern. Ich will nicht behaupten, dass meine Seite der 
Weisheit letzter Schluss ist, aber sie ist ganz sicher für dich 
hilfreich. Nimm Dir die Zeit, dich dort durch zu klicken.

Nachtrag:
Die Links oben beziehen sich alle auf den STM32F1. Ich habe auch einiges 
zu F3 und L0 Serien geschrieben. Zu deinem F4 habe ich leider gar nichts 
konkretes, ich weiß aber, dass er sehr ähnlich programmiert wird. Wenn 
du erstmal mit einem kleineren Modell anfängst, zu dem genug Anleitungen 
vorliegen, wird Dir der Wechsel auf den F4 sicher leicht fallen.

von hfhd (Gast)


Lesenswert?

habe mit AVR angefangen
Das war Anfangs ohne libs, ohne HAL oder irgendwas.
Eben direkter Registerzugriff.
Da lernt man aber wie Peripherie funktioniert.

Dann Cortex M0.
Das gleiche versucht , aber immer grob aus der LL Lib von ST abgeguckt.
Ist deutlich mehr Register und daher auch schwerer im Kopf zu behalten.


Aktuell verwende ich Cortex M7.
Hier mit RTOS und HAL lib.
Warum?

Das Ding is so Riesig und Komplex  .. hier brauch man schon Hilfe.
Gerade wenn man seine Aufmerksamkeit eher der Applikation schenkt.
Man möchte dann nicht mehr im Urschleim der Peripherie wühlen
(es sei denn die HAL funktioniert nicht wie gewünscht).

Gerade M4 / M7 finde ich , sind mit RTOS besser beherschbar.
Die HAL hat einen gewissen overhead der aber nicht mehr so brutal 
auffällt.

Und bis auf den USB HOST konnte ich mich nicht wirklich über Fehler in 
der HAL beschweren.

Ethernet, SAI(I²S ) , I²C , U(S)ART , RTC , CRC , HASH , RND ...
Das scheint erstmal Grundsätzlich zu laufen.

Ich binde die HAL in 10minuten ein und verbringe tage damit die 
Applikation zu schreiben.


CUBE nutze ich zB sehr gern um einen Passenden µC  auszuwählen..
Mit welchem µC kann ich diese und jene Peripherie parallel nutzen.
Welches Footprint liefert mi diese Eigenschaften.
Danach frage ich das Bauteil erst an.

Insgesammt lernt man das aber nur durch Anwenden...
Nur lesen bringt nichts.

von S. R. (svenska)


Lesenswert?

Raphael K. schrieb:
> Jetzt, wo ich jedoch schon weiter bin, frage ich mich,
> wie das andere Firmen/Programmierer machen.

Wir benutzen (größtenteils) ein BSP (Board Support Package) des 
SoC-Herstellers. Die von uns eingesetzten SoCs werden von der 
Linux-Community als "die komplexesten auf diesem Planeten" bezeichnet 
und sind für Dritte nicht mehr sinnvoll auf Systemebene programmierbar.

Ab einer gewissen Firmengröße lässt man die Chiphersteller selbst 
entwickeln (bzw. entwickelt in Zusammenarbeit mit diesem), entsprechende 
Kommunikation läuft dann über einen TAM (Technical Account Manager).

von Peter D. (peda)


Lesenswert?

Raphael K. schrieb:
> Wie programmiert man normalerweise ein Delay (z.B. für ein UART oder I2C
> als Clock Takt)?

Gar nicht, die haben entsprechende Vorteiler für die Baudrate, die man 
setzen muß.
Bei 32Bit-Boliden sind die Konfigurationsmöglichkeiten allerdings 
deutlich komplexer als bei bei einem 8Bitter. Und auch die Einstellungen 
für die Verwendung von Interrupts oder DMA. Am besten schaut man sich 
dafür Beispielcode an.
Bei den 8Bittern (AVR, 8051) reicht in der Regel die 
Registerbeschreibung im Datenblatt völlig aus, um in wenigen Minuten die 
UART zum Laufen zu bringen.

von W.S. (Gast)


Lesenswert?

Raphael K. schrieb:
> ich hätte hier mal ein paar Fragen an eingefleischte
> Harwareprogrammierer.
> Ich bin jetzt am Ende meiner Ausbildung und wurd sozusagen vor 1 - 1,5
> Jahren in das Thema Hardwareprogrammierung mit C hinein geworfen.
>
> Ich programmiere einen ARM Prozessor (STM32F429BI) mit der "JumpStart C
> for Cortex-M" IDE von Imagecraft. Diese IDE hat mir vorallem am Anfang
> den Arsch mit der jsapi.h Library gerettet.

Huch: "Hardware-Programmierung" versus "Software-Programmierung" etwa?

Dein Denken ist noch konfus, das solltest du deutlich verbessern.

Also: Hardware programmiert man nicht, sondern man benutzt sie. Der 
Chip, für den du Programme schreibst, ist so eine Hardware. Aber auch 
ein Stecker oder ein SN74LS00 oder ein LM358 ist eine ebensolche 
Hardware. Und das "Programmieren" besteht aus dem Konstruieren einer 
Schaltung.

Was du vermutlich meinst, ist das Schreiben von Lowlevel-Treibern für 
die diversen Peripherie-Cores auf deinem Chip. Zweck der Übung: daß man 
diese Cores tatsächlich benutzen kann und daß die Ebene der Algorithmen 
in deiner Firmware sich nicht um die Details der physischen Ebene zu 
kümmern braucht. Also sowas wie MotorEin(void) anstelle 
GPIO7_BSR=(1<<tralala)


Raphael K. schrieb:
> Jetzt, wo ich jedoch schon weiter bin, frage ich mich, wie das andere
> Firmen/Programmierer machen.

Das ist höchst unterschiedlich und wenn du 3 verschiedene Leute hier 
fragst, wirst du mindestens 4 völlig verschiedene Ansichten zu lesen 
kriegen. Es ist im übrigen auch herzlich egal, ob und was für eine IDE 
du gerade benutzt. Hier gilt auch: 3x fragen, 4x verschiedene Antworten 
kriegen.

Und wie man sowas angeht - das hängt vor allem davon ab, ob jemand sich 
auf das Zeugs einlassen will, was der Hersteller so anbietet oder nicht.

Wenn ja, dann nagelt man sich damit auf diesen Hersteller fest, wenn 
nein, dann schreibt man sich seine LL-Treiber selber und achtet daraf, 
daß deren Interface nach oben hin hersteller- und chip-UN-abhängig ist. 
Macht anfangs mehr Mühe, erleichtert aber das Wechseln zwischen 
verschiedenen Angeboten.

Sowas muß ein jeder mit sich selber ausmachen. Meine inzwischen 
langjährige Erfahrung besagt, daß man am besten fährt, wenn man sauber 
trennt zwischen den Algorithmen und den Lowlevel-Treibern - und wenn man 
vor dem Quellcode-Schreiben die Interfaces der Treiber sauber 
definiert und allen Beteiligten als ausgedrucktes PDF auf den 
Schreibtisch legt.

W.S.

von Axel S. (a-za-z0-9)


Lesenswert?

W.S. schrieb:
> Was du vermutlich meinst, ist das Schreiben von Lowlevel-Treibern für
> die diversen Peripherie-Cores auf deinem Chip.

Könntest du bitte aufhören, Peripherieeinheiten als "Cores" zu 
bezeichnen? Oder legst du es darauf an, deine Leser zu verwirren? 
Mikrocontroller mit mehreren Cores gewinnen derzeit an Verbreitung.

von Msd (Gast)


Lesenswert?

minifloat schrieb:
> Raphael K. schrieb:
>> Programmieren andere Firmen I2C, USART oder SPI komplett selber
>
> Meistens.

Nein. Selten.

Es wird auf die vom Hersteller gelieferten BSP zurückgegriffen. Dann 
werden hardwarespezifische Änderungen vorgenommen. Die Funktion des 
eigentlichen Schnittstellenprotokolls wird meist nicht angefasst.

von S. R. (svenska)


Lesenswert?

Axel S. schrieb:
> Könntest du bitte aufhören, Peripherieeinheiten als "Cores" zu
> bezeichnen? Oder legst du es darauf an, deine Leser zu verwirren?

So nennt man die Dinger aus Hardwaresicht aber... guck mal ins 
FPGA-Forum. Jeder einzelne Peripherieblock ist da ein "IP-Core".

Im Übrigen steht da "Peripherie-Core", das ist eindeutig kein Prozessor.

> Mikrocontroller mit mehreren Cores gewinnen derzeit an Verbreitung.

Du meinst "CPU-Cores". Das ist eine ganz bestimmte Bedeutung von "Core".

von Stefan F. (Gast)


Lesenswert?

Ich kenne CPU-Kern und Peripherie-Einheit.

von Weichwarenhändler (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ich kenne CPU-Kern und Peripherie-Einheit.

Ich wiederum kenne des Pudels Kern und Einheit von Wirtschafts- und 
Sozialpolitik.

von Axel S. (a-za-z0-9)


Lesenswert?

S. R. schrieb:
> Axel S. schrieb:
>> Könntest du bitte aufhören, Peripherieeinheiten als "Cores" zu
>> bezeichnen? Oder legst du es darauf an, deine Leser zu verwirren?
>
> So nennt man die Dinger aus Hardwaresicht aber... guck mal ins
> FPGA-Forum. Jeder einzelne Peripherieblock ist da ein "IP-Core".

Auch dir sollte aufgefallen sein, daß es hier um µC geht und nicht um 
FPGA. Außerdem ist "IP-Core" etwas anderes als "Core". Immerhin 
expandiert der unschuldig aussehende Vorsatz "IP" zu "intellectual 
property" und wird damit zu einem wesentlichen Bestandteil des Wortes. 
Tatsächlich ist das "core" da bloß noch Dekoration und es ist vollkomen 
offen, ob dieser IP-Core nachher tatsächlich der Kern des Designs ist, 
oder nicht. Ein UART oder I²C Block bildet jedenfalls definitiv nicht 
den Kern eines µC.

> Im Übrigen steht da "Peripherie-Core", das ist eindeutig kein Prozessor.

In vorherigen Posts hat W.S. ganz ohne diese Unterscheidung von "Cores" 
gesprochen:

Beitrag "Re: Erfahrung mit NXP Kinetis"
Beitrag "Re: Erfahrung mit NXP Kinetis"

>> Mikrocontroller mit mehreren Cores gewinnen derzeit an Verbreitung.
>
> Du meinst "CPU-Cores". Das ist eine ganz bestimmte Bedeutung von "Core".

Das ist im Kontext von Mikrocontrollern die einzig verbreitete 
Bedeutung. Ich finde W.S. Sprachgebrauch einfach nur verwirrend und bin 
damit sicher nicht der einzige. Der TE gehört mit an Sicherheit 
grenzender Wahrscheinlichkeit ebenfalls zum Kreis derer, die keine 
Ahnung haben, was W.S. mit "Cores" meinen könnte.

von P. S. (namnyef)


Lesenswert?

Raphael K. schrieb:
> Programmieren andere Firmen I2C, USART oder SPI komplett selber, oder
> greifen die auch auf Bibliotheken zurück ? Wenn ja, auf welche genau?
Ja, alleine schon weil viele Bibliotheken einfach Schrott sind. Zudem 
gibt es kaum schlimmeres als sich durch Projekte zu debuggen, die 
irgendein Amateur solange aus Beispielcode und Fremdbibliotheken 
zusammenkopiert hat bis "es läuft". Weil es halt wie immer schnell gehen 
musste.
Wobei ich sagen muss, dass die CMSIS-Bibliotheken eigentlich ganz 
passabel sind: Die scheinen tatsächlich von Profis geschrieben worden zu 
sein und werden auch gepflegt (!). Die hat eher nicht irgendein Trainee 
zusammengeschustert, der danach entweder befördert oder entlassen wurde.

Aber davon abgesehen, dass ich es grundsätzlich für besser halte die 
low-level-Treiber selbst zu schreiben, bleibt einem im 
sicherheitskritischen Bereich auch selten etwas anderes übrig (strenge 
Voraussetzungen für OTS-Software, Unit-Tests, statische Codeanalyse, 
...).

Man muss ja nicht immer bei Adam und Eva anfangen, sondern kann für 
bestimmte Controller firmeninterne Bibliotheken aufbauen und pflegen.

> Und als letzte Frage, könnt Ihr mir ein Buch zur Hardwareprogrammierung
> in C empfehlen, in der ich alles geballt lernen/lesen kann?
>
> Wo alles drin steht, der Funktion von Assert, über Interrupts, über
> wichtige Tipps zur Codesicherheit, bis hin zu schnellen
> Hardwarezugriffen mit einem FPGA.

Ich kenne leider kein einziges wirklich gutes Buch auf diesem Gebiet. 
Das meiste lernt man durch Erfahrung, von Blogs, Vorträgen, 
Compiler-Manuals (!), Coding Guidelines wie MISRA usw.
Bestimmt kann man aus fast jedem Buch etwas nützliches ziehen. Aber 
gerade im Bereich C gibt es echt viel wirklich schlechte Literatur.
Da würde ich fast eher allgemein gehaltene Werke, wie "Clean Code", 
empfehlen.

von C. A. Rotwang (Gast)


Lesenswert?

P. S. schrieb:
> Raphael K. schrieb:

>> Wo alles drin steht, der Funktion von Assert, über Interrupts, über
>> wichtige Tipps zur Codesicherheit, bis hin zu schnellen
>> Hardwarezugriffen mit einem FPGA.
>
> Ich kenne leider kein einziges wirklich gutes Buch auf diesem Gebiet.


In der Vergangenheit hat es mal Bücher gegeen die dem Anspruch von 
"Alles drin" nahe kommen wie:
-PC intern https://www.mitinet.de/pc-intern-systemprogrammierung/  oder
-PC-Hardwarebuch, ISBN 3-8273-1461-5

Aber da sich leider die Meinung breit gemacht hat, man brauche keine gut 
sortierte Handbibliothek mehr, weil man alles im Internet findet oder 
durch penetrantes Stellen dummer Frage aus einen Internet-Forum 
"prügeln" kann, findet sich keiner meh,r der seine Lebenszeit opfert um 
ein gutes Buch zu schreiben.

von Schnauze (Gast)


Lesenswert?

Ja. Auch du opferst deine Lebenszeit (wieviel hast du noch davon?) 
lieber, um hier rumzustänkern.

von Tatsächlich? (Gast)


Lesenswert?

Stefanus F. schrieb:
>> Wie programmiert man normalerweise ein Delay?
>
> Zwei Varianten sind üblich:
> a) Eine blockierende Warteschleife (wie hier:
> http://stefanfrings.de/stm32/stm32f1.html#delayloop), macht nur selten
> Sinn.
> b) Indem man einen Timer verwendet, der einen Zähler fortlaufend erhöht
> (Sekundentakt oder kleinere Intervalle). Arm Cortex Controller haben
> dazu alle den Systick Timer:
> http://stefanfrings.de/stm32/stm32f1.html#systick

Beide Varianten verbraten sinnlos die Zeit und können nur durch 
Interrupts durchbrochen werden.

von Stefan F. (Gast)


Lesenswert?

Tatsächlich? schrieb:
> Beide Varianten verbraten sinnlos die Zeit und können nur durch
> Interrupts durchbrochen werden.

Meine beiden oben genannten Beispiele sind single-Threaded, da ist der 
Vorteil von Timern versus Delay-Schleife kaum erkennbar.

Wie kann man denn sinnvoll Zeit verbraten? Vermutlich gar nicht. Aber, 
wenn man Timer benutzt, kann man die CPU während des Wartens z.B. 
schlafen legen oder herunter takten. So spart man dabei wenigstens 
Strom.

Wenn man Zustandsautomaten für Multi-Threading verwendet, ergibt es aber 
ganz offensichtlich Sinn. Deswegen habe ich ein solches Beispiel direkt 
hinterher geschoben.

von Harald W. (wilhelms)


Lesenswert?

Raphael K. schrieb:

> Wie funktioniert Harwareprogrammierung normalerweise ?

Ich würde sagen, so:
http://computermuseum.informatik.uni-stuttgart.de/pics/dex100/dex100_2s.jpg

von Peter D. (peda)


Lesenswert?

Raphael K. schrieb:
> Programmieren andere Firmen I2C, USART oder SPI komplett selber, oder
> greifen die auch auf Bibliotheken zurück ?

I2C und SPI steuern fast immer Peripherie an und diese erfordert jeweils 
eigene Sequenzen für den Zugriff. Daher fällt es schwer, dafür ein 
universelles Interface zu schreiben.
Z.B. der MAX1300 (16 Bit ADC) benötigt 3 1-Byte Pakete (Mode setzen, 
Kanal auswählen, Messung starten. Dann muß man die Wandlungszeit 
abwarten (Pin einlesen oder Delay) und dann 2 Byte auslesen.
Ein SPI-DAC oder SPI-Flash erfordern wiederum völlig andere Sequenzen.

Bzw. ein I2C-RTC, ein I2C-IO-Expander, ein I2C-EEPROM usw. sind auch 
nicht unter einen Hut zu bringen.

von W.S. (Gast)


Lesenswert?

Peter D. schrieb:
> Daher fällt es schwer, dafür ein
> universelles Interface zu schreiben.

Nun, für I2C geht das aber:
1. Funktion: Bus bekommen, Slave adressieren.
2. Funktion: Daten zum Slave schreiben
3. Funktion: Daten vom Slave lesen
4. Funktion: Ende, also StopCond.

Das ist mMn. ausreichend abstrahiert, sodaß man alle Handler für Uhren, 
ADC's, LCD's, EEPROM's und so weiter, die darauf aufsetzen, 
plattformunabhängig schreiben kann.

Im Übrigen ist es so, wie du schreibst: Bei sowas muß man eben auf diese 
Funktionen warten. Ob die zu erwartenden Wartezeiten jedoch ein 
aufwendiges System zum Ausnutzen der Wartezeit (RTOS etc.) 
rechtfertigen, sei mal dahingestellt.



Axel S. schrieb:
> Könntest du bitte aufhören, Peripherieeinheiten als "Cores" zu
> bezeichnen?

Nein, das tue ich nicht, denn ich bin gerade in so einem Thread für 
Klarheit und Exaktheit.

Was dabei herauskommt, wenn Leute die betreffenden Fachbegriffe nicht 
kennen und offenbar auch nicht gewillt sind, selbiger zu erlernen - das 
sieht man an diesem Thread und insbesondere an seiner Überschrift.

W.S.

Beitrag #6006983 wurde vom Autor gelöscht.
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.