This is an old revision of the document!
In acest laborator vom studia implementarea unui mediu multi-tasking pentru platforma Sparrow. Pentru simplitate, functionalitatea multi-tasking este implementata peste IDE-ul Arduino sub forma unei biblioteci ce permite planificarea diferitelor task-uri, salvarea si refacerea contextului si rularea efectiva a diferitelor procese intr-o maniera concurenta.
Biblioteca folosita este o versiune modificata a avr-os ce pune la dispozitie un mediu de execuie de baza pentru rularea de procese in regim de multitasking.
Biblioteca foloseste un planificator preemptiv pentru a face schimbarea de context si fiecare task are propria stiva ce este salvata si refacuta la reluarea executiei. Un timer AVR este initializat si folosit pentru a furniza tick-urile de ceas pe baza carora se face temporizarea executiei si schimbarea de context.
Biblioteca o puteti descarca de aici. Copiati continutul arhivei in directorul Libraries al Arduino si restartati IDE-ul.
Un exemplu de folosire a bibliotecii il aveti in exemplul de mai jos:
#include <AVR_OS.h> spinlock_t testLock; // Create instance of OS multitasker AVR_OS os = AVR_OS(); // Define task 1 void task1(void *arg) { uint8_t val=0; while(1) { os.spinlock_acquire(&testLock); Serial.println("task1: " + String((long)os.os_get_uptime())); os.spinlock_release(&testLock); os.os_sleep(10000); } } // Define task 2 void task2(void *arg) { int x = 0; uint8_t val = 0; while(1) { os.spinlock_acquire(&testLock); Serial.println("task2: " + String(x++)); os.spinlock_release(&testLock); os.os_sleep(1000); } } // Define task 3 void task3(void *arg) { while(1) { os.spinlock_acquire(&testLock); Serial.println("task3: HELLO- this is a long message to make sure spinlock is working"); os.spinlock_release(&testLock); os.os_sleep(15000); } } void setup() { Serial.begin(115200); Serial.println("\n\nStarting up...\n\n"); os.spinlock_init(&testLock); os.os_schedule_task(task1, NULL, 0); os.os_schedule_task(task2, NULL, 0); os.os_schedule_task(task3, NULL, 0); } void loop() { os.os_loop(); }
Task-urile sunt declarate ca functii apoi inscrise in planificator la initializare, in functia setup(). Numarul total de task-uri ce pot fi declarate este limitat la 5 in avr_os.cpp, din ratiuni de dimensiune redusa a stivei.