En máquinas direccionables por palabra, los números de punto fijo son manejados naturalmente por palabra por la CPU. Esto significa que cualquier número entero se almacena en celdas de memoria del tamaño de una palabra y que tiene que acceder a una palabra completa para leer o escribir un solo número entero. Pero, ¿qué hay de las unidades de datos más pequeñas como caracteres, comúnmente codificadas como piezas de datos de 8 bits? Dado que una palabra está formada por varios bytes, ¿la CPU es capaz de almacenar varios caracteres en una sola palabra mientras los maneja como piezas de datos individuales? Por ejemplo, si almaceno 4 caracteres (codificados con un esquema de 8 bits) en una palabra de 32 bits, ¿puede la CPU entenderlos como un conjunto con 4 elementos? ¿O es necesario almacenar un solo carácter en una palabra completa? ¿Existe un estándar o distintas arquitecturas tratan este asunto de manera diferente?
Sí tu puedes. Por ejemplo, la línea Texas Instruments MSP430 son procesadores de 16 bits y tienen palabras de 16 bits. Una variedad de registros tienen una longitud de 16 bits, pero también se pueden direccionar como registros de 8 bits. Sin embargo, su bus de memoria tiene 16 bits de ancho. Puede agregar bytes de 8 bits a la memoria sin problema. Y use ambos bytes de una ubicación de memoria de forma independiente o juntos si lo desea.
Si está programando en C, un carácter normalmente tiene el mismo tamaño que la unidad de memoria direccionable más pequeña. Si lo más pequeño que puede abordar es una palabra de 16 o 32 bits, entonces eso será un carácter. En la mayoría de las arquitecturas modernas, los caracteres son de 8 bits y se pueden empaquetar en una palabra de 32 bits en la memoria. Pero en algunos (algunos DSP) se utilizan bytes más grandes.
Siempre es posible trabajar en una parte de una palabra que es más pequeña que un byte usando las operaciones AND, OR y shift. De esa manera, podría empaquetar valores ASCII en 8 bits independientemente de cómo funcione el direccionamiento. Sin embargo, eso no sería muy portátil o fácil de trabajar.
Suena mucho como si estuvieras hablando de uniones de estilo c. Combinado con algo de magia de estructura, esto le permite interpretar la misma colección de bytes de diferentes maneras mientras mantiene los tipos. El compilador hace la magia del bitshifting/bitmasking por usted.
union data{
struct{
uint8_t byte1;
uint8_t byte2;
uint8_t byte3;
uint8_t byte4;
} bytes_individual;
uint32_t bytes_all;
}
union storage;
storage.bytes_all = 0x04030201;
storage.bytes_individual.byte1 == 0x04; // true
storage.bytes_individual.byte2 == 0x03; // true
// etc
Asumí una CPU little-endian aquí, por lo que la dirección menos significativa se almacena primero, o "LSB primero".
Hice referencia a este enlace si desea investigar un poco más: https://www.tutorialspoint.com/cprogramming/c_unions.htm
Si está buscando comprimir datos como este, depende de usted. El Micro hará lo que le digas que haga. Incluso puede tener instrucciones para manipular segmentos de datos de 8 bits. Es posible que ya existan bibliotecas para hacerlo. Puede ser que si está utilizando un compilador/lib de C que está escrito para hacerlo con datos de tamaño de caracteres y ni siquiera tiene que manejarlo con rutinas de bajo nivel.
Pero si está trabajando con un Cortex, probablemente tenga suficiente RAM para que esto no sea una preocupación.
brian carlton
brian carlton
Humberto Fioravante Ferro
Pico de voltaje
brian carlton