Codificación del ensamblador para ARM (Cortex-M0 y M3): ¿es posible / práctico?

1

Lamentablemente, no hay preguntas en la Pila con respecto a ARM y ensamblador.

Mi preocupación - es dispositivos críticos de tiempo. Tomemos como ejemplo uno de mis dispositivos basados en AVR (programa compilado con GCC) que debería hacer algo hasta la interrupción INT0. Funcionó con un oscilador interno de 8 MHz (125 ns en un ciclo de máquina) pero tomó hasta 5 microsegundos para reaccionar ante la interrupción. Después de la investigación del código, llegué a la conclusión de que, al comienzo del servicio de interrupciones, el procesador de rutina hace mucho trabajo para guardar su estado, que es casi incontrolable para los lenguajes de programación de alto nivel (como C es). Si utilizara el ensamblador, por ejemplo, podría lanzar un cambio de pin desde el principio y guardar el resto de los cálculos necesarios después de eso. O podría tener mucho más control sobre el uso de los registros y, por lo tanto, mucho menos tiempo para guardar esos registros.

Si fuera a ARM (lo que planeo hacer pronto) tendré un núcleo de procesador mucho más rápido con muchos más registros y espacio de memoria que parece prometedor. Pero ¿podré alguna vez tener control sobre dichos procesos críticos de tiempo para obtener, por ejemplo, tiempo de reacción dentro de, digamos, cientos de nanosecs?

    
pregunta Roman Matveev

3 respuestas

4

Es muy razonable programar ARM en ensamblador. Es una arquitectura RISC directa con pocas sorpresas y muchos registros. Puede combinar C y ensamblador siempre que tenga una buena comprensión de las convenciones de llamada.

Hay un modo especial de interrupción ARM de baja latencia llamado FIQ , que transfiere algunos de los registros a un banco en hardware para que no sea necesario guardarlos en el ISR. La latencia de 100 ns para hacer algo útil todavía será difícil: a 100MHz eso es 10 ciclos de reloj, y FIQ toma hasta 12 antes de que se ejecute la primera instrucción.

    
respondido por el pjc50
2

Sí, es ciertamente posible: todo el código de inicio que utiliza su programa C normalmente se escribirá en ensamblador (archivos .s).

Muchas de las cosas que la gente quiere hacer con los procesadores ARM se basan en la infraestructura existente de pilas de protocolos y bibliotecas de gráficos. Si está escribiendo aplicaciones independientes, usándolas como un super 8051 o PIC, puede usar el ensamblador para todo (o escribir sus propias pilas UDP, etc.). Por supuesto, puede asignar secciones críticas al código y usar C para la mayor parte de la programación.

Observé la codificación del ensamblador principal ARM7DTMI hace algún tiempo, y parecía bastante agradable trabajar con él. Estimé que no se tardaría más en alcanzar la velocidad que con cualquier otro procesador nuevo en ensamblador (pero en realidad re uso de C exclusivamente con núcleos ARM (es una lengua franca muy adecuada para expertos en dominios, tanto gente joven como programadores expertos).

Tenga en cuenta que las implementaciones típicas de ARM no están tan estrechamente acopladas como los procesadores simples; hay un bus periférico que puede ejecutarse a una frecuencia diferente a la del bus del procesador. Es posible que no pueda, por ejemplo, alternar un pin de puerto tan rápido como se podría esperar de la frecuencia de reloj. Generalmente, si algo es realmente crítico en el tiempo, es mejor tener un dispositivo periférico que lo maneje de manera autónoma (o usar un FPGA auxiliar).

    
respondido por el Spehro Pefhany
2

Este es un poco viejo, pero merece una mejor respuesta. La pregunta original era acerca de la latencia de interrupción. Dado que la plataforma original es un AVR, la pieza de reemplazo basada en ARM será una Cortex-M3 / M4 o M0. Ambos dispositivos tienen una latencia de interrupción de como máximo 12 ciclos de instrucción. Ese es el tiempo desde el estímulo hasta la ejecución de su código.

En la práctica, llevará más tiempo hacer algo útil. Es difícil escribir en un IO en menos de 3-5 ciclos de instrucción (cargar la dirección, cargar el valor, almacenar el valor). Más tiempo si el dispositivo de bus, ram o flash tiene latencias adicionales.

Si realmente necesita latencias en el rango .1us, necesita periféricos o lógica personalizada en lugar de software. Si la necesidad real es un tiempo de respuesta limitado / fijo, puede obtenerlo con la configuración adecuada del sistema de interrupción. Cortex-M tiene características que pueden reducir la latencia de interrupción a 6 ciclos en las circunstancias adecuadas (llegada tardía y encadenamiento de la cola). Se puede desactivar si necesita una latencia fija de 12 ciclos.

    
respondido por el Robert Sexton

Lea otras preguntas en las etiquetas