Saltar al contenido

ESP8266/Arduino: ¿Por qué es necesario agregar el ICACHE_RAM_ATTR? macro a ISR y funciones llamadas desde allí?

Posterior a de una prolongada selección de datos hemos podido solucionar este inconveniente que pueden tener algunos los usuarios. Te regalamos la solución y nuestro deseo es serte de gran ayuda.

Solución:

El ICACHE_RAM_ATTR y el ICACHE_FLASH_ATTR son enlazadores attributes. Una vez que compila su boceto, puede decir si la función debe almacenarse en la RAM o FLASH (normalmente no configura nada: no hay caché).

ESP8266 es multitarea y el ESP32 tiene 2 núcleos. Entonces puede ejecutar su código como subprocesos múltiples, ya que usa el RTOS.

Y ahora el problema: todo el flash se usa para el programa y el almacenamiento. La lectura y escritura en el flash se puede hacer solo en 1 subproceso. Si intenta acceder al flash simultáneamente en 2 subprocesos diferentes, su ESP probablemente se bloquee.

Esto se debe a que puede poner su función en la RAM en lugar de la flash. Entonces, incluso si está escribiendo algo en la EEPROM o en la memoria flash, esta función se puede llamar sin acceder a la memoria flash.

Con ICACHE_RAM_ATTR pones la función en la RAM.

Con ICACHE_FLASH_ATTR pones la función en el FLASH (para ahorrar RAM).

Las funciones de interrupción deben utilizar ICACHE_RAM_ATTR. Función que se llama con frecuencia, no debe usar ningún caché attribute.

Importante: ¡NUNCA acceda a su flash dentro de una interrupción! La interrupción puede ocurrir durante un acceso flash, por lo que si intenta acceder al flash al mismo tiempo, obtendrá un bloqueo (y a veces esto sucede después de 1-2 horas después de usar su dispositivo).

Dado que solo tiene 32kb de IRAM (RAM de instrucción), debe intentar poner solo funciones de interrupción en la RAM, no todas sus funciones, incluso si es posible hacerlo.

Segunda pregunta:
¡NO, absolutamente no! inline es otro indicador del compilador, de modo que el compilador intentará poner toda su función dentro de la función de llamada => convertir una llamada de función a código c ++ dentro de su principal. Esto no significa que el compilador lo hará, solo pruébalo. No puede solicitar colocar la función dentro de la RAM, si la función ya no existe una vez que compila su boceto.

Comentarios y valoraciones del post

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *