A première vue je pense que la mémoire associée à la tache est allouée une seule fois quand tu fais "taskCreate/pthreadcreate/ ou équivalent".
J'ai parcouru le code source pour avoir une réponse à ce sujet et j'ai trouvé un comportement qui semble correspondre à ça.
Voici l'implémentation de la fonction en question :
1 2 3 4 5 6 7 8 9 10 11
| xTaskHandle xTaskGetCurrentTaskHandle( void )
{
xTaskHandle xReturn;
/* A critical section is not required as this is not called from
an interrupt and the current TCB will always be the same for any
individual execution thread. */
xReturn = pxCurrentTCB;
return xReturn;
} |
Il est donc évident qu'elle ne fait pas d'allocation juste pour nous.
Dans le même fichier task.c, à la ligne 148 :
PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL;
A la ligne 214 de l'en-tête task.h, on trouve :
#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) )
On repart donc dans le fichier d'implémentation, ligne 486 pour voir comment cette fonction fonctionne. On regarde rapidement l'instruction :
xNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );
On arrive au final à la ligne 2396 et on trouve la fonction prvAllocateTCBAndStack(), qui fait des allocations, notamment avec :
pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) );
La fonction pvPortMalloc() est définie dans les fichiers du dossier MemMang. Je pense que son nom est clair ^^
En conclusion, je dirais qu'il n'y a pas besoin de faire un free() et même qu'il ne faudrait mieux pas essayer d'en faire un ^^
PS : qu'elle est le nom exact de la fonction pour mallinfo stp ? Est-ce que cela serait xPortGetFreeHeapSize() ?
Partager