Lenguajes de programación para ingenieros electrónicos.

22

Soy estudiante de Ingeniería Electrónica y de Comunicaciones, antes de llegar a la universidad, me interesaba 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 sobre 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, ¿en qué recomendarías aprender o concentrarte?

Quiero esos lenguajes utilizados en la programación de microcontroladores y otros circuitos integrados. ¿C ++ es suficiente o debería dominar C también? Dime tus pensamientos por favor.

Siraj Muhammad
fuente
3
"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.
Chris Stratton

Respuestas:

29

Sí, es casi seguro que es un buen movimiento aprender a usar C lo mejor posible (C ++ le dará un punto de partida útil, aunque como notas restantes , 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 un cierto tamaño (por ejemplo, PIC, AVR, MSP430, etc.) usan C (o ensamblador) ya que hay muchas versiones de alta calidad (gratuitas y $$ - por ejemplo, muchos compiladores comerciales se basan en el compilador GCC gratuito). .
Obtendrá otros idiomas 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 número de compiladores disponibles, diría que C es el idioma de elección para la mayoría. Si bien esto no significa que sea el mejor idioma, usar el idioma más popular tiene ventajas obvias (documentación, soporte, portabilidad, colaboración, etc.)
Para los micros más complejos y más grandes de 32 bits, como muchas variantes ARM, también hay C ++ y otros compiladores disponibles.

Me gustaría saltar y tomar algunas placas de desarrollo y obtener codificación. Puede elegir un micro de 8 bits de gama baja como el PIC16F (muchos kits de inicio en Microchip Direct)
Un micro de 16 bits en el medio del rango como el PIC24, y también un ARM C / C ++ / Linux integrado de algún tipo: el STM32F4 ARM Cortex M4 Discovery es una placa de desarrollo muy barata que podría valer la pena.
En el lado del lenguaje de descripción de hardware y lógica programable (HDL - los dos grandes son Verilog y VHDL), también puede valer la pena obtener una placa de desarrollo FPGA o CPLD de Diglent o similar.

Si no desea esperar un tablero de desarrollo, puede descargar MPLAB o MPLABX y usar el excelente simulador para probar el desarrollo de PIC. Lo mismo ocurre con otras herramientas también, por ejemplo, puede descargar Xilinx ISE Webpack de forma gratuita y probar HDL y diseño lógico programable.

Oli Glaser
fuente
99
Los PIC pueden ser baratos, pero a riesgo de comenzar una guerra de llamas, afirmarí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 uso 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.
uɐɪ
Muchas gracias ... esto fue de gran utilidad. 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 algunos paneles de desarrollo para practicar o simplemente usar esos simuladores como principio.
Siraj Muhammad
1
@SirajMuhammad: Sí, eso es todo, aparte de aprender tanto Verilog como 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 blando diseñado por otra persona en VHDL, en su diseño Verilog, y funcionará bien) así que solo elija uno.
Oli Glaser
44
@Ian - No estoy sugiriendo que tiene que ser un PIC, que es sólo un ejemplo (de ahí el "como un PIC") En cualquier caso, si se está programando en C, no creo que hay mucho de un general diferencia entre cualquiera de los pequeños micros por ahí. Por supuesto, conocer realmente un micro de adentro hacia afuera (ensamblaje y todo) es útil, pero para comenzar en un nivel superior, las cosas deberían ser muy parecidas, solo que las herramientas son diferentes. Creo que vale la pena probar algunos antes de comprometerse con algo.
Oli Glaser
2
"no debería ser demasiado difícil si ya conoces C ++"? No estaría de acuerdo con eso, alguien que conozca "VB .Net, C♯ y C ++" probablemente usa este último en un estilo RAII orientado a objetos de alto nivel y bien podría necesitar algo de tiempo para entender el manual gestión de la memoria.
Leftaroundabout
23

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 en 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 para iOS, pero mi último trabajo fue un concierto de EE semi-profesional 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 básico de circuito y diseño de placa y diseñando un par de placas simples. Así que básicamente tuve que enfrentar el problema de usar el mejor lenguaje de programación para unir el diseño de hardware / 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 nunca tienen que limitarse al conjunto de funciones de C para decir "es lo mismo", pero no lo es. Especialmente la forma en que C ++ ha evolucionado y reunido características, y la forma en que los programadores principales de C ++ usan esas características, 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 se ajuste a 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 MCU terminan usando GCC como su compilador, seguramente tendrá un compilador C ++ disponible si está utilizando una familia MCU decente. Pero debe tener mucho cuidado con las funciones que utiliza, especialmente las 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 embebidos, C ++ tiene bastantes características agradables que tienen desperdicio o no hay penalización de tamaño o velocidad, solo tiene que saber lo que está haciendo y escribir código de esa manera más adelante en el extremo de estilo C del espectro 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 adecuado, bla, bla. 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 donde solía haber mucho ensamblaje, luego aguantaron con C y C ++ 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 en un lenguaje de alto nivel directamente. Aun así, pasarán algunos años antes de que veas empresas contratando programadores de firmware con fondos de Python y Lua.

Tampoco pases demasiado tiempo en el montaje. No es malo estar familiarizado con los conceptos, pero es poco probable que te encuentres haciendo mucho, si es que hay alguna programación de ensamblaje. Es como esta sabiduría convencional con juegos e incrustados que es un ensamblaje "bueno saber", a menudo repetido por personas que realmente no trabajan en esos campos. Pero, en realidad, es muy poco probable que escriba algún ensamblaje, y si lo hace, probablemente solo habrá algunas líneas para la optimización o algo con el hardware para el que simplemente no tiene una API (pero lo hará después de escribir uno que envuelva algunas líneas de ensamblaje). He trabajado en varios juegos y en ese proyecto de diseño de placa / firmware y el número total de líneas de ensamblaje que he escrito para proyectos comerciales probablemente sea en la adolescencia. Eso'

Subóptimo
fuente
1
Vale la pena decir que sus pocas líneas de ensamblaje probablemente estarán en declaraciones de ensamblaje en línea ( asm()), bien incrustadas en su código C. Esta es una combinación ganadora en todos los sentidos. Alto nivel pero compacto con ocasionales inmersiones en el ensamblaje cuando, por ejemplo, el momento debe ser el correcto. La avr-gcccadena de herramientas ya hace esto mucho con las macros C, por lo que nunca se da cuenta.
Alexios
99
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, 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 utilizar la funcionalidad de un solo paso que proporcionan.
uɐɪ
1
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 .
Suboptimus
3
@ Ian - Ser capaz de leer ensamblador es inútil si no sabes cómo escribirlo. Debe leerlo y compararlo con lo que hubiera hecho si lo hubiera escrito.
Rocketmagnet
2
@Rocketmagnet: no está dispuesto a 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.
uɐɪ
10

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 también. Hacer esto te hará un mejor programador en C. Necesita saber qué sucede debajo del capó, y esto es mucho más cierto en el mundo integrado que en el mundo de las 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 un MCU más lento y barato 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 barata con menos memoria. O tener espacio para más funciones.


El otro idioma que podría considerar aprender es Verilog . Este es un lenguaje de descripción de hardware, y realmente es muy diferente a C, no solo en su aspecto, 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 le permite hacer cosas increíbles que son muy difíciles de hacer con cualquier otra MCU. También podrás hacer diseño FPGA .

Rocketmagnet
fuente
¿Qué quieres decir con "un lenguaje ensamblador"? Sé que hay un lenguaje llamado Asamblea, ¿tiene ramas o algo así? ¿Puedes nombrar algunos por favor? Y muchas gracias por tu respuesta.
Siraj Muhammad
44
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é utilizando.
Rocketmagnet
1
Iba a decir exactamente esto. C y ensamblaje son los más utilizados en ingeniería electrónica, porque generalmente 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.
Muz
9

Como MSEE que ha estado trabajando en la industria de Defensa durante 8 años, puedo decirle que comprender cómo programar bien en LabVIEW (un lenguaje de flujo de datos gráfico y estrictamente tipado) 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, en los últimos 25 años, LabVIEW se ha convertido en un lenguaje completo y rico en funciones con soporte para Orientación a Objetos y subprocesamiento múltiple. De hecho, diría que no hay otro lenguaje de programación, basado en texto o de otro tipo, que sea más fácil de programar en una aplicación multiproceso que LabVIEW; Esto se debe en gran parte a su paradigma de flujo de datos. A medida que el número de núcleos de CPU continúe aumentando, LabVIEW se volverá cada vez más relevante como lenguaje de propósito general.

Otro beneficio de conocer LabVIEW es que usted está muy cerca de programar FPGA utilizando el módulo LabVIEW FPGA que toma su código de LabVIEW y lo convierte a VHDL detrás de escena antes de pasarlo al compilador Xilinx. También puede usar sus habilidades de LabVIEW para realizar la transición a la programación del 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í

SiegeX
fuente
55
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 mercado de trabajo sólido para quienes estén dispuestos a mantener dicho código.
markrages
@markrages Me pidieron que mantuviera y / o ampliara el código que era casi tan malo, tal vez peor que también hubo llamadas dinámicas de VI y globales. Este problema es la espada 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 para el complejo marco de actores basado en OOP.
SiegeX
@markrages El problema es doble. Una, la gerencia brinda a los ingenieros suficiente capacitación para ser peligrosos. Yo diría que los programadores de LabVIEW del 9/10 que he conocido en mi empresa que han recibido capacitación solo tomaron los primeros dos cursos básicos que esencialmente le enseñan la sintaxis. En segundo lugar, LabVIEW se ha convertido en un lenguaje rico en características que rivaliza con cualquier lenguaje moderno hoy en día porque su gestión gráfica cree que debe ser fácil. Managemnt nunca le encargaría a un ingeniero de software diseñar un circuito medio a complejo, sin embargo, no tienen problemas para lanzar un EE a un problema de software complejo si "conocen LabVIEW"
SiegeX
@markrages: Justo cuando recordé por qué me gustaba LabVIEW, vi tu comentario y recordé por qué lo odiaba. Oh, las horas de frustración volvieron todas a la vez.
Jonny B Bueno
6

Si desea hacer una programación de bajo nivel de microcontroladores, entonces debe sentirse cómodo con la programación de lenguaje de ensamblaje (cuantas más arquitecturas diferentes, mejor), y sí, usará C mucho más de lo que usa C ++.

Para el trabajo de ingeniería general, los lenguajes orientados a las matemáticas como Matlab (también Scilab y GNU Octave) se utilizarán comúnmente para modelar y crear prototipos.

Además, muchos IDE para software y hardware son programables, por lo general usan TCL o LUA, por lo que sería útil familiarizarse con los lenguajes de secuencias de comandos en general (también Perl, Python, PHP, Javascript, etc.).

Para el diseño de hardware, necesitará habilidades de Verilog y / o VHDL.

Dave Tweed
fuente
6

¿Es suficiente C ++? Tal vez.

Recuerde que C se usa en algo como 90-99% de todos los mcu: s, por lo que C es imprescindible en su currículum.

Pero dado que eres un tipo de alto nivel, puedes comenzar a jugar con los 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.

Johan
fuente
3

Para los microcontroladores (y solo abordaré 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 de C lo está arruinando, creando errores, robando tictac de reloj, etc., y exprimiendo al máximo el rendimiento de su plataforma. Todo esto supone 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 sugiera que, como estudiante, es posible que aún 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 control de un lenguaje estructurado hace que el siguiente sea mucho más fácil, pero creo que siempre encontrarás agradables tus habilidades de programación de Windows en tu bolsillo.

Scott Seidman
fuente
2

Podría aprender C y el tipo de código de ensamblador generado por las sentencias C si trabaja con procesadores, pero también debe aprender cómo utilizar 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 puedes usar en muchas plataformas y es una buena manera de "hacer las cosas".

Paddy3118
fuente
2

Debes aprender C si quieres ser un desarrollador incrustado serio. También debe conocer el ensamblador, aunque probablemente lo use muy raramente.

mjh2007
fuente
0

Primero definiré al 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". Un software más profundo se convierte simplemente en una herramienta, la comprensión de algunos conceptos de compci sci en lenguajes complementarios desde C / C ++ hasta lenguajes similares a Lisp será más importante que los específicos. 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 totalmente personalizado e in silico, verá Lisp como lenguajes y C - lenguajes funcionales.

marcador de posición
fuente