Lo que sugerí en el correo anterior era utilizar un timer de alta resolución, esos timers toman el clock del MCU (con un prescaler opcional), es el caso donde puedes obtener la mejor precisión en cuanto a tiempos. Aún así, como tienes el scheduler del sistema operativo, otras tareas, prioridades, etc, tienes que tener todo eso en cuenta para que tu tarea sea la de mayor prioridad o puedes colocar algún código mínimo dentro de la misma interrupción (por ejemplo, calcular el periodo de tiempo entre los eventos) y luego generar una notificación (
ver queue o
eventos) para que después la tarea procese esa información y haga lo que tenga que hacer.
Los ticks son del sistema operativo (en el caso de ESP-IDF es FreeRTOS), el tick es la unidad de tiempo en la que se ejecuta el task scheduler. El máximo que puedes setear en FreeRTOS es 1000 ticks por segundo (por defecto se configura en 100 o 120) y la razón para esto es que el scheduler se ejecuta en cada tick, si por ejemplo el código del scheduler consume 25 us y cada tick ocurre cada 10 ms (CONFIG_FREERTOS_HZ=100, 100 ticks por segundo), la carga de trabajo del scheduler representa un 2.5%. Si, en cambio, se pudiera configurar el sistema para 10.000 ticks por segundo, el scheduler se ejecutará cada 100 us y la carga de trabajo del scheduler será del 25%. Si sigues aumentando los ticks llegaras a un punto donde la ejecución se mantendrá siempre en el task scheduler y no podrá ejecutar ninguna tarea. Se entiende?
Lo normal es hacer lo que expliqué en el primer párrafo:
1) configuras un timer de alta resolución (usa el prescaler para lograr el mejor balance entre precisión del timer y máximo overflow)
2) en la interrupción del primer botón disparas el timer
3) en la interrupción del segundo botón detienes el timer, calculas el Delta de tiempo y generas un evento o posteas el evento en una queue (por ejemplo, usando el delta de tiempo como parámetro)
4) en una tarea capturas ese evento y haces lo que debas. Recuerda configurar la tarea con la prioridad adecuada (ver
RTOS task priority)
Saludos cordiales,