【发布时间】:2012-02-15 15:14:28
【问题描述】:
我正在编写一个程序来测试一组电线的开路或短路情况。该程序在 AVR 上运行,将测试向量(行走的“1”)驱动到电线上并接收返回的结果。它将这个结果向量与已经存储在 SD 卡或外部 EEPROM 上的预期数据进行比较。
这是一个示例,假设我们有一组 8 根电线,所有这些电线都是直通的,即它们没有接头。因此,如果我们驱动 0b00000010,我们应该会收到 0b00000010。
假设我们收到 0b11000010。这意味着电线 7,8 和电线 2 之间存在短路。我可以通过 0b00000010 ^ 0b11000010 = 0b11000000 检测到我感兴趣的位。这清楚地告诉我 7 和 8 线有问题,但是我如何在大型位数组中有效地找到这些 '1' 的位置。使用位掩码只需 8 根线即可轻松完成此操作,但我正在开发的系统必须处理多达 300 根线(位)。在我开始使用如下宏并测试 300*300 位数组中的每个位之前,我想在这里询问是否有更优雅的解决方案。
#define BITMASK(b) (1 << ((b) % 8))
#define BITSLOT(b) ((b / 8))
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + 8 - 1) / 8)
只是为了进一步展示如何检测开路。预期数据:0b00000010,接收数据:0b00000000(电线未拉高)。 0b00000010 ^ 0b00000000 = 0b0b00000010 - 电线 2 已打开。
注意:我知道测试 300 根线不是 AVR Mega 1281 内的微型 RAM 可以处理的,这就是为什么我将把它分成几组,即测试 50 根线,比较,显示结果,然后继续前进。
【问题讨论】:
标签: c embedded bit-manipulation avr