Giwo
31.05.2005, 14:35
Hallo!
Ich habe ein sehr einfaches cooperatives Multitasking für den Asuro geschrieben. Es ist noch unvollständig (man kann z.B. noch keine Tasks beenden) und vermutlich voller Fehler (also bitte damit rechnen, das der Asuro unverhofft irgentwas macht und z.B. vom Tisch fährt!).
In der Task.zip ist ein Verzeichniss, dass dem "FirstTry" entspricht. Die asuro.c habe ich etwas verändert, so dass sie sich mit meinem task.c verträgt. Außerdem nutzt die Sleep-Funktion nun einen 32Bit Zähler, damit man auch länger als 3ms warten kann.
Die test.c startet 3 Tasks die alle unterschiedliche Leuchtdioden Blinken lassen. Zum anschauen stelle ich sie hier mal rein:
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/
#include "asuro.h"
#include "task.h"
#define STACK_SIZE 256 /* Groesse der Stacks fuer die Tasks */
unsigned char stackStatus[STACK_SIZE]; /* Stack fuer taskStatus */
unsigned char stackFront[STACK_SIZE]; /* Stack fuer taskFront */
/* taskStatus - Laesst die Status-LED rot und grueb blinken. */
void taskStatus(void) {
while (1) {
StatusLED(RED);
Sleep(72UL*500); /* eine halbe Sekunde warten */
StatusLED(GREEN);
Sleep(72UL*500); /* eine halbe Sekunde warten */
}
}
/* taskFront - Dimmt die Front-LED hell und dunkel, indem sie schnell ein- und ausgeschaltet wird. */
void taskFront(void) {
int i;
while (1) {
for (i=0; i<200; i++) { /* von dunkel nach hell */
FrontLED(ON);
Sleep(i);
FrontLED(OFF);
Sleep(200-i);
}
for (i=0; i<200; i++) { /* von hell nach dunkel */
FrontLED(ON);
Sleep(200-i);
FrontLED(OFF);
Sleep(i);
}
}
}
int main(void)
{
Init(); /* Asuro initialisieren */
initTask(); /* Task initialisieren */
addTask(taskFront, &stackFront[STACK_SIZE-1]); /* taskFront starten */
addTask(taskStatus, &stackStatus[STACK_SIZE-1]); /* taskStatus starten */
while (1) { /* Back-LEDs blinken lassen */
BackLED(ON,OFF);
Sleep(72UL*1000);
BackLED(OFF,ON);
Sleep(72UL*1000);
}
while(1);
return 0;
}
Ich hoffe, trotz fehlender Dokumentation reicht das, um erste spielereien zu machen!
Über Kritik, Kommentare, Verbesserungsvorschläge und natürlich Fehlerbereichte würde ich mich sehr freuen!
Ich habe ein sehr einfaches cooperatives Multitasking für den Asuro geschrieben. Es ist noch unvollständig (man kann z.B. noch keine Tasks beenden) und vermutlich voller Fehler (also bitte damit rechnen, das der Asuro unverhofft irgentwas macht und z.B. vom Tisch fährt!).
In der Task.zip ist ein Verzeichniss, dass dem "FirstTry" entspricht. Die asuro.c habe ich etwas verändert, so dass sie sich mit meinem task.c verträgt. Außerdem nutzt die Sleep-Funktion nun einen 32Bit Zähler, damit man auch länger als 3ms warten kann.
Die test.c startet 3 Tasks die alle unterschiedliche Leuchtdioden Blinken lassen. Zum anschauen stelle ich sie hier mal rein:
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/
#include "asuro.h"
#include "task.h"
#define STACK_SIZE 256 /* Groesse der Stacks fuer die Tasks */
unsigned char stackStatus[STACK_SIZE]; /* Stack fuer taskStatus */
unsigned char stackFront[STACK_SIZE]; /* Stack fuer taskFront */
/* taskStatus - Laesst die Status-LED rot und grueb blinken. */
void taskStatus(void) {
while (1) {
StatusLED(RED);
Sleep(72UL*500); /* eine halbe Sekunde warten */
StatusLED(GREEN);
Sleep(72UL*500); /* eine halbe Sekunde warten */
}
}
/* taskFront - Dimmt die Front-LED hell und dunkel, indem sie schnell ein- und ausgeschaltet wird. */
void taskFront(void) {
int i;
while (1) {
for (i=0; i<200; i++) { /* von dunkel nach hell */
FrontLED(ON);
Sleep(i);
FrontLED(OFF);
Sleep(200-i);
}
for (i=0; i<200; i++) { /* von hell nach dunkel */
FrontLED(ON);
Sleep(200-i);
FrontLED(OFF);
Sleep(i);
}
}
}
int main(void)
{
Init(); /* Asuro initialisieren */
initTask(); /* Task initialisieren */
addTask(taskFront, &stackFront[STACK_SIZE-1]); /* taskFront starten */
addTask(taskStatus, &stackStatus[STACK_SIZE-1]); /* taskStatus starten */
while (1) { /* Back-LEDs blinken lassen */
BackLED(ON,OFF);
Sleep(72UL*1000);
BackLED(OFF,ON);
Sleep(72UL*1000);
}
while(1);
return 0;
}
Ich hoffe, trotz fehlender Dokumentation reicht das, um erste spielereien zu machen!
Über Kritik, Kommentare, Verbesserungsvorschläge und natürlich Fehlerbereichte würde ich mich sehr freuen!