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
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:
- Una celda no vacía en la barra de nombre y en la barra de transición es de color amarillo;
- Una celda no vacía en el cuerpo de la rama es de color naranja;
- 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
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
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
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
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
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
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
Bucles anidados con implementación a través de ramas
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
Interrupción de un bucle implementado a través de ramas
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
Listado de todo el programa en Excel con un ajuste cero en una pantalla:
Luz de marcha. Código Excel
Luz de marcha. Listado final
Salir
Lo que no le gustó
- 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.
- 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.
- El programa se hincha rápidamente de forma horizontal. Al mismo tiempo, en Excel, el desplazamiento lateral es tosco e inconveniente.
- - – . 12801024 5 45 . 20% ( 45 ). – . .
- « » . .
- Excel . Atmel Studio .
- .
- . – . , .
- Excel . - , - – VBA.
- . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
- 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.
- Puede ingresar sus propias reglas para colorear celdas.
- 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.