先决条件
一些文章(https://habr.com/ru/post/345320/,habr.com/ru/post/80893,habr.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具有方便的条件格式设置功能。它可以以不同的方式使用,但是我们将仅介绍三个简单的规则:
- 名称栏和过渡栏中的非空单元格显示为黄色;
- 分支主体中的非空单元格显示为橙色;
- 具有“本地”标签和跳转命令的单元格显示为蓝色。它是一个非空单元格,其中包含上述“ _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 <>
让我们再次展示该算法在没有分支和有分支的情况下的样子。
中断一个分支内的循环
中断通过分支实现的循环
调用子程序
子例程由call,icall和rcall命令调用。这里有一个重要功能。子例程必须严格从分支的主体中调用。如果将调用放置在分支行中,则几乎可以保证子例程的返回发生在错误的位置。
子程序的强制性要求:
- 子例程本身必须以标签名称开头;
- 子例程的最后一个命令必须后退并放在跳转行中。
子程序的内部结构可以是任何-都应用相同的自动标签标签来实现逻辑。
行车灯示例
这是行车灯测试程序的代码。该示例包括循环,分支和子例程调用。
最终结果如下所示:
行车灯方案
在一个屏幕上以临时方式列出Excel中的整个程序:
行驶灯。Excel代码
行驶灯。最终上市
结果
什么不喜欢
- 所描述的方法不太适合在整个团队的参与下进行大型项目。版本控制,差异等 您仍然必须在一边决定。
- 在调试模式下,如果没有两个监视器,将非常不便。调试本身在Studio中进行,流程图在Excel中进行。这些是不同的窗口,需要切换。
- 程序在水平方向上迅速膨胀。同时,在Excel中滚动到侧面很粗糙且不方便。
- - – . 12801024 5 45 . 20% ( 45 ). – . .
- « » . .
- Excel . Atmel Studio .
- .
- . – . , .
- Excel . - , - – VBA.
- . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
- 其他检查错误。组织宏来检查是否有没有以过渡结尾的“悬挂”块很容易。我们还可以使用宏来查找和删除未使用的标签,这些标签会在调试期间分散注意力。
- 您可以输入自己的单元格着色规则。
- 如果将电子表格处理器作为代码编辑器内置在工作室中,那么直接在这种框图上进行调试将非常方便。