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

1

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 hobby servo a través de un flujo de datos en serie de Uart.

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

CONTEXT:

Supongamos que un servo debe 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 MANTENERLO SIMPLE ATM). @ 100Hz. Por lo tanto, 900 bits por segundo de velocidad de transferencia.

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 puedo encontrar en general "dada la naturaleza de la biblioteca de los lenguajes de programación" el número de instrucciones de bajo nivel utilizadas para una función o rutina en particular? Entonces puedo ver si tengo suficiente tiempo para encajar en este caso. La señal PWM entre la transferencia de datos.

    
pregunta Rob

2 respuestas

0

En general, cualquier biblioteca escrita en C probablemente no tenga información sobre la cantidad de ciclos de reloj necesarios para ejecutar una función. La razón es que depende de la configuración de optimización de tu compilador y del compilador que uses.

Por lo general, solo puede decir del código fuente cuánto tiempo va a tardar algo si está viendo el lenguaje ensamblador. Y solo entonces buscando el tiempo para cada instrucción en la hoja de datos.

Creo que las placas Arduino utilizan los procesadores AVR de Atmel. En ese caso, puede usar Atmel Studio para simular el código de 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 calcular. Ejecute el código hasta el primer punto de interrupción y registre la hora. A continuación, ejecute el segundo punto de interrupción y compruebe el tiempo. La diferencia en esos dos tiempos es lo que quieres medir.

La recepción en serie y la generación PWM en realidad se ejecutan en paralelo sin la participación de la CPU, ya que su chip probablemente tenga hardware dedicado para ambas funciones. La CPU solo se requiere para ajustar el ciclo de trabajo PWM si es necesario cambiar, y para tomar 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 de parada, por lo que 11 bits por valor. Si su UART solo admite 8 bits, se le obliga a enviar dos bytes, por un total de 20 bits si incluye los bits de inicio y parada.

Tenga en cuenta que el tiempo que se tardará en 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). Como solo necesita actualizar una vez cada 10 ms, incluso 9600 bps (que es bastante lento) sería más que suficiente.

    
respondido por el user4574
1

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 de biblioteca puede introducir más o menos instrucciones (y tiempo) en la ruta de ejecución. Si estuviera trabajando con un sistema completo de depuración y simulaciones (que Atmel puede ofrecer a un precio), 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 fuera usted y tuviera estas inquietudes, emplearía un osciloscopio con al menos doble trazo y capacidad de activación para probar el tiempo y la sincronización, de una manera más determinista. Es decir, puedo iniciar cualquier número 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 adicional más que suficiente, y todas sus tareas se completarán en un tiempo que es 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 velocidad de bits / baudios mucho más rápida, o Tendrá que usar varios procesadores (cada uno con su propia E / S en serie). luego, todos pueden preparar sus datos y ser activados para enviarlos simultáneamente, desde un solo comando (como un solo punto de E / S digital que indica a todas las CPU que deben enviarse).

¡Buena suerte! Esperamos que encuentre que la velocidad de Arduino no es un problema, y el envío de datos a todos sus servos uno por uno sigue siendo adecuado.

Y no sé si importa, pero todos los procesadores de 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.

    
respondido por el Randy

Lea otras preguntas en las etiquetas