En general, pasar de un microcontrolador de 8 a uno de 16 o 32 bits significa que habrá menos restricciones en cuanto a recursos, sobre todo de memoria, y a la anchura de los registros utilizados para realizar operaciones aritméticas y lógicas. Las denominaciones de 8, 16 y 32 bits se refieren generalmente al tamaño de los buses de datos internos y externos, así como al tamaño de los registros internos utilizados para las operaciones aritméticas y lógicas (antes sólo había uno o dos llamados acumuladores, ahora suele haber bancos de registros de 16 o 32).
El tamaño de los puertos de E/S también suele seguir el tamaño del bus de datos, por lo que un micro de 8 bits tendrá puertos de 8 bits, uno de 16 bits tendrá puertos de 16 bits, etc.
A pesar de tener un bus de datos de 8 bits, muchos microcontroladores de 8 bits tienen un bus de direcciones de 16 bits y pueden direccionar 2^16 o 64K bytes de memoria (lo que no significa que tengan implementado nada parecido). Pero algunos micros de 8 bits, como los PIC de gama baja, pueden tener un espacio de memoria RAM muy limitado (por ejemplo, 96 bytes en un PIC16).
Para evitar su limitado esquema de direccionamiento, algunos micros de 8 bits utilizan la paginación, donde el contenido de un registro de página determina uno de los varios bancos de memoria a utilizar. Por lo general, habrá algo de memoria RAM común disponible sin importar el valor del registro de página.
Los microcontroladores de 16 bits suelen estar limitados a 64K de memoria, pero también pueden utilizar técnicas de paginación para evitarlo. Los microcontroladores de 32 bits, por supuesto, ya no tienen estas restricciones y pueden direccionar hasta 4GB de memoria.
Junto con los diferentes tamaños de memoria está el tamaño de la pila. En los micros de gama baja, ésta puede implementarse en un área especial de la memoria y ser muy pequeña (muchos PIC16 tienen una pila de llamadas de 8 niveles de profundidad). En los micros de 16 y 32 bits, la pila estará normalmente en la RAM general y estará limitada sólo por el tamaño de la RAM.
También hay grandes diferencias en la cantidad de memoria -tanto de programa como de RAM- implementada en los distintos dispositivos. Los micros de 8 bits pueden tener sólo unos cientos de bytes de RAM y unos pocos miles de bytes de memoria de programa. Los micros de 16 bits pueden tener unos pocos miles de bytes de RAM y decenas de miles de bytes de memoria de programa. Los micros de 32 bits suelen tener más de 64K bytes de RAM, y quizás 1/2 MB de memoria de programa.
Si estás programando en lenguaje ensamblador, las limitaciones de tamaño de registro serán muy evidentes, por ejemplo, sumar dos números de 32 bits es una tarea ardua en un microcontrolador de 8 bits, pero trivial en uno de 32 bits. Si estás programando en C, esto será en gran medida transparente, pero por supuesto el código compilado subyacente será mucho más grande para el de 8 bits.
Dije en gran medida transparente, porque el tamaño de varios tipos de datos en C puede ser diferente de un tamaño de micro a otro; por ejemplo, un compilador que apunta a un micro de 8 o 16 bits puede usar "int" para significar una variable de 16 bits con signo, y en un micro de 32 bits esto sería una variable de 32 bits. Así que muchos programas utilizan #defines para decir explícitamente cuál es el tamaño deseado, como "UINT16" para una variable de 16 bits sin signo.
Si estás programando en C, el mayor impacto será el tamaño de tus variables. Por ejemplo, si sabes que una variable siempre será menor de 256 (o en el rango de -128 a 127 si tiene signo), entonces deberías usar un 8 bits (unsigned char o char) en un micro de 8 bits (ej. PIC16) ya que usar un tamaño mayor será muy ineficiente. Del mismo modo, las variables de 16 bits en un micro de 16 bits (por ejemplo, PIC24). Si está utilizando un micro de 32 bits (PIC32), entonces no hay ninguna diferencia, ya que el conjunto de instrucciones MIPS tiene instrucciones de byte, palabra y doble palabra. Sin embargo, en algunos micros de 32 bits, si carecen de dichas instrucciones, manipular una variable de 8 bits puede ser menos eficiente que una de 32 bits debido al enmascaramiento.
Como ha señalado vsz, en los sistemas en los que se tiene una variable mayor que el tamaño de registro por defecto (por ejemplo, una variable de 16 bits en un micro de 8 bits), y esa variable se comparte entre dos hilos o entre el hilo base y un manejador de interrupciones, hay que hacer cualquier operación (incluyendo sólo la lectura) en la variable atómico , es decir, hacer que parezca que se hace como una sola instrucción. Esto se llama sección crítica. La forma estándar de mitigar esto es rodear la sección crítica con un par de interrupciones de desactivación/activación.
Por lo tanto, al pasar de sistemas de 32 bits a 16 bits, o de 16 bits a 8 bits, cualquier operación sobre variables de este tipo que ahora sea mayor que el tamaño de registro por defecto (pero que antes no lo era) debe considerarse una sección crítica.
Otra diferencia principal, al pasar de un procesador PIC a otro, es el manejo de los periféricos. Esto tiene menos que ver con el tamaño de la palabra y más con el tipo y número de recursos asignados en cada chip. En general, Microchip ha intentado que la programación de un mismo periférico utilizado en diferentes chips sea lo más similar posible (por ejemplo, el temporizador 0), pero siempre habrá diferencias. El uso de sus bibliotecas de periféricos ocultará en gran medida estas diferencias. Una última diferencia es el manejo de las interrupciones. De nuevo, las bibliotecas de Microchip ayudan en este aspecto.
0 votos
No. Ciertamente hay diferentes preocupaciones, pero éstas se encuentran en gran medida en el nivel de detalle de los dispositivos. Por ejemplo, ¿se permite el acceso a palabras no alineadas? (En ARM no, pero en x86 sí). Esta pregunta no es lo suficientemente específica.
0 votos
Vaya chicos, gracias por las respuestas. Así que realmente hay diferencias muy importantes que debemos tener en cuenta a la hora de programar procesadores de 32 bits frente a procesadores de 8 bits. Aquí me refería a C ya que creo que la mayoría de la gente no se adentra en Assembly para programar por razones que todos conocemos muy bien. Gracias por las respuestas detalladas, lo aprecio mucho.
0 votos
Con los uc's de 32 bits hay MUCHAS más opciones y MUCHOS más registros que tienes que hacer bien. Supongo que depende de lo que estés haciendo. Dicho esto, hoy en día se puede conseguir una placa de desarrollo, compilador, depurador, IDE para alrededor de $50. Back in the day that would cost close to $ 1000.