Excel como traductor de ensamblador AVR

Prerrequisitos



Varios artículos ( https://habr.com/ru/post/345320/ , habr.com/ru/post/80893 , habr.com/ru/post/246975 ) sugirieron que Excel se puede utilizar como traductor en código ensamblador AVR.



Comparemos Excel con las características básicas de un editor de código "normal". La lista de las funciones más populares es la siguiente:

Característica del editor de código Cómo implementar en Excel Como se implementó en Atmel Studio
Resaltado de sintaxis Formato condicional de celdas basado en contenido. Comando resaltado
Autocompletar Funciones de VBA personalizadas;

Rangos con nombre;

Cell como una mini consola con una macro para el evento Change;

No
Sangría Saltar manualmente a una columna adyacente A mano
Comprobación de la correcta colocación de los brackets Tiene control incorporado Solo montaje
Ayuda de código contextual No Hay una lista de nombres de etiquetas.
Contraer un bloque de código Función de agrupación de columnas y filas No
Analizador de estática Muestra errores en los enlaces sobre la marcha No


Parece aceptable. Algunas cosas se obtienen "gratis", algo debe mejorarse.



Pero la principal diferencia entre un procesador de hojas de cálculo y uno textual es que el usuario puede colocar un bloque de información en un lugar arbitrario del espacio, y no solo uno debajo del otro. Usamos esta función para convertir el código plano en un diagrama de flujo casi completo.



Acuerdos iniciales



Tomemos el enfoque general y la terminología de aquí: habr.com/ru/post/345320

Todo el algoritmo se divide en ramas. La sucursal desempeña el papel de una unidad de programa independiente.

Cada rama tiene un nombre, que es el punto de entrada. Debe ser único y significativo. Todos los nombres de las ramas se colocan en la línea superior, que llamaremos - "cadena de nombre".



Una rama termina con una o más ramas a otras ramas. Las transiciones de una rama a otra se colocan en la línea de fondo. Llamémoslo la "línea de transición".

También aceptamos la regla de que desde dentro de una rama es imposible pasar a otra.

Esquema general del algoritmo
imagen



Para ramas y bucles dentro de una rama, también se utilizan etiquetas. Es decir, hay muchas etiquetas en el programa. Cada vez que se crea un nuevo nombre único es una rutina. Aquí es donde entra en juego la funcionalidad básica de Excel. Cada celda ya tiene un nombre único que consta de un nombre de columna y un número de fila.



En VBA, creemos una función de etiqueta con un argumento de tipo Range . Una etiqueta en el ensamblador AVR debe tener dos puntos al final. Aquellos. nuestra función de etiqueta recibe como entrada una referencia a la celda en la que está ubicada y calcula su dirección en el formato A1. Luego le agrega el texto "_M:". El fragmento "_M" no es accidental, lo usaremos más en el formateo de celdas.



Visualización de transición



En entornos visuales reales, las transiciones se indican con flechas. Es conveniente e intuitivo.

En un procesador de hojas de cálculo, en lugar de flechas, puede teñir las celdas que forman la ruta a la etiqueta desde el comando de salto. Esto se hace en los ejemplos.



Si logra ajustar todo el código de la sucursal en una pantalla, entonces no tiene que dibujar rutas. Todos los comandos y etiquetas de transición estarán frente a sus ojos.



Para los diagramas de bloques, existen estándares para la designación de elementos individuales. Por ejemplo, un rectángulo es un cálculo; diamante - condición, etc. Cuando trabajamos con un procesador de hojas de cálculo, tenemos acceso al control de color, estilo y bordes.



Excel tiene una práctica función de formato condicional. Se puede usar de diferentes maneras, pero presentaremos solo tres reglas simples:



  1. Una celda no vacía en la barra de nombre y en la barra de transición es de color amarillo;
  2. Una celda no vacía en el cuerpo de la rama es de color naranja;
  3. Las celdas con etiquetas "locales" y comandos de salto son de color azul. Es una celda no en blanco que contiene los caracteres "_M" mencionados anteriormente.




El siguiente gif muestra cómo se ve el trabajo con etiquetas y transiciones después de todas las configuraciones.



Trabajar con etiquetas y comandos de salto
imagen







El procedimiento para formar la lista final



El recopilador de listados recorre el programa final de arriba a abajo y de derecha a izquierda. Una celda a la vez.

Cómo se forma el listado final
imagen



El algoritmo de ensamblaje omite las celdas vacías y las celdas que contienen el carácter ";", es decir comentarios.



La depuración del algoritmo y el montaje final del proyecto se realiza en el estudio. No hay comentarios de código en el estudio con celdas de Excel. Por lo tanto, para detectar errores en el listado final, frente a cada comando, indicamos un enlace de celda. Desde este enlace, encontramos el comando problemático en el diagrama en Excel.



La solución algorítmica básica se ramifica como:



If <> then 
    <>
Else
    <>
End if


Para ello, existen instrucciones de salto condicionales en el ensamblador AVR (breq, brne, sbic y otros). Estos comandos le dicen al programa adónde ir cuando se cumple la condición.



Ahora imaginemos cómo debería verse el programa de tal ramificación, teniendo en cuenta los principios descritos anteriormente:



Ramificación simple
imagen





El comando brne y sus pares tienen una limitación. La distancia de salto es de 64 palabras en cada dirección. Por lo tanto, una macro larga insertada en la rama "Ninguno" puede llamar fuera de rango.



Para sortear esta limitación, el procesamiento "No" debe realizarse en una rama separada, que estará a la derecha de la marca de la rama de brne . O use una subrutina en la que se llame a la macro.



Seleccione el caso



Si tiene que elegir entre una gran cantidad de opciones, en Java se utiliza Seleccionar caso:



Select Case <>
    Case <1>
    Case <2>
    Case <3>
    Case else
End select




Los saltos de índice están disponibles en lenguaje ensamblador para AVR. Muestremos la opción de implementación.

Seleccione el caso
imagen





Aquí puedes ver que se viola la prohibición de saltar del cuerpo de una rama a otra. Esto es intencional, de lo contrario, el programa ocupará demasiado espacio horizontal.



Por la misma razón, el vector de interrupción debe ejecutarse en una columna.



Bucle con poscondición



Un bucle, cuando se necesita al menos una repetición, se ve así en notación Java:

Do
    <>
Loop while <>


Un ejemplo de cómo se ve en Excel y el código resultante en el estudio:

Bucle con poscondición
imagen





Bucle con condición previa



Un ejemplo en Java:

Do while <>
	<>
Loop


Un ejemplo de cómo se ve en Excel y el código resultante en el estudio:

Bucle con condición previa
imagen





Bucle con bucle anidado



Procesar matrices o trabajar con números implica el uso de bucles anidados. Vista general de JAVU:



Do
    Do
        <>
    Loop while < 2- >
    <>
Loop while < 1- >




Hay dos formas de implementar un bucle anidado: dentro de una sola rama o utilizando varias ramas. Vamos a mostrar ambas opciones.

Bucles anidados dentro de una rama
imagen





Bucles anidados con implementación a través de ramas
imagen





Bucle con salida condicional



Hay situaciones en las que es necesario salir del ciclo antes de que finalice. Por ejemplo, un cero lógico en el tramo 0 del puerto D puede indicar algún tipo de mal funcionamiento. El programa debe salir del bucle principal y activar una alarma.



En JLU, se utiliza el comando break y el algoritmo general es el siguiente:



Do 
    <>
    If < > then break
Loop while <>




Volvamos a mostrar cómo se vería el algoritmo sin ramas y con ramas.

Interrumpir un bucle dentro de una rama
imagen





Interrupción de un bucle implementado a través de ramas
imagen





Llamar a subrutinas



Las subrutinas son llamadas por los comandos call , icall , rcall . Aquí hay una característica importante. La subrutina debe llamarse estrictamente desde el cuerpo de la rama. Si la llamada se coloca en un ramal, es casi seguro que el retorno de la subrutina ocurrirá en el lugar equivocado.



Requisitos obligatorios para la subrutina:

  • la subrutina en sí debe comenzar con un nombre de etiqueta;
  • el último comando de la subrutina debe ser ret y colocarse en la línea de salto.


La estructura interna del subprograma puede ser cualquiera: aplique la misma etiqueta de etiqueta automática para implementar la lógica.



Ejemplo de luz de marcha



Aquí está el código de un programa de prueba de luces en funcionamiento. El ejemplo incluye bucles, bifurcaciones y llamadas a subrutinas.



El resultado final se ve así:

Esquema de luces de marcha
imagen





Listado de todo el programa en Excel con un ajuste cero en una pantalla:

Luz de marcha. Código Excel
imagen





Luz de marcha. Listado final
imagen





Salir



Lo que no le gustó



  1. Es poco probable que el método descrito sea adecuado para trabajar en un gran proyecto con la participación de todo un equipo. Control de versiones, diferencias, etc. todavía tienes que decidir por el lado.
  2. En el modo de depuración, es muy inconveniente sin dos monitores. La depuración en sí se lleva a cabo en el estudio y el diagrama de flujo en Excel. Estas son ventanas diferentes, se requiere cambiar.
  3. El programa se hincha rápidamente de forma horizontal. Al mismo tiempo, en Excel, el desplazamiento lateral es tosco e inconveniente.
  4. - – . 12801024 5 45 . 20% ( 45 ). – . .






  1. « » . .
  2. Excel . Atmel Studio .
  3. .
  4. . – . , .
  5. Excel . - , - – VBA.






  1. . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
  2. Comprobaciones adicionales de errores. Es fácil usar una macro para verificar si hay bloques "colgantes" que no terminen con transiciones. También podemos usar una macro para buscar y eliminar etiquetas no utilizadas que distraigan la atención durante la depuración.
  3. Puede ingresar sus propias reglas para colorear celdas.
  4. Si se integrara un procesador de hojas de cálculo en el estudio como editor de código, sería muy conveniente depurar directamente en dicho diagrama de bloques.



All Articles