嵌入式技术
对于我们大多数为嵌入式系统编写固件和软件的人来说,普遍希望立即投入编码,而忽略或很少关注关键的程序设计阶段。不幸的是,这种冲动在我们的领域比在其他领域更为明显。
例如,如果没有完全开发的蓝图或原理图,建筑商或硬件工程师永远不会开始施工。另一方面,即将推出的固件开发人员经常直接进入编码阶段,而没有完全开发其程序逻辑,这通常会导致混乱的“意大利面条”程序(图 1)。
在次设计之前编写代码是一种不好的做法,会导致混乱的“意大利面条”程序。
图 1.在首次设计之前编写代码是一种不好的做法,会导致混乱的“意大利面条”程序。
他们通过以下三种方式之一来做到这一点:
他们同时尝试设计和编码(这种方法被称为“设计一点,编码一点”)
他们在开发程序的逻辑设计时过于依赖编程语言的约束
他们完全跳过设计步骤,因为他们认为该项目“太简单”,或者他们对自己的能力过度自信,也就是“我太聪明了”。
这种急于编写代码的行为可能会适得其反,并终花费更多的开发时间,因为设计不当的程序可能会导致许多本来可以通过仔细规划来避免的错误。
例如,如果您使用“设计一点、编码一点”的方法,那么随着设计的不断变化,您可能需要擦除或重新输入很多内容。您的程序的长度将是其应有的两倍,效率将是其应有的一半。如果认为跳过程序的设计阶段会加快开发过程,并且您的嵌入式系统将立即启动并运行,那么这可能是一个巨大的错误。
事实上,为微控制器构建经济代码的关键是在编写一行代码之前花时间系统地设计程序。这也称为结构化编程,它会导致代码占用更少的内存,需要更短的处理时间,并且通常在次尝试时就可以正确运行。
结构化编程意味着对问题有透彻的理解。它涉及自上而下的分析,将问题分解为越来越小的部分,直到每个部分都有明显的解决方案或功能。同时,它还涉及使用三种控制结构(序列、交替、重复或循环)来组织或组合功能。
为此,在结构化编程中设计程序的一种流行工具是使用 Warnier-Orr 图,该图以创建者 Jean-Dominique Warnier 和 Kenneth T. Orr 的名字命名。
Warnier-Orr 图清晰可见
Jean-Dominique Warnier 和 Kenneth Orr 创建了 Warnier-Orr 图作为可视化工具,用于显示复杂数据或流程的层次结构分解。它的主要用途是表示程序的逻辑结构。
程序是一组有序指令,用于处理输入数据以产生结果。您正在编程的微控制器只是一个快速信息处理工具。
输入的数据、结果、程序都是信息文件。这些信息文件不是完全独立的数据,但可以嵌套在其内部。也就是说,它们可以分解为子部分并以父子方式分层组织。
Warnier-Orr 图允许您定义所需的输出并逆向工作,分解产生所需结果所需的输入和流程步骤。然后,它可以帮助您以图形方式表示程序步骤的层次结构以及已分解的输入和输出数据结构。
Warnier-Orr 图概述和注意事项
1. Warnier-Orr 图用括号在页面上水平绘制程序或数据结构(图 3)。
Warnier-Orr 图的示例。 A 分为子部分 B、C 和 D。D 分为子部分 E、F、J 和 H。
图 3.Warnier -Orr 图示例。A 分为子部分 B、C 和 D。D 分为子部分 E、F、J 和 H。
每个括号代表括号前面的数据项或流程步骤的功能细分。括号代表单独的层次级别,每个括号内的项目在逻辑上是相关的。
2. Warnier 图在括号内从左到右、从上到下阅读。
3. 对于程序结构表示,Warnier-Orr 图的每个括号都是一个视觉提示,表示已完成程序中的子例程。
4. 当一个项目或函数下面带有符号 (0,1) 时,表示它存在或不存在、选择或未选择、或假或真。
5. “+”表示包含 OR。当括号中的两个或多个项目或步骤用“+”分隔时,表示包括其中之一或另一个,或两者都包括在内。
6. 符号“?”表示异或。当括号内的两个或多个项目或步骤用“?”分隔时,表示包括或执行其中一项,但不是两项。
7. 符号“(n, N)”表示函数将被执行的次数(图 4)。
使用 Wanier-Orr 图分解智能锁数据。
图 4.使用 Wanier-Orr 图分解智能锁数据。
8. 符号“?N”符号表示要测试的条件以确定将选择哪个功能。图 5 所示图表的脚注详细介绍了这些条件。
已分解为子部分的程序的逻辑表示。
图 5.已分解为子部分的程序的逻辑表示。图片由分析师和程序员图表技术提供
9. 当表示一个程序时,每个层级或子功能都由三个部分组成。它们是开始、流程步骤和结束。
现在,有了 Warnier-Orr 工具,您就可以为下一个嵌入式系统项目设计程序了。
逻辑设计微控制器程序的步骤
为微控制器构建良好的程序需要系统的方法。Jean Warnier 和其他作者在《编程技术》一书中介绍了四个设计步骤,帮助您设计的程序,并从导致我们首先创建它们的问题中得出它们。
第 1 步:识别输出
步也是重要的一步是确定程序所需的输出。您必须问自己这个问题:“我希望程序做什么?” 确保您尽可能清楚地回答这个问题。
步骤 2:定义逻辑数据库
一旦明确定义了输出,您就可以识别所需的输入,并定义这些输入的属性。此步骤有助于确保考虑到所有必要的输入,以及一刻的添加,例如“哎呀,我忘了输入一些内容到。..。..”。。。”。保持在限度。
当您能够回答步骤一和步骤二中的问题时,您就完成了别的设计。
第三步:设计程序结构
接下来,设计程序结构分两步完成:自上而下的分析和综合。
自上而下的分析:
自上而下的分析涉及将程序分解为许多更详细的子功能。从别开始,这是描述整体功能的单个块,然后逐步将该功能扩展为详细的子功能。通过此步骤,不必太担心程序中子函数的执行顺序。你只关心应该做什么,而不关心应该如何做。
由于其中大部分内容都是直观的,因此请慢慢开始该过程,不要试图太快地开发太多细节。
合成:
完成自顶向下的分析后,您已将程序简化为基本组件的集合。综合涉及决定应以什么顺序执行功能。组织这些函数的三个基本逻辑结构是序列、if-then-else 和循环。这些的组合可用于构建复杂的函数。
第 4 步:使用 Warnier-Orr 图来表示您的设计
使用 Warnier-Orr 图将其转化为概述。整个图应该只包含逻辑语句,而不包含代码。这使得文档易于理解。
全部0条评论
快来发表一下你的评论吧 !