Bonjour,
J'ai programme embarqué qui utilise FreeRTOS et j'ai une tache qui remplie un buffer.
Je voudrais créer la fonction readData() qui me permettrait de pouvoir récupérer les données : comment faut-il procéder ?
Je pensais utiliser des mutex mais je ne vois pas trop comment faire sans que socket_task() et readData() s'inter-bloquent car ces deux fonctions ont besoin de connaitre l'état de l'autre fonction :
- socket_task() doit savoir quand readData() a vidé le buffer pour pouvoir relancer la fonction de remplissage du buffer.
- readData() ne doit pas lire le buffer s'il est en cours de modification par socket_task() (getSocketData() en cours d'execution).
Ci-dessous, les contraintes que j'ai (surtout à cause de la gestion du timeout) :
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 static char rxBuffer[100]; static size_t rxLen; void socket_task(void){ while(1){ // Remplissage du buffer // => Cette fonction est blocante. // => Elle ne doit pas être rappelée tant // que le buffer n'a pas été entièrement vidé. bool_t status = getSocketData(rxBuffer, &rxLen); if(status){ //... TODO : blocage tant que les données de rxBuffer n'ont pas été récupérée ... } } } // Fonction pour récupérer les données : elle est appelée depuis d'autres taches bool_t readData(char * data, size_t size, size_t *read, TickType_t timeout){ // La fonction est blocante tant qu'elle n'a pas récupérée le nombe d'octets // définit par la variable size // ... ou si le timeout s'est déclenché. // => Si timeout vaut portMAX_DELAY, alors il n'y a pas de gestion de timeout // (la fonction reste tout le temps blocante jusqu'a ce que le nombe d'octets // définit par la variable size soit récupéré) // => La fonction retourne true si pas de timeout déclenché (sinon false) // => après execution de la fonction, read contient le nombre d'ooctets récupérés. //... TODO ... // => il faut arriver à gérer les cas où la valeur de size est différente de // la taille de rxBuffer. }
Partager