2009-05-22 11 views
8

¿Podría alguien decirme si es posible quemar un microcontrolador 8051 con un programa C++? He intentado buscar en línea pero parece que no estoy seguro de si es posible o no. Keil usa C, pero el programa que necesito escribir es muy intensivo en cadenas y C es bastante antiestético en comparación con C#, que es lo que estoy acostumbrado a usar. Por el momento, estoy intentando escribir el código en C pero se está volviendo realmente complicado, así que me sentiría extremadamente aliviado si pudiera escribirlo en C++.C++ para microcontrolador 8051?

Necesitaría un compilador de C++ que creara un archivo de salida Hex que luego se puede quemar en el microcontrolador. ¿Alguien escuchó algo que podría usar? Y también, C usa un archivo de encabezado que le permite referirse a los puertos, pero cuando intenté averiguar si este archivo de encabezado también se usa en C++, no pude encontrar información sobre él.

Adición: El microcontrolador que estoy usando es Atmel AT89C51 con 4K Bytes de memoria flash reprogramable y RAM interna de 128 x 8 bits. Esto es en realidad para un Robot para un proyecto en la universidad y la codificación en realidad no requiere OOP. Simplemente tiene muchas tablas de búsqueda que están en formato de matriz de cadenas 2D. La única razón por la que quería considerar C++ fue por la confusión de las cadenas de manipulación que parecían estar recibiendo (debido a MI falta de experiencia en C).

¿Alguien sabe sobre el archivo de encabezado? C usa #include reg51.h pero traté de averiguar si esto funciona para C++ y no pude encontrar nada en él.

+4

No sé si hay una forma nativa, pero siempre puede usar el intérprete de LLVM C++ to C. – Zifre

+0

¿Cuánta memoria tienes (ROM y RAM)? – lothar

+3

¡Olvídalo! Probablemente necesitará cada ** bit ** de 128 Byte RAM y 4096 Byte Flash. Se recomienda encarecidamente usar el lenguaje ensamblador ... –

Respuesta

2

Hay un compilador comercial de ceibo.

Sin embargo si se puede usar C++ (especialmente cadena STL) depende de la cantidad de recursos (tanto ROM y RAM que tendrá.

Hay una 8051 site con foros, tutoriales y descargas donde puede conseguir más recursos para programando el 8051.

11

Me gustaría cuestionar si esta es realmente una buena idea en primer lugar. Entiendo el razonamiento detrás de querer usar C++ sobre C en el caso general pero en el caso de un microcontrolador de arquitectura Harvard de 8 bits Me gustaría advertir en contra de esto.

Cosas para llevar en mente incluyen:

  • El soporte de depuración a nivel de fuente estará en algún lugar entre pobre e imposible.
  • Sobrecarga de tiempo de ejecución de OOP en una máquina de 8 bits. Recomiendo hacer una evaluación comparativa seria antes de comprometerme con una herramienta.
  • La memoria no es barata en sistemas embebidos y sin duda tendrá algunas limitaciones de espacio de direcciones.

Además, si realmente va a hacer un manejo serio de cadenas, recomendaría usar la biblioteca estándar C en lugar de una biblioteca de objetos de cadena simplemente porque tiene un mejor control sobre la sustitución in situ y las copias de cadenas se vuelven evidentemente obvio en el código.

Por favor, publique un poco sobre el microcontrolador que planea usar (memoria de datos, memoria de programa) y si hay requisitos de rendimiento que se deben cumplir para que podamos ayudar un poco más concretamente.

+1

"El soporte para la depuración a nivel de fuente estará en algún lugar entre pobre e imposible". En mi humilde opinión, no será diferente de la depuración C. Si el objetivo tiene JTAG, debería ser bastante sencillo si el depurador tiene soporte para ello. – lothar

+0

Según tengo entendido, todas las herramientas 8051 C++ se traducen en C y utilizan una plataforma popular como Keil Tools o IAR. Son estas herramientas las que luego realizan el soporte de depuración IDE. Por supuesto, podría estar completamente equivocado :-) – mikelong

+2

Recuerda que C++ genera cómputo/generación de código en tiempo de compilación, por lo que en principio puede generar un mejor código que cualquier otro compilador de C alguna vez lo haría. Estoy trabajando en un puerto LLVM para una arquitectura de 8 bits (lo siento, no puedo decir más que eso), y el front-end de C++ genera un hermoso código numérico que es imposible de generar a partir de C puro. Básicamente, tengo una versión trucada de Eigen 3 que genera código numérico de punto fijo para una arquitectura de 8 bits con multiplicador de hardware. Código que está a la par con el montaje escrito a mano, por cierto. –

1

Es posible que desee considerar la posibilidad de detalles adicionales sobre el tipo de programa que se va a ejecutar en ese microcontrolador:

Usted ha hablado de C++, así como C# en su publicación, ambos de los cuales seguramente no se utiliza idealmente para el procesamiento de cadena pesada en un microcontrolador, sin mencionar que probablemente esté considerando un uso intensivo de la STL, que además aumentaría el tamaño del ejecutable?

¿Cuáles son exactamente sus principales restricciones (RAM, CPU, ROM, etc.)?

Si realmente cree que debe realizar este proceso de cadena de forma OO, considere la posibilidad de ejecutar un intérprete de secuencias de comandos incrustado liviano en el controlador, de modo que pueda proporcionar las rutinas de procesamiento de cadenas utilizando el lenguaje de scripting , mientras que el propio intérprete sería ANSI C compilado en un archivo HEX (por ejemplo, lua o nasal, ambos parecerían candidatos adecuados).

Sin embargo, tenga en cuenta que un lenguaje de scripts como lua generalmente impondrá aproximadamente 100kb + de sobrecarga en el espacio, Nasal es algo más liviano y puede compilar hasta 50-70 kb si deshabilita ciertas extensiones.

Además, hay otros intérpretes de secuencias de comandos disponibles que están diseñados específicamente para ser utilizados en plataformas integradas.

+0

Para un procesador como este, ejecutar un motor de scripting sería una sobrecarga masiva. Es mucho mejor escribir algunas rutinas de cadenas eficientes en C o C++. –

+0

realmente se reduce a lo que necesita hacerse, hay muchos otros objetivos incrustados como por ejemplo enrutadores que tampoco proporcionan mucha más potencia que un 8051, pero todavía usan motores de scripting, es decir, para proporcionar un Interfaz de usuario flexible y utilizable en el navegador – none

+0

@none - ¡Soy ella, por cierto! :-) – CodeConfused

0

Existen varios compiladores comerciales disponibles. El número 1 en la industria es de Keil Software.

+0

También he usado Keil antes. En mi humilde opinión, su IDE es la mejor opción para el desarrollo 8051 C. - Pero mis escaneos del sitio web me llevan a concluir que * no * ofrecen compiladores de C++ para los 8051. ¿Me estoy perdiendo de algo? – Nate

+2

Acabo de hablar con uno de sus desarrolladores, y tienes razón. Solo es C Entonces, mi respuesta realmente no cumple con los requisitos del OP. ; – NotMe

4

Los sistemas IAR tienen un 8051 compiler que puede compilar C++ de forma nativa (sin traducción a C), y la depuración a nivel de fuente tampoco debería ser un problema.

+0

Aquí hay un enlace para el compilador C/C++ 8051 de IAR: http://iar.com/website1/1.0.1.0/244/1/ – Nate

+0

Gracias, publicar actualizado. Yo era demasiado flojo para desenterrar el enlace. – JesperE

0

Puede intentar convertir el código C++ en código C y luego compilarlo con su compilador C existente.

Debería poder crear un Makefile que llame al compilador de C++ y luego ejecute el compilador de C luego.

No es la solución más elegante, pero en realidad es bastante inusual utilizar C++ en dispositivos pequeños como la exención de responsabilidad 8051.

: En realidad no he probado esto así que buena suerte! Si fuera yo, me quedaría con C y escribiría algunas funciones robustas de manejo de cadenas.

0

Otros han mencionado que existen compiladores de C++ para el 8051. Supongo que su principal problema con estos va a ser el costo. Muchas compañías le permitirán escribir el ensamblaje de forma gratuita, pero se le cobrará por el compilador C o C++. Probablemente estamos hablando de unos cientos de dólares aquí.

Mi pregunta principal es ¿qué es lo que está 'desordenado' en su código? ¿Qué características estás tratando de usar en C++ que se está volviendo desordenado en C? Algunas de las características en C++ no se traducen bien a un entorno incrustado mínimo (secuencias, constructores, destructores, etc.). C puede hacer muchas de las funciones de tipo orientadas a objetos con structs. Deben evitarse otras funciones (cualquier cosa con gestión de memoria dinámica).

Haré un esfuerzo para que funcione en C antes de potencialmente gastar mucho dinero y obtener un código que es grande, lento y difícil de manejar.

+0

Estoy empezando a pensar que tienes razón, Stephen. :( Simplemente no hay nada disponible. – CodeConfused

1

IAR parece ofrecer a C/C++ compiler for 8051'sa C/C++ compiler for 8051's. - Pero en total revelación, solo he usado los compiladores de Keil C para el desarrollo de 8051.

En cuanto a sus preocupaciones cabecera en archivos: Los archivos de cabecera se distribuyen a menudo ya sea por el proveedor IDE o el fabricante del hardware y, a menudo proporcionan una representación simbólica de las asignaciones de registro. Puede requerirse una cantidad modesta de masaje para incorporar un archivo de encabezado basado en C en un proyecto de C++. - Si está a punto de cambiar IDE/compiladores, a menudo puede esperar algún masaje de su código fuente para adaptarse al nuevo compilador. (Leer: el acceso al código C desde una base de código C++ a menudo hace que me detenga durante un día para hacerlo bien).

0

Parece que desea un compilador C++ para poder usar std::string. std::string requiere un montón. No tendrá un montón utilizable con solo 128x8 bits de RAM interna, especialmente no para los objetos std::string. Considere que si lee una cadena de 80 caracteres de un puerto serie, eso consume más del 60% de su RAM disponible. ¿También vas a usar RAM externa? ¿Cuánto cuesta?

¿Su firmware realmente necesita para manejar el procesamiento de cadenas en tiempo de ejecución? Por ejemplo, ¿envía/recibe comandos como cadenas a través de un puerto en serie o alguna otra interfaz? De ser así, debe aislar el manejo de cadenas del resto de su código tanto como sea posible, y usar tokens (tipos enumerados o # constantes integrales definidas) en otro lugar. De lo contrario, tendrá muchos menos problemas para adaptar su lógica a la memoria limitada de su procesador mediante el uso de tokens en lugar de cadenas.

Además, si necesita realizar un análisis sintáctico de cadenas, es mejor que escriba una máquina de estado que procese los caracteres de uno en uno, para que no tenga que ocuparse de cadenas completas. Nuevamente, 128 bytes no es mucho espacio para el procesamiento de cadenas.

+1

Solo una aclaración. Como saben, std :: string es solo un typedef para basic_string, con char y un asignador. En lugar de ese asignador masivo, se puede implementar un asignador personalizado , donde no se usa la memoria Heap. –

+0

@Johann Gerell: sospecho que escribir un asignador STL personalizado que gestione cadenas almacenadas en ROM sería significativamente más difícil (si es posible) que reescribir el procesamiento de cadenas en C. Tenga en cuenta que El sistema de destino de OP tiene solo 128 bytes de RAM y 4 KB de flash, lo que significa que las tablas de búsqueda deben almacenarse en flash. – bk1e

0

por qué no utilizar una biblioteca de cadenas C? Me gusta bstrlib o similar? C++ simplemente no es lo que necesita para este microcontrolador.

0

sí, puede grabar la memoria del microcontrolador 8051 con un programa C++ y también hay varios compiladores libres que se pueden utilizar para crear archivos hexadecimales y luego enviar los archivos al microcontrolador. Puede encontrar información sobre el proceso de programación del microcontrolador en un comprehensive article with tutorials, compilers, simulators, etc

Cuestiones relacionadas