User Tools

Site Tools


lab8

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lab8 [2015/12/08 17:40]
dan.tudose created
lab8 [2018/11/16 08:22] (current)
dan.tudose [Instalare si configurare]
Line 6: Line 6:
  
 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 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.
 +
 +===== Instalare si configurare =====
 +
 +Biblioteca o puteti descarca de {{:avr_os.zip|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:
 +
 +<code C>
 +#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(); 
 +}
 +</code>
 +
 +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.
 +
 +<note>**Task 0:** Rulați exemplul de mai sus.</note>
 +<note>**Task 1:** Definiti trei task-uri, cu o perioada de 1s, 2s, respectiv 3s. Fiecare task modifica starea unui LED (task1 pentru LED-ul rosu, task2 pentru LED-ul verde, task3 modifica LED-ul albastru). Un al patrulea task va comunica starea fiecarui LED pe interfata seriala, atunci cand aceasta se schimba. In Arduino, led-urile sunt mapate pe pinii 8, 10 si 11 ai Sparrow.</note>
 +<note>**Task 2:** Rulati un program de achizitie de date si transmisie la gateway prin interfata radio folosind multitasking-ul. Un task se ocupa cu achizitia de date de la senzorul de umiditate/temperatura, alt task pentru senzorul de lumina iar un al treilea task colecteaza datele culese si le transmite pe interfata radio folosind biblioteca SparrowTransfer implementata la laboratorul 3.</note>
lab8.1449589233.txt.gz · Last modified: 2015/12/08 17:40 by dan.tudose