PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was bringt mir ein Mehrkernprozessor im Zusammenhang mit einem Roboter ?



ITArgji
04.02.2015, 16:58
Hallo Liebe Community
Wie schon paar mal erwähnt bin ich Neu im Bereich Robotik
und deshalb tauchen bei mir immer wieder Fragen auf und meine Frage nun
wäre was bedeutet es wenn ein Prozessor mehr Kerne hat ?
Was heißt das um genau zu sein für meinen Roboter ?
Ist das ein Vorteil ?

PICture
04.02.2015, 18:02
Hallo!


... was bedeutet es wenn ein Prozessor mehr Kerne hat ?

Einfachste Erklärung: mehr voneinander unabhängigen Prozessoren in einem Gehäuse.


Was heißt das um genau zu sein für meinen Roboter ?

Ich kenne deinen Roboter nicht._.


Ist das ein Vorteil ?

Ja, wenn ein Prozessor zu langsam ist.

oberallgeier
04.02.2015, 18:45
... was bedeutet es wenn ein Prozessor mehr Kerne hat ... Ist das ein Vorteil ?http://www.elektronik-kompendium.de/sites/com/1203171.htm


.. Neu im Bereich Robotik und deshalb tauchen bei mir immer wieder Fragen auf ...Es wurde fast schon alles gefragt, aber noch haben nicht alle alles gefragt. Sehr viele Fragen kann ne einfache Suche mit ner Suchmaschine lösen.

malthy
04.02.2015, 19:20
Falk Brunner auf mikrocontroller.net neulich in einem Thread:



Jaja, und dann kommen die nächsten "Experten" die eine Motorsteuerung in Java machen wollen, dann muss es halt ein Quad-Core sein.

;-)

markusj
04.02.2015, 20:11
Falk Brunner auf mikrocontroller.net neulich in einem Thread
Die werden bestimmt am Von-Leitner-Institut für verteiltes Echtzeit-Java ausgebildet ;)

Peter(TOO)
04.02.2015, 21:15
Hallo,

Wie schon paar mal erwähnt bin ich Neu im Bereich Robotik
und deshalb tauchen bei mir immer wieder Fragen auf und meine Frage nun
wäre was bedeutet es wenn ein Prozessor mehr Kerne hat ?
Was heißt das um genau zu sein für meinen Roboter ?
Ist das ein Vorteil ?

Relativ schnell kommt man an einen Punkt, wo der Controller mehrere Dinge gleichzeitig tun soll:
Tasten abfragen, eine Anzeige bedienen, Motordrehzahl regeln, Sensoren abfragen, Weg berechnen....

Im einfachsten Fall, schreibt man für jede Aufgebe eine Funktion und eine Hauptschleife, welche diese alle nacheinander aufruft.
Wenn jetzt aber eine einzelne Funktion recht lange rechnen muss, sind die anderen blockiert und weil deshalb der Abstandssensor nicht abgefragt wird, rumst du in die Vase.
Jetzt kann man sich damit behelfen, dass man den Abstandssensor über einen Interrupt bedient.
Eine andere Möglichkeit ist, dass man die Funktionen so gestaltet, dass sie immer nach einer gewissen Zeit aufhören zu rechnen und beim nächsten Aufruf da weiterrechnen. Dazu muss man aber wissen, wie lange die einzelnen Rechnereien etwa dauern. Das wird dann aber unmöglich, wenn man z.B. auf externe Daten warten muss. Und wenn das freiwillige abgeben der CPU nicht funktioniert, sind alle anderen Funktionen blockiert.

Der nächste Schritt ist dann ein Multitask Betriebssystem zu verwenden. Hier kann man dann jede Funktion (Task) so programmieren, wie wenn sie die einzige ist, welche auf dem Controller läuft. Im einfachsten Fall unterbricht dann das Betriebssystem nach einer festen Zeit (Timeslice) den Task durch einen Interrupt und startet einen anderen Task für die nächste Zeitscheibe. So eine Zeitscheibe ist dann z.B. 1 ms lang. Bei 10 Tasks bekommt dann jeder Task etwa 10% der CPU-Leistung ab und darf alle 10ms rechnen.
Das Ganze kann man jetzt noch verfeinern, z.B. indem ein Task, wenn er gerade nichts zu tun hat, seine zugeteilte Rechenzeit abgibt. Dann kann man das ganze noch mit Prioritäten würzen, sodass ein Task mit hoher Priorität, mehr Rechenzeit zur Verfügung hat und schneller dran kommt.
Ein gutes Betriebssystem verwaltet auch den Speicher entsprechend, sodass jeder Task auch hier glaubt, der einzige zu sein. Dadurch kann man dann aber auch den selben Task mehrfach laufen lassen, ohne dass diese sich in die Quere kommen. Das macht z.B. Sinn, wenn du drei gleiche Abstandssensoren hast, welche abgefragt und umgerechnet werden müssen. Den Task musst du dann nur einmal Programmieren, du musst einzig dafür sorgen, dass jeder Task nur die Daten von "seinem" Sensor bekommt. Andere Tasks können dann die aktuellen Resultate von den einzelnen Tasks abfragen.

Man hat aber, im einfachsten Fall, nur eine CPU und deshalb geht alles immer nur der Reihe nach.
Bei 10 Tasks bekommt aber auch nicht jeder 10% Rechenleistung ab, das das Betriebssystem auch etwas Zeit für die Verwaltung benötigt.

Bei mehreren Kernen, kann man diese dann echt parallel rechnen lassen, indem jeder Kern einen Task ausführt. Bei 10 Tasks und 4 Kernen bekommt dann jeder Task etwa 40% der Rechenleistung eine Kernes zur Verfügung.

Wenn du 4 Kerne hast aber nur einen Task, bringt das nix :-( Da sind dann 3 CPUs am Däumchen Drehen!

Dann wäre da noch das Problem, wie die Tasks untereinander Informationen austauschen können.
Im einfachsten Fall gibt es einfach einen globalen Speicherbereich, also eine Art Pinnwand, wo jeder Task seine Resultate rein schreibt und die Resultate anderer abfragen kann. Ist natürlich schwierig in der Handhabung, wenn sich da was ändert und zudem weiss ein Task nicht, wann ein anderer das was geschieben hat, der muss immer nachscheuen gehen.

Meistens verwendet man daher Meldungen für die Kommunikation, das funktioniert dann so ähnlich wie eine SMS.
Ein Vorteil dabei ist, dass ein Task sich beim Betriebssystem melden kann, dass er jetzt auf eine Meldung wartet und so lange gar nichts zu rechnen hat. Der bekommt dann keine Rechenzeit zugeteilt, bis eine Meldung für ihn vorhanden ist.
Damit kann man dann auch Pausen in einen Task einbauen ohne Rechenleistung zu verbraten; Man sendet eine Meldung, mit eine Zeitangabe, an einen speziellen Timertask. Nach dem Absenden der Meldung wird der Task dann angehalten und bekommt keine Rechenleistung mehr. Wenn die Zeit abgelaufen ist, sendet der Timertask eine Meldung zurück, dass die Zeit jetzt abgelaufen ist und der Task bekommt die Meldung zugestellt und wieder Rechenleistung zugeteilt.
Beim Versenden einer Meldung gibt es typischerweise die Optionen:
- Ohne Warten, man kann gleich nach dem Absenden weiterrechnen.
- Mit warten auf Antwort. Es geht erst weiter, wenn die Antwort eingegangen ist.
- Warten mit Timeout. Es geht weiter wenn entweder eine Antwort eingegangen ist oder wenn eine bestimmte Zeit abgelaufen ist, welche beim Versenden angegeben wurde, was immer zuerst eintritt.

Dann braucht man manchmal noch Semaphoren. Manche Betriebssysteme stelle diese zur Verfügung, andernfalls kann man diese einfach mit einem Task einfach selbst herstellen. Semaphoren braucht man, wenn es Streit um eine Ressource geben kann.
Nehmen wir mal an du hast einen Drucker und zwei Tasks welche einen Statusbericht drucken wollen. Nun wird es etwas unleserlich, wenn die gedruckten Zeilen beider Tasks wild gemischt auf dem Papier erscheinen :-(
Vor dem Ausdrucken, fragt nun jeder Task bei der Semaphore an, ob diese frei ist. Ist der Drucker frei wird dieser von der Samphore als belegt markiert und dem anfragenden Task zugeteilt. Ist der Task fertig mit Drucken, meldet er dies der Semaphore und diese markiert den Drucker wieder als frei.
Wird der Drucker als belegt gemeldet, muss man halt abwarten, und später wieder nachfragen, bis er wieder frei ist. Das kann man natürlich noch verfeinern und sich z.B. vormerken lassen, für den Fall, dass der Drucker wieder frei gegeben wird. Entweder wird man dann nur benachrichtigt oder man bekommt den Drucker direkt zugeteilt, wenn er frei wird. Das Alles kann man dann noch mit Prioritäten garnieren....


MfG Peter(TOO)

HannoHupmann
05.02.2015, 08:13
Es gibt einen schönen Multikern-Micro-Controller von Parallax, den Propeller Chip. 8 Kerne a 10Mhz macht immerhin rechnerisch 80Mhz. Die 8 Kerne können eigenständig Aufgaben erledigen und abarbeiten, sprich real parallel laufen. Ich verwende diesen Chip sehr gerne für meine Hexas, da die IK-Berechnung parallel zur Servobewegung ablaufen kann.

Einziger Nachteil von dem Chip: spezielle Programmiersprache (wobei assembler auch geht) und eben ein untypisches Design - man muss ein wenig umdenken um das ganze Potential auszunutzen.