PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gibt es Tasks/Voids in Basic?



PcVirus
03.07.2006, 20:38
Hi,
ich hatte einen Legoroboter mit NQC(Not Quite C) programmiert.
Dort gab es Tasks und Voids. In den Tasks konnte man anweisungen schreiben. Sozusagen ein eigenes unterprogramm, aber man konnte auch wieder stoppen. Bei Voids das gleiche, nur das man sie nicht mehr stoppen kann.

Gibt es in Basic auch soetwas wie tasks und voids?

MFG PcVirus

Marco78
03.07.2006, 21:51
Ich glaube, diese Frage kann man so nicht mit Ja oder Nein beantworten.

In Bascom gibt es Labels und InterruptServiceRoutienen (ISR abgekürzt).

Ein Label enthält Anweisungen die der Reihe nach abgearbeitet werden. Es können mit IF oder SELECT oder DO-WHILE Abfragen bestimmte (in diesem Fall nicht benötigte/erwünschte) Befehle ausgelassen werden.

Ist das Label abgearbeitet, endet das Programm, oder das Label kann dauerhaft durchlaufen werden oder ein kann unter bestimmten Umständen nochmal durchlaufen werden oder aus diesem Label wird zurückgesprungen in ein anderes Label oder von dort aus wird erstmal in ein anderes Label gesprungen.

Eine ISR wird nur durch bestimmte Ereignisse aufgerufen. Z.B. wenn ein Taster gedrückt wird, eine ADC-Messung fertig ist, serielle Daten empfangen wurden, ein Timer ausgelöst hat, ...
Je nach AVR gibt es verschiedene INTs.

Wurde ein INT ausgelöst, werden die Schritte der ISR abgearbeitet. Diese unterscheiden sich nicht von Labels. ind die Schritte abgearbeitet, springt die ISR automatisch dahin zurück, wo sie hergekommen ist. Also an der Stelle des Programms, wo der INT ausgelöst wurde.


Im Prinzip lässt sich jeder Programmschritt irgendwie stoppen. Der Legoroboter, ein AVR und ein PC haben eines gemeinsam. Sie können (wie man es Männer auch nachsagt) nur eins zur Zeit. Sie können wirklich immer nur einen Schritt abarbeiten. Ist dieser fertig, geht's zum nächsten. Und immer so weiter, bis das Programm zuende ist.

Beim PC fällt das ganze nur deshalb nicht so auf, weil er schnell genug ist viele Schritte in kurzer Zeit abzuarbeiten. Und moderne Betriebssysteme regulieren die Abfolge der Schritte.

Ein Mikrokontrollerprogramm hingegen arbeitet langsamer. Das abarbeiten vieler Schritte kann das abarbeiten eines anderen Labels verzögern und diese Verzögerung kann ggf auch wahrgenommen werden. Spätestens wenn man viele Messungen in kurzer Zeit speichern und verarbeiten will. Das messen benötigt Zeit, das Verarbeiten benötigt Zeit und nach Ablauf dieser Zeit sollte evtl schon die nächste Messung fertig sein.
Ein Video aufnehmen wie man es von modernen Handys kennt ist mit einem AVR nicht möglich.

AVRs haben aber auch einige "ausgelagerte" Funktionen. Z.B. PWM. Es muss nur im Programm die Pulsweite angegeben werden und der AVR kümmert sich die ganze Zeit drum, das diese eingehalten wird, egal was das Hauptprogramm grade macht.


Ich hoffe ich konnte deine Frage halbwegs beantworten. Wenn nicht, dann musst du Beispiele geben und fragen, ob das was du vor hast möglich ist.

PcVirus
04.07.2006, 17:02
Also. Ich schreibe dann mal ein Beispiel in NQC:


void warten() //Definiere den Void warten
{
Wait(100); //Warte 1ne Sek.
}
task beep() //definiere den Task beep
{
while(true) //eine Whileschleife
{
PlaySound(SOUND_DOUBLE_BEEP); //Sound spielen
}
}

task main() //Haupt task, der als erstes gestartet wird
{
Wait(100); //Warte 1ne Sek.
warten(); //Starte den void warten
start beep; //Starte den task beep
Wait(200); //Warte 2Sek.
stop beep; //Und den Task beep wieder stoppen
}


Also Voids sind ja sozusagen funktionen die aufgerufen werden können und einmal durchlaufen.
An den Tasks ist das besondere, das man sie wieder stoppen kann.
Auch wenn dort eine while(true) schleife eingebaut ist. (Endlosschleife)

MFG PcVirus

Marco78
06.07.2006, 19:06
Ich kann nun kein C, kann den Code aber wohl so halbwegs nachvollziehen.
Aber es sei dazu gesagt, das diese Funktionen Task und Void spezifisch für Lego sind. Das Programm kann man so auf einem AVR zwar auch umsetzen, aber du musst dich von den Begriffen Task und Void trennen.

Zwei Fragen habe ich jetzt noch.

1. Wenn du schon im Ansatz C kannst, warum programmierst du nicht auch damit die AVRs?

2. Was genau willst du wissen? Das es möglich ist das mit Bascom auf einem AVR umzusetzen hab ich ja schon gesagt.

-tomas-
07.07.2006, 11:44
@PcVirus:
Ich kenne NQC, Bascom und C...
Du lässt Dich von den scheinbaren Fähigkeiten des NQC täuschen - das ist eine Interpretersprache, d.h. es vom Lego-Betriebssystem werden nur Opcodes (Dein Programm) abgearbeitet. Das ist zwar schnarchlangsam, aber für Lego ausreichend.
Dadurch behält das Lego-Betriebssystem die Zeit-Kontrolle, wenn es auf ein Wait(100) trifft, und kann sich einem anderen Task widmen.

In Bascom und C hast Du die Herrschaft über den µC. Sagst Du Wait xx, dann hängt der µC in einer Schleife fest. Nur ein Interrupt kann ihn vorzeitig aus dieser Schleife erlösen.

Fazit: Du musst umdenken, und Deine Programme anders strukturieren, da Du jetzt das Betriebssystem (!) schreiben musst, was bei NQC schon im ROM drin ist.
Marco78 hat das gut beschrieben.