Soy estudiante de Ingeniería en Electrónica y Comunicaciones, antes de llegar a la universidad me ha interesado la programación y las aplicaciones informáticas. Me había centrado en diseñar aplicaciones de Windows y aprender sus técnicas, pero ahora siento que esto es inútil en mi campo... ¡No tengo que aprender todo sobre informática y desarrollo de software! (¿Tengo razón en esto?)
Sé VB .Net, C# y C++. Tengo mucho tiempo en mis vacaciones, así que quiero profundizar programáticamente en el "campo de la electrónica". Entonces, ¿qué recomendaría aprender o en qué concentrarse?
Quiero esos lenguajes usados en la programación de Microcontroladores y otros circuitos integrados. ¿Es suficiente C++ o debería dominar C también? Dime tus pensamientos por favor.
Sí, es casi seguro que es un buen paso para aprender a usar C lo mejor posible (C++ le dará un punto de partida útil, aunque como notas pendientes , todavía habrá mucho que aprender, especialmente las diferencias entre la codificación para pequeños sistemas integrados en comparación con escribir para algo como Windows) dada su ubicuidad.
La mayoría de los microcontroladores por debajo de cierto tamaño (p. ej., PIC, AVR, MSP430, etc.) utilizan C (o ensamblador), ya que hay muchas versiones de alta calidad (gratuitas y económicas; p. ej., muchos compiladores comerciales se basan en el compilador GCC gratuito) compiladores C disponibles .
Obtiene otros lenguajes como el excelente JAL para PIC (autor original Wouter Van Ooijen que es miembro aquí), PICBASIC, variantes de Ada, pero debido a su popularidad y la cantidad de compiladores disponibles, diría que C es el lenguaje de elección para la mayoría. Si bien esto ciertamente no significa que sea el mejor lenguaje, usar el lenguaje más popular tiene ventajas obvias (documentación, soporte, portabilidad, colaboración, etc.)
Para los micros de 32 bits más complejos y más grandes, como muchas variantes de ARM, también hay C++ y otros compiladores disponibles.
Saltaría directamente y tomaría algunas placas de desarrollo y obtendría la codificación. Puede elegir un micro de gama baja de 8 bits como el PIC16F (muchos kits de inicio en Microchip Direct)
Un micro de gama media de 16 bits como el PIC24, y también un C/C++/Linux integrado ARM de algún tipo: el STM32F4 ARM Cortex M4 Discovery es una placa de desarrollo muy económica que podría valer la pena adquirir.
En el lado de la lógica programable y el lenguaje de descripción de hardware (HDL, los dos grandes son Verilog y VHDL), también puede valer la pena hacerse con una placa de desarrollo FPGA o CPLD de Diglent o similar.
Si no quiere esperar por una placa de desarrollo, puede descargar MPLAB o MPLABX y usar el excelente simulador para probar el desarrollo de PIC. Lo mismo ocurre con otras herramientas, por ejemplo, puede descargar Xilinx ISE Webpack de forma gratuita y probar HDL y diseño de lógica programable.
Aprenda C y obtenga una placa de desarrollo de microcontrolador barata, como un MSP430 o ARM Cortex, y al menos escriba y cargue algunos programas C.
Tengo un título en ciencias de la computación y experiencia en desarrollo de software, principalmente programación en C++ para juegos y ahora juegos y aplicaciones de iOS, pero mi último trabajo fue un concierto de EE semiprofesional que comenzó con un montón de programación de firmware para un sistema ARM Cortex M3. , y luego terminé conmigo aprendiendo cómo hacer un diseño de circuito básico y un diseño de tablero y diseñando un par de tableros simples. Así que básicamente tuve que enfrentar el problema de usar el mejor lenguaje de programación para crear un puente entre el diseño de hardware y software como alguien responsable de ambos extremos.
C es absolutamente el lenguaje que necesitas saber. Es fácil para las personas que programan en C++ y en realidad nunca tienen que restringirse al conjunto de funciones de C decir "es lo mismo", pero no lo es. Especialmente por la forma en que C++ ha evolucionado y reunido funciones, y la forma en que los programadores de C++ convencionales usan esas funciones, es realmente muy diferente trabajar en una aplicación C razonablemente grande en lugar de una aplicación C++. Su SDK de firmware será un montón de bibliotecas C, cualquier otra cosa que quepa en una MCU será una biblioteca C, cualquier sistema operativo que tenga sentido en una MCU se escribirá en C, etc., etc.
Dicho esto, dado que muchas de las cadenas de herramientas de MCU terminan usando GCC como su compilador, es casi seguro que tendrá un compilador de C++ disponible si está usando una familia de MCU decente. Pero debe tener mucho cuidado con las funciones que usa, especialmente las cosas de la biblioteca estándar, ya que es muy fácil terminar con un binario que es demasiado grande para caber en su dispositivo. Creo que hay un buen caso para usar C ++ en dispositivos integrados, C ++ tiene bastantes características agradables que tienen basura o no penalizan el tamaño o la velocidad, solo tiene que saber lo que está haciendo y escribir código de esa manera más en el extremo del espectro de estilo C que en el extremo STL del espectro en términos de uso inteligente de funciones.
No preste demasiada atención a las personas que dicen que puede usar Lua o Python en una MCU con el intérprete integrado correcto, bla, bla. Eso es cierto, lo he hecho y es divertido, pero por el momento es más para proyectos de juguetes y cosas que aparecen en Hack a Day. Creo que veremos más de ese tipo de cosas ya que la Ley de Moore se aplica implacablemente incluso a los procesadores más pequeños, esto es algo que sucedió con los juegos en los que solía haber mucho ensamblaje, luego aguantaron con C y C++ por más tiempo. que todos los demás, y ahora todo es tan rápido, y la productividad del desarrollador es tan importante que gran parte del desarrollo se realiza con lenguajes integrados de alto nivel o directamente en un lenguaje de alto nivel. Aun así, pasarán algunos años antes de que vea empresas contratando programadores de firmware con experiencia en Python y Lua.
Tampoco pierda demasiado tiempo en el montaje. No está mal estar familiarizado con los conceptos, pero es poco probable que te encuentres haciendo mucho, si es que lo haces, programando en ensamblador. Hay como esta sabiduría convencional con juegos e incrustados de que es "bueno saber" el ensamblaje, a menudo repetido por personas que en realidad no trabajan en esos campos. Pero, en realidad, es muy poco probable que escriba un ensamblado alguna vez, y si lo hace, probablemente serán solo unas pocas líneas para optimización o algo con el hardware para el que simplemente no tiene una API (pero lo hará). después de escribir uno que envuelve unas pocas líneas de ensamblaje). He trabajado en varios juegos y ese proyecto de diseño de placa/firmware y el número total de líneas de ensamblaje que he escrito para proyectos comerciales es probablemente de unos pocos. Eso'
asm()
), muy bien integradas en su código C. Esta es una combinación ganadora en todos los sentidos. Alto nivel pero compacto con caídas ocasionales en el montaje cuando, por ejemplo, el momento debe ser el correcto. La avr-gcc
cadena de herramientas ya hace esto mucho con las macros de C, por lo que nunca se da cuenta.Estoy de acuerdo con todos los demás en que debes ser muy competente en C.
También recomendaría aprender al menos un lenguaje ensamblador. Hacer esto te hará un mejor programador de C. Necesita saber lo que sucede debajo del capó, y esto es mucho más cierto en el mundo integrado que en el mundo de la PC.
Comprender el ensamblador que genera su C le permitirá escribir un C más óptimo en términos de velocidad y compacidad. Código más rápido significa:
Un código más compacto significa que puede usar una MCU más económica con menos memoria. O tener espacio para más características.
El otro idioma que podría considerar aprender es Verilog . Este es un lenguaje de descripción de hardware, y realmente es bastante diferente a C, no solo en la forma en que se ve, sino también en su funcionalidad. Verilog abrirá el camino para aprovechar chips muy potentes como Cypress PSoC3 y 5 . Es un microcontrolador con hardware reprogramable analógico y digital, que te permite hacer cosas asombrosas que son muy difíciles de hacer con cualquier otra MCU. También podrá hacer diseño de FPGA .
Como un MSEE que ha estado trabajando en la industria de la defensa durante 8 años, puedo decirle que comprender cómo programar bien en LabVIEW (un lenguaje gráfico de flujo de datos estrictamente tipificado) significa que nunca le faltará trabajo.
LabVIEW comenzó como un lenguaje de programación para ingenieros de hardware, puede ver esto en el hecho de que el código se parece mucho a un diagrama de circuito. Sin embargo, durante los últimos 25 años, LabVIEW se ha convertido en un lenguaje completo y rico en características con soporte para Orientación a Objetos y subprocesos múltiples. De hecho, diría que no hay otro lenguaje de programación, basado en texto o de otro tipo, en el que sea más fácil programar una aplicación de subprocesos múltiples que LabVIEW; esto se debe en gran parte a su paradigma de flujo de datos. A medida que la cantidad de núcleos de CPU continúa aumentando, LabVIEW se volverá cada vez más relevante como lenguaje de propósito general.
Otro beneficio de conocer LabVIEW es que está a un tiro de piedra de programar FPGA utilizando el módulo LabVIEW FPGA que toma su código de LabVIEW y lo convierte a VHDL entre bastidores antes de pasarlo al compilador Xilinx. También puede usar sus habilidades de LabVIEW para pasar a la programación de código en tiempo real a través del módulo LabVIEW Real-Time que usa VxWorks o Phar Lap.
Nota: Soy un desarrollador certificado de LabVIEW.
Si desea realizar una programación de microcontroladores de bajo nivel, debe sentirse cómodo con la programación en lenguaje ensamblador (cuantas más arquitecturas diferentes, mejor), y sí, utilizará C mucho más que C++.
Para el trabajo de ingeniería general, los lenguajes orientados a las matemáticas como Matlab (también Scilab y GNU Octave) se usarán comúnmente para modelar y crear prototipos.
Además, muchos IDE para software y hardware admiten secuencias de comandos, normalmente utilizando TCL o LUA, por lo que sería útil cierta familiaridad con los lenguajes de secuencias de comandos en general (también Perl, Python, PHP, Javascript, etc.).
Para el diseño de hardware, necesitará conocimientos de Verilog y/o VHDL.
¿Es C++ suficiente? Quizás.
Recuerde que C se usa en aproximadamente el 90-99% de todos los mcu: s que existen, por lo que C es imprescindible en su currículum.
Pero dado que eres un tipo de alto nivel, podrías comenzar a jugar con Arduino: s, ya que están programados con un C ++ reducido, y eso daría una idea aproximada de lo que C ++ puede hacer en el mundo mcu en este momento.
Para los microcontroladores (y solo me referiré a los microcontroladores), creo que C es un lenguaje de entrada mucho mejor que C++. El ensamblaje sería el siguiente paso, fantástico para ayudarlo a comprender cómo su compilador C lo está arruinando, creando errores, robando tics de reloj, etc., y exprimiendo el máximo rendimiento de su plataforma. Todo esto suponiendo que esté hablando de un microcontrolador, no de un arduino, BASIC Stamp o cualquier otra plataforma que involucre un microcontrolador envuelto.
¡Es difícil decir qué es útil para "su campo" y sugerir que, como estudiante, es posible que todavía no sepa cuál es su campo! -- pero creo que su conjunto de idiomas parece bastante razonable y se encontrará usándolo una y otra vez. Por lo menos, tener un buen dominio de un lenguaje estructurado hace que el siguiente sea mucho más fácil, pero creo que siempre encontrará agradable tener sus habilidades de programación de Windows en su bolsillo.
Podría aprender C y el tipo de código ensamblador que generan las sentencias C si trabaja con procesadores, pero también debería aprender a usar un shell de línea de comandos de Unix como bash y las herramientas que lo acompañan, como sed, ed, awk, vim/vi, find, tar, gzip, ... así como Python, que puede usar en muchas plataformas y es una buena manera de "hacer las cosas".
Debes aprender C si quieres ser un desarrollador integrado serio. También debe saber ensamblador, aunque probablemente lo use muy raramente.
Primero definiré ingeniero electrónico como alguien involucrado en el diseño de hardware desde el firmware hasta el diseño de la placa y el diseño del chip. En algunos casos, estará haciendo firmware, como se indicó anteriormente, necesitará "C". Más profundamente, el software se convierte simplemente en una herramienta, comprender algunos conceptos de ciencia informática en lenguajes complementarios, desde C/C++ hasta lenguajes similares a Lisp, será más importante que los detalles. Necesitará software para respaldar sus esfuerzos de diseño, pero eso no tiene prioridad para comprender los límites fundamentales de lo que se puede hacer en una implementación física. El diseño digital NO es Verilog/VHDL incluso si el diseño se expresa en esos idiomas. En un diseño completamente personalizado e in-silico, verá lenguajes similares a Lisp y lenguajes funcionales C.
chris stratton