IoT Laborator NR 2
September 29, 2022 | Author: Anonymous | Category: N/A
Short Description
Download IoT Laborator NR 2...
Description
MINISTERUL EDUCAŢIEI, CULTURII ȘI CERCETĂRII AL REPUBLICII MOLDOVA Universitatea Tehnică a Moldovei Facultatea Calculatoare, Informatică și Microelectronică Microelectronică Departamentull Ingineria Software și Automatică Departamentu
Sisteme de Operare Lucrare de laborator nr.2
Student: Coordonator: Dubac Serghei, asistent universitar
Chişinău, 2020
Sarcina Realizarea unei aplicații pentru MCU care va rula minim 3 task-uri în două versiuni: Secvențial și cu FreeRTOS. Aplicația va rula minim 3 task-uri printre care: 1. Butto Buttonn Led – schimbar schimbaree stare LED la ddetecț etecția ia unei ap apăsări ăsări pe buton; 2. Butto Buttonn Led – intermite intermitent, nt, în faz fazaa în care LED LED-ul -ul de la pr primul imul ttask ask e sti stins; ns; 3. Increm Incrementare entare/decre /decrementar mentaree – valoare a unei var variabil iabilee la apăsare apăsareaa a două butoane care care va reprez reprezenta enta numărul de recurențe/timp în care LED-ul de la al doilea task se va afla într-o stare; 4. Idle – afiș afișarea area stă stărilor rilor di dinn progra program, m, cum ar fi, afi afișare șare sta stare re LED, și af afișar ișaree mesaj la detecția detecția apăsă apăsării rii butoanelor, o implementare fiind ca la apăsarea butonului să se seteze o variabilă, iar la afișare mesaj – resetare, implementând mecanismul provider/consumer.
Indicații 1. Să se impl implemente ementeze ze comuni comunicarea carea înt între re task task-uri -uri ca pr provider ovider/cons /consumer, umer, adi adică: că:
task-ul care generează date, provider, stochează rezultatele într-o variabilă globală/semnal;
task-ul care utilizează aceste date, consumer, citește aceasta variabilă/semnal.
Exemplu: task de UI (LCD sau Serial) preia informația din
niște variabile-semnale globale și raportează.
2. A se uurma rma pr princip incipiile iile pr prezenta ezentate te la curs S Siste isteme me Secv Secvenția ențiale: le:
stabilirea rezonabilă a recurenței pentru a diminua încărcarea procesorului;
stabilirea offset-ului, întru a activa în ordinea cuvenită task-urilor.
3. Tas Task-u k-ull de rap raport ortare are pent pentru ru Secven Secvenți țial al cu utili utilizar zaree STDIO STDIO prin printf( tf()) căt către re LCD va fi rul rulat at în buc bucla la infinita/IDLE deoarece este bazat pe un spin lock și ar putea bloca întreruperile, deci secvențial clasic – printf&delay în main loop, în FreeRtos – un task separat. 4. Ve Vers rsiu iune ne cu Fr Free eeRt Rtos os..
Etapele Pentru aplicația (anume MCU) noastră vom utiliza un sistem compus din mai multe componente, care le analizăm din schema 1. Treptat vom testa fiecare din acestea, dând la execuție la programul nostru.
Schema 1. Schema aplicației pentru MCU După exacutarea în prima priză, LED-ul de culoare roșie este cu statut de stins, iar LED-ul verde este intermitent timp de 1 secundă.
Schema 2. Executarea în primă repriză Acțiunea următoare va fi, apăsarea butonului „BTM INCREMENT”. Acesta va mări timpul de ardere intermitent (de exemplu, 2 secunde arde și 2 secunde în regim stins). În terminal (schema 3) analizăm valoarea recurenței, LED-ul verde timp de 4 secunde se va afla în regim ON, iar apoi OFF.
Schema 3. Valoarea recurenței pentru Green LED Testăm butonul „BTN RED LED”, vedem că automat LED-ul de culoare verde se stinge și se aprinde cel de culoare roșie. De asemenea, acordăm atenție că atât timp cât roșu este activat, LED-ul verde va fi inactiv (schema 4).
Schema 4. Testarea butonului „BTN RED LED” Testăm butonul „BTN RESET” (schema 5) – toate valorile anterioare afișate după executări sunt restate și întreg sistem revine la starea inițială. La final, avem afișat mesajul precum sistemul nostru a trecut cu succes prin resetare.
Schema 5. Testarea butonului „BTN RESET”
Concluzie În cadrul lucrării de laborator nr.2, am lucrat la realizarea unei aplicații pentru MCU. În baza unei scheme, am programat și testat fiecare componentă. Am demontrat schimbarea de stări al unui buton la detectarea unei acțiuni similare cu altă componentă. În proiect s-a pus accent pe numărul de recurențe per timp. Fiecare buton are programul său, iar după resetare avem un mesaj afișat, datorită implimentării mecanismul de provider per consumer.
ANEXA 1 Cod sursă. Sistem FreeRTOS include #include #include include #include include
define BUTTON_PIN 13 BUTTON_PIN 13 #define #define define BUTTON_LED_INCR 10 #define define BUTTON_LED_DECR 11 LED_PIN 4 #define define LED_PIN 4 #define define LED_BLINK_PIN 5 LED_BLINK_PIN 5 define LED_ON 1 LED_ON 1 #define #define define LED_OFF 0 LED_OFF 0 define TASK_REC 2 TASK_REC 2 #define #define define TASK_OFFSET 5 TASK_OFFSET 5
int led2Rec; led2Rec; int int int ledState; ledState; int led2State; led2State; int int int buttonState; buttonState;
int led2ReadRec; led2ReadRec; int int btnResetState; btnResetState; int
void void GreenLEDblink( GreenLEDblink ( void *pvParameters ); void void IncDecRecLED( IncDecRecLED ( void *pvParameters ); void void PrintStates( PrintStates ( void *pvParameters ); void RedLEDstatus( void RedLEDstatus ( void *pvParameters); void Reset( Reset( void *pvParameters); void void setup() void setup() { led2Rec=0; ledState=0; led2State=0; buttonState=0; led2ReadRec = 1000; pinMode(BUTTON_LED_DECR, (BUTTON_LED_DECR, INPUT); pinMode pinMode pinMode(BUTTON_LED_INCR, (BUTTON_LED_INCR, INPUT); pinMode pinMode(LED_BLINK_PIN, (LED_BLINK_PIN, OUTPUT); pinMode(BUTTON_PIN, (BUTTON_PIN, INPUT); pinMode pinMode(LED_PIN, (LED_PIN, OUTPUT); pinMode pinMode pinMode(9, (9, INPUT); (9600); Serial.begin(9600); Serial.begin xTaskCreate xTaskCreate(GreenLEDblink, (GreenLEDblink, "GreenLedBlink", 128, NULL, 3, NULL); xTaskCreate(IncDecRecLED, xTaskCreate (IncDecRecLED, "RecForLed", 128, NULL, 2, NULL); xTaskCreate(PrintStates, xTaskCreate (PrintStates, "Print", 128, NULL, 3, NULL); xTaskCreate(RedLEDstatus, xTaskCreate (RedLEDstatus, "RedLED", 128, NULL, 1, NULL); xTaskCreate(Reset, xTaskCreate (Reset, "ResetEverything", 128, NULL, 3, NULL); vTaskStartScheduler (); } void loop() loop() void {
} /*--------------------------------------------------*/ /*---------------------- Tasks ---------------------*/ /*--------------------------------------------------*/
void GreenLEDblink(void void GreenLEDblink (void *pvParameters){ void) ) pvParameters; (void for(;;){ for(;;){ if(ledState (ledState == 0) if { if(led2State == 0) if(led2State { led2State = 1; digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, HIGH); digitalWrite } else { led2State = 0; digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, LOW); digitalWrite }
} vTaskDelay vTaskDelay(led2ReadRec (led2ReadRec / portTICK_PERIOD_MS); } } void IncDecRecLED(void IncDecRecLED (void *pvParameters){ void (void void) ) pvParameters; for(;;){ (;;){ for if if( (digitalRead(BUTTON_LED_INCR) digitalRead (BUTTON_LED_INCR) == 0) { led2ReadRec=led2ReadRec+1000;
} if( (digitalRead(BUTTON_LED_DECR) digitalRead (BUTTON_LED_DECR) == 0) if { led2ReadRec=led2ReadRec-1000; } vTaskDelay vTaskDelay(15); (15); }
} void PrintStates(void PrintStates (void *pvParameters){ void (void) void) pvParameters; for(;;){ for(;;){ Serial.println(); Serial.println (); ("Red LED status:"); status:" ); Serial.print( Serial.print
if if(ledState==1){ (ledState==1){ ("ON"); "ON"); Serial.println( Serial.println } else else Serial. Serial.println println( ("OFF" "OFF"); );
Serial.print( Serial.print ("Green LED status:"); status:"); if(led2State==1){ (led2State==1){ if ("ON"); "ON"); Serial.println( Serial.println } else else Serial. Serial.println println( ("OFF" "OFF"); ); ("Green LED rec:"); rec:"); Serial.print( Serial.print Serial.print(led2ReadRec/1000); Serial.print (led2ReadRec/1000); ("s" "s"); ); Serial.println( Serial.println
vTaskDelay(1000 (1000 / portTICK_PERIOD_MS); vTaskDelay } } void void RedLEDstatus( RedLEDstatus ( void *pvParameters){ (void void) ) pvParameters;
for(;;){ for(;;){ digitalRead(BUTTON_PIN); (BUTTON_PIN); buttonSta buttonState te = digitalRead if if(buttonSta (buttonState te == 0) { if if(ledState (ledState == 1) { ledState = 0; } else { ledState = 1; led2State=0; digitalWrite digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, LOW); } digitalWrite(LED_PIN, (LED_PIN, ledState); digitalWrite } vTaskDelay(15); vTaskDelay (15); } } void void Reset(void Reset(void *pvParameters){ (void) void) pvParameters;
for(;;){ for(;;){ btnResetState = digitalRead digitalRead(9); (9); if(btnResetState if(btnResetState == 0){ led2Rec=0; ledState=0; led2State=0; digitalWrite digitalWrite(LED_PIN, (LED_PIN, LOW); digitalWrite digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, LOW); led2ReadRec = 1000; ("System Reseted!" Reseted!"); ); Serial.println( Serial.println } vTaskDelay vTaskDelay(35); (35); }
}
ANEXA 2 Cod sursă. Sistem secvențial #include include include "timer-api.h" "timer-api.h" #include #include include #define define BUTTON_PIN 13 BUTTON_PIN 13 define BUTTON_LED_INCR 10 #define #define define BUTTON_LED_DECR 11 BUTTON_PRESSED 0 #define define BUTTON_PRESSED 0 define BUTTON_NOT_PRESSED 1 #define #define define LED_PIN 4 LED_PIN 4 #define define LED_BLINK_PIN 5 LED_BLINK_PIN 5 #define define LED_ON 1 LED_ON 1 LED_OFF 0 #define define LED_OFF 0 define TASK_REC 2 TASK_REC 2 #define #define define TASK_OFFSET 5 TASK_OFFSET 5
int led2Rec led2Rec = 0; int int int ledState ledState = 0; int led2State led2State = 0; int int int buttonState buttonState = 0; int led2ReadRec led2ReadRec = 0; int
void void setup() setup() { // put your setup code here, to run once: pinMode pinMode(LED_PIN, (LED_PIN, OUTPUT); pinMode(LED_BLINK_PIN, (LED_BLINK_PIN, OUTPUT); pinMode pinMode pinMode(BUTTON_PIN, (BUTTON_PIN, INPUT); pinMode(BUTTON_LED_DECR, (BUTTON_LED_DECR, INPUT); pinMode pinMode(BUTTON_LED_INCR, (BUTTON_LED_INCR, INPUT); pinMode //timer_init_ISR_1Hz(TIMER_DEFAULT); timer_init_ISR_2Hz (TIMER_DEFAULT); Serial.begin Serial.begin(9600); (9600); led2Rec = TASK_OFFSET; }
void void taskLedWithButton () // change led1 state when press button { buttonStat buttonState e = digitalRead digitalRead(BUTTON_PIN); (BUTTON_PIN); if if(buttonState (buttonState == BUTTON_PRESSED) { if if(ledState (ledState == 1) { ledState = 0; } else {
ledState = 1; digitalWrite digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, LOW); } digitalWrite(LED_PIN, (LED_PIN, ledState); digitalWrite } } void taskLedBlink() void taskLedBlink () // blinking led { if if(ledState (ledState == 0) { if if(led2State (led2State == 0) { led2State = 1; digitalWrite (LED_BLINK_PIN, HIGH); digitalWrite(LED_BLINK_PIN, } else { led2State = 0; digitalWrite digitalWrite(LED_BLINK_PIN, (LED_BLINK_PIN, LOW); } } } void taskButton2LedReadRec () // read recurency for blink led void { if if( (digitalRead(BUTTON_LED_INCR) digitalRead (BUTTON_LED_INCR) == BUTTON_PRESSED) { led2ReadRec++; } if( if(digitalRead(BUTTON_LED_DECR) digitalRead (BUTTON_LED_DECR) == BUTTON_PRESSED) { led2ReadRec--; } } void void timer_handle_interrupts (int timer) { taskLedWithButton (); taskButton2LedReadRec (); if(--led2Rec (--led2Rec
View more...
Comments