[FreeRTOS] Comment récupérer les données d'un buffer ?
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:
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