以应用为中心的开发
在当今的现代开发周期中,嵌入式开发人员需要做出的第一个思维转变是没有硬件。我们不是从硬件开始,然后一路向上,而是将注意力和开发重点放在应用程序上。开发人员应该关注应用程序功能、它们之间的关系以及它们操作的数据。
专注于应用程序而不是硬件具有几个主要优势。首先,它将开发人员的注意力转移到应用程序功能上。其次,以应用程序为重点,开发人员可以识别各种功能所需的数据作为输入和输出,以及这些数据如何在应用程序中流动。这种对数据的关注具有抽象和消除硬件依赖性的额外好处!最后,以应用程序为中心的开发允许我们在没有硬件的情况下模拟、建模和测试我们的应用程序代码。这为我们提供了创建自动化回归测试、最小化目标调试时间和在 PC 环境中测试我们的应用程序的能力,这比在目标环境中更容易工作。
没有按钮!
让我们看一个简单的例子。嵌入式开发人员经常需要编写一个可以消除开关抖动的函数。传统上,开发人员会定期调用他们的 debounce 函数,该函数将读取 GPIO 线,然后运行 debounce 算法。这里的问题是去抖动功能直接依赖于硬件!如果GPIO线发生变化,需要更新功能!将硬件更改为新的微控制器,该功能需要使用新的 GPIO 驱动程序调用进行更新。对功能进行单元测试感兴趣?这要困难得多,因为该功能取决于硬件。
显然,这不是一个很好的解决方案,即使我们一直这样编写代码!相反,我们需要认识到没有按钮!只有数据包含代表按钮的状态。按钮去抖功能应该采用代表当前开关状态的参数,而不是让去抖开关直接访问 GPIO 硬件。这将功能与硬件解耦,并允许在没有硬件的情况下对功能进行完全测试!只需传入数据以测试开关去抖算法是否正常工作!这也意味着我们可以构建回归测试!
设计无硬件系统
一般来说,嵌入式开发人员可以遵循几个步骤来编写他们的应用程序代码,从而打破他们的硬件依赖关系。
首先,识别硬件生成或使用的数据。该数据将成为传递给应用程序功能函数的参数。对于 debounce 示例,这只不过是 ButtonState。函数原型可能如下所示:
bool Button_Debounce(ButtonState_t const ButtonState);
接下来,创建一个可用于获取硬件状态的抽象。 在 PC 上运行时,此功能将仅链接到可以模拟硬件的数据生成器。 当硬件存在时,该函数链接到返回硬件状态的 GPIO 驱动程序。 这使开发人员可以在有或没有硬件的情况下进行操作。 这将导致应用程序代码如下所示:
bool ButtonDebounced = false;
ButtonState_t ButtonState = Button_StateGet();
ButtonDebounced = Button_Debounce(ButtonState);
最后,还可以进行抽象以将数据发布到硬件。这对于去抖动算法来说不是必需的,但如果应用程序组件要控制 LED、阀门、电机等,则可能是必需的。这再次允许开发人员在 PC 或硬件上运行应用程序之间切换 .
结论
希望提高代码稳健性、降低总体成本和缩短上市时间的嵌入式开发人员可以从编写没有硬件的应用程序代码中受益匪浅。这并不总是可行或值得的,但对于许多现代系统来说,这是一种可以显着改进系统设计的技术。它的好处是使应用程序易于测试,并最大限度地减少了在目标上调试所花费的时间。