Forum: Mikrocontroller und Digitale Elektronik Microchip WLAN Modul & TCP/IP Stack


von Flipp (Gast)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

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.

von Marco M. (marco_m)


Lesenswert?

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.

von Flipp (Gast)


Lesenswert?

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?

von Frank K. (fchk)


Lesenswert?

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

von Flipp (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.