IoT Laborator NR 2

September 29, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF