
S05APP2: Noyau temps réel
main.cpp@7:e9f5280d47b3, 2017-01-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |