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.