Halli Hallo, wie bereits in einem anderen Thema erwähnt bin ich gerade dabei an einem Modul zu bauen, welches in der Lage ist CAN Daten über WLAN an den Computer zu übertragen. Im ersten Wurfe will ich dazu ein Eval-Kit benutzen, welches bereits einen CAN-Transceiver sowie einen PIC Microcontroller trägt. Um nun die Daten über WLAN zu versenden habe ich mir bei Microchip auch schon mal die WLAN-Module angesehen und dazu hätte ich folgende Fragen: MRF24WB0MA http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en548014 Dieses Modul bietet keinen integrierten TCP/IP Stack. Jedoch gibt es für PIC uC diesen bereits von Microchip als Download -> http://ww1.microchip.com/downloads/en/appnotes/00833b.pdf Was mir nicht ganz klar ist, ist z.B. diese Zeile aus dem Datenblatt "To be able to meet this requirement and still stay relatively independent of the main application using its services, the Microchip TCP/IP Stack uses a widely known technique called cooperative multitasking." Mir ist prinzipiell schon klar warum das nötig ist - allerdings muss ich laut Datenblatt diese Technik auch für meine Implementierung nutzen. Was bedeutet dass für mich? Der Begriff ist mir neu und wie ich meine Software passend dazu entwickel ist mir vollkommen ein Rätsel. Eine Alternative wäre noch z.B. RN171 http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 Dieses Modul hat bereits einen TCP/IP Stack implementiert. Heisst dass, das ich lediglich die Befehle und Nachrichten über SPI an das Modul schicke und dann mich um gar nichts mehr kümmern muss, also nicht mal mehr um oben genanntes "cooperative multitasking" ? Welches Modul wäre also für einen mehr oder minder großen Neuling eher zu empfehlen? Vielen Dank und viele Grüße Flipp
Kooperativ bedeutet, dass deine Applikation regelmässig Rechenzeit abgeben muss. Oft gibt es eine einzelne Funktion dafür; da steht sicher Genaueres dazu in den Appnotes oder Programmbeispielen.
Flipp schrieb: > Was mir nicht ganz klar ist, ist z.B. diese Zeile aus dem Datenblatt > > "To be able to meet this > requirement and still stay relatively independent of the > main application using its services, the Microchip > TCP/IP Stack uses a widely known technique called > cooperative multitasking." > > Mir ist prinzipiell schon klar warum das nötig ist - allerdings muss ich > laut Datenblatt diese Technik auch für meine Implementierung nutzen. Was > bedeutet dass für mich? Der Begriff ist mir neu und wie ich meine > Software passend dazu entwickel ist mir vollkommen ein Rätsel. > Cooperatives Multitasking kennt man noch aus Windows 3.11 Zeiten. Jeder Vorgang wurde dort durch ein Event eingeleitet und wenn man etwas abarbeiten wollte, dann musste man regelmäßig den Arbeitsstatus speichern und zum Event-Dispatcher zurückkehren, sonst wäre alles eingefroren. Wenn ich die Codebeispiele zum PIC Stack so sehe, dann soll man wohl sowas machen: Statt:
1 | void meine_aufgabe() |
2 | {
|
3 | for(;;) { |
4 | mache_a(); |
5 | mache b(); |
6 | mache c(); |
7 | }
|
8 | }
|
Da hier:
1 | int status=0; |
2 | void meine_aufgabe_cm() |
3 | {
|
4 | switch(status) |
5 | {
|
6 | case 0: |
7 | mache_a(); |
8 | status=1; |
9 | return; |
10 | case 1: |
11 | mache_b(); |
12 | status=2; |
13 | return; |
14 | case 2: |
15 | mache_c(); |
16 | status=0; |
17 | return; |
18 | }
|
19 | }
|
Eine Funktion des TCP Stacks ruft dann meine_aufgabe_cm() regelmäßig (neben anderen "Tasks") auf, so daß mache_a,b,c da reingemultiplext werden.
Hey, vielen Dank für die Antworten. Also nur dass ich das jetzt richtig verstehe: Ich lasse also mein eigentliches Programm über eine Funktion des PIC Stacks laufen, welcher dann von Zeit zu Zeit meine Funktionen aufruft. Diese Funktionen muss ich (je nach Größ) in verschiedene Teilaufgaben unterteilen (siehe bei deinem Beispiel mache_a, mache_b und mache_c) ? Würde ich also z.B. die Funktion meine_aufgabe_cm so rechenintensiv implementieren, dass eine Gewisse Laufzeit überschritten würde, würde das cooperative multitasking nicht mehr funktionieren? Aber am Rande hätte ich dann noch die Frage ob es dann nicht einfacher/geeigniter ist das Modul mit bereits integriertem TCP/IP Stack zu verwenden?
Flipp schrieb: > Ich lasse also mein eigentliches Programm über eine Funktion des PIC > Stacks laufen, welcher dann von Zeit zu Zeit meine Funktionen aufruft. > Diese Funktionen muss ich (je nach Größ) in verschiedene Teilaufgaben > unterteilen (siehe bei deinem Beispiel mache_a, mache_b und mache_c) ? > Würde ich also z.B. die Funktion meine_aufgabe_cm so rechenintensiv > implementieren, dass eine Gewisse Laufzeit überschritten würde, würde > das cooperative multitasking nicht mehr funktionieren? Richtig. Der PIC würde zwar nicht abstürzen, aber er würde auf nichts mehr reagieren - keine Pings, keine HTTP-Requests,... > Aber am Rande hätte ich dann noch die Frage ob es dann nicht > einfacher/geeigniter ist das Modul mit bereits integriertem TCP/IP Stack > zu verwenden? Im Prinzip hast Du dort das gleiche Problem. Alles, was das Modul selber machen könnte, wie ICMP etc, würde zwar noch laufen, aber Deine Weboberfläche würde nicht mehr reagieren. Unter Windows ist es genauso. Wenn Du in einem Windows GUI-Programm Deine Window Messages nicht schnell genug verarbeitest, hängt Dein Programm auch, und das ist für den Benutzer sehr nervig. Du musst lernen, fundamental anders zu programmieren. Nicht Du bist es, der den Programmablauf bestimmt, sondern der Benutzer ist es. So ging es früher: PRINT "Vorname eingeben:" INPUT vor$ PRINT "Nachname eingeben:" INPUT nach$ Jetzt bestimmt der Benutzer, welches Feld er in welcher Reihenfolge ausfüllt. Du bekommst nur noch eine Nachricht "Benutzer hat Feld 'nach' ausgefüllt" und musst darauf reagieren, indem Du beispielsweise das entsprechende Edit Control ausliest. Genauso ist es mit einem Netzwerkgerät. Du bekommst Callbacks vom TCP-Stack, das eine bestimmte Webseite angefordert wurde und musst beispielsweise Variablen einfügen oder ein Formular auswerten oder oder oder, und damit auf das Nutzerverhalten REAGIEREN. Du agierst nicht mehr. Dieses Paradigma wirst Du verinnerlichen müssen. Das Stichwort ist "ereignisgesteuert" oder "event-driven". Der Microchip-Stack hat den Vorteil, dass Du dort an die Hand genommen wirst und jemand anders schon die konzeptionelle Arbeit getan hat. Falsche Designentscheidungen wirst Du damit kaum treffen können bzw es sehr schnell merken. fchk
Hey, vielen Dank für die ausführliche Antwort!!! Das Umdenken zu einer mehr Eventbasierten Programmierphilosophie fällt mir an und für sich nicht so schwer, da ich schon mit C# etwas GUI Programmierung gemacht habe, darunter auch mit Netzwerkkommunikation. Mein Problem ist dabei dass Umdenken in den Embedded Bereich. Während ich unter Linux oder Windows Betriebssystemen relativ einfach Programme mit mehreren Threads realisieren kann, ist mir das ganze auf einem Mikrocontroller leider noch nicht so ganz klar. Da ich auf einem nackten uC ja keine Threadverwaltung habe und das auch ungern selbst implementieren würde (und wohl auch gar nicht könnte) ist mir die Umsetzung leider nicht ganz klar. Ich hätte es mir jetzt so vorgestellt, dass ich bei der Variante mit dem Stack auf meinem Microcontroller, ich es wohl durch die bereits vorgeschlagene Methode realisieren muss. D.h. ich lasse den eigentlichen Hauptthread im Code von dem TCP Stack laufen und von dort werden dann meine Funktionen aufgerufen. Bei der anderen Variante (also Stack auf dem Modul) würde ich erwarten dass der Controller auf diesem externen Modul quasi in seinem eigenen Thread arbeitet und mir dann über den SPI erst Bescheid gibt wenn irgendwas zu tun ist...?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.