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

2

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 0x2 (0b10) para el canal 2 sería tomar 0x04 (0b00000100) del registro de marca y generar 0x0030 (0b0000000000110000) para ser ANDed con una máscara de configuración constante 0xAAAA (0b1010101010101010) , lo que da como resultado 0x0020 (0b0000000000100000) .

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

Una forma aparentemente sencilla de implementar esto en el software es cambiar un bit por cada dos en (es decir, enfoque en serie), prestando atención a la endianidad. En el ensamblaje de la 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 consulta; p.ej. ¿Uno que sea capaz de procesar múltiples bits a la vez? (2) ¿Hay un nombre para este procedimiento?

    
pregunta chrstphrchvz

1 respuesta

2

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

Varias formas de calcular los números Morton: hacks Twiddling

Especialización del método de los 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 )

    
respondido por el helloworld922

Lea otras preguntas en las etiquetas