在许多嵌入式应用程序中,需要在使代码非常高效或将代码与特定系统配置隔离以免受不断变化的需求影响之间进行权衡。
您通常采用哪种 C 结构来实现两全其美(灵 active 和可重构性而不损失效率)?
如果您有时间,请继续阅读以了解我在说什么。
当我为安全气囊 Controller 开发嵌入式 SW 时,我们遇到了一个问题,即每次客户就特定要求改变主意时,我们都必须更改部分代码。例如,在开发过程中,触发安全气囊展开的条件和事件的组合每两周就会发生变化。我们讨厌如此频繁地更改那段代码。
当时,我参加了嵌入式系统大会,听到了 Stephen Mellor 的精彩演讲,名为“应对不断变化的需求”。你可以阅读论文here (他们会让您注册,但它是免费的)。
这样做的主要思想是在您的代码中实现核心行为,但以数据的形式配置具体细节。您可以轻松更改数据,甚至可以在 EEPROM 或闪存的不同部分中对其进行编程。
这个想法听起来很适合解决我们的问题。我与我的同事分享了这一点,我们立即开始重新设计一些 SW 模块。
当我们尝试在编码中使用这个想法时,我们在实际实现中遇到了一些困难。对于受限的嵌入式系统,我们的代码结构变得非常繁重和复杂。
为了说明这一点,我将详细说明上面提到的示例。我们没有使用一堆 if 语句来确定输入组合是否处于需要安全气囊展开的状态,而是改为使用一张大表。有些条件不是微不足道的,所以我们使用了很多函数指针来调用很多小的辅助函数,这些函数以某种方式解决了一些条件。我们有几个间接级别,一切都变得难以理解。长话短说,我们最终使用了大量内存、运行时间和代码复杂性。调试这个东西也不简单。老板让我们改回一些东西,因为模块太重了(他也许是对的!)。
PS: SO中也有类似的问题,但看起来侧重点不同。 Adapting to meet changing business requirements?
最佳答案
作为改变需求的另一种观点......需求进入构建代码。那么为什么不对此采取元方法:
- 将可能更改的程序部分分离出来
- 创建一个脚本,将部分源代码粘合在一起
这样您就可以在 C 语言中维护兼容的逻辑构建 block ……然后在最后将这些兼容的部分粘在一起:
/* {conditions_for_airbag_placeholder} */
if( require_deployment)
trigger_gas_release()
然后保持独立条件:
/* VAG Condition */
if( poll_vag_collision_event() )
require_deployment=1
还有一个
/* Ford Conditions */
if( ford_interrupt( FRONT_NEARSIDE_COLLISION ))
require_deploymen=1
您的构建脚本可能如下所示:
BUILD airbag_deployment_logic.c WITH vag_events
TEST airbag_deployment_blob WITH vag_event_emitter
真的是大声思考。这样你就可以在不读取配置的情况下得到一个紧凑的二进制 blob。 这有点像使用覆盖 http://en.wikipedia.org/wiki/Overlay_(programming)但在编译时执行。
关于c - 如何在不增加太多开销和复杂性的情况下使您的嵌入式 C 代码不受需求变化的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983584/