PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC - mehrere Befehle parallel ausfuehren



Goblin (logout)
01.02.2005, 09:57
Moin!

Ich hab mich mal gefragt, ob es moeglich ist, in einem pic mehrere befehle gleichzeitig zu verarbeiten. z.b. wenn jetzt 2 sensoren am pic haengen und beide gleichzeitig verschiedene signale geben, die gleichzeitig verarbeitet werden muessen. geht das?

goblin

PicNick
01.02.2005, 10:12
Hi, schau die das Blockbild deines PIC im Datasheet an. Das, was da extra is, rennt auch parallel u. gleichzeitig. Aber jeder Trumm kann natürlich nur eine Sache gleichzeitig machen.
d.h z.B. Die ALU kann nur EINEN Befehl auf einmal abbarbeiten, aber die Timer und der ADC rennen unabhängig daneben.
mfg robert

mcs
01.02.2005, 20:13
Hi!
Ja, stimmt schon, hardwaremäßig geht das net, allerdings ist ein PIC ja schon recht schnell. Jenachdem wie deine Signale sind (Frequenz,...) könntest du aber eine art multitasking wie im PC betreiben.

mcs

stegr
01.02.2005, 22:54
Multitasking selber ist ja an sich nicht das Problem (mach ich seit einiger Zeit fast ausschließlich in PICs), aber dadurch werden auch keine Befehle parallel ausgeführt. Allerdings ist mir parallele Befehlsabarbeitung nur bei DSPs bekannt. Da gibt es einige, die einige Befehle parallel abarbeiten können. Manche uC's können auch durch geschicktes Pipelining mehrere Befehle quasiparallel abarbeiten, aber du hast nahezu immer das Problem, dass nur ein Befehl gleichzeitig auf einen Speicher, die ALU oder sonst irgendwas zugreifen kann bzw. du auch nur einen Befehl gleichzeitig laden kannst.

Daher wäre es mal interessant von dir zu wissen, ob du wirklich PARALLEL die Befehle ausgeführt haben willst, oder ob du nur mehrere Unterprogramme quasigleichzeitig laufen haben willst (also Multitasking).

02.02.2005, 20:13
Hier ist es wie gesagt nur davon abhängig., wie schnell das Signal ist. Mit 100 HZ z.B kannst du einige Signale praktisch parallel überwachen.

03.02.2005, 10:09
also ich dachte da dann wohl eher an multitasking. also der pic soll z.b. von 3 raedern die drehzahl regeln, waehrend er auch nen auge auf die sensoren hat und ausserdem seriell daten versendet. es handelt sich um einen 16F870 mit 20 Mhz.

stegr
03.02.2005, 10:58
Dabei könnte man sich ein ganz einfaches kooperatives Multitasking überlegen:
while (1) {
- Sensoren überprüfen
- Drehzahl Rad 1 einstellen
- Drehzahl Rad 2 einstellen
- Drehzahl Rad 3 einstellen
- seriell Daten versenden
}

Dabei darf natürlich die Rundenlaufzeit nicht zu hoch sein, sonst reagieren womöglich die Sensoren zu schnell usw...

Oder aber du verwendest ein preemptives Multitasking-System, dann aber musst du schon fast ein Betriebssystem für den PIC schreiben...
Dieses Betriebssystem wird mittels eines Timer-Interrupts aufgerufen (z.B. alle 1 ms) und legt dann immer der Reihe nach (oder nach einem anderen Verfahren) einen Prozess auf den Prozessor.

Dies sieht dann so aus, dass der Interrupt irgendwann zuschlägt, du den Prozesskontext (alten PC, benötigte RAM-Bereiche usw.) sichern musst, den PC mit dem nächsten Task laden usw...
Um in einem kritischen Prozess Unterbrechnungen zu vermeiden kannst du dann einfach während des kritischen Bereichs die Interrupts deaktivieren...

Das ganze ist längst nicht so kompliziert wie es sich anhört (vielleicht schreib ich demnächst dann auch mal ein kleines OS für PICs).

MfG
Stefan

03.02.2005, 12:03
es gibt da so ein-platinen-rechner auf pic-basis. ich glaube die waren auch open source. vielleicht koenntest du dir da anregungen holen. wenn ich zu hause bin, such ich mal den link.