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?
microcontroller
programming
quantum231
fuente
fuente
Respuestas:
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.
fuente
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:
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.
fuente
region_base[offset]
)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.
fuente
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.
fuente
int
a 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 definenint
a ser mayor que 16 bits, o promover Valores de 16 bits a cualquier cosa más grande.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.
fuente