Estoy cableando un programa que prueba un conjunto de cables para circuitos abiertos o cortocircuitos. El programa, que se ejecuta en un AVR, conduce un vector de prueba (una caminata '1') a los cables y recibe el resultado de nuevo. Compara este vector resultante con los datos esperados que ya están almacenados en una tarjeta SD o EEPROM externa.Encontrar la posición de '1 de manera eficiente en una matriz de bits
Aquí hay un ejemplo, supongamos que tenemos un conjunto de 8 cables, todos los cuales son directos, es decir, no tienen uniones. Entonces, si manejamos 0b00000010 deberíamos recibir 0b00000010.
Supongamos que recibimos 0b11000010. Esto implica que hay un cortocircuito entre el cable 7,8 y el cable 2. Puedo detectar qué bits me interesan por 0b00000010^0b11000010 = 0b11000000. Esto me dice claramente que los cables 7 y 8 son los culpables, pero ¿cómo puedo encontrar la posición de estos '1 de manera eficiente en una matriz de bits grande? Es fácil hacer esto solo por 8 cables con máscaras de bits, pero el sistema que estoy desarrollando debe manejar hasta 300 hilos (bits). Antes de comenzar a usar macros como los siguientes y probar cada bit en una matriz de 300 * 300 bits, quería preguntar si había una solución más elegante.
#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)
Solo para mostrar mejor cómo detectar un circuito abierto. Datos esperados: 0b00000010, datos recibidos: 0b00000000 (el cable no se tira demasiado). 0b00000010^0b00000000 = 0b0b00000010 - el cable 2 está abierto.
NOTA: Sé que probar 300 cables no es algo que la pequeña RAM dentro de un AVR Mega 1281 pueda manejar, es por eso que dividiré esto en grupos, es decir, probaré 50 cables, compararé, mostraré resultados y luego avanzaré.
Leo a través del enlace de Brujin y parece requerir 0 consecutivos. No hay garantía de que las fallas sean consecutivas. Mi compilador es AVR-GCC. Voy a ir y hacer una investigación para ver si implementa estos. – saad