Dentro de una biblioteca de funciones comunes (Conjunto de instrucciones ----> Programa de alto nivel) ¿hay información de cuántos ciclos de reloj usan?

Soy una Persona Matemática. Así que pensando desde esa perspectiva.

Para hacer mi pregunta un poco más concreta. Estaba pensando en controlar un servo de hobby a través de un flujo de datos en serie Uart.

Estoy inventando números con el propósito de comunicar la idea.

CONTEXTO:

Supongamos que un servo necesita actualizarse a 100 Hz y necesita una resolución de 1 grado.

Esto implica que las comunicaciones en serie deben enviar DATOS (101101000) de 9 bits de ancho. (Me doy cuenta de que hay gastos generales MANTÉNGALO SIMPLE ATM). @ 100 Hz. Por lo tanto, tasa de transferencia de 900 bits por segundo.

Dado que un servo está controlado por una señal PWM. Y en el caso de un arduino con reloj de 16Mhz.

Esa transferencia en serie consumirá un porcentaje del tiempo, dejando el resto para producir la señal PWM para controlar el servo.

PREGUNTA PRINCIPAL:

¿Cómo encuentro en general "dada la naturaleza de la biblioteca de los lenguajes de programación" la cantidad de instrucciones de bajo nivel utilizadas para una función o rutina particular? Entonces puedo ver si tengo suficiente tiempo para encajar en este caso. La señal PWM entre la transferencia de datos.

¿Te refieres a algún procesador en particular? ¿Y qué sistema operativo tienes en mente?
Microcontrolador Atmel AtMega32u4. Sin embargo, mi pregunta era de carácter general. Porque se trata más de cómo encontrar esta información para "placa de inserción" y poder seleccionar en consecuencia.
eso es genial, encontré un error en cuestión de todos modos. 9 * 100 = 900 no 9000 jajaja. Gracias.
en términos humanos, la carga de trabajo en el microcontrolador que realiza una actualización del servo de 100 Hz es similar a pasar una página de un libro una vez al día más o menos... realmente solo estoy adivinando la exactitud de la comparación
Usted escribe el código y luego lo compara con un alcance. Dispare en el borde descendente de UART, luego muestre el PWM. Tratando de llegar a una teoría de cuántas instrucciones no van a producir las librerías de Ardunio, hay demasiada sustancia pegajosa de C++ entre el código de usuario y el hardware. Si contar las instrucciones es importante, escriba el controlador usted mismo. Codificar sistemas de microcontroladores en tiempo real con Arduino suena doloroso.

Respuestas (2)

En general, cualquier biblioteca escrita en C probablemente no tendrá información sobre cuántos ciclos de reloj se necesitan para ejecutar una función. El motivo es que depende de la configuración de optimización de su compilador y del compilador que utilice.

Por lo general, solo puede saber a partir del código fuente cuánto tiempo llevará algo si está mirando el lenguaje ensamblador. Y solo entonces buscando el tiempo de cada instrucción en la hoja de datos.

Creo que las placas Arduino usan los procesadores Atmel AVR. En ese caso, puede usar Atmel Studio para simular el código para cualquier función de biblioteca. El simulador contará el tiempo transcurrido de la simulación.

Simplemente coloque un punto de interrupción antes y después del código que desea cronometrar. Ejecute el código hasta el primer punto de interrupción y registre el tiempo. Luego corre al segundo punto de interrupción y verifica el tiempo. La diferencia en esos dos tiempos es lo que quieres medir.

La recepción en serie y la generación de PWM en realidad se ejecutan en paralelo sin la participación de la CPU porque su chip probablemente tenga hardware dedicado para ambas funciones. Solo se requiere que la CPU ajuste el ciclo de trabajo de PWM si necesita cambiar, y que tome un carácter una vez que el búfer de recepción esté lleno.

También con respecto a los 9 bits, si su UART admite una palabra de 9 bits, entonces su número total de bits es de 9 bits de datos más un bit de inicio y parada, es decir, 11 bits por valor. Si su UART solo admite 8 bits, está obligado a enviar dos bytes, para un total de 20 bits si incluye los bits de inicio y parada.

Tenga en cuenta que el tiempo que llevará enviar un byte se puede determinar aproximadamente sin simulación solo en función de la velocidad en baudios. Por ejemplo, una velocidad de 9600 bps tomará (10 bits)/(9600 bits por segundo) = 1,04 ms por byte (al enviar con 8 bits de datos, 1 bit de inicio, 1 bit de parada). Dado que solo necesita actualizar una vez cada 10 ms, incluso 9600 bps (que es bastante lento) sería más que suficiente.

Los UART en los chips AVR admiten 9 bits, pero el noveno bit debe extraerse de un registro separado.
Gracias user96037 eso es exactamente lo que estaba buscando. No me di cuenta de que PWM era paralelo (información muy útil). Buen punto sobre la eficiencia del compilador. ¡Tenía una comprensión conceptual muy general, gracias por tomarse el tiempo para responder!
Curiosamente, algunas de las partes de XMOS tienen una cadena de herramientas que muestra esta información directamente en el IDE, junto con la gran cantidad de unidades de ejecución necesarias para mantener cada una lo suficientemente simple como para permitir este tipo de determinismo para un conjunto útil de código de aplicación. En un sentido más general, este problema es un caso especial del "problema de la detención". xmos.com/products/herramientas

Incluso con un procesador RISC como este, donde todas las instrucciones toman la misma cantidad de ciclos, será difícil, si no imposible, determinar la cantidad exacta de ciclos (y, por lo tanto, el tiempo) de una rutina de biblioteca determinada. Especialmente considerando que cada decisión condicional dentro de cada llamada a la biblioteca puede introducir más o menos instrucciones (y tiempo) en la ruta de ejecución. Si estuviera trabajando con un depurador completo y un sistema de simulaciones (que Atmel puede ofrecer a un precio), entonces sería posible establecer puntos de interrupción y medir el tiempo preciso de cada caso posible de cada rutina. Pero sospecho que sería frustrante a menos que las funciones de la biblioteca estuvieran diseñadas para garantizar que todos los casos resultaran en el mismo momento.

Siendo ese el caso, si yo fuera usted y tuviera estas inquietudes, emplearía un osciloscopio con al menos doble rastreo y capacidad de disparo para probar la temporización y la sincronización, de una manera más determinista. Es decir, puedo iniciar cualquier cantidad de secuencias de prueba y alternar varios pines digitales para cambiar el estado de salida cuando se completa una tarea determinada. Esto me permitiría ver claramente tanto el tiempo total para completar varias tareas, como las diferencias entre varios casos. El resultado que espera, que creo que obtendrá dada la velocidad de las CPU, es que tendrá tiempo extra más que suficiente, y todas sus tareas se completarán en un tiempo insignificante en comparación con la velocidad mucho más lenta. de las palabras seriales reales de 9 bits.

Por supuesto, si resulta que incluso con un tiempo de procesamiento insignificante, todavía no está satisfecho con estar limitado por la velocidad de la transmisión en serie, entonces tendrá que usar una tasa de bits/baudios mucho más rápida, o tendrá que utilizar varios procesadores (cada uno con su propia E/S serie). luego, todos pueden preparar sus datos y ser activados para enviarlos simultáneamente, desde un solo comando (como un único punto de E/S digital que indica a todas las CPU que envíen).

¡Buena suerte! Con suerte, encontrará que la velocidad de Arduino no es un problema, y ​​​​el envío de datos a todos sus servos uno a la vez sigue siendo adecuado.

Y no sé si importa, pero todos los procesadores arduino que conozco tienen varias salidas PWM directas.

Pero también tenga en cuenta que probablemente haya mejores foros que el foro de ingeniería eléctrica para preguntas específicas sobre codificación o capacidad del procesador.

+1, la parte divertida (no realmente) es que cuando compila el código para la producción, sin varios ganchos de depuración, el tiempo cambiará nuevamente.
@AliChen Bueno, no he trabajado con las herramientas de simulación de Amtel, pero puedo decirle que en otras plataformas (en particular, algunas de las MCU de microchip), la simulación le permite predecir con precisión la ejecución entre dos puntos cualesquiera. En los primeros días, cuando los UART incorporados costaban un poco, diseñé con éxito varios "bit bangers" en serie de esa manera, y me imagino que tales herramientas serían lo suficientemente buenas para el OP, SI tuviera esas herramientas y las mantuviera completas . control del código. Para su situación, lo haría de la manera que sugerí.
Gracias también por tu información Randy. No tenía las palabras, así que solo generé un solo caso donde estaba lo suficientemente claro como para obtener la información :). En cuanto a mis necesidades reales. Podría construir un caso más complejo en el que esté ejecutando servos multiplicados a una frecuencia de actualización mucho mayor que 100Hz. Estaba pensando en cómo sincronizaría algún proceso externo como un servo o grupo de servos con el árbol de decisión de la CPU interna. Obviamente, la complejidad del árbol de decisiones puede crecer muy rápidamente. Pero sin medir los ciclos de reloj en relación con el código, no tenía idea de qué hacer.