c embedded

c - Entrar en Embedded



(12)

Estoy tratando de familiarizarme con el campo incorporado, pero también tengo recursos limitados en términos de tiempo y equipo para comprar.

  • ¿Cuál es un buen lenguaje para envolver mi cabeza alrededor de incrustado, sin invertir demasiado tiempo apoyado en un lenguaje incrustado específico? Estoy más familiarizado con PHP, Java, Actionscript, pero desafortunadamente sé muy poco C. Recuerdo haber leído en alguna parte que alguien usó PERL para programar sistemas integrados, pero no estoy seguro de si eso es realmente posible.

  • ¿Se puede aprender sin necesidad de comprar chips, etc. a través de simuladores o algo así?

  • ¿Alguien puede recomendar una hoja de ruta simplificada para mostrar cómo se iniciaría uno? Estoy un poco inseguro de por dónde empezar.


¿Cuál es un buen lenguaje para envolver mi cabeza alrededor de incrustado, sin invertir demasiado tiempo apoyado en un lenguaje incrustado específico?

Como todos sugerirán: C. Ahora, dependiendo de qué tan profundo vayas a profundizar en la plataforma de tu elección, es posible que también necesites un poco de ensamblaje, pero no te asustes por eso: normalmente solo usarás un poco.

Si está aprendiendo C, mi sugerencia personal es: trabaje como lo haría en la asamblea; El lenguaje de programación no le dará muchas abstracciones, así que piense en términos de administración de memoria. Cuando hayas aprendido cómo hacerlo, avanza hacia abstracciones y vive feliz.

C ++ también es popular en las plataformas integradas, pero en mi humilde opinión es difícil, a menos que sepa bien cómo programar en C, también puede comprender lo que está bajo el capó de su abstracción.

Cuando se sienta seguro con C / C ++, puede comenzar a meterse con los sistemas operativos integrados. Notará que pueden ser totalmente diferentes del sistema operativo que elija (por ejemplo, no todos los sistemas operativos tienen una biblioteca estándar de C , procesos y división entre el espacio de usuario y el espacio de núcleo).

Aprenderás cómo construir un compilador cruzado, cómo meterte con los scripts del enlazador, los trucos de los formatos binarios y muchas cosas geniales.

Para el punto de vista teórico, también hay muchas cosas: si estudias Informática, puedes obtener una maestría en sistemas integrados.

¿Se puede aprender sin necesidad de comprar chips, etc. a través de simuladores o algo así?

Sí: muchos sistemas operativos pueden ejecutarse en simuladores como qemu .

¿Alguien puede recomendar una hoja de ruta simplificada para mostrar cómo se iniciaría uno? Estoy un poco inseguro de por dónde empezar.

Intenta conseguir un sistema operativo simple que pueda ejecutarse en emuladores, hackéalo y sigue tu curiosidad. No tengas miedo de jugar con el código nudoso.


  1. El alcance de la computación integrada ha crecido mucho, por lo que las respuestas dependen un poco del tipo de dispositivo al que apuntas. En un extremo, hay controladores de 8 bits con solo unos pocos KB de memoria, generalmente programados completamente en ensamblaje o C. En el otro extremo, los procesadores como los de su enrutador son bastante potentes (200 MHz y algunos MB de RAM) no es infrecuente) y, a menudo, ejecuta un sistema operativo como Linux, lo que significa que puede usar casi cualquier idioma, aunque C y Java son los más comunes.

  2. Es mejor comprar un chip real y experimentar. La mayor parte del trabajo involucrado es, por lo general, conocer un dispositivo y saber cómo interactuar con él, por lo que usar un simulador no sirve para nada.


1) La mayoría de las veces, para la mayoría y, generalmente, el sistema integrado de gama baja, necesita conocer C.

Y todavía le recomendaré que obtenga una tarjeta de desarrollo de vainilla para familiarizarse con el flujo de trabajo y la parte complicada de trabajar con un sistema integrado como depuración y compilación cruzada. Se encontrará con problemas si solo confía en el emulador.

Puede probar The Linux Stamp, no es caro y es bueno para principiantes, pero necesita conocimientos previos sobre Linux.

2) Para un sistema integrado de gama alta, un buen ejemplo es el Smartphone de HTC (la velocidad de la CPU puede alcanzar 1Ghz) o algún otro teléfono Android que se ejecute rápidamente e incluso puede codificar Java en él.



En cuanto al idioma, C es probablemente el idioma más importante de saber. Desde Java, debería poder adaptarse, pero recuerde que una gran cantidad de Java de alto nivel no estará disponible para usted. Hay un montón de libros de texto por ahí pero recomendaría el libro de programación en C original de Kernighan y Ritchie http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)

Para una buena introducción a C incrustada, puedes probar un libro de Michael J Pont:

http://www.amazon.com/Embedded-C-Michael-J-Pont/dp/020179523X

En cuanto a la parte incorporada de las cosas, podría comenzar con Microchip, el IDE está bien para desarrollarse con un simulador razonable, y los compiladores c son gratuitos para las ediciones de los alumnos C18 y C30, ligeramente limitadas, el instalador del IDE también le preguntará si desea instalar un compilador HI-TECH C de terceros que pueda utilizar. En cuanto al procesador, recomiendo seleccionar un PIC estándar de la serie 18, como el PIC18F4520.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

Cualquiera que sea el fabricante de chips, debe conocer las hojas de datos. No tienes que aprenderlo todo de una vez, ¡pero lo necesitarás a mano!

Incrustado, como la mayoría de la programación, tiende a girar en torno a:

1) inicializar un recurso, en este caso, en lugar de que los datos provengan de un almacén de datos, son de registros de computadora. Solo incluya el archivo de encabezado del procesador (.h) y le permitirá acceder a estos como puertos (generalmente bytes) o pines (bits). Además, los microprocesadores vienen con recursos útiles en el chip, como temporizadores, convertidores analógico a digital (ADC) y sistemas de comunicaciones en serie (UART). Recuerde que el chip en sí es un recurso y necesita inicializarse antes que cualquier otra cosa.

2) utilizando el recurso. ¡C le permitirá hacer que los datos sean lo más globales posible y todo puede acceder a todo en cualquier momento! Evite esta tentación y manténgala modular, como Java lo habrá alentado (aunque para la velocidad es posible que deba estar un poco más relajado con respecto a estas reglas).

Pero tienen un arma adicional llamada interrupciones que puede usarse para proporcionar un comportamiento en tiempo real. Estos pueden pensarse un poco como eventos OnClick (). Las interrupciones pueden generarse por eventos externos (por ejemplo, botones o recibir un byte de otro dispositivo) e internos (temporizadores, transmisiones completadas, conversiones de ADC completadas). Mantenga las rutinas de servicio de interrupción (ISR) cortas y fáciles de usar, úselas para manejar eventos en tiempo real (por ejemplo, tome un byte recibido y almacénelo en un búfer y luego levante una bandera), pero permita que el código de fondo lo resuelva (por ejemplo, verifique un byte recibido bandera, si se establece a continuación, lea el byte recibido). ¡Y recuerde la gran importancia de las variables utilizadas por las rutinas ISR y las rutinas de fondo!

De todos modos, lea, recomiendo www.ganssle.com para obtener consejos en general.

¡Buena suerte!


Hay algunas lecciones de programación incorporadas que se trasladan de una plataforma y estilo a otra, pero es realmente un campo amplio. Diferentes procesadores pueden requerir tácticas muy diferentes, y diferentes aplicaciones pueden dictar tanto tácticas de diseño de firmware diferentes como microcontroladores diferentes. Aquí hay algunas cosas para comenzar ...

msp430

Texas Instruments tiene varios kits de desarrollo USB muy económicos que llaman EZ430 y están basados ​​en su familia de microcontroladores MSP430. El más simple tiene un msp430 f2013, que tiene 2K de espacio de programa flash, 3x128 bytes de usuario flash utilizable (existe otra página de 128 bytes, pero es especial), 128 bytes de RAM (sí, 128 bytes pero es suficiente para muchas cosas) ), y 16 registros de CPU (algunos de estos son propósitos especiales, como el puntero de pila, el puntero de instrucción, el registro de estado y tal vez uno o dos más). Los MSP430 también tienen varios registros de funciones especiales asignados en memoria que se utilizan para configurar y controlar los periféricos integrados. Los MSP430 son procesadores de von Newman, por lo que todo vive en un espacio de direcciones. Estos cuestan alrededor de $ 20 dólares tanto para el programador como para una pestaña extraíble (tarjeta de PC) que contiene el msp430 f2013. Por aproximadamente $ 10 dólares, puede obtener 3 pestañas de reemplazo con msp430 2012, que es compatible con el pin 2013 (en su mayoría) y tiene algunos periféricos diferentes. Estas pestañas tienen un LED, un botón y varias vías grandes (orificios en la placa de la PC) que están conectados al pin del procesador. Estas vías son fáciles de soldar cables incluso si nunca ha soldado antes; debido a la acción capilar, las vías simplemente aspiran la soldadura fundida y, mientras está caliente, solo pueden pinchar el extremo de su cable allí.

También tienen un par de kits similares con radios 802.15.4. Incluso si no está interesado en la radio, puede estar interesado en estos porque su programador también tiene un UART extraído de la pestaña extraíble y es compatible con las pestañas utilizadas en los otros kits mencionados anteriormente. Estos kits también contienen al menos una placa programable adicional y un paquete de baterías para ello. (Uno de estos kits puede contener más, pero no tengo el mío en este momento y no lo voy a buscar).

También tienen un kit que tiene un reloj programable como plataforma objetivo. Nunca he tenido uno de estos, pero tienen una pantalla, acelerómetros y varias otras cosas geniales, pero esto puede abrumarlo para su primer proyecto. Sugeriría uno de los kits anteriores para comenzar con MSP430s.

Puede obtener compiladores de C gratuitos y entornos de desarrollo para MSP430s en forma de KED de Embebido de Trabajo Integrado de IAR (4 MB de espacio de programa limitado), Code Composer Studio (también tamaño de programa limitado, pero un límite superior, creo), y gcc / gdb para El MSP430. El arranque rápido de IAR es bastante fácil de comenzar rápidamente, aunque no es perfecto. Es posible que tenga que apagarlo, desconectar su USB EZ430, reiniciar IAR y volver a enchufarlo para que vuelva a funcionar. O quizás algún orden diferente funcionará mejor para ti.

TI también proporciona muchos ejemplos en archivos con mal nombre (todos sus archivos descargables hacen todo lo posible para que no se les nombre). Tenga cuidado: los MSP430 similares pueden tener diferentes interfaces de registro de control de dispositivos para periféricos similares, lo que puede ser confuso. Asegúrese de que cualquier documento o ejemplo que esté leyendo realmente se aplique al microcontrolador que está utilizando.

otros sistemas pequeños

Hay muchas otras muchas familias de procesadores y kits con los que puede ir, y probablemente debería saber al menos un poco sobre ellos.

AVR: arquitectura Harvard de 8/16 bits de Atmel. Harvard se refiere a espacios de direcciones separados para código y memoria de trabajo. Tiene 32 registros de 8 bits, algunos de los cuales se pueden usar en pares como registros de 16 bits. Es un procesador muy popular y muy bueno. Algunos de los más pequeños solo tienen registros sin RAM adicional, lo que da miedo. Atmel también tiene un AVR32 que no se parece en nada al AVR. A menos que haga uso de un gestor de arranque existente capaz de cargar su nuevo código, necesitará obtener una unidad JTAG para estos.

8051 - Esto es viejo como las colinas y un dolor en el trasero para usar hasta que finalmente lo entiendas. Es un procesador de 8/16 bits, con muchos más límites en la forma de hacer matemática de 16 bits y solo tiene 1 par de registros que pueden actuar como punteros. Tiene 3 espacios de direcciones separados (pila, memoria global y código) y muchas características extrañas (en comparación con otras arquitecturas). El nivel bajo puede no significar mucho para usted si está programando en C, excepto que las operaciones de C muy simples pueden convertirse en mucho más código del que pensaba. Usted no quiere comenzar en uno de estos, lo más probable.

hélice: el procesador de múltiples núcleos muy interesante de Parallax, que es muy diferente a otros procesadores. Tiene varios núcleos que actúan en su mayoría de forma independiente y se pueden usar para simular periféricos o realizar tareas de computación más tradicionales. Nunca he usado uno de estos, aunque me gustaría. Nunca tuve una tarea que pareciera encajar. Tienen su propio lenguaje de alto nivel para programarlos, así como el lenguaje de ensamblaje del procesador.

sistemas más grandes

Después de salir de los procesadores de 8/16/24 bits, comienza a desenfocar las líneas entre la programación integrada y la de escritorio, incluso si está integrada técnicamente.

AVR32 - Hay 2 versiones principales de estos. Una es una arquitectura de Harvard y la otra es von Newman. La versión de von Newman es esencialmente mejor ARM que ARM, pero no es tan popular como ARM. Hasta donde puedo decir, fue diseñado con "ejecutar Linux" en mente, aunque no está vinculado a él de ninguna manera loca. Solía ​​ser capaz de obtener tableros de desarrollo baratos para estos y el código a menudo es casi tan fácil de cargar como copiar archivos de una PC a otra, aunque probablemente utilice uboot y tftp para realizar algunos trabajos. JTAG solo es necesario cuando desordenes el cargador de arranque. Creo que todos estos tienen soporte para la aceleración JAVA nativa. www.AVR32.org

ARM - El procesador integrado más popular. Hay muchas versiones de estos. Algunos no tienen una MMU (unidad de gestión de memoria) y otros no. Hay mucho que decir sobre ellos. Algunas versiones tienen aceleración JAVA nativa, aunque creo que los señores ARM no dicen libremente todos los detalles de cómo usarla, por lo que tiene que encontrar una JVM que sepa cómo usarla. Muchos proveedores los fabrican, incluidos Atmel, Freescale, Intel y muchos otros.

MIPS - Un procesador muy RISC. El más peligroso.

Hay muchos otros

Estilos de programación

Podría escribir 3 libros sobre esto, pero la regla general es hacer las cosas tan simples como la aplicación pueda permitirle. Una excepción a esto es que si puede hacer uso fácilmente de un sistema operativo puede querer usarlo si simplifica su tarea.


Imagine su controlador integrado sentado en un circuito apagado ...

  1. Se aplica la alimentación Vcc y el circuito de reset confirma la señal de reset .

  2. Los relojes han alcanzado velocidades de funcionamiento y se han estabilizado los voltajes, por lo que se reset .

  3. Ahora su controlador establece su indicador de instrucción en el "vector de reinicio", que es la dirección física 0xE0000000 en este chip en particular. El controlador obtiene las instrucciones en ese lugar.

  4. Las interrupciones están deshabilitadas, y la primera tarea es inicializar registros como el puntero de pila. En algunos chips, hay marcas de bits (por ejemplo, bandera de dirección x86) que deben borrarse o configurarse.

  5. Una vez que los registros y los bits de bandera se configuran correctamente, es posible que se ejecuten las rutinas de servicio de interrupción. A estas alturas, debemos haber ejecutado el código en la ubicación 0xE0000072 cuando lleguemos al código que habilita las interrupciones al alternar primero algunos pines GPIO al controlador de interrupciones externo, luego habilitar la máscara de interrupciones de la CPU.

  6. En este punto, el equivalente de "controladores de dispositivo" se está ejecutando en forma de rutinas de servicio de interrupción. Suponiendo que el entorno C tenga una biblioteca que coincida con las interfaces de las estructuras de datos de estas rutinas, ahora nuestro código del cargador de arranque puede saltar a la función main() de algún código de objeto C.

En otras palabras, el código que nos llevó desde el encendido hasta main() y que maneja la E / S de bajo nivel, está escrito en el ensamblador peculiar del chip que elija. Esto significa que si desea ser versátil en la programación integrada, debe saber cómo implementar el código de ensamblaje a partir del vector de reinicio.

La realidad es que la programación incrustada de aficionados no da tiempo para implementar todos los ISR y el código del cargador de arranque. Por esta razón, muchas personas usan marcos de software estándar disponibles para chips específicos. Otros usan chips de lenguaje personalizado como el BASICstamp. El BASICstamp es un chip integrado que aloja un intérprete de lenguaje BASIC a bordo. El intérprete y todos los ISR están escritos previamente para usted. El entorno BASIC le brinda la capacidad de controlar pines de E / S, leer voltajes, todo lo que puede hacer desde el ensamblaje con un controlador integrado, pero un poco más lento.



Lo primero que debe saber al responder esta pregunta es "¿QUÉ ES" un sistema integrado? Una definición GENERAL sería un sistema informático dedicado a un único propósito específico. Esto no limita el tipo de hardware que puede usar, de hecho, las "PCs incrustadas" se han usado durante años. El sistema operativo QNX en tiempo real ha existido desde principios de los años 80 y se ha utilizado en PC industriales para aplicaciones integradas durante años. Personalmente lo he usado en sistemas de control para acerías. Medidores de espesor XRAY. Por otro lado, actualmente uso los DSP de TI sin ningún soporte de sistema operativo y solo uso 256K de RAM. Otro ejemplo sería el llavero para tu coche. Los viejos solían usar un microcontrolador PIC de Microchip. (Ese es en realidad el nombre de la compañía).

Algunas personas consideran que el iPhone es un sistema integrado, pero debido al hecho de que puede cargar aplicaciones para hacer casi cualquier cosa, tiendo a decir que es una computadora de mano con capacidades de teléfono. Un teléfono celular OLD DUMB que es solo un teléfono, no PDA es un sistema integrado. Eso es sólo un poco de filosofía.

Como regla general, hay algunos conceptos que necesita comprender para la programación de sistemas integrados, y la mayoría de ellos se pueden explorar en una PC.

EDITAR: La RAZÓN por la que se recomienda C o C ++ es que C en sí fue diseñada para realizar la programación de sistemas. C ++ mantiene todas sus ventajas, pero agrega capacidades para la programación OOP. Algunos ASM tal vez se requieren en algunos sistemas. Sin embargo, muchos proveedores de chips, como TI, proporcionan herramientas que básicamente hacen posible hacer todo el sistema en C ++. : EDICIÓN FINAL

Muchos de los sistemas embebidos simples se parecen más o menos así:

While(true) // LOOP FOREVER... There is no command prompt { // Typically you want I/O to occur on fixed "timebase." wait(timerTick); readDigitalIO(&dioStruct); readAnalogIO(&aioStruct); // Combine current system state with input values // and do some useful calculations. (i.e. Analog input to temperature calc) Process(dioStruct,aioStruct,&CurrentState); // This can be a serial output/audio buzzer/leds/motor controller // or Whatever the system REQUIREMENT call for. driveOutputs(CurrentState); // The watchdog timer resets your system if it gets stuck. petWatchDogTimer(); }

No hay nada aquí que no puedas hacer usando la PC. (Bueno, una PC que todavía tiene un puerto paralelo de todos modos. Que es más o menos un puerto DIO). En un sistema simple sin un sistema operativo, esto podría ser todo lo que hay. En un sistema basado en RTOS, es posible que tenga varias tareas que parezcan un tanto similares a esto, pero que pasen datos entre las tareas.

Las partes interesantes surgen cuando tiene que interactuar con el hardware, el primer trabajo que tuve fuera de la universidad fue escribir un controlador de dispositivo para una placa de adquisición de datos bajo QNX.

Conceptos básicos de manejo de hardware o controladores de dispositivo (con los que puede experimentar al piratear el código de la unidad de dispositivo de Linux que está disponible de forma gratuita), la mayoría del hardware se parece al programador como una dirección de memoria. Esto se llama "Memoria asignada de E / S". ¿Qué significa esto? Vamos a usar un puerto serie como ejemplo:

// Serial port registers definition: typedef struct { unsigned int control; // Control bits for the port. unsigned int baudDiv; // Baud rate divider. unsigned int status; // READ Status bits/ Write resets fifos; char TXdata; // The head of the hardware TX fifo. char RXdata; // The tail of the hardware RX filo. } serRegs; // Using the volatile keyword to indicate the hardware can change the value // independantly from the software. volatile serRegs *Ser1 = (serRegs *)0x8000; // Hardware exists at a specific location in memory. volatile serRegs *Ser2 = (serRegs *)0x8010; // Hardware exists at a specific location in memory. // Bits bits 15-12 enable interupts and select interupt vector, // bits 11-8 enable,bits 7-4 parity,bits 3-0 stop bits. Ser1->status = 1; // Reset fifos. Ser1->baudDiv = CLOCKVALUE / 9600; // Set the baudrate 9600; Ser1->control = 0x1801; // Enable, 8 data, no parity, 1 stop bit. // Write out a "OK/r/n" message; (Normally this would be a loop.) Ser1->Txdata = ''O''; // First byte in fifo Transmission starts. Ser1->Txdata = ''K''; // Second byte in fifo still transmitting first byte Ser1->Txdata = ''/r''; // Third byte in fifo still transmitting first byte Ser1->Txdata = ''/n''; // Fouth byte in fifo still transmitting first byte

Normalmente, tendría una función o un controlador de interrupciones para manejar la transmisión de datos por TX, pero, por ejemplo, quería señalar que el hardware funciona mientras el software sigue funcionando. Básicamente, el hardware funciona como, escribo un valor en una dirección y "STUFF" ocurre independientemente del software. Este es quizás uno de los conceptos clave para la programación integrada, cómo hacer que la computadora realice un cambio en el mundo real.

EDITAR:

Si realmente desea obtener una tarjeta barata, la tendencia actual de los desarrolladores de Micro es poner un kit de desarrollo en una memoria USB. Esta página tiene información sobre varias, desde 8 bits hasta arquitecturas ARM: http://dev.emcelettronica.com/microcontrollers-usb-stick-tool

El PSOC de Cypress fue uno de los primeros en hacer esto con el "FirstTouch Starter Kit". El PSOC es una parte única porque tiene un microcontrolador y "Bloques analógicos y digitales configurables" que le permiten desplegar un ADC, un puerto serie o E / S digital usando una interfaz gráfica de usuario y configura automáticamente su aplicación C para usarlo. Los PSOC también están disponibles en paquetes DIP, lo que los hace fáciles de usar en el tablero de prototipos de un prototipo.


Necesitas saber C (¡pero cada programador necesita saber C!)

La mayoría de estas plataformas tienen un simulador / emulador, pero como el objetivo es aprender aplicaciones reales y problemas reales (que tienen que ver con problemas de tiempo en el mundo real), entonces usted quiere un tablero real.

Es probable que también desee un osciloscopio (un alcance analógico lento de n nthth muy económico) y tiene alguna idea de cómo usarlo.

La forma más fácil de ingresar es Arduino , quizás más profesional pero un poco más difícil es el launchpad MSP430


Sí, Arduino sería el camino a seguir. De acuerdo. Barato (alrededor de $ 20 para comenzar) y tiene una gran API para comenzar con funciones de alto nivel. C es una necesidad, sin embargo, no se puede evitar. Pero si puedes programar en otros idiomas, estarás bien.

Mi recomendación es comenzar a comprar en http://www.sparkfun.com muchos ejemplos para trabajar y consejos útiles sobre qué dispositivos comprar.


  • C y el conjunto específico de tu chip.

  • No, realmente necesitas un chip real. Los simuladores no son lo real. Debe ser capaz de lidiar con el jitter de pulsación de tecla, el funkyness de voltaje, etc.

  • El Arduino es la moda actual para los aficionados incrustados. No soy un gran fan de la arquitectura de Harvard, personalmente. Pero encontrarás montones de ayuda por ahí. Utilizo un XCore para mi trabajo de tesis y me ha resultado muy fácil programar cosas de varios núcleos. Yo sugeriría comenzar con un AVR32 e ir de allí.