55 1 1MB
Technical University of Moldova Faculty of Computers, Informatics and Microelectronics Software Engineering
Laboratory Nr. 2 Operating Systems
Student: Belinschi Victoria Teacher: Moraru Dumitru, lector universitar
2021
Tasks:
Realizarea unei aplicații pentru MCU care va rula minim 3 task-uri in doua versiuni Secvential si cu FreeRTOS Aplicația va rula minim 3 task-uri printre care 1. 2. 3.
4.
Button Led - Schimbare stare LED la detecția unei apăsări pe buton. un al doilea Led Intermitent în faza în care LED-ul de la primul Task e stins Incrementare/decrementare valoare a unei variabile la apăsarea a doua butoane care va reprezenta numărul de recurențe/timp în care ledul de la al doilea task se va afla într-o stare Task-ul de Idle se va utiliza pentru afișarea stărilor din program, cum ar fi, afișare stare LED, și afișare mesaj la detecția apăsării butoanelor, o implementare fiind ca la apăsarea butonului sa se seteze o variabila, iar la afișare mesaj - resetare, implementând mecanismul provider/consumer.
Indicații pentru implementare 1. sa se implementeze comunicarea intre Taskuri ca provider consumer, adica: • •
- task-ul care generează date, provider, stochează rezultatele într-o variabila globala/ semnal - task-ul care utilizează aceste date, consumer, citește aceasta variabila/semnal.
de ex: task de UI (LCD sau Serial) preia informația din niște variabile-semnale globale și raportează 2. A se urma principiile prezentate la curs Sisteme Secvențiale • •
- stabilirea rezonabila a recurentei pentru a diminua incarcarea procesorului - stabilirea ofsetului, intru a activa în ordinea cuvenita task urile
3: Task-ul de raportare pentru Secvențial cu utilizare STDIO printf() catre LCD va fi rulat in bucla infinita/IDLE deoarece este bazat pe un spin lock și ar putea bloca întreruperile deci secvențial clasic - printf & delay in main loop, in FreeRtos - un task separat. 4. Pentru Versiune cu FreeRtos, a se recomandarile sistemul
Work Progress
Description of the main functions used to perform the tasks #include SoftwareSerial mySerial(9,10); #define Button 4 #define BAUD_RATE 9600 #define LED 2 #define LED2 3 #define Button2 5 int button_state = 0; int button2_state = 0; int prestate = 0; int variable = 0; void setup() { mySerial.begin(9600); delay(500); pinMode(Button,INPUT); pinMode(Button,INPUT); pinMode(LED,OUTPUT); pinMode(LED2,OUTPUT); } #define T1_TASK_OFFSET 10 #define T1_TASK_REC 100 int T1_rec_cnt = T1_TASK_OFFSET; int LedState2; void Task1(void) { button_state = digitalRead(Button); if(button_state == HIGH && prestate == 0){ digitalWrite(LED, LOW); LedState2 = 1; prestate = 1; variable++; } else if(button_state == LOW){ digitalWrite(LED, HIGH); prestate = 0; LedState2 = 0; } } #define T2_TASK_OFFSET 15
#define T2_TASK_REC 20 int T2_rec_cnt = T2_TASK_OFFSET; void Task2(void) { if (LedState2 == 0) { digitalWrite(LED2, LOW); } else { digitalWrite(LED2, HIGH); } } #define T3_TASK_OFFSET 11 #define T3_TASK_REC 19 int T3_rec_cnt = T3_TASK_OFFSET; void Task3(void) { button2_state = digitalRead(Button2); if(button2_state){ } else{ mySerial.println(variable); delay(500); variable = 0; } }
void OS_Scheduler(void) { if (--T1_rec_cnt