¿Qué tan diferentes son los microcontroladores de 8 bits de los microcontroladores de 32 bits cuando se trata de programarlos?

19

Correcto, entonces tenemos microcontroladores de 8, 16 y 32 bits en este mundo en este momento. Todos ellos son de uso frecuente. ¿Qué tan diferente es programar microcontroladores de 8 bits y 16 bits? Quiero decir, ¿requiere una técnica o habilidad diferente? Tomemos microchip por ejemplo. ¿Qué cosas nuevas necesita aprender una persona si quiere hacer la transición de microcontroladores de 8 bits a microcontroladores de 32 bits?

quantum231
fuente
No. Ciertamente, existen diferentes preocupaciones, pero están en gran medida en el nivel de detalle específico del dispositivo. Por ejemplo, ¿se permite el acceso de palabras no alineadas? (En ARM no lo es, pero en x86 sí). Esta pregunta no es realmente lo suficientemente específica.
Chris Stratton
Guau chicos, gracias por las respuestas. Por lo tanto, en realidad hay diferencias muy importantes que debemos tener en cuenta al programar procesadores de 32 bits frente a procesadores de 8 bits. Aquí me refería a C porque creo que la mayoría de la gente no profundiza en la Asamblea para programar por razones que todos conocemos. Gracias por las respuestas detalladas, realmente lo aprecio.
quantum231
Con los uc 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, en estos días puede obtener una placa de desarrollo, compilador, depurador, IDE por alrededor de $ 50. De vuelta en el día que costaría cerca de $ 1000.

Respuestas:

33

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.

tcrosley
fuente
Vale la pena señalar que, a nivel de lenguaje ensamblador, los procesadores de 8 bits tienden a tener menos registros y menos instrucciones ortogonales (AVR es una excepción más RISCy), una consecuencia de las limitaciones de diseño cuando se desarrollaron. Los procesadores de 32 bits tienden a ser descendientes de RISC (RX de Renesas, un CISC moderno, es una excepción, y ColdFire de Freescale desciende de m68k).
Paul A. Clayton
99
Para no comenzar una nueva respuesta solo para esta adición, creo que es importante agregar que la transición de 32 bits a 16 de 16 a 8 puede causar sorpresas desagradables ya que la aritmética deja de ser atómica. Si agrega dos números de 16 bits en un microcontrolador de 8 bits y los usa en una interrupción, debe asegurarse de que sean seguros para subprocesos, de lo contrario podría terminar agregando solo la mitad antes de que se active la interrupción, lo que resulta en un valor no válido en su rutina de servicio de interrupción.
vsz
2
@vsz - Buen punto, se olvidó de eso. En general, uno debe deshabilitar las interrupciones en torno a cualquier acceso (incluida la simple lectura) de cualquier variable volátil que sea mayor que el tamaño de registro predeterminado.
tcrosley
1
¿Es cierto que el uC de 32 bits generalmente tiene interfaces de E / S de 32 bits? Creo que de todos modos es más comúnmente solo comunicación en serie.
clabacchio
1
@clabacchio Mi experiencia es que todos los registros de puertos de E / S se definen como 32 bits, pero a veces los 16 bits superiores 16-31 no se utilizan, por lo que un puerto paralelo sigue siendo 16 pines físicos. En otros casos, como un registro RTCC, se utilizan los 32 bits.
tcrosley
8

Una diferencia común entre los microcontroladores de 8 bits y 32 bits es que los de 8 bits a menudo tienen un rango de memoria y espacio de E / S al que se puede acceder en una sola instrucción, independientemente del contexto de ejecución, mientras que los microcontroladores de 32 bits con frecuencia requieren una secuencia de múltiples instrucciones. Por ejemplo, en un microcontrolador típico de 8 bits (HC05, 8051, PIC-18F, etc.) se puede cambiar el estado de un bit de puerto con una sola instrucción. En un ARM típico (32 bits), si el contenido del registro fuera inicialmente desconocido, se necesitaría una secuencia de instrucciones de cuatro instrucciones:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

En la mayoría de los proyectos, el controlador pasa la gran mayoría de su tiempo haciendo otras cosas además de configurar o borrar bits de E / S individuales, por lo que el hecho de que operaciones como borrar un pin de puerto requieran más instrucciones a menudo no importará. Por otro lado, hay momentos en que el código tendrá que "manipular" muchas manipulaciones de puertos, y la capacidad de hacer esas cosas con una sola instrucción puede resultar bastante valiosa.

Por otro lado, los controladores de 32 bits están invariablemente diseñados para acceder de manera eficiente a muchos tipos de estructuras de datos que pueden almacenarse en la memoria. En comparación, muchos controladores de 8 bits son muy ineficientes para acceder a estructuras de datos que no están asignadas estáticamente. Un controlador de 32 bits puede realizar en una instrucción un acceso a matriz que tomaría media docena o más instrucciones en un controlador típico de 8 bits.

Super gato
fuente
Supongo que quisiste decir "bit-bang". Vale la pena señalar que ARM admite regiones de banda de bits (donde las operaciones de palabras son operaciones de un solo bit) y la Extensión específica de aplicación MCU para MIPS proporciona un bit Atomically Set / Clear dentro de instrucciones Byte (ASET / ACLR).
Paul A. Clayton
@ PaulA.Clayton: Realmente no he mirado el MIPS en los últimos 20 años; En cuanto a las regiones de banda de bits, nunca he descubierto una forma de usarlas en un código de aspecto razonable, e incluso si pudiera usarlas, guardarían solo una instrucción a menos que uno usara algún truco de programación loco, en cuyo caso podrían guardar dos [cargar R0 con una dirección par o impar en función de si el bit debe establecerse o borrarse, y ajustar el desplazamiento en la instrucción de almacenamiento según corresponda para compensar]. Por cierto, ¿tienes alguna idea de por qué la región de banda de bits usa direcciones de palabras?
supercat
@supercat: el direccionamiento de palabras le permite acceder a las regiones de banda de bits desde C o C ++ mediante la suscripción de puntero ( region_base[offset])
Ben Voigt
@BenVoigt ¿Y por qué no se puede hacer eso con el direccionamiento de bytes? (Quizás una posible razón sería eliminar la expectativa / esperanza de que se admitieran operaciones de dos y cuatro bits).
Paul A. Clayton
@BenVoigt: Tener que escalar el número de bit por un factor de 4 a menudo costará una instrucción adicional. En realidad, lo que me hubiera gustado haber visto, en lugar de un área de banda de bits, sería un conjunto de dos áreas que se ubicarían en un desplazamiento fijo en relación con los accesos de memoria "normales", pero que especifiquen las escrituras en un área si es posible, solo "establecerá" bits, y las escrituras en el otro solo "borrarán" bits. Si el bus tuviera bits de control separados "write-ones-enable" y "write-zeroes-enable", se podrían lograr las cosas que permite el bit-banding, pero en muchos casos evitar leer-modificar-escribir.
supercat
6

La mayor diferencia práctica es la cantidad de documentación, realmente, para comprender completamente todo el chip. Hay microcontroladores de 8 bits que vienen con casi 1000 páginas de documentación. Compare eso con aproximadamente 200-300 páginas para una CPU de 8 bits de 1980 y los populares chips periféricos con los que se usaría. Un dispositivo de 32 bits rico en periféricos requerirá que revise 2000-10,000 páginas de documentación para comprender la parte. Las partes con gráficos modernos en 3D bordean en 20k páginas de documentación.

En mi experiencia, toma alrededor de 10 veces más tiempo saber todo lo que hay que saber sobre un controlador moderno de 32 bits dado como lo haría para una parte moderna de 8 bits. Por "todo" quiero decir que usted sabe cómo usar todos los periféricos, incluso de manera no convencional, y conoce el lenguaje de la máquina, el ensamblador que usa la plataforma, así como otras herramientas, los ABI (s), etc.

No es inconcebible que tantos, muchos diseños se realicen con una comprensión parcial. A veces es intrascendente, a veces no lo es. El cambio de plataformas debe hacerse con el entendimiento de que habrá un precio a corto y mediano plazo en la productividad que pagará por las ganancias percibidas de productividad de una arquitectura más poderosa. Haz tu debida diligencia.

Reinstalar a Mónica
fuente
3

Personalmente, no me preocuparía demasiado por actualizar (8bit-> 32bit) uC de la misma familia y está aumentando las especificaciones en todos los ámbitos. En general, no hago nada fuera de lo normal con los tipos de datos, ya que puede ser difícil de mantener en el futuro.

La degradación de un código de dispositivo es una historia diferente.

Nick Tullos
fuente
3
El compilador determina el tamaño de los tipos de datos, no la arquitectura del procesador. Un procesador de 8 bits puede tener entradas de 32 bits, aunque necesitará múltiples instrucciones para manipularlos.
Joe Hass
buen comentario: eliminé la primera línea debido a la corrección.
Nick Tullos
@JoeHass: Un compilador para un procesador de 8 bits podría definir inta ser de 32 bits, o incluso 64, para el caso, pero estoy al tanto de ninguna compiladores de 8 bits existentes, que en realidad no definen inta ser mayor que 16 bits, o promover Valores de 16 bits a cualquier cosa más grande.
supercat
-1

Los MCU de 32 bits consumirán mucha más energía para uno. Y requieren más circuitos de soporte.

Uno realmente no hace la transición a 32 bits de 8 bits ... Seguirá usando ambos, a menudo juntos. La conclusión es que debe usar (y aprender) lo que sea apropiado para el trabajo. Aprenda ARM porque bueno, ahora mismo sacudirá el mundo incrustado y seguirá haciéndolo. También aprenda AVR o PIC porque son increíbles controladores de placa.

Probablemente experimentará tanta angustia al cambiar de AVR a ARM como lo haría de ARM a x86 de todos modos, el tamaño del bus realmente no hace mucha diferencia. Sin embargo, todo el hardware adicional avanzado lo hace. Pasar de interrupciones estándar a una matriz de interrupciones vectorizadas con 6 niveles de prioridad será mucho más difícil que descubrir cómo contar hasta cuatro mil millones.

Hugo
fuente
44
No sé si es correcto afirmar que las MCU de 32 bits son intrínsecamente más hambrientas de energía. Al menos una línea completa de productos de la empresa ( micro energía ) son MCU de potencia ultra baja, y todos están basados ​​en núcleos ARM de 32 bits.
Connor Wolf
3
Acabo de resolver un circuito stm32l1 que debería funcionar durante 7 años en un cr2032
Scott Seidman
2
¿Puede justificar el comentario de que una MCU de 32 bits necesita más "circuitos de soporte"? Creo que estás expresando varias opiniones injustificadas aquí.
Joe Hass
1
Además, su comentario de interrupciones vectorizadas no tiene mucho sentido, ya que puede obtener múltiples niveles de prioridad en microcontroladores de 8 bits (consulte MCU Atmel xmega, que tienen 3 niveles de prioridad), y tener interrupciones vectorizadas es irrelevante cuando cada dispositivo de hardware tiene propios vectores independientes de todos modos.
Connor Wolf
2
Estoy usando un procesador Cortex-M0 de 32 bits para controlar un cargador de batería inteligente para un vehículo eléctrico. Utiliza una sola fuente de 3.3 V. Tiene un oscilador interno y PLL, por lo que ni siquiera necesito un cristal. Estoy usando un paquete DIP de 28 pines, pero puedo obtener un Cortex-M0 en un DIP de 8 pines si quiero. ¿Cómo puede ser más complejo que un PIC o AVR típico?
Joe Hass