Excel como tradutor para AVR assembler

Pré-requisitos



Vários artigos ( https://habr.com/ru/post/345320/ , habr.com/ru/post/80893 , habr.com/ru/post/246975 ) sugeriram que o Excel pode ser usado como tradutor no código assembly do AVR.



Vamos comparar o Excel com os recursos básicos de um editor de código "normal". A lista dos recursos mais populares é a seguinte:

Recurso de editor de código Como implementar no Excel Conforme implementado no Atmel Studio
Realce de sintaxe Formatação condicional de células com base no conteúdo Destaque de comando
Preenchimento Automático Funções VBA personalizadas;

Intervalos nomeados;

Cell como um mini-console com uma macro para o evento Change;

Não
Recuo Pule manualmente para uma coluna adjacente Manualmente
Verificando a colocação correta dos colchetes Possui controle integrado Apenas montagem
Ajuda de código contextual Não Há uma lista de nomes de rótulos
Recolher um bloco de código Função de agrupamento de coluna e linha Não
Analisador estático Mostra erros em links em movimento Não


Parece aceitável. Algumas coisas ficam "de graça", algo precisa ser melhorado.



Mas a principal diferença entre um processador de planilhas e um textual é que o usuário pode colocar um bloco de informações em um lugar arbitrário do espaço, e não apenas um abaixo do outro. Usamos esse recurso para transformar o código simples em um fluxograma quase completo.



Acordos iniciais



Vamos usar a abordagem geral e a terminologia a partir daqui: habr.com/ru/post/345320

O algoritmo inteiro é dividido em ramos. A filial desempenha o papel de uma unidade de programa independente.

Cada ramificação possui um nome, que é o ponto de entrada para ela. Deve ser único e significativo. Todos os nomes de ramos são colocados na linha superior, que chamaremos de - "string de nome".



Uma ramificação termina com uma ou mais ramificações para outras ramificações. As transições de uma ramificação para outra são colocadas na linha de fundo. Vamos chamá-la de "linha de salto".

Também aceitamos a regra de que de dentro de uma filial você não pode entrar em outra.

Esquema geral do algoritmo
imagem



Para ramificações e loops dentro de uma ramificação, rótulos também são usados. Ou seja, há muitos rótulos no programa. Cada vez que surgir um novo nome exclusivo é uma rotina. É aqui que entra a funcionalidade básica do Excel. Cada célula já possui um nome exclusivo que consiste em um nome de coluna e um número de linha.



No VBA, vamos criar uma função de rótulo com um argumento do tipo Range . Uma etiqueta no assembler AVR deve ter dois pontos no final. Essa. nossa função de rótulo recebe como entrada uma referência à célula na qual está colocada e calcula seu endereço no formato A1. Em seguida, adiciona o texto "_M:" a ele. O fragmento "_M" não é acidental, vamos usá-lo mais adiante - na formatação de células.



Visualização de transição



Em ambientes verdadeiramente visuais, as transições são indicadas por setas. É conveniente e intuitivo.

Em um processador de planilha, em vez de setas, você pode colorir as células que formam o caminho para o rótulo do comando de salto. Isso é feito nos exemplos.



Se você conseguir encaixar todo o código do branch em uma tela, não precisará traçar rotas. Todos os comandos e rótulos de transição estarão diante de seus olhos.



Para diagramas de blocos, existem padrões para a designação de elementos individuais. Por exemplo, um retângulo é um cálculo; diamante - condição, etc. Ao trabalhar com um processador de planilhas, temos acesso ao controle de cor, estilo e borda.



O Excel possui um recurso prático de formatação condicional. Ele pode ser usado de maneiras diferentes, mas apresentaremos apenas três regras simples:



  1. Uma célula não vazia na barra de nome e na barra de transição é colorida de amarelo;
  2. Uma célula não vazia no corpo do ramo é colorida de laranja;
  3. As células com rótulos "locais" e comandos de salto são coloridas em azul. É uma célula não vazia que contém os caracteres "_M" mencionados acima.




O gif abaixo mostra como fica o trabalho com rótulos e transições após todas as configurações.



Trabalhar com rótulos e comandos de salto
imagem







O procedimento para formar a lista final



O coletor de listagem percorre o programa final de cima para baixo e da direita para a esquerda. Uma célula de cada vez.

Como a lista final é formada
imagem



O algoritmo de montagem pula células vazias e células que contêm o caractere ";", ou seja, comentários.



A depuração do algoritmo e montagem final do projeto ocorre no estúdio. Não há feedback de código no Studio com células do Excel. Portanto, para detectar erros na listagem final, em frente a cada comando, indicamos um link de célula. Nesse link, encontramos o comando problemático no diagrama do Excel.



A solução algorítmica básica é ramificada como:



If <> then 
    <>
Else
    <>
End if


Para isso, existem instruções de salto condicional no montador do AVR (breq, brne, sbic e outros). Esses comandos informam ao programa aonde ir quando a condição for atendida.



Agora vamos imaginar como deve ser um programa de tal ramificação, levando em consideração os princípios descritos acima:



Ramificação simples
imagem





O comando brne e seus pares têm uma limitação. A distância do salto é de 64 palavras em cada direção. Portanto, uma macro longa inserida na ramificação "Nenhum" pode chamar fora do intervalo.



Para contornar essa limitação, o processamento de "Não" deve ser feito em uma ramificação separada, que estará à direita da marca de ramificação de brne . Ou use uma sub-rotina na qual a macro é chamada.



Selecionar caso



Se você tiver que escolher entre um grande número de opções, o Select Case é usado em Java:



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




Os saltos do índice estão disponíveis em linguagem assembly para AVR. Vamos mostrar a opção de implementação.

Selecionar caso
imagem





Aqui você pode ver que a proibição de pular do corpo de um galho para outro é violada. Isso é intencional, caso contrário, o programa ocupará muito espaço horizontal.



Pelo mesmo motivo, o vetor de interrupção deve ser executado em uma coluna.



Loop com pós-condição



Um loop, quando pelo menos uma repetição é necessária, tem a seguinte aparência na notação Java:

Do
    <>
Loop while <>


Um exemplo de como fica no Excel e o código resultante no estúdio:

Loop com pós-condição
imagem





Loop com pré-condição



Um exemplo em Java:

Do while <>
	<>
Loop


Um exemplo de como fica no Excel e o código resultante no estúdio:

Loop com pré-condição
imagem





Loop com loop aninhado



Processar matrizes ou trabalhar com números envolve o uso de loops aninhados. Visão geral do JAVU:



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




Existem duas maneiras de implementar um loop aninhado: dentro de uma única ramificação ou usando várias ramificações. Vamos mostrar as duas opções.

Loops aninhados dentro de uma ramificação
imagem





Loops aninhados com implementação via branches
imagem





Loop com saída condicional



Existem situações em que você precisa sair do ciclo antes que ele termine. Por exemplo, um zero lógico na perna 0 da porta D pode indicar algum tipo de mau funcionamento. O programa deve sair do loop principal e disparar um alarme.



No JLU, o comando break é usado e o algoritmo geral é o seguinte:



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




Vamos mostrar novamente como o algoritmo ficaria sem ramificações e com ramificações.

Interromper um loop dentro de um ramo
imagem





Interromper um loop implementado por meio de ramificações
imagem





Sub-rotinas de chamada



As sub-rotinas são chamadas pelos comandos call , icall , rcall . Há um recurso importante aqui. A sub-rotina deve ser chamada estritamente a partir do corpo da ramificação. Se a chamada for feita em um ramal, o retorno da sub-rotina é quase garantido para ocorrer no lugar errado.



Requisitos obrigatórios para a sub-rotina:

  • a própria sub-rotina deve começar com um nome de rótulo;
  • o último comando da sub-rotina deve ser retido e colocado na linha de salto.


A estrutura interna do subprograma pode ser qualquer - aplicar todos o mesmo rótulo automática rótulo para implementar a lógica.



Exemplo de corrida leve



Aqui está o código de um programa de teste leve em execução. O exemplo inclui loops, ramificações e chamadas de sub-rotina.



O resultado final é assim:

Esquema de luz em execução
imagem





Listando todo o programa no Excel com um arranhão em uma tela:

Luz corrente. Código Excel
imagem





Luz corrente. Lista final
imagem





Resultado



O que não gostou



  1. É improvável que o método descrito seja adequado para trabalhar em um grande projeto com a participação de uma equipe inteira. Controle de versão, diffs, etc. você ainda tem que decidir sobre o lado.
  2. No modo de depuração, é muito inconveniente sem dois monitores. A depuração propriamente dita é feita no estúdio e o fluxograma no Excel. Estas são janelas diferentes, é necessário alternar.
  3. O programa aumenta rapidamente na direção horizontal. Ao mesmo tempo, no Excel, a rolagem para o lado é difícil e inconveniente.
  4. - – . 12801024 5 45 . 20% ( 45 ). – . .






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






  1. . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
  2. Verificações adicionais de erros. É fácil usar uma macro para verificar se existem blocos "pendentes" que não terminam com transições. Também podemos usar uma macro para localizar e remover rótulos não utilizados que distraem a atenção durante a depuração.
  3. Você pode inserir suas próprias regras para colorir células.
  4. Se um processador de planilha fosse integrado ao estúdio como editor de código, seria muito conveniente depurar diretamente nesse diagrama de blocos.



All Articles