Los flujos, y por lo tanto también los mensajes, utilizan al campo de notificaciones de 32 bits que cada tarea incluye, por lo que estos campos sufrirán modificaciones si utilizas flujos y mensajes. En otras palabras, si utilizas flujos o mensajes, entonces no podrás utilizar notificaciones (recuerda que éstas tienen varios usos), y viceversa, a no ser que utilices las funciones de la API de notificaciones que incluyen o terminan en Indexed
. Por favor sigue leyendo.
En la lección Notificaciones (I) te hablé de las notificaciones directas a la tarea (Direct to task notifications, en inglés) y de cómo podían ser utilizadas para transferir datos de 32 bits. Lo que no te dije es que antes de la versión 10.4.0 de FreeRTOS sólo existía un campo de notificaciones por cada tarea, pero a partir de dicha versión ya puedes tener un arreglo de campos de notificaciones (el tamaño del arreglo lo estableces con la constante configTASK_NOTIFICATION_ARRAY_ENTRIES
en el archivo de configuración FreeRTOSConfig.h) en cada tarea. Los flujos y los mensajes utilizan la entrada 0 de dicho arreglo. Esto significa que puedes utilizar flujos (o mensajes) y notificaciones al mismo tiempo, siempre y cuando te asegures de utilizar un índice mayor que 0 para las notificaciones y que utilices las funciones de la API de notificaciones que incluyen o terminan en Indexed
.
La API completa de las notificaciones la puedes consultar aquí.
¿Porqué no lo mencioné en las lecciones? Por una simple pero perturbadora razón: los arreglos de notificaciones no funcionan con el compilador avr-gcc y el chip ATmega328. Cualquier intento de utilizar un arreglo de notificaciones mayor a 1 causaba que los programas tronaran, volviéndolos inseguros e inutilizables. Así que tomé la decisión de continuar con el tema, pero suponiendo que sólo existía un campo de notificaciones, y sin mencionar la existencia del arreglo.
Por cuestiones de tiempo y de mis diferentes actividades, al día de hoy (5/abril/21), no he podido hacer la prueba del arreglo de notificaciones con microcontroladores diferentes, en particular con los de la familia LPC de NXP y los STM de ST, ambos de 32 bits,, que son con los que tengo infraestructura. En cuanto lo haga reportaré mis resultados.
UPDATE (25/mayo/21): Los arreglos de notificaciones en el microcontrolador LPC1549 (32 bits, Cortex-M3) funcionan perfectamente. Casi estoy seguro que el compilador avr-gcc o el port del ATmega328 de FreeRTOS tienen un error.