0% au considerat acest document util (0 voturi)
41 vizualizări7 pagini

Lab 2

Aplicația rulează 3 task-uri pe un MCU: 1) schimbă stare LED la apăsarea butonului, 2) LED intermitent când primul LED este stins, 3) incrementarea/decrementarea unei variabile la apăsarea unui buton care reprezintă numărul de recurențe ale LED-ului intermitent. Un task de raportare afișează stările programului.

Încărcat de

Vika Belinschi
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
41 vizualizări7 pagini

Lab 2

Aplicația rulează 3 task-uri pe un MCU: 1) schimbă stare LED la apăsarea butonului, 2) LED intermitent când primul LED este stins, 3) incrementarea/decrementarea unei variabile la apăsarea unui buton care reprezintă numărul de recurențe ale LED-ului intermitent. Un task de raportare afișează stările programului.

Încărcat de

Vika Belinschi
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

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. Button Led - Schimbare stare LED la detecția unei apăsări pe buton.


2. un al doilea Led Intermitent în faza în care LED-ul de la primul Task e stins
3. 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
4. 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.h>
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() {
[Link](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{
[Link](variable);
delay(500);
variable = 0;
}
}

void OS_Scheduler(void) {
if (--T1_rec_cnt <= 0) {
Task1();
T1_rec_cnt = T1_TASK_REC;

if (--T2_rec_cnt <= 0) {
Task2();
T2_rec_cnt = T2_TASK_REC;
}

if (--T3_rec_cnt <= 0) {
Task3();
T3_rec_cnt = T3_TASK_REC;
}
}
void loop() {
OS_Scheduler();

}
[Link] Led - Schimbare stare LED la detecția unei apăsări pe buton.

Fig 2.1. Circuit with LED lighting up when a button is pushed

[Link] al doilea Led Intermitent în faza în care LED-ul de la primul Task e stins
Fig2.2. Intermittent LED D2

[Link]/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

Fig 2.3 Virtual Terminal showing the number of times button 1 was pushed/ Led 2 was in LOW
state

[Link]-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.
Fig 2.4 Virtual terminal showing the reseted variable after Button 2 is pushed

Conclusions
For the laboratory work nr. 2 , we worked with an Arduino. Leds, buttons and virtual terminal. I
added resistors for the leds and buttons. The virtual terminal was for presenting a variable, which is
incremented every time a led state is changed, and the button 1 is pushed.

The variable is reseted after every push of the second button, after the variable is exposed on the
virtual terminal.

S-ar putea să vă placă și