lunes, 11 de marzo de 2024

Yocto Project I. Introducción

 El proyecto Yocto

Este es un tema muy avanzado para sistemas embebidos pero por razones de mercado de valores y estratégia de negocios de la empresa donde trabajaba ahora tengo vacaciones indefinidas.

 Ya que en las mentes de los desarrolladores son binarias tienden a tener opciones de dos en dos entonces o me quedo a lamentarme y culparme preguntando ¿por que a mi?, o me pongo a pulir habilidades para y mientras consigo un nuevo empleador.

Así que:

Yocto Project

Yocto es el prefijo del Sistema internacional de unidades para definir la escala más pequeña (hasta 2022 cuando se añadieron un par de ordenes más), un multiplicador por 10^{-24} o sea 0.000....1 con 24 ceros antes del 1. 

En el ámbito que nos incumbe significa que es una unidad muy pequeña, entonces Yocto project es un conjunto de herramientas para crear sistemas operativos basados en Linux de forma totalmente personalizada y que permite manipular cada componente en el proceso. 

El proyecto yocto combina y mantiene varios elementos clave:

  1. El sistema de compilación OpenEmbedded se compone del core de OpenEmbedded y Bitbake.
  2. Una configuración de Linux embedded es usada para pruebas (Llamada Poky).
  3. Una amplia infraestructura de pruebas esta disponible a través del constructor automático basado en Builbot.
  4. Se dispone de herramientas para trabajar con embedded Linux de forma eficiente:
    1. Herramientas para automatizar la compilación y las pruebas.
    2. Procesos y estándares para las definiciones e intercambios de apoyo a la junta directiva.
    3. Herramientas de análisis de seguridad y cumplimiento de licencias, soporte para manifiestos de software (SBoM) en SPDX.

Existen muchos componentes de código abierto bajo Yocto Project.

Poky el "embedded OS" (sistema embebido empotrado) de referencia es en un BUILD EXAMPLE que construirá un pequeño sistema operativo con el sistema de compilación (bitbake, el motor de compilación, OpenEmbedded-Core, y los metadatos del sistema de compilación principal).

El sistema de compilacion se descarga con "archivos" de instrucciones de compilación de Poky llamados "recipes" y "layers". Tu puedes modificar, copiar o utilizar las especificaciones de Poky de la forma que necesites para crear un Sistema Embedded Linux personalizado.



Desde la documentación oficial de yocto ofrece algunas ventajas de utilizarlo para construir un sistema operativo a la medida.

  • Se ha adoptado muy bien en la industria muchos fabricantes de semiconductores, sistemas operativos, software y vendedores de servicio han adoptado y dan soporte para Yocto Project.
  • Es compatible con varios tipos de arquitectura, por ejemplo Intel, AMD, MIPS, ARM y varias otras. 
  • Es compatible con una gama amplia de dispositivos emulados por QEMU (Quick emulator).
  • Es relativamente fácil portar las imágenes y el código sin tener que pasar a nuevos entornos de desarrollo.
  • Tiene mucha flexibilidad, por ejemplo una corporación puede crear una distribución a la medida y después de eso crear varios productos a la medida.
  • Es ideal para dispositivos del internet de las cosas (IoT por sus siglas en inglés) utilizando justamente lo que se necesita en un nuevo dispositivo.
  • Se pueden utilizar toolchains de terceros y es compatible con la mayoría de las arquitecturas más comunes. 
  • Utiliza un sistema de modelo de capas, se pueden agregar paquetes de forma separada y de manera incremental, lo que reduce la redundancia y la complejidad.
  • Soporta compilaciones parciales por lo tanto es posible crear y reconstruir paquetes individuales según se necesiten.
  • Yocto project permite ser muy específico con las dependencias y logra porcentajes muy altos de reproducibilidad binaria,  cuando las distribuciones no son específicas otros paquetes se pueden incluir arbitrariamente.
  • Existe un gran ecosistema de individuos y organizaciones con una comunidad muy valiosa, también foros de soporte y desarrolladores activos.
  • Manifiesto de licencia, el proyecto proporciona un manifiesto de licencia para que lo revisen las personas que necesitan realizar un seguimiento del uso de licencias de código.

Algunas dificultades que se pueden encontrar al usar Yocto project son los siguientes:

  • Las curvas de aprendizaje son muy grandes además de que una tarea puede tener varias formas de realizar una sola tarea. 
  • Comprender que cambios necesitan realizarse para un nuevo diseño implica una gran cantidad de investigación.
  • El flujo de trabajo puede ser confuso si eres un usuario de escritorios tradicionales o servidores, En un entorno de desarrollo existen mecanismos para extraer e instalar nuevos paquetes que generalmente estan pre-compilados desde servidores en internet, al utilizar Yocto project se debe modificar la configuración y reconstruir para agregar paquetes adicionales.
  • El trabajar en un entorno de compilación cruzada (Cross-Build) puede resultar desconocido. Cuando se desarrolla un código para determinada tarjeta la compilación, ejecución y pruebas todos los procesos podrían ser mas rápidos si se ejecutaran en la la tarjeta que con bitbake dado que se tendrían que cargar después en la tarjeta para realizar pruebas. Yocto soporta un enfoque donde los cambios se pueden realizar con bitbake y luego solo implementar los paquetes actualizados en la tarjeta destino.
  • El sistema de compilación de Open embedded produce paquetes en formato estándar (por ejemplo rpm, deb o ipk).  Tu puedes implementar estos paquetes en un sistema que ya se encuentre corriendo mediante paquetes como rpm.
  • Los tiempos de compilación iniciales pueden ser muy grandes, esto debido a que son muchos los paquetes que se deben crear desde cero para tener un sistema Linux. La ventaja es que se tiene un cache  para que en sucesivas compilaciones solamente cambien los paquetes que han sido modificados. 

 

La documentación oficial tiene una sección con "Cosas que desearía haber sabido de Yocto", su traducción más o menos quedaría así.

Usar yocto es fácil hasta que algo sale mal. Sin un buen entendimiento de como funciona el proceso de compilación puede suceder que se vuelva una caja negra. Algunos elementos que se deben saber antes de empezar a usar yocto son los siguientes:

  1. Se debe utilizar Git y no archivos de paquetes, con esto nos aseguramos que el software se actualizará cuando exista algún error. Si algún archivo "tarball"es utilizado, el usuario debe hacerse responsable de sus propias actualizaciones.
  2. Debe conocer el "layer index" (índice de capas) todas la capas pueden ser encontradas en el índice de capas. Aquellas que han solicitado el estado compatible con el Yocto project se pueden encontrar en la pagina "Project compatible layers".
  3. Cuando sea posible se deben utilizar "BSP layers"  de fabricantes como Intel, NxP, raspberry-pi y demás, debemos tratar de no crear layers desde cero, incluso con algún componente "custom" se debe usar una layer preexistente como plantilla.
  4. No pongas todo en un solo "layer", se deben usar diferentes capas separando lógicamente la información de una compilación. Por ejemplo podría tener una capa BSP, una de GUI, otra de configuración de distro, otra de aplicación, etc. A su vez aislar la información ayuda a simplificar futuras personalizaciones y reutilizado de código. 
  5. Nunca, nunca, nunca jamás modificar la "poky layer" cuando se actualice el siguiente "release" se perderán todos los cambios. Absolutamente todo.
  6. La documentación oficial se encuentra en "All in one Mega Manual" las búsquedas en google aunque son buenas, probablemente arrojarán resultados desactualizados. 
  7. Entender los conceptos básicos de como el sistema se construye: "the workflow": es muy importante debido a que puede ayudar en caso de que ocurran errores en una etapa diferente de compilación.
    1. Fetch – (busca) obtiene el código fuente.
    2. Extract –(extraer) descomprime el código fuente.
    3. Patch – (parchar) Aplica parches para soluciona de errores y nuevas prestaciones.
    4. Configure (configura)– configura los parámetros del ambiente.
    5. Build (compila)– compila y realiza el mapeo/vinculado.
    6. Install (instala) – copia los archivos a los lugares indicados.
    7. Package (empaqueta) – agrupa los archivos para la instalación.

    Durante el proceso "fetch" probablemente no encontremos código, cuando sucede "extract" es posible que exista un archivo .zip no valido o algún problema similar. En otras palabras, la función de un punto particular del proceso te dan una idea de que es lo que podría estar fallando.



  8. Es posible generar un gráfico de dependencias que muestra las relaciones entre recipes, tasks and targets. Se puede utilizar la opción '-g' para generar el gráfico. Esto es muy útil cuando una compilación no se efectúa correctamente, dado que permite visualizar que paquetes causan problemas. Para mejor información ver la sección del Manual de bitbake.
  9. Para decodificar los nombres "magic" de las carpetas en tmp/work: El proceso de compilación hace la búsqueda de paquetes, descomprime, preprocesa y
    compila. Si algo sale mal el sistema reporta directamente en donde se encuentran los archivos y paquetes temporales (build/tmp) que resultan de la compilación. 
    Cuando se realiza una compilación se puede usar "-u"  en la instucción bitbake para especificar un visor de interfaces de usuario en la gráfica de dependencias (por ejemplo knotty, ncurses, o taskexp).
  10. Se puede compilar mas que solo imágenes: Es posible correr tareas específicas para un paquete o incluso un solo "recipe". También se pueden utilizar un "Development Shell".
  11.  Una definición ambigua: Package vs Recipe: una receta "Recipe" contiene instrucciones para la construcción de un "Package" paquete. 
  12. Se deben conocer que esta empaquetado en el sistema de archivos raiz (root filesystem).
  13. Crear una receta con imágenes propias:  Es recomendable crear recetas personalizadas. 
  14. A continuación hay una lista de las habilidades necesarias en un desarrollador de embedded systems el cual debería poder:
    • Saber negociar con proxies empresariales.
    • Añadir un paquete a una imagen. 
    • Comprender la diferencia entre una receta y un paquete. 
    • Compilar un paquete por si mismo y saber por que es útil.
    • Descubrir que paquetes son creados por una receta.
    • Descubrir que archivos hay en un paquete.
    • Descubrir que archivos hay en una imagen.
    • Añadir un servidor ssh a una imagen habilitando la transferencia de archivos.
    • Conocer la anatomía de una receta.
    • Saber como crear y usar "layers".
    • Encontrar recetas (en el OpenEmbedded index).
    • Comprender las diferencias de configuración entre la máquina y la distribución
    • Encontrar y utilizar la BSP(de la máquina) para tu hardware.
    • Encuentra ejemplos de funciones  de distribución y saber donde Configurarlas. 
    • Comprender el proceso de tareas y ejecutarlas individualmente. 
    • Comprander el devtool (herramientas de desarrollo) y como simplifica el trabajo.
    • Mejorar las velocidades de compilación con descargas compartidas y caché de estado de trabajo.
    • Generar y comprender una gráfica de dependencia.
    • Generar y comprender el entorno Bitbake.
    • Compilar una extensión SDK para el desarrollo de aplicaciones. 
  15. Dependiendo de cuales son los intereses del usuario con Yocto Project, se podría considerar cualquiera de las siguientes:
    • Consulte el manual de tareas de desarrollo de Yocto project.
    • Consulte el manual de desarrollo de aplicaciones y el quit de desarrollo de software extensible (eSDK).
    • Obtenga información sobre el desarrollo del Kernel: puede consultal el manual de desarrollo de kernel. 
    • Obtenga información sobre los Board Support Pages (BSPs): hay una guia disponible
    • Aprender acerca del "Toaster": Es una interfaz web para el sistema de compilación de Yocto también tiene un manual
    •  Obtenga información sobre los plugins para Visual Studio Code o Eclipse.
    • Ten a la mano el Yocto Project Reference Manual. A diferencia del resto del conjunto de manuales del Proyecto Yocto, este manual se compone de material adecuado para referencia en lugar de procedimientos.

jueves, 20 de abril de 2023

Lección 2. Operadores

 Los operadores. 

Son los símbolos que permiten realizar operaciones matemáticas y lógicas, como la suma, sustracción, multiplicación, división, comparación y de manejo de bits. Los mas comunes son:

  1. Operadores aritméticos: se utilizan para realizar operaciones matemáticas básicas, como sumar, restar, multiplicar, dividir y obtener el resto de una división. Algunos ejemplos de operadores aritméticos en C son '+' (suma), '-' (resta), '*' (multiplicación), '/' (división) y '%' (módulo).

  2. Operadores de asignación: se utilizan para asignar valores a variables. El operador de asignación más común en C es '='.

  3. Operadores de comparación: se utilizan para comparar dos valores y devolver un resultado booleano (verdadero o falso). Algunos ejemplos de operadores de comparación en C son '==' (igualdad), '!=' (desigualdad), '<' (menor que), '>' (mayor que), '<=' (menor o igual que) y '>=' (mayor o igual que).

  4. Operadores lógicos: se utilizan para combinar expresiones booleanas y devolver un resultado booleano. Algunos ejemplos de operadores lógicos en C son '&&' (AND lógico), '||' (OR lógico) y '!' (NOT lógico).

  5. Operadores bit a bit: se utilizan para realizar operaciones a nivel de bits. Algunos ejemplos de operadores bit a bit en C son '&' (AND bit a bit), '|' (OR bit a bit), '^' (XOR bit a bit) y '~' (NOT bit a bit).

  6. Operadores de desplazamiento: se utilizan para desplazar bits a la izquierda o a la derecha. Algunos ejemplos de operadores de desplazamiento en C son '<<' (desplazamiento a la izquierda) y '>>' (desplazamiento a la derecha).

Además de estos operadores, C también cuenta con operadores de incremento y decremento '++' y '--', operadores condicionales '?:' y operadores de apuntador '*' y '&'.

Estos operadores se utilizan en diferentes situaciones dependiendo de la aplicación que estemos realizando. 

Precedencia de operaciones. 

La operaciones también pueden agruparse y se tiene el mismo concepto de jerarquía que se obtiene en las matemáticas. Hay una precedencia que debe tomarse en cuenta en lenguaje C. 

  1. Paréntesis:  ( )
  2. Postfijos: X++ X--
  3. Prefijos ++X, --X, Signo unario (positivo y negativo): +,-. Negacion y complemento: '!', '~'. Apuntador y dirección: '*', '&' 
  4.  Multiplicación y división: '*',  '/'. Modulo: '%' (la sobra al hacer una división entera) 
  5. Suma y resta: '+', '-'.
  6. Desplazamiento de bits: >>, <<.
  7. Operadores de comparación: <, >, <=, >=.
  8. Relacionales: ==, !=.
  9. AND binario: &.
  10. XOR binario: ^.
  11. OR binario: |.
  12. AND lógico: &&.
  13. OR lógico: ||.  
  14. Condicional ternario: '? :'.
  15. Asignaciones: =, +=, -=.. etc.
  16. Coma: ', ' (separación de parámetros, listas, elementos) 

Todo esto cobra sentido cuando se utilizan estos operadores. En códigos antes mostrados ya estan plasmados los mas comunes para operaciones aritméticas. 



 

En la próxima lección cuando utilicemos las sentencias de control para comenzar a realizar nuestros primeros programas útiles. 



miércoles, 5 de abril de 2023

Lección 01. Variables, entrada y salida estándar.

 Entrada y salida estándar. 

    En una computadora, el concepto clásico que todos tenemos, tiene varios dispositivos de entrada y salida de datos.

Entradas  Salidas
Teclado  Monitor
Micrófono
 Bocinas
Puertos USB
 Ventiladores
Botones de encendido/reinicio
 Puerto VGA
Ratón
 Puerto HDMI
Reloj de tiempo real
 Unidades de almacenamiento
Cámara de vídeo
 LEDs indicadores

    Un teléfono celular también es una computadora, la cual funciona con el propósito de hacer y recibir llamadas, aunque actualmente tienen un sin fin de utilidades más. Comparte con la PC clásica el hecho de que consta de dispositivos de entrada y salida de datos como lo es un touchpad, pantalla, micrófono, auriculares, bluetooth, wifi, etc.

    En lenguaje C es posible utilizar todos los dispositivos de entrada y salida de una computadora. Aunque esto puede ser tanto muy complejo como muy sencillo dependiendo de la aplicación que se esté desarrollando al momento.

    Para fines educativos, en este espacio se utilizará solamente la terminal o consola para hacer la ejecución de nuestros programas en Lenguaje C, y más adelante se utilizarán los puertos de entrada y salida de microcontroladores y/o microprocesadores a nuestra disposición. 

    En C estándar la biblioteca "studio.h" contiene las funciones básicas para el uso de los puertos de entrada salida, y en nuestro caso hemos utilizado ya una de ellas, que es "printf". Esta función sirve para imprimir mensajes en la pantalla. Su uso se irá extendiendo a base de ejercicios.

Variables

Tipos de datos

    Vamos a partir que en este punto, que tienes conocimientos de matemáticas básicos sobre todo algebra, pues en al final las computadoras solamente pueden reconocer números por medio de almacenamiento de energía eléctrica que se organizan en cadenas de 0s y 1s.  
    Una forma sencilla de comprender una variable es la x de una ecuación de primer grado solucionada, es decir un espacio que puede contener un valor. 
    En lenguaje C, tenemos unas cuantas formas de reconocer datos para considerarlos en diferentes tipos. Esto no sera tan fácil de digerir al inicio supongo, pero con la práctica se verá más fácil. Aquí usaremos el precepto de: "La mejor forma de aprender a programar es programando". Los elementales son los siguientes:
  • Enteros, tal como en las matemáticas son los números que no tienen parte fraccionaria, o punto decimal. Para declararlos existen palabras reservadas especificas:
    • int: Entero con signo de 2 bytes (16 bits) y puede tener valores entre -32768 a 32767. El númeto de datos que se pueden representar con 2¹⁶ en representacion binaria. Si no entendiste esta parte, con algunos ejercicios más adelante se intentará hacerlo más claro. 
    • unsigned int: Entero sin signo es decir, sus valores van de  0 a 65535.
    • long int: El modificador long, dobla el tamaño  "base" de los tipos de dato. para los enteros quedaria en 8 bytes, es decir  
  • Caracteres:
    • char: Es un tipo de datos de 1 byte (8 bits) que codifica el codigo acci (una googleada no esta mal para ver de que se trata).  
  • Cadena de caracteres:
    • No es un tipo de dato como tal en Lenguaje C, se maneja como un array de tipo char, mas adelante se tomara en cuenta de mejor manera.
  • Punto flotante:  Es el tipo de datos que permite utilizar números decimales es decir que tienen parte entera y parte fraccionaria. 
    • float: este tipo de dato por lo general es de 4bytes de precisión para representar numero decimales. sus valores van de 3.4E-38 a 3.4E+38
    • double: este tipo de dato esta compuesto de 8 bytes 1.7E-308 a 1.7E+308.
 Probablemente esto en un principio no sea tan importante, pero ya en el momento de trabajar es algo que debe tomarse muy en cuenta. Vale la pena empezar a familiarizar los conceptos.

Tipos de Variables
    Las variables se pueden organizar en dos grandes tipos. 

Globales

    Este tipo de variables se puede utilizar en cualquier momento dado que se declaran de forma que todo el código tenga la capacidad de acceder a ellas. 

Locales

    Este tipo de variable se define en una parte específica del código y es invisible o inaccesible para el resto de la aplicación. 

En este punto se que te estarás preguntando: ¿Que chingados?  sobre todo si es tu primera vez tomando estos conceptos. El autor esperaría que no, que ya estas ampliando tu conocimiento. En todo caso, se peude ver mejor en el repositorio de Github donde se incluye un ejemplo de uso de entrada y salida de datos que se guardan en variables de distintos tipos. 

Ejemplo práctico

    El archivo printScanVariables.c contiene el codigo para interactuar con la pantalla y el teclado con un codigo muestra, es muy básico pero creo que se comprendera facilmente. En el se puede ver el uso de la función scanf, printf y como pueden distintas variables tener alcances globales y locales.

    Las variables se declaran con un tipo de dato y el valor iniciar (de preferencia) debido a que si esto no se hace puede en algun punto haber comportamientos extraños producto de valores no esperados.

Como se puede ver se sigue la estructura de un programa estandar, al inicio los headers, la sección de macros, variables globales, prototipos de funcion, funcion principal y funciones vamos a llamarles secundarias. 

Dentro del archivo se puede encontrar tambien la forma de imprimir distintos tipos de datos, como lo son caracteres, enteros y números flotantes. utilizando el formato de la función printf (que de hecho deriva del nombre print with format). La función printf se utiliza en su forma más simple con la estructura: 

printf ("Cadena de caracteres", parametros de distinto tipo de dato).

Los modificadores de formato mas utilizados son los siguintes:
  • %d: para imprimir un número entero con signo.
  • %u: para imprimir un número entero sin signo.
  • %f: para imprimir un número en coma flotante.
  • %c: para imprimir un carácter.
  • %s: para imprimir una cadena de caracteres.
  • %p: para imprimir un puntero.
  • %x o %X: para imprimir un número en formato hexadecimal.

A grandes rasgos se utilizarán comas para separar los parametros di la funcion, que pueden ser los tipos de datos vistos anteriormente (enteros, caracteres, flotantes, etcétera).






















Para el caso de la lectura de datos desde el teclado, se utiliza la funcion scanf() la cual funciona  tomando datos de teclado y guardandolos en las variables. Al igual que printf funciona con la misma estructura utilizando caracteres de formato. 






En el código ejemplo se utilizan funciones que serán explicadas más adelante. Recomiendo descargar el código y en base a el crear una funcion main que permita escribir mensajes personalizados,  leer frases y leer variables para hacer algunas otras operaciones. Por ejemplo de desigualdades. 

Para el caso de la lectura de datos, se realiza por medio de la funcion scanf().

La funcion scanf(), utiliza los mismos operadores que scanf, no daremos muchos detalles debido a que este curso esta pensado en darle mas importancia a los sistemas embebidos. Asi que la utilizaremos solamente para aprender un poco la lógica de programación. 















domingo, 5 de febrero de 2023

Leccion 00. Hola mundo y Visual Studio Code

¿Cómo se hace un programa/aplicación en Lenguaje C?

No quiero meterme demasiado en la teoría aun, porque en un inicio aprender definiciones y proceso puede que sea muy cansado. 

Así que les explico un poco, lo que yo sé. No usaré una bibliografía todavía.

Para comenzar, hace unos años (casi 70 dado que escribo esto en 2022) las computadoras eran de tamaño de un cuarto completo,  llenas de bulbos y para realizar operaciones se insertaban tarjetas perforadas y debían cambiarse cantidades enormes de cables y switches,  en esos días el software era curiosamente desarrollado sobre todo por mujeres, hay una película de Disney al respecto de hecho, y es muy famosa la foto de la programadora con el código que escribió para las máquinas que llevaron al hombre a la luna. Unos años después, ya en los 60s y 70s se empezaba a experimentar con las pantallas, fue entonces cuando nació el lenguaje ensamblador y lenguajes de "alto nivel" que para comprenderlo más fácil, no son solo representaciones de 0s y 1s en grandes cadenas que solo la computadora puede entender (las tarjetas perforadas cumplían una función parecida a esta) sino que se representan acciones por palabras comunes que posteriormente pasaron a llamarse keywords.

Una vez que se tuvieron los lenguajes de alto nivel, había que traducir el lenguaje humano (inglés) a lenguaje de las máquinas, 0s y 1s organizados en cadenas que se escriben en un mapa de memoria. Con este fin se inventaron los compiladores. Que son herramientas que se encargan de hacer el proceso de traducción de lenguaje humano a mapas de memoria que el procesador puede comprender.

Pare esto se llevan a cabo 4 pasos principales (a todo esto mejor aprénderlo en inglés será más fácil a futuro):

  1. Preprocesamiento (pre- processing)
  2. Compilación (Compiling)
  3. Ensamblado (Assembling)
  4. Enlazado (Linking)

Una buena práctica de programación es separar los códigos en pequeños módulos. Esto es un archivo principal, y distintos archivos secundarios que serán unidos en el proceso de compilación. 

Compilar nuestro primer programa en lenguaje C

En un primer post ya enseñamos a instalar  IDE de DEV C (compilado y editor)en el sistema operativo windows, ahora se realizará el mismo proceso utilizando GCC (GNU Compiler Collection) desde GNU Linux, el proceso será el mismo en escencia asi que lo que aquí se describa se podrá utilizar en ambos sistemas operativos indistintamente (a eso le llamamos portabilidad).
De igual manera que se hizo en Windows tendremos que conseguir un editor y un compilador como herramientas principales. 
Una herramienta muy útil es Visual Studio Code que funciona en ambos sistemas operativos. Otra herramienta es Notepad++ para windows en Linux con Gedit es posible trabajar para fines educativos.
En este blog se usaran tanto Visual Studio Code como Gedit. 

Reciclamos el código de hola mundo de la vez pasada:

//Headers - Encabezados
#include <stdio.h>

// Macros 
// Global variables - Variables Globales
// Function prototypes - prototipos de función
// Main function - Función principal

int main (){
printf ("Hola mundo\n");
return 0;
}
// Functions - Funciones 




Para compilar y ejecutar nuestro programa en Linux es necesario tener a la mano una terminal y situarnos en el path de trabajo, en mi caso:

$ cd ClangCourse/HelloWorld/

En este directorio se encuentra nuestro archivo HolaMundo.c el cual compilaremos con el comando:

$ gcc HolaMundo.c -o HolaMundo

Lo cual compilara nuestro programa y creara un archivo binario ejecutable llamado HolaMundo. Para ejecutarlo se manda llamar el binario a ejecución:

$ HolaMundo

La salida es el texto: Hola Mundo



Visual Studio Code

Se puede descargar desde su sitio oficial e intalar en cualquie sistema operativo. Es un IDE muy completo y amigable, además que tiene integrado el sistema de versionado GIT lo que nos hará un poco mas fácil nuestras tareas del día a día. Se puede descargar en su portal:


Esta herramienta es de las más utilizadas hoy en día, en la seccion de documentación se puede encontrar información de como instalar la aplicación. 

En windows solo es darle doble clic y siguiente a todo lo que salga. En linux se descarga el paquete y se corre con el instalador de tu preferencia (en mi caso es fedora así que se utiliza dnf, en ubuntu será apt). 

Una vez instalado VS Code seguramente estará configurado en inglés, y como este intento de curso esta dirigido a hispanoparlantes además que siempre es más sencillo aprender algo en el idioma natal, pues es posible cambiar la interfaz. 

Para instalar el paquete de idioma español sera necesario buscarlo en la seccion de extensiones buscamos español y damos clic en instalar.



















Una vez finalizado, sera necesario reiniciar la interfaz como lo indica una ventana emergente en la esquina inferior derecha.












Damos clic en Restart y listo, VS Code esta ahora en español.
























Asi mismo instalaremos las herramientas para desarrollo en Lenguaje C. 

















Buscamos C e instalamos las 3 extensiones relacionadas:
  • C/C++
  • C/C++ Themes
  • C/C++ Extensions Pack
Una vez instalado podemos abrir el directorio de trabajo. Solamente debemos abrir la carpeta donde estamos trabajando en el menú: Archivo/Abrir Carpeta/ y seleccionamos el directorio donde estamos trabajando:

Al hacer clic en abrir, tenemos en pantalla los archivos que forman parte de nuestro proyecto.
en este caso:

Procedemos a abrir el archivo HolaMundo.c


Ahora podemos hacer una prueba y compilar nuestro programa desde VS Code. Dado que ya están instalados los plugins de C/C++ solo hay que hacer clic en Run en la parte superior derecha y listo, nos mostrara la terminal con el programa ejecutándose.



Probablemente haya que configurar manualmente algunos parámetros o variables de entorno si estas acciones no se realizan de forma automática. De ser así pueden preguntar en la caja de comentarios o recurrir siempre al poderoso google, o a stackoverflow para saltarnos un paso.

Saludos y nos vemos en la próxima lección. 
<- Anterior Siguiente ->

domingo, 11 de septiembre de 2022

Primeros pasos en Lenguaje C

Muy breve historia del lenguaje C


Este lenguaje fue desarrollado por Dennis Ritchie entre 1969 y 1972 en los laboratorios Bell. Una característica importante es que estuvo enfocado en el desarrollo de sistemas operativos Unix específicamente.

Dadas sus bondades, como que era fácil de crear aplicaciones de alto nivel y a la par implementar soluciones de bajo nivel. Su uso incremento rápidamente, a finales de los 70s,  comenzó a sustituir a BASIC como lenguaje de programación de microcomputadoras, también en esta época se hizo el desarrollo del lenguaje C++, que toma C y se le añade la manipulación de Objetos. 

 En 1989,  se realizó la estandarización del lenguaje C bajo el estándar: SO/IEC 9899:1990. 

La segunda revisión se realizó en 1999 bajo el nombre: ISO 9899:1999, C99.

En el 2011 una nueva revisión estuvo disponible: ISO/IEC 9899:2011 o C11

La última revisión es la ISO/IEC 9899:2018 o C18.

Para mas información podemos ir a dar una vuelta por wikipedia o en la página de la historia de C.

Herramientas para trabajar

La idea de esta sección es familiarizarnos con el lenguaje C, hacer algunos programas básicos en consola para intentar comprender su funcionamiento y estructura, para después adentrarnos en lo que nos interesa. Lenguaje C para sistemas embebidos. Si ya tienes conocimientos del tema, puedes saltarte hasta la sección de desarrollo con microcontroladores, y si eres nuevo en este mundo, intentaré hacer todo lo más simple posible

Lo más básico para trabajar con Lenguaje C, es un procesador de texto y un compilador.

El procesador de texto, es el software que nos permite trabajar con el lenguaje de programación, en nuestro caso C. 

El compilador esta compuesto por herramientas que permiten traducir lenguaje C (instrucciones en "idioma humano" llamadas  de alto nivel) en mapas de memoria que la computadora, microprocesador o microcontrolador podrán interpretar. 

IDE (Integrated Development Environment):  Por sus siglas en inglés es un entorno de desarrollo integrado, que como su nombre nos indica es un conjunto de herramientas que nos permiten realizar desarrollo en un solo software. Por lo general los IDEs contienen un editor de código, compilador, debugger e interprete en un solo software y actualmente control de versiones. Algunos ejemplos de IDEs populares para diversos lenguajes de programación son Eclipse, NetBeans, Visual Studio Code, y Arduino IDE.  

Instalación de Dev C++

Dev C++ es un IDE optimizado para el desarrollo de Software utilizando herramientas GNU, de código abierto, es decir,  cualquier persona pude ver su código fuente y modificarlo. Se utilizará este IDE para realizar nuestros primeros programas debido a que es muy fácil de conseguir e instalar, es gratuito y también contiene editor, compilador y debugger. 

 La página oficial del proyecto es la siguiente: https://www.bloodshed.net/  en esta página procedemos a descargar el software. 










Al hacer clic, nos redirige a sourceforge un repositorio de software libre en el cual podemos encontrar muchos proyectos de software libre. La descarga debería iniciar automáticamente, de no ser así dar clic en el icono para iniciar la descarga. 












 Una vez descargado se procede a instalar el software, solamente hay que seguir la secuencia de instalación dada por el asistente y listo. 

1. Iniciar la instalación.
 

2. Seleccionar idioma de instalador


3. Aceptar la licencia.










4. Seleccionar la instalación Full









5.Seleccionar la ruta de instalación.









 

Termina la instalación








Al finalizar, se elige el idioma en que estará ejecutándose el software, para nuestros fines, y para hacer todo un poco más sencillo, se puede escoger español de Latinoamérica. Pero dado que el mundo de la programación como veremos más tarde esta documentado en inglés y para fortuna o adquisición de oportunidades nuestra, deberíamos aprender a la par el lenguaje C como el idioma inglés y prestarle más atención al "English" que a C.  

Crear un proyecto en Dev C++

Ejecutamos Dev C y luego de eso damos clic en el menú archivo/nuevo/proyecto. 























Luego se abre un cuadro de dialogo, donde seleccionamos aplicación de terminal. 













Damos clic en Aceptar, y seleccionamos el directorio donde guardaremos nuestro proyecto, en  mi caso usaré el escritorio. 


Ahora tenemos nuestro primer código fuente muestra.



Este código ya puede ser compilado y los archivos binarios resultantes pueden ser ejecutados, aunque haremos algunos cambios para que sea un poco más intuitivo. Debemos guardar el archivo para así pasar a la compilación. 



Listo para comprobar que nuestro primer código funciona, solo hay que ir al icono de compilar y ejecutar (su atajo es presionar la tecla F11).



Y ahora tenemos el resultado final.



Como podemos ver en la pestaña de registro de compilación podemos ver cuales son los resultados del proceso y a la derecha la consola con nuestro primer programa corriendo. 

Felicidades, has iniciado en el mundo de la programación. 

Ahora viene un camino lleno de horas a prueba y error para mejorar nuestras habilidades. No prometo que será fácil pero intentaré enseñar las bases de la mejor manera que pueda y por que no, divirtiéndonos si es posible. 

Próximamente explicaré como hacer esto en Linux, un sistema operativo que recomiendo puedas comenzar a utilizar de no tener ni idea de que es, porque nuestro mundo hiperconectado esta cimentado sobre Linux. 

domingo, 4 de septiembre de 2022

Sistemas de numeración

Sistemas de numeración

    Recuerdan cuando eran niños (no sé si esto aun apliqué pero los que crecimos en los 90s e inicios de los 2000) llevábamos un abaco a la primaria Fig1. 

    Esto nos permitió comprender como funcionan los sistemas de numeración posicional de forma inconsciente, para nuestro caso especial el sistema de numeración decimal.

    Y ¿cómo funciona el ábaco? Pues en la varilla izquierda pones una cuenta y sabes que es la representación de las unidades. 

    La siguiente representa la decenas, la tercera la centenas y así sucesivamente.


Ese es el principio básico de cualquier sistema de numeración. Intentare explicarlo de una forma más general.

Primero tenemos un conjunto de símbolos que nos tendrán un valor intrínseco, estos serán lo números o dígitos. 0,1,2,3,4,5,6,7,8,9 (en el sistema decimal).
De izquierda a derecha tendrán un valor dependiendo de su posición.
 

B^n B^(n-1) ... B^3 B^2 B^1 B^0 B:Base del sistema, decimal para el ejemplo
10^n 10^(n-1) ... 10^3 10^2 10^1 10^0

Para tomar un ejemplo, tomamos el número 3785, este no es otra cosa que la suma de sus componentes:
3x10^{3} + 7x10^{2} + 8x10^{1}+5x10^{0}=3*1000+ 7*100 + 8*10 + 5*1= 3000+700+80+5=3785

El mismo concepto aplica para cualquier sistema de numeración. 

    En el mundo de la informática se utiliza el sistema binario de numeración para realizar operaciones es más práctico realizar operaciones de bits que codificar el sistema decimal desarrollando hardware que pueda soportarlo.

 Sistema de numeración binario.

    Dado que las computadoras utilizan transistores para realizar operaciones, la forma de codificar esto es utilizando el sistema binario de numeración.  

2^n 2^(n-1) ... 2^3 2^2 2^1 2^0
2^n 2^(n-1) ... 8 4 2 1     

Siguiendo las reglas de un sistema de numeración, al utilizar solo dos valores posibles, se necesitan solo 2 dígitos para representar cualquier valor. En este caso el 0 y 1.

Así que se puede realizar la conversión a decimal fácilmente siguiendo la siguiente tabla:

Binario Desarrollo de exponentes Sumatoria decimal Valor Decimal
0000 0x2³ + 0x2² + 0x2¹ + 0x2⁰ 0 + 0 + 0 +0 00
0001 0x2³ + 0x2² + 0x2¹ + 0x2⁰ 0 + 0 + 0 + 1 01
0010 0x2³ + 0x2² + 1x2¹ + 0x2⁰ 0 + 0 + 2 + 0 02
0011 0x2³ + 0x2² + 1x2¹ + 1x2⁰ 0 + 0 + 2 + 1 03
0100 0x2³ + 1x2² + 0x2¹ + 0x2⁰ 0 + 4 + 0 + 0 04
0101 0x2³ + 1x2² + 0x2¹ + 1x2⁰ 0 + 4 + 0 + 1 05
0110 0x2³ + 1x2² + 1x2¹ + 0x2⁰ 0 + 4 + 2 + 0 06
0111 0x2³ + 1x2² + 1x2¹ + 1x2⁰ 0 + 4 + 2 + 1 07
1000 1x2³ + 0x2² + 0x2¹ + 0x2⁰ 8 + 0 + 0 + 0 08
1001 1x2³ + 0x2² + 0x2¹ + 1x2⁰ 8 + 0 + 0 + 1 09
1010 1x2³ + 0x2² + 1x2¹ +0x2⁰ 8 + 0 + 2 + 0 10
1011 1x2³ + 0x2² + 1x2¹ + 1x2⁰ 8 + 0 + 2 + 1 11
1100 1x2³ + 1x2² + 0x2¹ + 0x2⁰ 8 + 4 + 0 + 0 12
1101 1x2³ + 1x2² + 0x2¹ + 1x2⁰ 8 + 4 + 0 + 1 13
1110 1x2³ + 1x2² + 1x2¹ + 0x2⁰ 8 + 4 + 2 + 0 14
1111 1x2³ + 1x2² + 1x2¹ + 1x2⁰ 8 + 4 + 2 + 1 15

Algo que seguramente se habrá notado es que aunque se necesitan más posiciones, el sistema es muy simple debido a que solamente dos dígitos son suficientes para representar el conjunto de los números enteros.

    Siguiendo las reglas de los sistemas de numeración es posible representar valores en cualquier base. Al trabajar con sistemas informáticos, debido a la manera en que utilizamos los semiconductores para el control de la corriente eléctrica (Tema que se verá posteriormente), lo más fácil es utilizar el sistema binario, que además es fácilmente codificable en sistema octal y hexadecimal. Cabe aclarar que el sistema octal actualmente es poco utilizado en aplicación, aunque comprenderlo facilita las cosas cuando estamos aprendiendo. 

Para esto vamos a definir algunos conceptos: 

Bit: Es la unidad mínima de información, en una computadora el espacio donde solo puede haber 0 ó 1.

Byte: Es la agrupación de 8 bits, en las arquitecturas de microprocesador más simple es el tamaño que tiene un registro (tener esto en cuenta para futuros temas).

Nibble:  La agrupación de 4 bits, también conocido como octeto o medio byte.

Sistema de numeración octal: Este sistema de numeración tiene de base el número 8, es decir del 0 al 7. 

Sistema de numeración hexadecimal: este sistema de numeración tiene como base el número 16, utilizando los dígitos decimales del 0 al 9 y completándolos con las letras A, B, C, D, E, F.

En la siguiente tabla se puede ver la equivalencia de algunos valores en estos sistemas.

   Binario 
    Octal      Hexadecimal    Valor Decimal 
0000 00 00 00
0001 01 01 01
0010 02 02 02
0011 03 03 03
0100 04 04 04
0101 05 05 05
0110 06 06 06
0111 07 07 07
1000 10 08 08
1001 11 09 09
1010 12 0A 10
1011 13 0B 11
1100 14 0C 12
1101 15 0D 13
1110 16 0E 14
1111 17 0F 15
00001 0000 20 10 16

Existe una correlación entre los sistemas binario, octal y hexadecimal, dado que la base 8 y 16 en su respectivo sistema es una potencia del número 2. 

Para convertir de binario a octal solo agrupamos los bits de derecha a izquierda de 3 en 3 y simplemente se acomodan las cifras. Ejemplos:

   Decimal 
    Binario      Agrupando     Octal 
28 11100 011,100 38
147 10010011 010,010,011 223
465 111010001 111,010,001 721

En el caso del hexadecimal, se aplica la misma regla, el único cambio es agrupar en 4 posiciones de izquierda a derecha (un nibble) los dígitos binarios. Algunos ejemplos en la siguiente tabla:

   Decimal 
    Binario      Agrupando    Hexadecimal 
19
10011
1,0011
17
219 11011011
1101,1011
DB
465 111010001 1,1101,0001
1D1

Por lo general, la arquitectura de los registros de los procesadores, microprocesadores ó microcontroladores es de 8 bits, 16 bits o 64 bits. Esto toma relevancia dado que el sistema hexadecimal se vuelve hasta una forma natural de realizar las operaciones en los distintos dispositivos. 

En lecciones posteriores se intentarán hacer proyectos en arquitecturas de 8 y 32 bits. 

 

<- Anterior     Siguiente ->

 


viernes, 8 de abril de 2022

Preguntas en una entrevista para desarrollador de Sistemas Embebidos

¿Qué es un ingeniero de sistemas embebidos?

 El desarrollador de sistemas embebidos es la persona que se dedica a desarrollar software para microcontroladores y/o microprocesadores.La aplicación es muy variada en muchos campos actuales de diversas áreas de la ingeniería, algunas de las cuales son:

  • Internet de las cosas (IoT)
  • Medicina
  • Agroindustria
  • Aeronáutica
  • Automotriz
  • Telecomunicaciones

¿Dónde puedo trabajar?

En México la industria automotriz, la aeroespacial, la electrónica de consumo  y las telecomunicaciones  son las industrias en las cuales un ingeniero de sistemas embebidos tiene mayores oportunidades de conseguir un empleo y desarrollarse laboralmente. 

Entre las empresas que conozco que solicitan el perfil de  ingeniero de sistemas embebidos están (tal vez el giro de alguna de ellas esté equivocado pero se que son las que ofertan vacantes):

  •  Continental: en el ramo automotriz, desarrollando diversas partes de vehículos (no solo hacen llantas).
  • John Deere: empresa del ramo automotriz/Agroindustrial, conocida mundialmente por sus tractores. Aquí se desarrollan cosas relacionadas a la navegación automática, sistemas de control, y dispositivos tipo tabletas que llevan sus vehículos.
  • Luxoft: es una consultora que renta a sus ingenieros a otras industrias, hasta donde sé tienen proyectos muy interesantes.
  • Bosch: otro de los gigantes alemanes, por lo general se dedica a hacer sensores y sistemas automotrices.
  • Hella: se dedica sobre todo a la iluminación y sistemas automotrices.
  • Texas Instruments: gran fabricante de componentes electrónicos.
  • NxP: otro gran desarrollador de componentes electronicos. 
  • Honeywell: un monstruo gringo que se dedica a la electrónica de consumo y muchas otras industrias.
  • Schneider Electric: empresa dedicada al ramo de la automatización y la transmisión de energía
  • Ford
  • Audi
  • Volkswagen 
  • Capgemini: consultora enorme que tiene diversos clientes.
  • Una gran candidad de StartUps que ojalá tengan futuro
  • Solo  busca en  OCC, glassdor o LinkedIn embedded Developer y listo, encontrarás  tanto las empresas  listadas aquí, como muchas más que estan interesadas en conseguir personal 

 Sueldos

Hay 11 motivos por los que una persona decide ser desarrollador de sistemas embebidos:

  • 01)Es un(a) nerd/ñoño(a)/teto(a) sin remedio que sufrió bullying cuando era niño(a)/adolescente (sobre todo antes del 2008, algún día discutiremos porque este año fue un punto de inflexión), te apasiona la ciencia y la tecnología y soñabas con llegar a la nasa, destruías tus juguetes con tal de saber que tenían dentro y  al final solo quedabas con un monton de motores a los cuales les terminabas rompiendo los engranes y tus papás no querian comprarte uno más.  Si es el caso llegó la hora de triunfar.
  • 10)Ya vio los sueldos que se pueden alcanzar y si no, aquí va un pequeño aproximado (sueldos mensuales, calculados por mi mismo en abril de 2022, échenle coco ajustando inflación y condiciones futuras):
    • Trainee: de gratis a 10000 pesos, espero que a medio tiempo y por unos cuantos meses.
    • Jr (de 0 a 3 años de experiencia): el sueldo oscila entre los 15000 pesos hasta los 30000 pesos en promedio, dependiendo de la empresa y la experiencia que se tenga.
    • Middle(no hay un consenso real de la experiencia, pero va de los 2 a los 5+ años dependiendo de lo que diga el empleador): desde los 25000 hasta los 45000 pesos mexicanos. Como que se va poniendo interesante el asunto.
    • Senior (un chingón con más de 5 años de experiencia): Arriba de los 50k ya mejor ni contamos.
  • 11) Eres un caso raro que tiene el éxito garantizado desde la cuna, una persona agraciada físicamente y ademas con un IQ muy alto. Extrovertido y con mucho carisma, no se que haces como developer, esta no es tu familia.
Si por casualidad es usted RH en alguna empresa y el azar de la vida lo trajo a este post, considere ajustar sus sueldos a lo que aquí se sugiere, tal vez por eso no encuentra a la persona ideal. 

Conocimientos para ser desarrollador

En un post anterior, deje una lista de los temas más importantes para poder desempeñarse como ingeniero de sistemas embebidos. Pero una cosa es saber todo eso y otra muy distinta es expresar los conocimientos. Por tanto, básicamente cualquier camarada con un título de ingeniería (o formación porque he conocido algunos que no fueron mas de un par de años a la universidad y se rifan bien macizo, pero no son la norma he de aclarar.) pero, sobre todo: Lic en Informatica, Ing. en Electrónica, Ing. Mecatrónico, Ing. en Computacion, Ing. en Sistemas, incluso Ing. Industrial (suena a chiste pero en lo personal quien me ayudo a pulir mis conocimientos en FPGAs pertenece a esta estirpe, y yo mismo he sido coach de algún industrial por la senda de los sistemas embebidos.)

Bueno a lo que venimos. 

¿Qué me preguntarán en una entrevista para el puesto de ingeniero de sistemas embebidos?

  • Mantener una conversación en inglés: Sí, primer golpe en la cara para el gran porcentaje de los camaradas Mexicanos, que paradójicamente estamos más cerca de USA que de Dios (aunque yo pongo esto en duda), pero ahora tenemos udemy, miles de vídeos sobre todo en Youtube, Duolingo, y paradójicamente si lees esto en español como primer fuente de consulta, ya vamos mal, porque primero debiste ver algún blog en inglés escrito por un colega de la india. Pero bueno, primer punto, saber expresarte en inglés sobre todo conversaciones técnicas aunque no tengas idea de como se dice: nariz, pinza, cotonete, problema o etiqueta.

  • Se recomienda que si tuviste la fortuna de que en tu formación académica hiciste proyectos con microcontroladores, les pongas el plus que los profesores no le dieron, esta bien que utilices arduino, pero aprende un poquito más  Lenguaje C/C++, resuelve problemas de otras materias (ejemplo métodos númericos, usando microcontroladores), descríbelos y preséntalos cuando tengas tu entrevista, esto es sin miedo al éxito. La idea es que en este espacio puedas encontrar proyectos interesantes que puedas replicar y me disculpo si fallo en mi misión autoimpuesta.

  • Si eres  geek, creo que no tengo que decir que utilices Linux, porque ya lo haces, si no es el caso, nunca es tarde, aprende a instalarlo y administrarlo desde terminal, no es tan fácil, llega a ser frustrante (I know that.. but). Descarga el que más te guste, aprende a jugar con él y lee un poquito sobre Yocto proyect al menos entérate de que va.

  • Es necesario conocer algunos conceptos de Sistemas operativos, Unix, RTOS, Kernel, shell.

Principales preguntas:

No se darán respuesta aqui a estas preguntas del todo, por experiencia propia se que esto es mejor investigarlo y comprenderlo que memorizarlo y no saber de que va. Pero más adelante se irán contestando en la etapa de teoría y projectos. No desesperen amigos, la senda del gran viaje es larga. 

  1. Preguntas Relacionadas al Lenguale C
    • ¿Qué es el keyword volatile y donde/ para qué se utiliza?
    • ¿Para que se usa la palabra reservada static? ¿que pasa si se le pone a una variable? ¿qué pasa si la lleva una función?
    • ¿Cuál es el tamaño del dato int? (spoiler depende de la arquitectura)
    • ¿Qué hace el modificador const?
    • ¿Qué es un apuntador?
    • ¿Se puede hacer un apuntador const, volatile, static...?
    • ¿Para que se utiliza la palabra reservada struct?
    • ¿Para que se utiliza la palabra reservada enum?
    • ¿Para que se utiliza la palabra reservada union?
    • ¿Cuál es la diferencia entre union y struct
    • ¿Cómo se llama una función por apuntador?
    • ¿Cuáles son las dos formas de pasar parámetros a una función?
    • ¿Cuál es el tamaño de un apuntador?
    • ¿Si tengo un apuntador a una estructura, cual es la diferencia en tamaño a un apuntador a una función o a una variable?
    • ¿De que depende el tamaño de una dirección de memoria? (pista, hay arquitecturas de 8, 16, 32 y hasta 64 bits)
    • ¿Cómo se hace un cast(enmascarar tipos de dato)?
    • Sabes hacer operaciones de bits, dominas el llamado bitwise(si no lo haces recomiendo lo investigues). 
    • ¿Cómo conviertes rápidamente de decimal a hexadecimal? 
    • ¿Cómo conviertes rápidamente de decimal a binario? 
    • ¿Que es una variable local? ¿Qué es una variable global? ¿En que se diferencian?
    • ¿Para qué se utiliza el modificador extern?
    • ¿Cuáles son las principales estructuras de datos? (pilas, colas, listas...)
    • Conoces las funciones para reservar memoria. ¿Cuáles son?
    • Si tengo definido un struct y un union con los mismos componentes, ¿qué me regresará  sizeof en cada una de ellas?
    • ¿Cules son las fases de un compilador?
    • ¿Qué hace el preprocesador?
    • ¿Qué se hace durante el compilador/traductor?
    • ¿Qué hace el ensamblador?
    • ¿Qué hace el linker?
    • ¿Qué es una macro?
    • ¿Qué es una funcion in-line?
    • ¿Cuál es la diferencia entre hacer una rutina por función y por macro?
    • ¿Qué es un API?

      Como sugerencia, el desarrollador de Sistemas embebidos ya no piensa en un enfoque orientado a  objetos, podria describirse como apegado a la programación estructurada clásica, sin embargo. La definición que en lo personal puedo definir es el control de Hardware por medio de estructuras y algoritmos de Software. El mundo en binario (códificado en hexadecimal) es el pan de cada día para el embedded SW Developer. 

  2. Preguntas sobre arquitecturas de procesador y memoria
    • ¿Qué arquitecturas conoces?
    • ¿Cuál es la diferenia entre arquitectura Hardvard y Von Newmann?
    • ¿Qué arquitecturas de procesador has utilizado?
    • ¿Qué significa que tengo un microcontrolador/procesador de 32 bits? (referido como maneja la memoria)
    • ¿Cuál es la diferencia entre un cliclo de reloj y un ciclo máquina?
    • ¿Que significa que un microcontrolador sea big endian?
    • ¿Que significa que un procesador sea little endian?
    • ¿Qué es un procesador?
    • ¿Qué es un microcontrolador?
    • ¿Todos los microcontroladores contienen un procesador?
    • ¿Qué modulos puede tener un microcontrolador?
    • ¿Qué es un DAC?
    • ¿Qué es un DAC?
    • ¿Qué es la ALU?
    • ¿Qué es un timer/counter?
    • ¿Qué hace un modulo PWM?
    • ¿Qué es una UART?
    • ¿Qué es una fuente de reloj?
    • ¿Qué es  un PLL, para que se puede usarn en un microcontrolador?
    • ¿Cómo puedes generar señales de reloj/ osciladores?
    • ¿Qué es una interrupción?
    • ¿Qué es el pulling?
    • ¿Cómo manejas una interrupción (utilizando lenguaje C)? (spoiler por el ISR usando funciones, para ARM usas el NVIC)
    • ¿Que es un watchdog timer? ¿Qué funciones tiene?
    • Si yo tengo que hacer un delay, ¿por qué me conviene más implementarlo por medio de una cuenta descendente que por una ascendente?
    • ¿Cómo se organiza la memoria de un microcontrolador?
    • ¿Qué tipos de memoria existen (de acuerdo con su fabricacion)? Flash, eeprom, ram, nand, etc, intenta saber un poco de todas.
    • ¿Cuales son las partes de la memoria de un sistema y que se hace en cada una de ellas? Se los dejo en english pero creo que es la forma en que se puede comprender (y muy seguramente su entrevista será en inglés como dijimos más arriba):
      • Text segment  (i.e. instructions)
      •  Initialized data segment 
      •  Uninitialized data segment  (bss)
      •  Heap 
      •  Stack
    • ¿Como puedo saber el tamaño de una estructura sin utilizar el operador sizeof? pista, se usan apuntadores y una operacion sencilla. En su momento falle al responder.
    • ¿Qué es un puerto de entrada- salida/ Qué es el GPIO?
    • ¿Como se mapea un GPIO dentro del microcontrolador (en referencia a lenguaje C)?

  3.  Preguntas relacionadas con Sistema Operativo
    • ¿Qué es un sistema operativo?
    • ¿Qué es un sistema operativo de tiempo real?
    • ¿Cuál es la diferencia entre sistema monolítico y uno microkernel?
    • ¿Qué es un semáforo?
    • ¿Qué es mutex? 
    • ¿Qué es RTOS?
    • ¿Qué es Embedded Linux?
    • ¿Has utilizado alguna tarjeta de desarrollo que soporte sistema operativo? (Raspberry, beaglebone)
    • Utilizando Linux (bash) como te mueves entre directorios, obtienes la fecha, describir algún algoritmo para hacer respaldos.
  4.  Preguntas acerca de protocolos de comunicación:
    • ¿Qué es un protocolo de comunicación síncrono?
    • ¿Qué es un protocolo de comunicación asíncrono?
    • ¿Cómo se realiza una comunicación serial?
    • Explica brevemente como funciona el protocolo I2C
    • Explica brevemente como funciona el protocolo SPI
    • ¿Conoces el protocolo CAN?
    • ¿Conoces el protocolo LIN?
    • ¿Qué significa que unprotocolo sea Full-Duplex ó Half-Duplex?
    • ¿En qué aplicaciones se recomienda utilizar SPI y en cuales I2C?
    • ¿Cómo se manejan los errores de comunicación en un protocolo?
    • ¿Qué es el bit de inicio?
    • ¿Qué es un checksum?
    • ¿Qué es un frame?
    • Explica como has usado protocolos de comunicación en los proyectos
  5. Muchas entrevistas se enfocan en como resuelves problemas desde el punto de vista funcional, tanto en cuestiones técnicas como en interacción humana por medio del trabajo en equipo. Esto con preguntas del tipo:
    • ¿En una situación donde un miembro del equipo genera conflictos contigo como lo resolverías?
    • ¿Cuáles son los problemas que has tenido para organizar un equipo de trabajo?
    • ¿Cuál ha sido tu mayor reto al trabajar en un equipo?
    • ¿En que proyectos has trabajado? ¿A grandes rasgos que se hace en ellos?
          En esta parte pudes describir proyectos personales, y académicos en el caso que no tengas una experiencia previa de trabajo. Y si ya has tenido un trabajo anteriormente se vale decir con qué tecnología trabajaste, y mas o menos de que va para no violar las clausulas de exclusividad y temas de esa índole.
    • Si te toca hacer un ejercicio técnico en conjunto, intenta explicar tu lógica para resolverlo de la mejor manera, nosotros sabemos que no es muy fácil escribir código y que funcione a la primera, pero si tienes el panorama general bien claro desde el principio y planteas la solución de la mejor manera, la codificación será lo  de menos importancia.

Espero que esta información sea de utilidad para alguien, aquí si se necesita un poco de esfuerzo y mucha suerte, sobre todo para conseguir un primer empleo. Un consejo para mover la estadística a favor es tener un buen perfil en linkedIn y agregar a los headhunters/RRHH de empresas de tecnología así como ingenieros que  ya estén desarrollando. Sin temor, y sin vergüenza. 

Por el momento me despido, intentaré actualizar este post cada que pueda. 

Les dejo una lista de lugares donde pudran encontrar solución a algunas de estas preguntas, y muchas más para prepararse. 

Top 18 Embedded Systems Interview Questions & Answers

Embedded C interview questions

Embedded C Interview Questions

 

<-Anterior  Siguiente->

 

 

Yocto Project II. Primera configuración de sistema y compilación.

 Se dice que la mejor manera de aprender a programar es programando, el mismo principio se sigue respetando para cuestiones de sistemas oper...