¿Cuándo puedo decir que he dominado el lenguaje C para sistemas integrados?

Supongo que está comenzando, así que mencionaré algunos problemas que requieren conceptos avanzados en C y sistemas integrados.

1. Ser capaz de usar primitivas RTOS (mutex, semáforo, hilos múltiples). Aún mejor si puedes codificar estas primitivas tú mismo.

2. Ser capaz de codificar una pila de protocolos de red bastante complicada. Esto generalmente implica tener una comprensión de las máquinas de estado, punteros, amortiguadores y resistencia.

3. Ser capaz de usar conceptos de OO en C. Los patrones de Adaptador, Estado, Observador pueden usarse en C. También el uso elegante de punteros de función muestra la comprensión del buen diseño. Las funciones de devolución de llamada en todo tipo de bibliotecas, como una biblioteca de gráficos, utilizan este enfoque.

4. Escribir un gestor de arranque e implementar la capacidad de actualización de firmware. Si ha escrito un gestor de arranque, ha entendido una parte muy importante de una computadora.

5. Poder utilizar cómodamente periféricos como DMA, Timers, I2C, SPI, ADC, DAC, Crypto hardware, etc. Aparecen todo tipo de periféricos nuevos, así que prepárese para leer el manual de referencia e implementar controladores.

6. Escribir sus propias estructuras de datos como listas, árboles, búferes circulares. Implementación de una base de datos, algoritmos de procesamiento de señales como filtros digitales, etc. Esto es algo que debe hacer solo por diversión. Usa una biblioteca cuando puedas.

7. Habilidades de depuración. Una parte del mundo real es que, en última instancia, tendrá que lidiar con errores y habrá momentos en los que un error está tan profundamente incrustado y es tan difícil de reproducir que requerirá sintetizar muchas cosas que ha aprendido para encontrar la causa raíz. .

Para mí, puedes hacer todo lo anterior y aún no ser un maestro. Por ejemplo, si usa números mágicos en todo su código, diré que se ha perdido algo fundamental. Ser un maestro se trata tanto de resolver problemas como tener la disciplina de tratar su diseño y código como un arte. Nunca deja de pensar en cómo puede mejorar el código y el diseño. Es algo de lo que puedes estar orgulloso. Es algo que otros leerían y admirarían. Desafortunadamente, el software no recibe el mismo nivel de escrutinio que una espada Samurai. La función es importante pero la forma generalmente se pierde. Es por eso que si quieres ser un maestro, debes revisar tu código, y también estudiar y aprender técnicas de otros. Un maestro puede mirar el software y señalar qué es genial y qué se puede mejorar en él. Significa desarrollar intuiciones que se vuelven automáticas después de años de agudizar sus habilidades. Y para hacer eso, uno debe resolver muchos problemas, de diferentes maneras y ser implacable.

Si insiste en este tipo de cosas, diría que ha “dominado” algo una vez que ha entregado una “obra maestra”. En los viejos tiempos, una obra maestra real era un trabajo que un aprendiz creaba con el propósito de convertirse en un “maestro” reconocido en su campo en campos que tenían gremios.

Por supuesto, los maestros nunca dejan de trabajar y aprender …

En software u otras áreas de ingeniería que tienen un fuerte enfoque económico, diría que el equivalente de una obra maestra sería la creación de un programa interesante o un conjunto de características importantes en un programa más grande como parte de un proyecto comercial, industrial, o proyecto de código abierto que diseñó y creó principalmente por su cuenta.

El trabajo en entornos puramente académicos no es suficiente para tal “dominio”.

En lo que respecta a la integración, cada dispositivo y proyecto es diferente, por lo que aprenderá cosas nuevas, o al menos nuevas API, en cada proyecto. Además, en “pequeña incrustación”, tendrá que trabajar con RTOS y entornos de CPU y RAM fuertemente restringidos, mientras que en “gran incrustación”, probablemente estará más preocupado por los problemas extremos de rendimiento.

Algunas cosas que necesitará saber para ser un desarrollador integrado sólido:

  • Cómo codificar en entornos restringidos de RAM y CPU.
  • En muchos entornos integrados más pequeños, necesitará saber cómo manejar la falta de asignación de memoria dinámica, lo que puede significar que no puede usar muchas de las funciones de biblioteca estándar de C.
  • Cómo trabajar con RTOSes: sistema operativo en tiempo real.
  • Cómo escribir código que pueda manejar restricciones de “tiempo real verdadero”.
  • Cómo evitar pérdidas de memoria, corrupción u otros problemas de memoria, y cómo probar su código para ellos.
  • Cómo depurar en el dispositivo, donde es posible que no tenga un gran conjunto de herramientas disponibles para depurar.
  • Muchas otras cosas 🙂

El desarrollo de productos integrados es más de desarrollo de productos y muy poco de C.

Durante el desarrollo del producto, se dedica mucho tiempo a comprender el producto y a elaborar un diagrama de flujo / lógica (algunas veces en papel, otras veces en su cabeza)

Escribir esta lógica / diagrama de flujo en C es fácil. Muy fácil.

Basic C no necesita más que unas pocas horas para comenzar. No se concentre en dominar. Use google cuando esté atascado.

(Mi experiencia personal: he estado trabajando en desarrollo integrado durante los últimos 35 años y usando PL / M 51 y luego C durante los últimos 30 años. No recuerdo ni siquiera las funciones de cadena de memoria, consulte book / google cada vez. Lo hace no importa o afecta mi rendimiento / velocidad / calidad de mis diseños)

Sus puntos de vista pueden variar.

Esta respuesta no es específica para el lenguaje C, pero después de haber sido un desarrollador incrustado yo mismo desde la década de 1970, utilicé casi exclusivamente C para ese trabajo, y como examinador técnico para puestos de ingeniero de firmware incorporado, estos son, en mi opinión profesional, el mínimo “debe tener habilidades “para un desarrollador integrado.

Recuerde, escribir código para sistemas embebidos requiere mucho más que simplemente dominar el lenguaje C, aunque si puede lograr todos los siguientes puntos (principalmente las cosas que están resaltadas en negrita ) que están relacionadas con la codificación usando el lenguaje C ( algunos de las viñetas se refieren a las habilidades electrónicas ya que todas estas habilidades, no solo las habilidades de codificación, son necesarias para trabajar con sistemas integrados ), entonces probablemente esté listo.

En base a mis casi 40 años de trabajo en el campo de los sistemas integrados, estos son, en mi humilde opinión, las habilidades / conocimientos mínimos “imprescindibles”:

  • Una buena comprensión de la electrónica analógica digital y de pequeña señal.
  • Capacidad para leer y comprender esquemas.
  • Posibilidad de utilizar eficazmente un medidor de voltios / ohmios y un osciloscopio.
  • Capacidad para realizar al menos la depuración / resolución de problemas electrónicos básicos.
  • Competencia en al menos un lenguaje ensamblador.
  • Competencia en el lenguaje de programación ‘C’.
  • Una buena comprensión de los componentes internos del microprocesador (principalmente los registros).
  • Una comprensión de las regiones de memoria y sus usos (montón, pila, IVT, código) cuando se usa el lenguaje C.
  • Trabajando con números hexadecimales y matemática hexadecimal.
  • Una muy buena comprensión de las matemáticas booleanas (lógica).
  • Un dominio en el uso de punteros de datos y funciones en C.
  • Un excelente conocimiento de qué son las interrupciones y cómo funcionan en código C.
  • Una comprensión de los diferentes tipos de memoria (RAM, ROM, Flash), las diferencias entre ellos y cómo se leen, escriben y acceden usando C.
  • Una comprensión de la multitarea y cómo se implementa en C (en el mundo integrado usamos el término original “multitarea”. El término “multitarea” fue un término que alguien creó más tarde para significar exactamente lo mismo. Lo que otros llaman “hilos” lo hemos llamado “tareas” desde la década de 1970).
  • Posibilidad de utilizar un depurador para realizar al menos operaciones simples, como establecer puntos de interrupción, un solo paso, examinar valores variables, examinar la memoria, examinar registros, y comprender cuándo habilitar y deshabilitar las interrupciones cuando se realiza un solo paso con un depurador ( para la respuesta a esto Quora pregunta que estamos hablando sobre el código C de depuración a nivel fuente ).
  • Capacidad para depurar código multitarea.
  • La capacidad de leer y comprender hojas de datos y producir código de controlador en C para un dispositivo determinado en función de la información contenida en su hoja de datos.
  • Comprender las ventajas y desventajas de usar un bucle de primer plano con interrupciones versus usar un núcleo multitarea y cómo implementar cualquiera de ellos (usando C).
  • Desarrollo de código C para ejecutar bajo un RTOS (Sistema operativo en tiempo real) y cómo usar semáforos, mutexes, colas, comunicaciones entre tareas.
  • Cómo desarrollar y depurar código C para periféricos como UART, convertidores A / D y D / A, temporizadores, generación PWM desde un temporizador, relojes en tiempo real, etc.
  • Cómo desarrollar y depurar el código C para las comunicaciones utilizando RS-232 (y sus variantes), SPI, I2C y puertos de datos paralelos.
  • Cómo desarrollar y depurar código con pilas, colas, listas enlazadas y otras construcciones de datos comunes.
  • Una buena comprensión de DMA (Acceso directo a memoria) y cómo implementarlo en C para sistemas que tienen capacidad DMA.

Mira, creo que el aprendizaje nunca se detiene. Sin embargo, puede considerarse bastante bueno con los sistemas integrados cuando:

1. estás tan versado con el chip con el que estás trabajando, que ni siquiera necesitas echarle un vistazo a su hoja de datos. Ya conoce la mayoría de los nombres de los registros (aunque siempre es recomendable mantener la hoja de datos cerca para evitar sorpresas desagradables),

2. se le da un proyecto de sistemas integrados y comienza a diseñarlo con precisión en su cabeza incluso antes de sentarse frente a la computadora,

3. Ha realizado tantos proyectos relacionados con sistemas embebidos que comienza a crear productos comercialmente confiables incluso cuando solo está haciendo algo en una placa de pan solo por diversión. (por ejemplo, habilita el temporizador de vigilancia y la detección de oscurecimiento en los primeros 20 minutos de programación del chip),

4. se siente cómodo con temas avanzados como RTOS (Sistema operativo en tiempo real) y múltiples procesadores,

5. finalmente y lo más importante, ha cubierto ‘The C Programming Language’ de Denise Ritchie de principio a fin.

Nota: – Lo anterior es mi opinión. Otros pueden tener una opinión diferente de un buen ingeniero de sistemas integrados, así que siéntase libre de comentar y discutir constructivamente sobre cualquiera de los puntos anteriores.

Puedes decirlo cuando quieras. Probablemente sea una mentira de todos modos.

En los viejos tiempos, el sistema embebido era más sobre sistemas mínimos, microcontroladores y demás. Realmente aprendiste a hacerlo con hardware / lenguaje ensamblador, luego recurriste a C porque era más fácil. Pero no debería haber dicho que dominaba verdaderamente el sistema embebido sin la parte de hardware / ensamblaje, C era solo el recubrimiento de azúcar fácil.

La parte más difícil probablemente fue sobre detalles de herramientas como compilar su compilador para el destino (a menudo como un compilador cruzado), o detalles específicos de entornos de desarrollo y depuración al usar C. Supongo que eso es lo que habría llamado “dominar C”.

Hoy en día, los sistemas integrados son un nicho ecológico mucho más extendido que incluye sistemas mucho más complejos. Probablemente nunca me atrevería a decir que estoy dominando el tema. El lenguaje C sigue siendo pan comido y su uso en sistemas modernos tiende a ser más fácil que en el pasado.

Puede describir sinceramente qué entornos usó y conoce, pero aún no tiene mucho que ver con el lenguaje C.

Eres un maestro cuando otros maestros del oficio te reconocen como un compañero.

Nunca puedes proclamarte a ti mismo como un maestro, solo puedes hacer que tu dominio sea reconocido por otros. El peso de ese reconocimiento es proporcional a los logros de la persona que lo realiza.

Cuando solo ha estado programando C en su vida, se ha dejado crecer la barba, tiene un perro y 3 hijos y actualmente está comprando su segunda casa.
Entonces puede decir que ha dominado C.

Bromas aparte … En mi humilde opinión, has dominado cualquier idioma si puedes escribir código mantenible en un tiempo razonable con el conjunto de herramientas que está disponible en el campo con el que estás familiarizado.
Sin embargo, no estoy seguro de si puedes decirlo por ti mismo …

Mi criterio (pero vengo de los años 70) es cuando conoces el error en el primer compilador de C de Microsoft. (Produjo un código totalmente incorrecto: cargar un par de registros y luego usar uno diferente como si el valor estuviera en ese).

Pero “dominado”? Si vives lo suficiente, tal vez en 70 años. Solo lo he estado haciendo durante un poco más de 40 años, y aún no lo he dominado. Soy bastante bueno, pero no soy un maestro.

C para sistemas embebidos será en gran medida: interfaces de registro, campos de bits, uniones para empaquetado de bits y también acceso a campos en estructuras de telecomunicaciones, interrupciones, bibliotecas de subprocesos múltiples. Esto es lo que puedo pensar, de inmediato.

  1. Puntero
  2. Puntero
  3. Puntero
  4. Char Pointer
  5. Puntero de función
  6. Función de devolución de llamada
  7. Estructura-union
  8. lleno
  9. ## ABCD ## funcionalidad
  10. Macros
  11. # if- #endif indicador de compilación
  12. libre de malloc
  13. de nuevo necesitas puntero
  14. Puntero

No dominas C, llegas a un punto donde puedes usarlo sin demasiados dedos destrozados. “Es difícil hacer un cuchillo que pueda cortar carne y no dedos”

La programación integrada y del núcleo es donde los márgenes de error y la presión para hacer que las cosas sean eficientes se unen en un ataúd. Cuando te sientas cómodo trabajando allí, puedes decir que eres competente.

Nadie puede ser un maestro en sistemas integrados con solo adquirir experiencia en lenguaje C ¿Por qué?

World es un centro tecnológico donde la innovación ocurre de vez en cuando. Debe comprender las necesidades de la industria y los requisitos del cliente.

Puedo decir que la mejor manera de dominar el lenguaje C es crear un producto real que se venda en el mercado competente.

Nota: El hecho es que, aparte del lenguaje C, hay muchos otros lenguajes de programación favoritos como python, perl, java c ++ .

Carrera en Sistemas Embebidos: Oportunidades mundiales – Codrey Electronics

Muchas respuestas glib (gnu lib – get it?) A esto – muchas ni siquiera mencionan “C”, sino que se centran en los mecanismos de concurrencia comunes disponibles en un núcleo. No dominarás “C” jugando con mutexes.

Transfiera un servidor web basado en C (por ejemplo, apache, incluido el marcador) a un beagleboard y publíquelo. Si la gente comienza a usarlo, entonces dominas el “lenguaje C para sistemas integrados”

Es en gran medida una cuestión de ego. Cuando declares “He dominado este tema y no tengo más que aprender trabajando en este campo específico”, prepárate para equivocarte al respecto. Las reacciones a su código en las revisiones de código es un indicador plausible para vigilar.

No puedes … y mi sincero pedido … Nunca intentes igualarlo. Si te mantienes abierto, verás nuevas características / facetas de C todos los días. Seguir aprendiendo…

Cuando te pagan más que a cualquier otro desarrollador de C incorporado, lo sabes.

Nunca.