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) :
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.
 
}
Merci d'avance