Excel作为AVR汇编程序的翻译器

先决条件



一些文章(https://habr.com/ru/post/345320/habr.com/ru/post/80893habr.com/ru/post/246975建议该Excel中可以用作一个翻译转换为AVR汇编代码。



让我们将Excel与“常规”代码编辑器的基本功能进行比较。最受欢迎的功能列表如下:

代码编辑器功能 如何在Excel中实施 如在Atmel Studio中实施
语法高亮 基于内容的单元格条件格式 命令突出显示
自动补全 自定义VBA功能;

命名范围;

单元格作为带有更改事件宏的微型控制台;

没有
缩进 手动跳转到相邻列 手动地
检查支架的正确位置 具有内置控制 仅组装
上下文代码帮助 没有 标签名称列表
折叠代码块 列和行分组功能 没有
静态分析仪 在旅途中显示链接中的错误 没有


看起来可以接受。有些事情是“免费的”,有些事情需要改进。



但是,电子表格处理器和文本处理器之间的主要区别在于,用户可以将信息块放置在空间中的任意位置,而不仅仅是彼此放置。我们使用此功能将平面代码变成几乎完整的流程图。



初步协议



让我们 从这里开始采用通用的方法和术语:habr.com/ru/post/345320

整个算法分为多个分支。该分支充当独立程序单元的角色。

每个分支都有一个名称,该名称是该分支的入口。它必须是独特且有意义的。所有分支名称都放在第一行,我们将其称为“名称字符串”。



分支以一个或多个分支到其他分支结束。从一个分支到另一个分支的过渡位于最底线。我们称其为“过渡线”。

我们也接受这样的规则,即不可能从一个分支进入另一个分支。

算法的一般方案
图片



对于分支和分支内的循环,也使用标签。也就是说,程序中有很多标签。每次想出一个新的唯一名称都是一种惯例。这是基本的Excel功能出现的地方。每个单元格已经具有由列名和行号组成的唯一名称。



在VBA中,让我们创建一个带有Range类型参数的标签函数AVR汇编器中的标签结尾必须带有冒号。那些。我们的标签函数接收输入的对它所在的单元格的引用,并以A1格式计算其地址。然后,他在其中添加了文本“ _M:”。“ _M”片段不是偶然的,我们将在单元格格式中进一步使用它。



过渡可视化



在真实的视觉环境中,过渡用箭头指示。它既方便又直观。

在电子表格处理器中,您可以着色单元格,而不是箭头,这些单元格构成了Jump命令中通往标签的路径。这些是在示例中完成的。



如果您设法将所有分支代码放入一个屏幕中,则不必绘制路线。所有过渡命令和标签都在您的眼前。



对于框图,有指定各个元素的标准。例如,矩形是一个计算;钻石-条件等 使用电子表格处理器时,我们可以使用颜色,样式和边框控件。



Excel具有方便的条件格式设置功能。它可以以不同的方式使用,但是我们将仅介绍三个简单的规则:



  1. 名称栏和过渡栏中的非空单元格显示为黄色;
  2. 分支主体中的非空单元格显示为橙色;
  3. 具有“本地”标签和跳转命令的单元格显示为蓝色。它是一个非空单元格,其中包含上述“ _M”字符。




下面的gif显示了在完成所有设置后如何使用标签和过渡效果。



使用标签和跳转命令
图片







形成最终清单的程序



列表收集器从上到下,从右到左遍历最终程序。一次一个单元。

最终清单的形成方式
图片



汇编算法会跳过空单元格以及包含“;”字符(即 评论。



算法的调试和项目的最终组装在工作室中进行。在带有Excel单元格的studio中没有代码反馈。因此,为了捕获最终列表中与每个命令相对的错误,我们指示了单元链接。通过此链接,我们在Excel的图中找到有问题的命令。



基本的算法解决方案如下所示:



If <> then 
    <>
Else
    <>
End if


为此,AVR汇编器中有条件跳转指令(breq,brne,sbic等)。这些命令告诉程序满足条件时该去哪里。



现在,考虑到上面概述的原理,想象这样一个分支的程序应该看起来如何:



简单分支
图片





brne命令和它的同行有一个限制。每个方向的跳跃距离为64个字。因此,插入到“无”分支中的长宏可能会超出范围。



为了解决此限制,在单独的分支中执行处理“否”,该分支位于brne分支标记的右侧或使用一个调用宏的子例程。



选择案例



如果必须从大量选项中进行选择,则在Java中使用Select Case:



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




索引跳转可用于AVR的汇编语言。让我们展示实现选项。

选择案例
图片





在这里您可以看到违反了从分支主体跳转到另一个分支的禁止。这是故意的,否则程序将占用过多的水平空间。



出于同样的原因,中断向量应该在一列中执行。



后置条件循环



在Java表示法中,至少需要重复一次的循环如下所示:

Do
    <>
Loop while <>


有关它在Excel中的外观以及在Studio中生成的代码的示例:

后置条件循环
图片





前提条件循环



Java中的示例:

Do while <>
	<>
Loop


有关它在Excel中的外观以及在Studio中生成的代码的示例:

前提条件循环
图片





嵌套循环



处理数组或处理数字涉及嵌套循环的使用。JAVU的一般视图:



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




您可以通过两种方式实现嵌套循环:在单个分支内或使用多个分支。让我们展示两个选项。

一个分支内的嵌套循环
图片





通过分支实现嵌套循环
图片





有条件退出循环



在某些情况下,您需要在循环结束之前退出循环。例如,端口D的第0支路上的逻辑零可能表示某种故障。该程序应退出主循环并触发警报。



在JLU中,使用break命令,常规算法如下:



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




让我们再次展示该算法在没有分支和有分支的情况下的样子。

中断一个分支内的循环
图片





中断通过分支实现的循环
图片





调用子程序



子例程由callicallrcall命令调用这里有一个重要功能。子例程必须严格从分支的主体中调用。如果将调用放置在分支行中,则几乎可以保证子例程的返回发生在错误的位置。



子程序的强制性要求:

  • 子例程本身必须以标签名称开头;
  • 子例程的最后一个命令必须后退并放在跳转行中。


子程序的内部结构可以是任何-都应用相同的自动标签标签来实现逻辑。



行车灯示例



这是行车灯测试程序的代码。该示例包括循环,分支和子例程调用。



最终结果如下所示:

行车灯方案
图片





在一个屏幕上以临时方式列出Excel中的整个程序:

行驶灯。Excel代码
图片





行驶灯。最终上市
图片





结果



什么不喜欢



  1. 所描述的方法不太适合在整个团队的参与下进行大型项目。版本控制,差异等 您仍然必须在一边决定。
  2. 在调试模式下,如果没有两个监视器,将非常不便。调试本身在Studio中进行,流程图在Excel中进行。这些是不同的窗口,需要切换。
  3. 程序在水平方向上迅速膨胀。同时,在Excel中滚动到侧面很粗糙且不方便。
  4. - – . 12801024 5 45 . 20% ( 45 ). – . .






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






  1. . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
  2. 其他检查错误。组织宏来检查是否有没有以过渡结尾的“悬挂”块很容易。我们还可以使用宏来查找和删除未使用的标签,这些标签会在调试期间分散注意力。
  3. 您可以输入自己的单元格着色规则。
  4. 如果将电子表格处理器作为代码编辑器内置在工作室中,那么直接在这种框图上进行调试将非常方便。



All Articles