S05APP2: Noyau temps réel

Dependencies:   mbed mbed-rtos

Committer:
marc1119
Date:
Fri Jan 27 14:21:41 2017 +0000
Revision:
7:e9f5280d47b3
Parent:
6:6da143aff561
Child:
8:56f2b8db5361
Ajout du mutex et de la mailbox

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benjaminroy 0:4f447b02a32f 1 #include "mbed.h"
benjaminroy 1:d37b1a61bd0b 2 #include "rtos.h"
benjaminroy 0:4f447b02a32f 3
marc1119 7:e9f5280d47b3 4 Mutex createEvent;
benjaminroy 3:fa3112b2216c 5 Ticker ticker;
benjaminroy 1:d37b1a61bd0b 6 DigitalIn en_1(p15);
benjaminroy 1:d37b1a61bd0b 7 DigitalIn en_2(p16);
benjaminroy 1:d37b1a61bd0b 8 AnalogIn ea_1(p19);
benjaminroy 1:d37b1a61bd0b 9 AnalogIn ea_2(p20);
benjaminroy 3:fa3112b2216c 10 DigitalOut led1(LED1);
marc1119 2:94e2eebf1524 11 DigitalOut led2(LED2);
benjaminroy 4:8f40ed50c04b 12 DigitalOut led3(LED3);
benjaminroy 4:8f40ed50c04b 13 DigitalOut led4(LED4);
marc1119 2:94e2eebf1524 14 Thread *t1;
marc1119 2:94e2eebf1524 15 Thread *t2;
marc1119 2:94e2eebf1524 16 Thread *t3;
marc1119 2:94e2eebf1524 17
benjaminroy 3:fa3112b2216c 18 uint8_t compteur = 0;
benjaminroy 5:79b5773e6764 19 bool verifierSiStable = false;
benjaminroy 6:6da143aff561 20 float echantillons1[5];
benjaminroy 6:6da143aff561 21 float echantillons2[5];
benjaminroy 6:6da143aff561 22 float seuil = 0.125;
benjaminroy 6:6da143aff561 23
marc1119 7:e9f5280d47b3 24 typedef struct {
marc1119 7:e9f5280d47b3 25 bool type; //Numérique = 0, analogique = 1
marc1119 7:e9f5280d47b3 26 time_t time; //Le temps au moment ou l'évènement s'est produit.
marc1119 7:e9f5280d47b3 27 uint8_t pinNumber; //Le numéro de la pin
marc1119 7:e9f5280d47b3 28 } mail_t;
marc1119 7:e9f5280d47b3 29
marc1119 7:e9f5280d47b3 30 Mail<mail_t, 20> mail_box; //La taille du buffer est à déterminer
benjaminroy 3:fa3112b2216c 31 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 32 // -------------------------------------------------------
benjaminroy 3:fa3112b2216c 33
marc1119 7:e9f5280d47b3 34 void createMail(bool type, uint8_t pinNumber)
marc1119 7:e9f5280d47b3 35 {
marc1119 7:e9f5280d47b3 36 createEvent.lock();
marc1119 7:e9f5280d47b3 37 mail_t *mail = mail_box.alloc();
marc1119 7:e9f5280d47b3 38 mail->type = type;
marc1119 7:e9f5280d47b3 39 mail->time = time(NULL);
marc1119 7:e9f5280d47b3 40 mail->pinNumber = pinNumber;
marc1119 7:e9f5280d47b3 41 createEvent.unlock();
marc1119 7:e9f5280d47b3 42 mail_box.put(mail);
marc1119 7:e9f5280d47b3 43 }
marc1119 7:e9f5280d47b3 44
benjaminroy 1:d37b1a61bd0b 45 void lecture_analog(void const *args) {
benjaminroy 6:6da143aff561 46 int i = 0;
benjaminroy 6:6da143aff561 47 float moyenne_passee1 = -1;
benjaminroy 6:6da143aff561 48 float moyenne_passee2 = -1;
benjaminroy 6:6da143aff561 49
benjaminroy 6:6da143aff561 50 while (true) {
benjaminroy 6:6da143aff561 51 // Synchronisation sur la période d'échantillonnage
benjaminroy 6:6da143aff561 52 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 53
benjaminroy 6:6da143aff561 54 // Lecture des échantillons analogiques
benjaminroy 6:6da143aff561 55 float entreeanal_1 = ea_1.read();
benjaminroy 6:6da143aff561 56 float entreeanal_2 = ea_2.read();
benjaminroy 6:6da143aff561 57
benjaminroy 6:6da143aff561 58 echantillons1[i] = entreeanal_1;
benjaminroy 6:6da143aff561 59 echantillons2[i] = entreeanal_2;
benjaminroy 6:6da143aff561 60
benjaminroy 6:6da143aff561 61 i++;
benjaminroy 6:6da143aff561 62 if (i == 5) {
benjaminroy 6:6da143aff561 63 // Calcul de la moyenne courante du signal (calculée sur 5 échantillons successifs)
benjaminroy 6:6da143aff561 64 float moyenne_courante1 = (echantillons1[0] + echantillons1[1] + echantillons1[2] + echantillons1[3] + echantillons1[4]) / 5;
benjaminroy 6:6da143aff561 65 float moyenne_courante2 = (echantillons2[0] + echantillons2[1] + echantillons2[2] + echantillons2[3] + echantillons2[4]) / 5;
benjaminroy 6:6da143aff561 66 //printf("moyenne courante = %f, moyenne passee = %f, variation = %f\n", moyenne_courante1, moyenne_passee1, std::abs(1 - (moyenne_courante1 / moyenne_passee1)));
benjaminroy 6:6da143aff561 67
benjaminroy 6:6da143aff561 68 if (moyenne_passee1 != -1) {
benjaminroy 6:6da143aff561 69 if ((std::abs(1 - (moyenne_courante1 / moyenne_passee1))) > seuil) {
benjaminroy 6:6da143aff561 70 // Génération éventuelle d'un événement
marc1119 7:e9f5280d47b3 71 createMail(1, 19);
benjaminroy 6:6da143aff561 72 printf("La variation de la moyenne 1 depasse le seuil fixe\n");
benjaminroy 6:6da143aff561 73
benjaminroy 6:6da143aff561 74 }
benjaminroy 6:6da143aff561 75 }
benjaminroy 6:6da143aff561 76 if (moyenne_passee2 != -1) {
benjaminroy 6:6da143aff561 77 if ((std::abs(1 - (moyenne_courante2 / moyenne_passee2))) > seuil) {
benjaminroy 6:6da143aff561 78 // Génération éventuelle d'un événement
marc1119 7:e9f5280d47b3 79 createMail(1, 20);
benjaminroy 6:6da143aff561 80 printf("La variation de la moyenne 2 depasse le seuil fixe\n");
benjaminroy 6:6da143aff561 81
benjaminroy 6:6da143aff561 82 }
benjaminroy 6:6da143aff561 83 }
benjaminroy 6:6da143aff561 84
benjaminroy 6:6da143aff561 85 moyenne_passee1 = moyenne_courante1;
benjaminroy 6:6da143aff561 86 moyenne_passee2 = moyenne_courante2;
benjaminroy 6:6da143aff561 87 i = 0;
benjaminroy 6:6da143aff561 88 }
benjaminroy 0:4f447b02a32f 89 }
benjaminroy 0:4f447b02a32f 90 }
marc1119 2:94e2eebf1524 91
benjaminroy 5:79b5773e6764 92 void lecture_num(void const *args) {
benjaminroy 1:d37b1a61bd0b 93 while (true) {
benjaminroy 3:fa3112b2216c 94 // Synchronisation sur la période d'échantillonnage
marc1119 2:94e2eebf1524 95 Thread::signal_wait(0x1);
benjaminroy 6:6da143aff561 96
benjaminroy 3:fa3112b2216c 97 // Lecture des échantillons numériques
benjaminroy 3:fa3112b2216c 98 uint8_t entreenum_1 = en_1.read();
benjaminroy 3:fa3112b2216c 99 uint8_t entreenum_2 = en_2.read();
benjaminroy 6:6da143aff561 100 //printf("Valeur de entree numerique 1: %d\n", entreenum_1);
benjaminroy 6:6da143aff561 101 //printf("Valeur de entree numerique 2: %d\n", entreenum_2);
benjaminroy 3:fa3112b2216c 102
benjaminroy 3:fa3112b2216c 103 // Lecture de l'étampe temporelle
benjaminroy 3:fa3112b2216c 104 time_t t = std::time(NULL);
benjaminroy 5:79b5773e6764 105
benjaminroy 5:79b5773e6764 106 // Prise en charge du phénomène de rebond
benjaminroy 5:79b5773e6764 107 if (en_1 || en_2) {
benjaminroy 5:79b5773e6764 108 verifierSiStable = true;
benjaminroy 5:79b5773e6764 109 Thread::signal_wait(0x2);
benjaminroy 5:79b5773e6764 110
benjaminroy 5:79b5773e6764 111 if (en_1 == 1 && entreenum_1 == en_1.read()) {
marc1119 7:e9f5280d47b3 112 // Génération d'un évènement...
benjaminroy 5:79b5773e6764 113 printf("Entree numerique 1 est stable\n");
marc1119 7:e9f5280d47b3 114 createMail(0, 15);
benjaminroy 5:79b5773e6764 115
benjaminroy 5:79b5773e6764 116 } else {
benjaminroy 6:6da143aff561 117 // Entree numerique 1 n'est pas stable
benjaminroy 5:79b5773e6764 118 Thread::yield();
benjaminroy 5:79b5773e6764 119 }
benjaminroy 5:79b5773e6764 120 if (en_2 == 1 && entreenum_2 == en_2.read()) {
marc1119 7:e9f5280d47b3 121 // Génération d'un évènement...
benjaminroy 5:79b5773e6764 122 printf("Entree numerique 2 est stable\n");
marc1119 7:e9f5280d47b3 123 createMail(0, 16);
benjaminroy 5:79b5773e6764 124
benjaminroy 5:79b5773e6764 125 } else {
benjaminroy 6:6da143aff561 126 // Entre numerique 2 n'est pas stable
benjaminroy 5:79b5773e6764 127 Thread::yield();
benjaminroy 5:79b5773e6764 128 }
benjaminroy 5:79b5773e6764 129 }
benjaminroy 5:79b5773e6764 130 else {
benjaminroy 5:79b5773e6764 131 Thread::yield();
benjaminroy 5:79b5773e6764 132 }
benjaminroy 1:d37b1a61bd0b 133 }
benjaminroy 1:d37b1a61bd0b 134 }
marc1119 2:94e2eebf1524 135
benjaminroy 1:d37b1a61bd0b 136 void collection(void const *args) {
benjaminroy 1:d37b1a61bd0b 137 while (true) {
benjaminroy 1:d37b1a61bd0b 138 // attente et lecture d'un événement
marc1119 7:e9f5280d47b3 139 osEvent evt = mail_box.get();
marc1119 7:e9f5280d47b3 140 if (evt.status == osEventMail) {
marc1119 7:e9f5280d47b3 141 mail_t *mail = (mail_t*)evt.value.p;
marc1119 7:e9f5280d47b3 142 // écriture de l'événement en sortie (port série)
marc1119 7:e9f5280d47b3 143 if(mail->type == 0) printf("Une lecture a ete detectee sur l'entree numerique %d, a %d secondes\n", mail->pinNumber, mail->time);
marc1119 7:e9f5280d47b3 144 else printf("Une lecture a ete detectee sur l'entree analogique %d, a %d secondes\n", mail->pinNumber, mail->time);
marc1119 7:e9f5280d47b3 145 mail_box.free(mail);
marc1119 7:e9f5280d47b3 146 }
marc1119 7:e9f5280d47b3 147 else Thread::yield();
benjaminroy 1:d37b1a61bd0b 148 }
benjaminroy 1:d37b1a61bd0b 149 }
marc1119 2:94e2eebf1524 150
benjaminroy 3:fa3112b2216c 151 void alarm() {
benjaminroy 3:fa3112b2216c 152 compteur++;
benjaminroy 5:79b5773e6764 153
benjaminroy 5:79b5773e6764 154 if (verifierSiStable) {
benjaminroy 5:79b5773e6764 155 t1->signal_set(0x2);
benjaminroy 5:79b5773e6764 156 verifierSiStable = false;
benjaminroy 5:79b5773e6764 157 }
benjaminroy 3:fa3112b2216c 158
benjaminroy 3:fa3112b2216c 159 if (compteur % 2 == 0) {
benjaminroy 3:fa3112b2216c 160 // Entrées numériques échantillionnées à tous les 100 ms
benjaminroy 3:fa3112b2216c 161 t1->signal_set(0x1);
benjaminroy 3:fa3112b2216c 162 } else if (compteur % 5 == 0) {
benjaminroy 3:fa3112b2216c 163 // Entrées analogiques échantillonnées à tous les 250 ms
benjaminroy 6:6da143aff561 164 t2->signal_set(0x1);
marc1119 2:94e2eebf1524 165 }
benjaminroy 3:fa3112b2216c 166
benjaminroy 3:fa3112b2216c 167 if (compteur % 10 == 0) {
benjaminroy 3:fa3112b2216c 168 compteur = 0;
benjaminroy 3:fa3112b2216c 169 }
marc1119 2:94e2eebf1524 170 }
marc1119 2:94e2eebf1524 171
benjaminroy 1:d37b1a61bd0b 172 int main() {
marc1119 2:94e2eebf1524 173 // Démarrage des tâches
benjaminroy 5:79b5773e6764 174 printf("Demarrage des taches...\n");
benjaminroy 3:fa3112b2216c 175
marc1119 2:94e2eebf1524 176 Thread t_lectureNum(lecture_num);
benjaminroy 6:6da143aff561 177 Thread t_lectureAnalog(lecture_analog);
marc1119 2:94e2eebf1524 178 Thread t_collection(collection);
marc1119 2:94e2eebf1524 179
marc1119 2:94e2eebf1524 180 t1 = &t_lectureNum;
benjaminroy 6:6da143aff561 181 t2 = &t_lectureAnalog;
marc1119 2:94e2eebf1524 182 t3 = &t_collection;
benjaminroy 3:fa3112b2216c 183
marc1119 2:94e2eebf1524 184 // Initialisation du RTC
benjaminroy 6:6da143aff561 185 ticker.attach(&alarm, 0.05);
benjaminroy 5:79b5773e6764 186
benjaminroy 4:8f40ed50c04b 187 while(1) {}
benjaminroy 1:d37b1a61bd0b 188 }