21 votos

¿En qué se diferencian los microcontroladores de 8 bits de los de 32 bits a la hora de programarlos?

Bien, en este momento tenemos microcontroladores de 8, 16 y 32 bits. Todos ellos se utilizan a menudo. ¿Qué diferencia hay entre programar microcontroladores de 8 y 16 bits? Quiero decir, ¿se requiere una técnica o habilidad diferente? Tomemos como ejemplo el microchip. ¿Qué cosas nuevas tiene que aprender una persona si quiere pasar de los microcontroladores de 8 bits a los de 32 bits?

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.

35voto

Matt McMinn Puntos 6067

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

Cabe destacar que, a nivel de lenguaje ensamblador, los procesadores de 8 bits tienden a tener menos registros y menos instrucciones ortogonales (el AVR es una excepción más RISC), una consecuencia de las limitaciones de diseño cuando se desarrollaron. Los procesadores de 32 bits suelen ser descendientes de RISC (el RX de Renesas, un CISC moderno, es una excepción, y el ColdFire de Freescale desciende del m68k).

9 votos

Para no empezar una nueva respuesta sólo por esta adición, creo que es importante añadir que la transición de 32 bits a 16 o de 16 a 8 puede causar sorpresas desagradables ya que la aritmética deja de ser atómica. Si sumas dos números de 16 bits en un microcontrolador de 8 bits, y los usas en una interrupción, tienes que tener cuidado de hacerlos a prueba de hilos, de lo contrario podrías terminar sumando sólo la mitad antes de que la interrupción se dispare, resultando en un valor inválido en tu rutina de servicio de interrupción.

2 votos

@vsz -- Buen punto, me olvidé de eso. Generalmente uno debería deshabilitar las interrupciones alrededor de cualquier acceso (incluyendo sólo la lectura) de cualquier variable volátil que sea mayor que el tamaño del registro por defecto.

8voto

Alex Andronov Puntos 178

Una diferencia común entre los microcontroladores de 8 y 32 bits es que los de 8 bits suelen tener un rango de memoria y espacio de E/S al que se puede acceder con una sola instrucción, independientemente del contexto de ejecución, mientras que los microcontroladores de 32 bits requerirán con frecuencia una secuencia de varias 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 se desconoce inicialmente, 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 pasará la mayor parte de su tiempo haciendo otras cosas que no sean establecer o borrar bits individuales de E/S, así que el hecho de que operaciones como borrar un pin de puerto requieran más instrucciones a menudo no importará. Por otro lado, hay ocasiones en las que el código tendrá que hacer un montón de manipulaciones de puertos, y la capacidad de hacer tales cosas con una sola instrucción puede resultar muy valiosa.

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

0 votos

Supongo que querías decir "bit-bang". Puede ser que valga la pena señalar que ARM soporta regiones de banda de bits (donde las operaciones de palabra son operaciones de un solo bit) y la Extensión Específica de la Aplicación MCU para MIPS proporciona instrucciones Atomically Set/Clear Bit within Byte (ASET/ACLR).

0 votos

@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 manera de usarlas en un código de aspecto razonable, e incluso si pudiera usarlas sólo ahorrarían una instrucción a menos que uno usara algún truco de programación loco, en cuyo caso podrían ahorrar dos [cargar R0 con una dirección par o impar en función de si el bit debe establecerse o despejarse, y ajustar el desplazamiento en la instrucción de almacenamiento según corresponda para compensar]. Por cierto, ¿tienes idea de por qué la región de la banda de bits utiliza direcciones de palabra?

0 votos

@supercat: El direccionamiento de palabras te permite acceder a las regiones de la banda de bits desde C o C++ a través de la subscripción de punteros ( region_base[offset] )

6voto

Kuba Ober Puntos 1474

La mayor diferencia práctica es la cantidad de documentación, realmente, para entender completamente el chip. Hay microcontroladores de 8 bits que vienen con casi 1000 páginas de documentación. Compárelo con las 200-300 páginas de una CPU de 8 bits de los años 80 y los populares chips periféricos con los que se utiliza. Un dispositivo de 32 bits rico en periféricos requerirá que revises entre 2000 y 10.000 páginas de documentación para entender la pieza. Las piezas con gráficos 3D modernos rozan las 20.000 páginas de documentación.

Según mi experiencia, se necesita aproximadamente 10 veces más tiempo para saber todo lo que hay que saber sobre un controlador moderno de 32 bits que para una pieza moderna de 8 bits. Con "todo" me refiero a que sepas cómo utilizar todos los periféricos, incluso de forma poco convencional, y conozcas el lenguaje de máquina, el ensamblador que utiliza la plataforma así como otras herramientas, la(s) ABI(s), etc.

No es en absoluto inconcebible que muchos, muchos diseños se hagan con una comprensión parcial. A veces es intrascendente, a veces no. El cambio de plataforma tiene que hacerse con la comprensión de que habrá un precio a corto y medio plazo en la productividad que se paga por las ganancias de productividad percibidas de una arquitectura más potente. Haga su debida diligencia.

3voto

Alex Puntos 164

Yo personalmente no me preocuparía demasiado por actualizar (8bit->32bit) uC de la misma familia y estás aumentando las especificaciones en todo el tablero. En general, no hago nada fuera de la norma con los tipos de datos, ya que puede ser difícil de mantener en el camino.

Bajar el código de un dispositivo es una historia diferente.

3 votos

El tamaño de los tipos de datos lo determina el compilador, no la arquitectura del procesador. Un procesador de 8 bits puede tener ints de 32 bits, aunque se necesiten varias instrucciones para manipularlos.

0 votos

Buen comentario- He eliminado la primera línea debido a la corrección.

0 votos

@JoeHass: Un compilador para un procesador de 8 bits podría definir int de 32 bits, o incluso de 64, pero no conozco ningún compilador de 8 bits que realmente hacer definir int para ser mayores de 16 bits, o promover valores de 16 bits a cualquier cosa mayor.

-1voto

Niten Puntos 878

Los MCU de 32 bits consumen mucha más energía para uno. Y requieren más circuitos de apoyo.

Uno no pasa realmente de los 8 bits a los 32 bits... Seguirá utilizando ambos, a menudo juntos. La conclusión es que debes usar (y aprender) lo que sea apropiado para el trabajo. Aprende ARM porque es lo mejor del mundo embebido ahora mismo y seguirá haciéndolo. También aprende AVR o PIC porque son controladores de placa impresionantes.

Probablemente experimentarás tanta angustia al cambiar de AVRs a ARMs como lo harías de ARM a x86 de todos modos, el tamaño del bus realmente no hace mucha diferencia. Sin embargo, todo el hardware avanzado adicional sí 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 averiguar cómo contar hasta cuatro mil millones.

4 votos

No sé si es exacto afirmar que las MCU de 32 bits son intrínsecamente más consumidoras de energía. Al menos una empresa ( energía micro ) toda la línea de productos son MCUs de ultra bajo consumo, y todos ellos están basados en núcleos ARM de 32 bits.

3 votos

Acabo de elaborar un circuito stm32l1 que debería funcionar durante 7 años en un cr2032

2 votos

¿Puedes justificar el comentario de que una MCU de 32 bits necesita más "circuitos de apoyo"? Creo que estás expresando varias opiniones injustificadas aquí.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X