Lenguajes de programación para ingenieros electrónicos.

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.

"Soldar" O, más en serio, C simple es bastante tradicional para las herramientas de soporte, aunque Python está un poco de moda en la actualidad.

Respuestas (10)

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.

Los PIC pueden ser baratos, pero a riesgo de iniciar una guerra de llamas, diría que usar un PIC como herramienta de aprendizaje le enseña a programar PIC en lugar de enseñarle a programar un microcontrolador de propósito general. Para esto, el MSP, AVR (Arduino), ARM Cortex de gama baja o incluso los venerables procesadores 8051 proporcionarían habilidades más fácilmente transferibles.
Muchas gracias... esto fue muy útil. Pero para resumir su respuesta: lo que necesito en este momento es seguir trabajando en C ++ y dominar C, aprender Verilog o VHDL o ambos, y tomar algunas placas de desarrollo para practicar o simplemente usar esos simuladores como un comienzo.
@SirajMuhammad: sí, eso es todo, además de aprender Verilog y VHDL probablemente no sea necesario, ya que generalmente se pueden usar juntos en un diseño (por ejemplo, puede usar un procesador de núcleo suave diseñado por otra persona en VHDL, en su diseño de Verilog, y funcionará bien), así que solo elija uno.
@Ian: no estoy sugiriendo que tenga que ser un PIC, eso es solo un ejemplo (de ahí el "como un PIC") En cualquier caso, si está programando en C, no creo que haya mucho general diferencia entre cualquiera de los pequeños micros que hay. Por supuesto, es útil conocer realmente un micro de adentro hacia afuera (ensamblaje y todo), pero para comenzar en un nivel superior, las cosas deberían verse muy parecidas, solo que las herramientas son diferentes. Creo que vale la pena probar algunos antes de comprometerse con nada.
Un Cortex M3 o M4 es un gran comienzo. Hay placas baratas, TI acaba de lanzar una placa Launchpad M4 de $4.99, STMicro tiene una placa Discovery de $15. Tienen una gran variedad de periféricos, una interfaz USB para conectarse directamente a una máquina host para programar y depurar, y mucha CPU (en términos relativos, por supuesto). Y si termina con una idea de proyecto loca, hay bibliotecas de controladores para controladores LED PWM, pantallas LCD, pantallas táctiles, etc. También tienen IDE incluidos para que pueda comenzar rápidamente si quiere seguir esa ruta, y hay arm-eabi-gcc si te gusta ir por la ruta de Unix.
"no debería ser demasiado difícil si ya sabes C++"? No estaría de acuerdo con eso, alguien que conozca "VB .Net, C♯ y C++" probablemente use este último en un estilo RAII orientado a objetos de alto nivel y podría necesitar algo de tiempo para comprender correctamente el manual. gestión de la memoria.
@leftaroundabout: punto justo, tal vez lo dije demasiado brevemente: solo quise decir que le dará al OP un buen punto de partida con estructura, sintaxis y una sensación familiar, en lugar de comenzar "desde cero". Estoy de acuerdo en que todavía habrá mucho que aprender, especialmente con respecto al uso real en sistemas integrados con memoria limitada.
@leftaroundabout No hay nada de malo en escribir programas orientados a objetos, y RAII (cuando se usa correctamente) tiene un costo cero y ayuda a evitar muchos errores tontos (que son inevitables durante el aprendizaje).
@Alice exactamente mi punto. El hecho de que alguien pueda escribir bien en C ++, usando RAII y todo, no significa que también pueda programar en C.

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'

Vale la pena decir que sus pocas líneas de ensamblaje probablemente estarán en instrucciones de ensamblaje en línea ( 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-gcccadena de herramientas ya hace esto mucho con las macros de C, por lo que nunca se da cuenta.
Probablemente sea más importante poder LEER el ensamblaje en lugar de tener que escribirlo. Esto le permite comprender lo que el compilador le dice al micro que haga y, en casos muy raros, puede detectar cuándo el compilador se equivoca. También debe tener cierta comprensión del ensamblaje para aprovechar al máximo sus herramientas de depuración y usar la funcionalidad de un solo paso que brindan.
Definitivamente de acuerdo con eso. Creo que uno de los mejores ejercicios para un aspirante a programador es escribir un compilador de lenguaje de juguete y un generador de código que al menos maneje funciones, matrices y estructuras para aprender cómo se ve un marco de pila y cómo se ven los elementos básicos de un lenguaje de programación en ensamblador. .
@Ian: ser capaz de leer el ensamblador es inútil si no sabes cómo escribirlo. Tienes que leerlo y compararlo con lo que habrías hecho si lo hubieras escrito.
@Rocketmagnet: no debe verificar que el compilador haya generado la implementación de ensamblaje más eficiente. El requisito es que tenga la capacidad de leer el ensamblador generado y verificar que la lógica del código implementado coincida con su intención. Esto es lo mismo que usar otros lenguajes humanos. Puedo leer y entender mucho más francés, alemán y latín de lo que puedo hablar o escribir.
@Ian - Sí, lo soy. La verificación de la corrección y la optimización son importantes, como expliqué en mi publicación. Si su compilador de C está generando un código subóptimo, simplemente no lo sabrá y comprará una MCU más cara de lo que necesita. Lo he visto varias veces antes. Incluso los codificadores de C y C++ muy hábiles, que no tienen experiencia integrada, pueden escribir un código terriblemente derrochador porque no tienen idea de cómo examinarlo. Esto ha causado, por ejemplo, problemas con los bucles de control en tiempo real en los robots que han tenido que esperar años para que los datos regresen de las MCU mal codificadas.

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:

  • puede usar una MCU más lenta y económica y socavar a un competidor.
  • puede bajar la velocidad del reloj para mejorar el cumplimiento de EMC.
  • en una aplicación de baja potencia, la MCU puede pasar más tiempo en reposo, lo que conduce directamente a una mayor duración de la batería.

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 .

¿Qué quiere decir con "un lenguaje ensamblador"? Yo se que hay un lenguaje que se llama ensamblador, tiene ramas o algo asi? ¿Puedes nombrar algunos por favor? Y muchas gracias por tu respuesta.
Cada tipo de CPU o MCU tiene su propio lenguaje ensamblador con diferentes instrucciones. Todos son bastante similares, pero con diferencias importantes. Aprenda el lenguaje ensamblador para cualquier MCU que esté usando.
Iba a decir exactamente esto. C y Ensamblaje son los más utilizados en Ingeniería Electrónica, porque normalmente se trata de cosas de bajo nivel. Orientado a objetos no es realmente tan bien utilizado, el tipo de pensamiento de bajo nivel que proviene de C/Assembly también se aplicará a cualquier otra cosa con la que trabaje.

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.

ingrese la descripción de la imagen aquí

Toda la producción de LabVIEW que he visto se parece más a esto: thedailywtf.com/Articles/Labview-Spaghetti.aspx No dudo que haya un fuerte mercado laboral para aquellos dispuestos a mantener dicho código.
@markrages Me han pedido que mantenga y/o amplíe el código que era casi tan malo, tal vez peor, ya que también había llamadas VI dinámicas y globales. Este problema es el arma de doble filo que es LabVIEW. Por un lado, lo comercializan como un lenguaje en el que cualquier ingeniero puede programar, sin embargo, sin una base sólida en la arquitectura de software, terminas obteniendo un código como este. Afortunadamente, NI ha abordado suficientemente este problema con LabVIEW 2012 al proporcionar plantillas bien escritas y comentadas para arquitecturas que comienzan con la máquina de estado simple hasta el marco de actor complejo basado en programación orientada a objetos.
@markrages El problema es doble. Uno, la gerencia brinda a los ingenieros la capacitación suficiente para que sean peligrosos. Diría que 9/10 programadores de LabVIEW que conocí en mi empresa que han recibido capacitación solo tomaron los primeros dos cursos básicos que esencialmente le enseñan solo la sintaxis. En segundo lugar, LabVIEW se ha convertido en un lenguaje rico en funciones que rivaliza con cualquier lenguaje moderno hoy en día porque su administración gráfica cree que debe ser fácil. La administración nunca le pediría a un ingeniero de software que diseñe un circuito medio a complejo, pero no tienen problemas para lanzar un EE en un problema de software complejo si "conocen LabVIEW"
@markrages: Justo cuando recordé por qué me gustaba LabVIEW, vi su comentario y recordé por qué lo odiaba. Oh, las horas de frustración regresaron todas a la vez.

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.