extender más rápido la máscara de 8 bits a 16 bits para MCU

Usando un registro de bandera de 8 bits, el objetivo es generar una máscara de 16 bits para manipular un registro de configuración de 2 bytes donde pares de bits adyacentes controlan un canal, por ejemplo, escribir para el canal 2 sería tomar del registro de bandera 0x2 (0b10)y 0x04 (0b00000100)generar 0x0030 (0b0000000000110000)para ser ANDed con una máscara de configuración constante 0xAAAA (0b1010101010101010), lo que resulta en 0x0020 (0b0000000000100000).

El "circuito" lógico digital equivalente para generar la máscara se vería así:

8 a 16

Una forma aparentemente sencilla de implementar esto en el software es cambiar un bit por cada dos (es decir, enfoque en serie), prestando atención al endian. En ensamblaje CPU12 (big endian):

    LDX     #2     ;counter: 2 bytes
L1  LDY     #4     ;counter: 4 bits
    LDAA    flag   ;get flag register
L2  LSRA           ;shift lsb into carry
    PSHC           ;copy carry (ccr)
    LSRB           ;shift carry into msb
    PULC           ;paste carry
    LSRB           ;shift carry again
    DBNE    Y,L2   ;loops 4 times
    PSHB           ;store half-result (1 byte)
    DBNE    X,L1   ;loops 2 times
    PULD           ;retrieve resulting mask (2 bytes)

(1) ¿Existe un algoritmo más rápido para este procedimiento sin recurrir al cableado de 24 pines MCU como se ilustra, o una tabla de búsqueda? por ejemplo, uno que es capaz de procesar varios bits al mismo tiempo? (2) ¿Hay un nombre para este procedimiento?

La siguiente respuesta parece lo suficientemente buena para usted, tenga en cuenta que la analogía del programa del circuito lógico digital <-> cae bastante temprano, es decir, no puede hacer que un solo procesador haga cosas en paralelo, no en el sentido que está preguntando aquí. Una LUT funcionará pero requeriría 256*16 bits de memoria, lo que puede ser un problema en sistemas más pequeños.

Respuestas (1)

Creo que lo que estás buscando son números de Morton xcon x.

Varias formas de calcular los números de Morton: trucos de Bit Twiddling

Especialización en el método de números mágicos binarios para entrada de 8 bits y salida de 16 bits (código de estilo C):

uint16_t x; // set lower 8 bits of x for input

x = (x | (x << 4)) & 0x0f0f;
x = (x | (x << 2)) & 0x3333;
x = (x | (x << 1)) & 0x5555;

uint16_t res = x | (x << 1); // could also store result in place

Esto maneja cualquier combinación de bits de entrada. Ej.: si x = 0x5( 0b101), entonces res = 0x33( 0b110011)