Blogs

轻量级硬件抽象

BENE BRENIMAN.2012年1月31日

一些课程比其他人更艰难。 你会认为艰苦的战斗更容易记住,但有时它只是不这样做。 最近,我被要求拿起另一名员工管理的项目。 该项目还有另一种成本减少项目。 硬件组任务是更新当前运输产品,以降低现有的故障率,同时删除产品的成本。 重新设计导致工程师在微控制器上的引脚分配周围播放,以便释放一些模拟输入。 对于此设备的现有固件,也存在强烈的愿望,以限制重新验证产品的范围。

我的第一个冲动是跳进进入和破解的变化,并转向更有趣的东西。 我隔离改变的信号,并开始搜索代码以进行影响的引脚名称的发生。 当我发现超过100个引脚名称时,我非常惊讶。 我跳上了更好的判断,并通过实例进行了跳转,并通过实例进行了实例,并将代码与#ifdef语句进行修改以改变另一个信号的所有引用。 在一天的时间,我有代码转换,很快它很快就会在新的原型上运行。 不是我最好的工作,或者我最骄傲的时刻,但工作已经完成,我可以自由地回到真正有趣的工作。

例如:

    if(ready)
    {
#ifdef旧的
        PORTB.4 = 1;            // Turn LED off
#别的
        PORTB.7 = 1;            // Turn LED off
#万一
    }

很快,它决定需要更多的硬件改变。 开发了新版本的硬件,甚至更改了更改。 我们已将一些早期原型发布到远程工程位置,其中在两个版本的原型都在完成某些测试。 现在我需要维护多个版本的固件来支持两个不同的原型。 这已经开始很快丑陋。 现在已经凌乱的代码甚至乱码了。

通过新的更改,代码现在看起来像这样:

    if(ready)
    {
#ifdef旧的
        PORTB.4 = 1;            // Turn LED off
#elif proto_one.
        PORTB.7 = 1;            // Turn LED off
#别的
        PORTC.2 = 0;            // Turn LED off
#万一
    }

一个简单的变化看起来不看 so bad. 但是采取多次更改,乘以不同的发生,很快代码真的很乱。 但等等,我可以做些什么不同的? 简单的答案是抽象。从韦比斯,我发现了以下的抽象定义:

挑选的过程(抽象)的共同特征 对象 和程序。例如,程序员将使用抽象,例如,注意两个函数几乎执行几乎相同的任务,并且可以组合成单个函数。抽象是最重要的技术之一 软件工程 并与另外两种重要技术密切相关 - 封装信息隐藏。所有三种技术都用于降低复杂性。

在这里,想法将以一种方式提出一个方法,将所需的功能表示为每个版本的硬件的单个包含文件。 通过这种方式,可以更改单个包含语句,以便为每个硬件版本构建固件的唯一版本。 以最简单的形式, 该示例中的每个语句的每个部分都可以在概念中定义,并且可以从代码中抽象出来的操作。

然后,修改后的代码读取:

    if(ready)
    {
        MODE_LED = LED_ON;
    }

为了使其工作,我们需要创建包含从代码中抽象的操作的文件。 三个包含文件需要:old.h,proto1.h和proto2.h。 这些文件中的每一个都需要必要的定义来表示mode_led和LED_ON的更高级别函数或表示。

对于Old.h:

#define mode_led.        (PORTB.4)
#define turn_on.         1

对于proto1.h:

#define mode_led.        (PORTB.7)
#define turn_on.         1

对于proto2.h:

#define mode_led.        (PORTC.2)
#define turn_on.         0

现在通过包括正确的包含文件可以隐藏所有必要的更改,留下代码清洁器,更远更可读。 再次,我以前学到了这个课程,但不知何故,当我面对类似的问题时,我的第一选择是错误的。

愿你的第一个选择更好。


要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录