En general, pasar de microcontroladores de 8 a 16 a 32 bits significa que tendrá menos restricciones en los recursos, particularmente la memoria, y el ancho de los registros utilizados para realizar operaciones aritméticas y lógicas. Los apodos de 8, 16 y 32 bits generalmente se refieren al tamaño de los buses de datos internos y externos y también al tamaño de los registros internos utilizados para operaciones aritméticas y lógicas (solían ser solo uno o dos llamados acumuladores , ahora generalmente hay bancos de registro de 16 o 32).
Los tamaños de los puertos de E / S también seguirán generalmente el tamaño del bus de datos, por lo que un micro de 8 bits tendrá puertos de 8 bits, un puerto 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 (eso no significa que tengan cerca de eso implementado). Pero algunos micros de 8 bits, como los PIC de gama baja, pueden tener solo un espacio RAM muy limitado (por ejemplo, 96 bytes en un PIC16).
Para evitar su esquema de direccionamiento limitado, algunos micros de 8 bits usan paginación, donde el contenido de un registro de página determina uno de varios bancos de memoria para usar. Por lo general, habrá algo de RAM común disponible, sin importar el registro de la página.
El microcontrolador de 16 bits generalmente está restringido a 64K de memoria, pero también puede usar técnicas de paginación para solucionar esto. Los microcontroladores de 32 bits, por supuesto, no tienen tales restricciones y pueden direccionar hasta 4 GB de memoria.
Junto con los diferentes tamaños de memoria está el tamaño de la pila. En los micros del extremo inferior, esto puede implementarse en un área especial de memoria y ser muy pequeño (muchos PIC16 tienen una pila de llamadas profundas de 8 niveles). En los micros de 16 y 32 bits, la pila generalmente estará en RAM en general y estará limitada solo 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 solo pueden tener unos pocos cientos de bytes de RAM y unos pocos miles de bytes de memoria de programa (o mucho menos, por ejemplo, el PIC10F320 tiene solo 256 palabras flash de 14 bits y 64 bytes de RAM). 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 a menudo tienen más de 64K bytes de RAM, y quizás 1/2 MB o más de memoria de programa (el PIC32MZ2048 tiene 2 MB de flash y 512KB de RAM; el PIC32MZ2064DAH176 recientemente lanzado, optimizado para gráficos tiene 2 MB de flash y la friolera de 32 MB de RAM en chip).
Si está programando en lenguaje ensamblador, las limitaciones de tamaño de registro serán muy evidentes, por ejemplo, agregar dos números de 32 bits es una tarea rutinaria en un microcontrolador de 8 bits pero trivial en uno de 32 bits. Si está programando en C, esto será en gran medida transparente, pero, por supuesto, el código compilado subyacente será mucho más grande para 8-bitter.
Dije en gran parte transparente, porque el tamaño de varios tipos de datos C puede ser diferente de un tamaño micro a otro; por ejemplo, un compilador que apunta a un micro de 8 o 16 bits puede usar "int" para referirse a una variable con signo de 16 bits, y en un micro de 32 bits sería una variable de 32 bits. Por lo tanto, muchos programas usan #defines para decir explícitamente cuál es el tamaño deseado, como "UINT16" para una variable de 16 bits sin signo.
Si está programando en C, el mayor impacto será el tamaño de sus variables. Por ejemplo, si sabe que una variable siempre será inferior a 256 (o en el rango de -128 a 127 si está firmada), entonces debe usar un 8-bit (sin signo char o char) en un micro de 8-bit (por ejemplo, PIC16 ) ya que usar un tamaño más grande será muy ineficiente. Asimismo, re variables de 16 bits en un micro de 16 bits (por ejemplo, PIC24). Si está utilizando un micro de 32 bits (PIC32), entonces realmente no hace ninguna diferencia ya que el conjunto de instrucciones MIPS tiene instrucciones de byte, palabra y palabra doble. Sin embargo, en algunos micros de 32 bits, si carecen de tales instrucciones, la manipulación de una variable de 8 bits puede ser menos eficiente que una de 32 bits debido al enmascaramiento.
Como señaló el miembro del foro vsz, en los sistemas donde tiene una variable que es más grande que el tamaño de registro predeterminado (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, uno debe realizar cualquier operación (incluso solo lectura) en la variable atómica , es decir, hacer que parezca que se hace como una sola instrucción. Esto se llama una sección crítica. La forma estándar de mitigar esto es rodear la sección crítica con un par de interrupción de activación / desactivación.
Por lo tanto, al pasar de sistemas de 32 bits a 16 bits, o de 16 bits a 8 bits, cualquier operación en variables de este tipo que ahora son más grandes que el tamaño de registro predeterminado (pero no antes) debe considerarse crítica sección.
Otra diferencia principal, pasar de un procesador PIC a otro, es el manejo de periféricos. Esto tiene menos que ver con el tamaño de la palabra y más con el tipo y la cantidad de recursos asignados en cada chip. En general, Microchip ha tratado de hacer que la programación del mismo periférico utilizado en diferentes chips sea lo más similar posible (por ejemplo, timer0), pero siempre habrá diferencias. El uso de sus bibliotecas periféricas ocultará estas diferencias en gran medida. Una diferencia final es el manejo de las interrupciones. Nuevamente hay ayuda aquí de las bibliotecas de Microchip.