J'ai complété le programme pour avoir une vraie file d'attente pour faire une messagerie qui échangerait les données d'une tâche à l'autre. Bien sûr, une tâche tourne sur le cœur 0 et l'autre sur le cœur 1 sinon ça n'a pas d'intérêt.
Ca m'intéresse d'avoir vos retours.
PS : Pierre, je viens juste de voir ta réponse et je ne l'ai pas analysée. Cependant, le ne suis pas certain qu'il y ait besoin de sémaphore dans ce cas car il n'y a pas de modifications de données entre les tâches, non ?
TaskHandle_t vSenderTask;
TaskHandle_t vReceiverTask;
/* Declaration d'une variable xQueue de type QueueHandle_t qui servira a stocker la file. */
QueueHandle_t xQueue;
/* Taille de la file*/
int queueSize = 1000;
/* Taille maxi de la chaine de caractere */
#define maxCaractInQueue 25
void setup() {
Serial.begin(115200);
delay(2000);
Serial.printf("\n");
xQueue = xQueueCreate( queueSize, maxCaractInQueue );
if ( xQueue != NULL ) {
xTaskCreatePinnedToCore(
vSenderTaskCode, /* Task function. */
"vSenderTask", /* name of task. */
10000, /* Stack size of task */
NULL,
1, /* priority of the task */
&vSenderTask, /* Task handle to keep track of created task */
0); /* pin task to core 0 */
delay(500);
xTaskCreatePinnedToCore(
vReceiverTaskCode, /* Task function. */
"vReceiverTask", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
2, /* priority of the task */
&vReceiverTask, /* Task handle to keep track of created task */
1); /* pin task to core 1 */
delay(500);
}
else
/* The queue could not be created. */
Serial.printf("The queue could not be created.");
}
void vSenderTaskCode( void *parameter ) {
BaseType_t xStatus;
/* Variable qui va contenir la valeur a envoyer*/
char strTx[maxCaractInQueue];
Serial.print("vSenderTask\n");
for (int i = 0; i < queueSize; i++) {
sprintf(strTx, "Ligne %d", i);
xStatus = xQueueSendToBack( xQueue, (char*) strTx, 0 );
if ( xStatus != pdPASS )
Serial.printf( "Could not send to the queue.\r\n" );
else
Serial.printf("Send : %s\n", strTx);
}
vTaskDelete( NULL );
}
void vReceiverTaskCode( void *parameter ) {
BaseType_t xStatus;
/* Variable qui va contenir la valeur recue*/
char strRx[maxCaractInQueue];
const TickType_t xTicksToWait = pdMS_TO_TICKS( 100 );
Serial.print("vReceiverTask\n");
for ( ;; ) {
if ( uxQueueMessagesWaiting( xQueue ) != 0 )
Serial.printf( "Queue should have been empty!\n" );
xStatus = xQueueReceive( xQueue, &strRx, xTicksToWait );
if ( xStatus == pdPASS )
/* Data was successfully received from the queue, print out the received
value. */
Serial.printf( "Received : %s\n", &strRx );
else
Serial.printf( "Could not receive from the queue.\r\n" );
}
}
void loop() {}