Páginas

domingo, 12 de febrero de 2012

[Emb Comp Class] Tarea Intro: Lenguaje Ensamblador

Este es mi reporte sobre la Tarea Intro, programar en Lenguaje Ensamblador una rutina, y analizarla para entender un poco sobre las funciones de este lenguaje.

Para este reporte decidí realizar una rutina algo común, es un factorial recursivo. Lo siguiente es el código en C:



Después de eso, hay que compilarlo para obtener el código en Ensamblador, esto con la instrucción:
gcc -S factorial.c
Este es el resultado:



Después, lo siguiente fue optimizar el código, eliminando aquellas instrucciones que no fueran necesarias, la mayoría de las lineas que elimine fueron etiquetas debug y algunos movimientos de memoria innecesarios.
Cuando recién compilamos aparecerán muchas líneas basura, la mayoría comienzan con .cfi, todas esas líneas podemos eliminarlas.
Algunas etiquetas como .file, .type, tambien podemos suprimirlas
También elimine algunos intercambios de registros innecesarios, por ejemplo, el return de la función factorialRec realizaba los siguientes movimientos:
mov %eax, 12(%esp)
mov 12(%esp), %eax
Este procedimiento lo elimine porque no tenia sentido hacer ese intercambio.

El nuevo código en Ensamblador es el siguiente:



Lo siguiente son las diapositivas que explique en clase, lo dejo como evidencia y por si quieren visualizar algo, la mayoria de la informacion que les comparto se encuentra en la siguiente liga: Lenguaje Ensamblador Teoría



Cualquier comentario, sugerencia o aclaracion, dejen un comentario.

Referencias: AQUI

sábado, 11 de febrero de 2012

[Emb Comp Lab] Lenguaje Ensamblador (Assembly)

"Es un lenguaje de programación de bajo nivel. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. 
Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico a cierta arquitectura de computador física (o virtual).


Mnemónico: es un dato simbólico que identifica a un comando generalmente numérico (binario, octal, hexadecimal) de una forma más sencilla que su numeración original, lo cuál facilita radicalmente la memorización de este comando para el programador.

Características

  • Es un lenguaje de bajo nivel.
  • El lenguaje ensamblador es difícilmente portable. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.
  • Los programas en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.
  • Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.
  • Por lo general, cada arquitectura tiene su propia "versión" de ensamblador, es muy probable que un código escrito para cierta arquitectura no pueda ser ejecutado en otras, sino que sera necesario reescribir todo el código.


Obtener Assembly desde C

Desde la terminal tecleamos:
gcc -S nombreDelCodigo.c
Esto genera un archivo con terminacion .s que contiene el código en Assembly

Compilar Assembly

Desde la terminal tecleamos:
gcc -o nombreDelEjecutable nombreDelCodigo.c
Para ejecutar tecleamos:
./nombreDelEjecutable

Algunos conceptos


Stack



Stack Frame o en español Marco de Pila es un espacio en la memoria donde, de manera temporal, se almacena la información utilizada por una función para poder recuperarla después.

Principalmente, almacena 3 cosas:
  • Parámetros de una función
  • Variables locales
  • La dirección de retorno

Registros



os registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo de la arquitectura.

El registro %ebp (base pointer), apunta a la base del stack de la función que se esta ejecutando

El registro %esp (stack pointer), apunta a la cima del stack de la función que se esta ejecutando.

Registros de uso general

  • AX: Registro acumulador, dividido en AH y AL (8 bits cada uno).- Interviene en las operaciones aritméticas y lógicas, después de la operación arroja un resultado.
  • BX: Registro base, dividido en BH y BL.- Se utiliza en transferencias de datos entre la memoria y el procesador.
  • CX: Registro contador, dividido en CH y CL.- Se utiliza como contador en bucles(LOOP), en operaciones con cadenas(REP), y en desplazamientos(CL).
  • DX: Registro de datos, dividido en DH y DL.- Se utiliza en operaciones de multiplicación y división junto con Ax y en operaciones de entrada y salida de puertos, su mitad inferior DL contiene el número de puertos.

Registros de segmento

Un registro de segmento se utiliza para alinear en un limite de párrafo o dicho de otra forma codifica la dirección de inicio de cada segmento y su dirección en un registro de segmento supone cuatro bits 0 a su derecha. Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamientos conocidos como el segmento actual. Los registros de segmento son: CS (código), DS (datos), SS (pila), ES , FS y GS.

Registro Apuntador de instrucciones (IP)

El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta.

Registro índice

Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y restas. Que son las operaciones de punta.

Registro de bandera (EFLAGS)

Los registros de banderas sirven parar indicar el estado actual de la maquina y el resultado del procesamiento, Cuando algunas instrucciones piden comparaciones o cálculos aritméticos cambian el estado de las banderas.

Ejecución del Código


1. Push Parameters: Los parámetros de la función que fue llamada son empujados al stack, al mismo tiempo se lleva un registro de los bytes ocupados por los parámetros y se almacena el offset en donde se encuentran. Esto sirve para las labores de limpieza posteriores.

2. Call the function: El procesador empuja el registro %EIP (Instruction Pointer) dentro del stack, el cual apunta al primer byte después de la llamada a la función (instrucción CALL). Después de que termina la ejecución de la función, esta pierde el control y lo pasa a la función desde la cual fue llamada.

3. Guardar y actualizar el registro %ebp: Ahora estamos preparados para la nueva función, necesitamos reservar el stack local de la misma; lo anterior se logra guardando el %ebp que pertenece a la función anterior y que el apuntador %esp apunte al tope del nuevo stack. A esto se le llama prologo, sus instrucciones son:
push ebp mov ebp, esp
4. Guardar los registros del CPU: : Si la función necesita utilizar registros del CPU, se deben guardar los anteriores. Se empujan uno a uno a la pila. El compilador debe recordar este paso para poder recuperarlos después.

5. Reservar el espacio para las variables locales: A esto se le conoce como "enderezar la pila o alinear la pila". La función realiza una suma del espacio que utilizaran las variables (caracteres = 1byte, enteros = 4bytes), se suma su tamaño en bytes y la función decrementa el apuntador %esp en grupos de 4bytes hasta alcanzar el tamaño calculado. Entonces, las variables locales se alojan entre el registro %ebp y el registro %esp.

6. Ejecutar la tarea de la función: En este punto el stack ya esta construido, mas o menos asi:

La función es libre de utilizar todo registro dentro del stack, con ellos puede realizar todas las operaciones para las cuales fue creada.

7. Liberar el espacio temporal: Una vez que la función termina su ejecución primero debe liberar el espacio alojado por sus variables. Esto de logra con algunas operaciones POP.

8. Restaurar los registros guardados: Deben ser restaurados en el mismo orden en el cual fueron guardados, para ello se utilizan algunas operaciones POP.

9. Restaurar el puntero al registro base anterior: En el stack hemos guardado el puntero al registro %ebp del anterior stack, esto es hacer que %esp apunte a %ebp y despues hacemos POP a %ebp. Con ello destruimos el stack de la función recién concluida y restauramos el stack de la función anterior. A esto se le llama epílogo y las instrucciones son:
mov esp, ebp pop ebp
Que es equivalente a la instrucción
LEAVE
10. Regresar el control a la función anterior: La instrucción RET saca (POP) el registro %eip del stack y entonces la ejecución salta a esa ubicación, regresando el control a la función padre.

11. Limpiar los parámetros introducidos al inicio: Con algunas instrucciones POP, se sacan los parámetros introducidos en el stack. La función recuerda el offset de inicio y final para sacarlos a todos rápidamente.

Para entender un poco mejor estos conceptos les dejo el siguiente código en C. El código en ensamblador tiene comentarios para su mejor análisis.
Referencias

viernes, 10 de febrero de 2012

[MDE Lab] Historia y Evolucion de los Dispositivos Moviles



Definir lo que es un dispositivo móvil es una tarea difícil, se trata de un concepto bastante generalizado que abarca un gran conjunto de productos.

Pero a grandes rasgos podemos definir un dispositivo móvil como aquellos aparatos lo suficientemente ligeros para ser transportados cómodamente por una persona, y que disponen de una batería que les otorga autonomía para funcionar.
Normalmente tienen prestaciones muy limitadas. En este caso, una laptop o computadora cualquiera no se considera dispositivo móvil.

Clasificación

  • 1. Teléfonos: Son los mas pequeños y portátiles. Su función principal es la de ofrecer un medio de comunicación continua para realizar llamadas y recibir mensajes. Actualmente existe una gama alta de teléfonos denominados Smartphones que proporcionan herramientas mas especializadas y una conectividad completa.
  • 2. Asistentes Personales: Su funcionalidad principal era la de servir como organizadores de agenda, eventos, calendario, contactos, etcétera. Actualmente han sido rebasados por los smartphones y las tabletas.
  • 3. Videojuegos: Esta clasificación es relativamente nueva, sin embargo, se ha decido integrar ya que las consolas de ultima generación proporcionan una buena conectividad a Internet, funciones organizadoras y aplicaciones.
  • 4. Tablets: Son productos relativamente nuevos, es un mercado emergente orientado a un grupo especial de personas que buscan algo mas que un smartphone sin llegar a una laptop. Su principal desventaja es su alto precio. Proporcionan las mismas funciones que un teléfono inteligente, pero combinan una pantalla mas grande.


Un poco de historia...




Para mucha gente, el primer dispositivo portatil fue un asistente personal llamado Newton. Fue la primera platafoclasicorma móvil desarrollada por Apple justo por detrás de iOS. En su momento fue un gran producto, tan revolucionario, que fracaso completamente debido al selecto mercado existente.

El siguiente paso se considera que lo dieron las calculadoras fabricadas por HP y Casio. Estas calculadoras tenían capacidades de sincronización con computadoras de escritorio y poseían capacidades gráficas y accesorios.

El siguiente paso lo hicieron las llamadas PocketPC o PDA, un segmento de los dispositivos móviles que en su momento PALM lidero. Pero en realidad, el éxito de estos dispositivos fue su alta conectividad con Windows, las tareas de sincronización eran sencillas y poseían una buena conectividad, desde el clásico IrDA hasta el Wi-Fi, pasando por el Bluetooth.


Sin embargo, los reyes de los dispositivos moviles son los telefonos.



El teléfono móvil se remonta a la época de la Segunda Guerra Mundial cuando Motorola desarrollo un equipo de comunicación llamado Handie Talkie H12-16, básicamente fue un sistema de comunicación por medio de ondas de radio, que comunicaba a los soldados en el campo de batalla.



En la actualidad, es mas fácil resumir la historia de los teléfonos móviles si los clasificamos por generaciones:

Generación 0

Es el comienzo de todo, y existe cierto discernimiento si en realidad los dispositivos de esta generación son en realidad dispositivos móviles. Son aparatos que utilizan las ondas de radio para comunicarse, como los Walkie Talkie.
Los estándares de comunicación en esta generación son:
  • PTT: Siglas de Push To Talk, pulsar para hablar
  • IMTS: Improved Mobile Telephone System.


Motorola DynaTac



Surgidos a partir de 1973 y con un tamaño y peso inmanejable, los móviles de primera generación funcionaban de manera analógica, es decir que la transmisión y recepción de datos se apoyaba sobre un conjunto de ondas de radio que cambiaban de modo continuo.
El hecho de que fueran analógicos traía consigo una serie de inconvenientes, tales como que solo podían ser utilizados para la transmisión de voz o su baja seguridad, la cual hacia posible a una persona escuchar llamadas ajenas con un simple sintonizador de radio o, incluso hacer uso de las frecuencias cargando el importe de las llamadas a otras personas.
A pesar de todo, esta fue la primera generación considerada realmente como de teléfonos móviles.
Estándares más utilizados:
  • NMT: Nordic Mobile Telephone
  • AMPS: Advaced Mobile Phone System


Al contrario de lo que pasa en otras generaciones, la denominada ”segunda generación” no es un estándar concreto, sino que marca el paso de la telefonía analógica a la digital, que permitió, mediante la introducción de una serie de protocolos, la mejora del manejo de llamadas, más enlaces simultáneos en el mismo ancho de banda y la integración de otros servicios adicionales al de la voz, de entre los que destaca el Servicio de Mensajes Cortos (Short Message Service).
Estos protocolos fueron implementados por diversas compañías, siendo este hecho el origen de uno de los principales problemas de esta generación la incompatibilidad entre protocolos, debido a que el radio de utilización del teléfono quedaba limitado al área en el que su compañía le diera soporte.

Esta generación quedo marcada por el gran avance en los dispositivos móviles. Las empresas comenzaron a fabricar un sin numero de equipos con capacidades nunca imaginadas. Esto trajo consigo el boom de la telefonía móvil dado en el 2000.

Generacion 2.5G: Como tal no existe ningún estándar ni tecnología a la que se pueda llamar 2.5G o 2.75G, pero suelen ser denominados así a algunos teléfonos móviles 2G que incorporan algunas de las mejoras y tecnologías del estándar 3G como es el caso de GPRS y EDGE en redes 2G y con tasas de transferencia de datos superiores a los teléfonos 2G regulares pero inferiores a 3G.

Estándares más utilizados:
  • GSM: Global System for Mobile Communications - Sistema Global para Comunicaciones Móviles.
  • CDMA: Code Division Multiple Access - Acceso Múltiple por División de Código
  • GPRS: General Packet Radio Service - Servicio General de Radio por Paquetes


3G nace de la necesidad de aumentar la capacidad de transmisión de datos para poder ofrecer servicios como la conexión a Internet desde el móvil, la videoconferencia, la televisión y la descarga de archivos. En este momento el desarrollo tecnológico ya posibilita un sistema totalmente nuevo: UMTS (Universal Mobile Telecommunications System).

Esta es la generación dominante en la actualidad, trajo el mejoramiento de la conectividad y un gran incremento en el consumo de datos, la creación de dispositivos con mayores funciones y capacidades de procesamiento mas altas, los smartphones.
Pantallas mas grandes a color y táctiles, celulares con procesadores y gran poder gráfico, conectividad totalmente cubierta, dispositivos multifuncionales.

Sin embargo, esta generación se caracteriza por no quedarse solo para los dispositivos móviles, existen una gran cantidad de modems 3G que permiten conectar cualquier equipo a la red.

La generación 4 Generacion o 4G será la evolución tecnológica que ofrecerá al usuario de telefonía móvil un mayor ancho de banda que permitirá, entre muchas otras cosas, la recepción de television en Alta Definición.
Hoy en día no hay ningún sistema de este nivel que esté claramente definido, pero a modo de ejemplo podemos echar un vistazo a los sistemas LTE (Long Term Evolution).









Video-evolución de los celulares


Les comparto un vídeo bastante entretenido de la compañia Vodafone sobre la evolución de los celulares.

Evolucion de los Dispositivos Moviles (Infografia)


Esta imagen esta bastante grande como para embeberla en la entrada, sin embargo, den click en el siguiente enlace donde podran ver una excelente inforgrafia que explica la evolucion de las computadoras y dispositivos moviles.

-> Infografia Historia de las Computadoras

Referencias

jueves, 9 de febrero de 2012

[MDE Lab] Hardware Móvil

"Son aparatos de pequeño tamaño, con algunas capacidades de procesamiento, con conexión permanente o intermitente a una red, con memoria limitada, diseñados específicamente para una función, pero que pueden llevar a cabo otras funciones más generales."


Diferencias: Dispositivo móvil vs. Computadora

Siempre estamos buscando los mejores equipos, sobre todo cuando buscamos desarrollar algo para estos aparatos, buscar el dispositivo que mas se acomode a nuestras necesidades cada vez se vuelve cada vez mas difícil y la mayoría de las veces el precio es lo que determina cual adquirimos. Sin embargo, pagamos por algo que nunca utilizamos al 100%, por eso hay que conocer las especificaciones técnicas de los mismos para poder decidir sabiamente.

El hardware movil varia significativamente entre dispositivos, ya que estos estan orientados a diferentes mercados y necesidades. Vamos a analizar algunas caractetisticas generales.

Dispositivo Ventajas Desventajas
Celular
  • Liviano y muy pequeño
  • Muchas aplicaciones.
  • Realizar llamadas y una amplia conectividad.
  • Los precios varían dependiendo de sus capacidades.
  • El manejo es un poco difícil por el tamaño de la pantalla.
  • No te permite cambiar el sistema operativo.
  • Tienden a ser caros.
Tableta
  • Liviana, practica y portatil
  • Buena conectividad
  • Variedad de aplicaciones.
  • Es un poco dificil realizar trabajos complejos.
  • El precio es muy elevado.
  • No puede ser modificado
  • Portátil, pero siempre sera necesario tener una funda para transportarlos.
  • Es solo un sistema operativo y no lo podrás cambiar.
Computadoras
  • Alta capacidad de procesamiento, excelente para todo tipo de trabajo.
  • Altamente modificable, se le puede incorporar casi cualquier hardware.
  • Tienes una gama de precio a elegir muy variable.
  • Tiene una infinidad de programas a ser instalados y sistemas operativos.
  • Es portátil, pero siempre dara cierta incomodidad al tener que apoyarla en algun lugar para trabajar.
  • Tiende a ser un poco pesada.
  • La batería es de poca duración, siempre es necesario llevar el cargador.


Ahora analicemos las características de algunos smartphones, tabletas y computadoras portátiles:


Specs
Galaxy Note
Lumia 900
iPad
Galaxy Tab
Alienware M18x
Acer TimelineX AS5830TG
Precio $ 600dll $ tba $ 500dll $ 350dll $ 2000dll $ 1200
Sistema Operativo Android OS, v2.3 (Gingerbread) Microsoft Windows Phone 7.5 Mango iOS Android OS, v2.2 (Froyo), upgradable to v2.3 Windows 7 Ultimate 64bit Windows 7 Home Premium
Procesador Qualcomm MSM8660 Snapdragon, Dual-core 1.5 GHz Scorpion Qualcomm APQ8055 Snapdragon, 1.4 GHz Scorpion 1GHz dual-core Apple A5 Hummingbird, 1 GHz Cortex-A8 Intel® Core™ i7 2960XM Overclocked Turbo Boost to 4.0GHz (8MB Cache) Intel® Core™ i5-2430M (2.40GHz with Turbo Boost up to 3.00GHz, 3MB L3 cache)
GPU Adreno 220 Adreno 205 PowerVR SGX540 Dual 2GB GDDR5 NVIDIA® GeForce® GTX 580M nVIDIA GeForce GT 540M 1 GB
RAM 1 GB 512 MB RAM 512 GB 512 MB RAM 32GB Dual Channel DDR3 at 1333MHz (4DIMMS) 6GB
Almacenamiento 16GB storage and microSD, up to 32GB 16GB storage 16GB - 64GB 16/32GB andmicroSD, up to 32GB Up to 2000GB6 hard drive (5400RPM), Up to 1000GB6 SATA hard drive (7200RPM), Up to 512GB6 Solid State Drive SATA hard drive 750GB HDD
Pantalla Super AMOLED capacitive touchscreen, 16M colors, 800 x 1280 pixels, 5.3 inches AMOLED capacitive touchscreen, 16M colors, 480 x 800 pixels, 4.3 inches LED-backlit glossy widescreen Multi-Touch display with IPS technology, 1024-by-768-pixel, 9.7-inch (diagonal) TFT capacitive touchscreen, 16M colors, 600 x 1024 pixels, 7.0 inches WLED 1920 x 1080 18.4-inch Active Matrix TFT Colour LCD 15.6
Dimensiones y peso 146.8 x 83 x 9.7 mm, 178 g 127.8 x 68.5 x 11.5 mm, 160 g 241.2 x 185.7 x 8.8 mm, 601 g 190.1 x 120.5 x 12 mm, 380 g 53.00 x 322.00 x 436.00 mm, 5.41 kg 31.3 x 378.0 x 249.0 mm, 2.49 kg
Conectividad GSM, HSDPA, LTE, Bluetooth 3.0, Wi-Fi GSM, HSDPA, LTE, Bluetooth 2.1, Wi-Fi Wi-Fi, 3G, GSM/EDGE, Bluetooth 2.1 GSM, HSDPA, LTE, Bluetooth 3.0, Wi-Fi Gigabit Ethernet, Wi-Fi, Bluetooth 3.0 Gigabit Ethernet, Wi-Fi, Bluetooth 3.0
Bateria Li-Ion 2500 mAh, Stand-by 300 h, Talk time = 10 hr Li-Ion 1830 mAh, Stand-by 300 h, Talk time 7 h Li-Ion 25Watt, Up to 10 hours Li-Po 4000 mAh, Up to 25hr High Capacity 12-cell Lithium Ion (97whr) 6-cell Li-Ion 6000 mAh, Up to 9 Hour
Extras 8MP Camera, Accelerometer, gyro, proximity, compass, barometer, multimedia player 8MP Camera Accelerometer, gyro, proximity, compass, multimedia player 1.3MP Camera, Three-axis gyro, Accelerometer, Ambient light sensor, Digital Compass 3.15 MP Camera, Accelerometer, gyro, proximity, compass 3.0 Megapixel HD Video and Picture Camera, Microphone, HD Speakers. VGA Camera, microphone, stereo speakers


En mi opinión...


Como podemos ver en la tabla anterior, últimamente los smartphone y tables tienden a tener hardware equivalente, posiblemente sea por evolución natural, sin embargo, a pesar de las especificaciones estos nunca llegaran a tener el alto procesamiento de las computadoras

Alienware fabrica maquinas con una gran capacidad (tanto en procesador, gpu y ram), sin embargo, vemos que el precio se dispara por los cielos.
Asus ofrece una maquina con capacidades muy buenas y a mitad de precio.
Ahora, la relación precio-especificaciones no se obedece en los dispositivos mas pequeños, que tienden a encarecerse mas que nada por cuestiones de marketing, si nos podemos a pensar, los dispositivos pequeños tienen un alto nivel de producción, es decir, la demanda crece. En las laptops esto no es igual, la demanda es un poco menor lo cual se refleja en su precio.

Los dispositivos mas pequeños están orientados a un mercado especifico, un mercado que requiere conectividad y comunicación, esas 2 características combinado con la movilidad y portatibilidad que nos ofrecen los vuelven perfectos si queremos realizar tareas simples y navegar en Internet, pero no es recomendable si necesitamos altas capacidades de computo y rendimientos gráficos.
Las computadoras nos ofrecen ese alto nivel de computo, sin embargo, nos vemos a veces en la necesidad de detenernos para realizar cualquier actividad en nuestro equipo.

En mi opinión, un buen balance entre estos dispositivos nos ofrece la funcionalidad que necesitamos, lo mejor es que estos dispositivos (con la configuración correcta) son capaces de sincronizarse entre si y no tener la necesidad de dividir nuestros proyectos en tantos dispositivos.
Cuando sales de casa llevas tu teléfono, eso te permite estar siempre comunicado, posiblemente necesites realizar un pequeño trabajo (modificar una presentación por ejemplo), entonces usas tu tablet; necesitas programar y renderizar algunos gráficos, usas tu laptop. En mi opinión, entre celulares y laptops, y entre tablets y laptops si existe una linea bastante marcada que diferencía fácilmente para qué son cada una, sin embargo, a linea que divide a las tablets con los smartphones tiende a desvanecerse en ciertos momentos. Sin embargo, estas dos últimas clasificaciones se han vuelto las favoritas de los programadores.

Al proyecto...

He tomado la decisión de combinar el poder de un smartphone Android con una computadora (mi laptop) emulando un servidor.

No necesito un gran poder en ambos, pero el smartphone Android me ofrece la interfaz funcional y la laptop me ofrece la conectividad a internet que necesito. Pequeño y liviano, permitirá que el usuario prácticamente acceda desde cualquier parte de su casa a

Ahora, me gustaría también desarrollar algo para ese mercado especial de las tablets, mas que nada por la interfaz y visualización por lo que en realidad la alta capacidad pasa a segundo plano también. En una tablet puedo desarrollar algún tipo de mando mas completo, lo que me proporciona una buena funcionalidad.

Bueno, esto es todo, espero que la información les sea útil para que decidan bajo que arquitectura quieren desarrollar sus proyectos y aplicaciones.

Referencias

miércoles, 8 de febrero de 2012

[Emb Comp Lab] Los Sistemas Integrados

Con le paso del tiempo nos acostumbramos a las cosas, sistemas y aparatos que alguna vez fueron un hito hoy se vuelven invisibles. Nunca nos hemos preocupado por saber qué es lo que hace que funcione el contador de nuestro microondas, o el control de temperatura de nuestro refrigerador, qué hace que nuestro sistema de sonido tenga esas luces hipnotizantes en esa pantallita.

Y cuando alguien nos hace esa pregunta, es cuando comenzamos a pensar. Pues eso no sería posible sin software, así es, software. Pero no software como lo conocemos, sino software mas especializado y creado para cumplir tareas limitadas. Aún así, estos programitas son como las hormigas, poderosos y capaces de realizar tareas en cualquier campo donde se requiere una gran especialización, y están en todos lugares aunque no nos demos cuenta.

Ahora, cada vez que te encuentres con un chip o circuito integrado sabrás que, posiblemente, estés frente a un Sistema Integrado o Sistema Embebido.



¿Qué es un Sistema Integrado?

Para empezar, si me refiero a Sistema Integrado o Sistema Embebido estoy refiriéndome al mismo concepto.

Un sistema integrado es un software diseñado solamente para realizar ciertas funciones, en una amplia gama de aparatos y sistemas.
Se llaman sistemas integrados, incrustados o embebidos porque estan integrados en las tarjetas madre, la tarjeta de vídeo, de audio, de módem, o cualquier otra tarjeta controladora.

Programación


Por lo general los sistemas embebidos se pueden programar directamente en el lenguaje ensamblador del microcontrolador o microprocesador incorporado sobre el mismo, o tambien, utilizando los compiladores específicos, pueden utilizarse lenguajes como C o C++; en algunos casos, cuando el tiempo de respuesta de la aplicación no es un factor crítico, tambien pueden usarse lenguajes interpretados como JAVA. Los sistemas embebidos siempre estan realizando tareas en tiempo real.


La forma más popular de programar sistemas embebidos son por medio de los PIC, que son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica de General Instrument. 

Los PIC son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica de General Instrument. Su nombre completo es PICmicro, aunque generalmente se utiliza como Peripheral Interface Controller (controlador de interfaz periférico).

Cada uno de estos microcontroladores de programan utilizando un Programador PIC, el cual guarda las instrucciones (previamente compiladas desde algún lenguaje escrito en alguna interfaz de desarrollo de nuestra elección [algunas veces los programadores de pic incluyen esta interfaz de desarrollo]) que le indican al microcontrolador qué tareas debe realizar


Puesto que los sistemas embebidos se pueden fabricar por decenas de millares o por millones de unidades, una de las principales preocupaciones es reducir los costes. Los sistemas embebidos suelen usar un procesador relativamente pequeño y una memoria pequeña para ello.

Ejemplos (Aplicaciones)


Como lo mencione anteriormente, podemos encontrar sistemas integrados en un sin fin de ubicaciónes.



Si hablamos, por ejemplo, de las tarjetas de audio o de video o cualquier otra, podremos identificar algunos chips y circuitos integrados. Éstos chips que la mayoria de las veces no tenemos ni idea de que hacen ahí, en realidad son parte de un sistema embebido.
¿Y qué tareas realiza éste sistema? Bueno, pueden ir desde regular las frecuencias de sonido o amplificarlas, reducir el ruido, convertir señales análogas a digitales y viceversa, y a su vez convertirlas en señales que la computadora pueda reconocer.


Otros ejemplos son, los controladores de temperatura en los refrigeradores y/o microondas. El sistema de un televisor que nos permite cambiar las características de color y de audio, un sistema que permita reconocer la señal del control remoto y transformarlas en una instrucción para el televisor, y en los televisores digitales más modernos, debe existir algún sistema que permita convertir las señales análogas a digitales.


Los vehículos mecánicos son los sistemas mas interesantes, en su totalidad son sistemas completamente físicos, mecánicos y análogos, pero en la mayoría vemos pantallitas que nos muestran la información del rendimiento, como por ejemplo:
  • Rendimiento del combustible
  • Niveles de eficiencia, calentamiento y estrés en ciertas partes mecánicas
  • Posibles fallas
  • En aviones, altitud, presión, ubicación, incluso los controles automáticos
  • Recibir señales de sensores


Ejemplos (Sistemas)



Además de los sistemas sencillos que ya hemos visto, existen también sistemas operativos embebidos que pueden realizar tareas más complejas, administrar memoria y otro hardware, entre otras más. Algunos ejemplos son

OS/2 (eComStation)


Ahora mismo está en desuso, pero en su momento podías verlo en cualquier cajero automático.
Fue desarrollado a medias entre Microsoft e IBM como posible sucesor de PC DOS, el OS/2 sufrió un batacazo comercial en favor de la versión 3.0 de Windows. No obstante, su orientación a sistemas embebidos fue muy popular durante los 90 y hoy en día aún sigue implementado en expendedores públicos en su versión original o en la derivada, de nombre eComStation.

Windows CE


Se usaba en aajeros automáticos (en desuso), sistemas de navegación para el coche o videoconsolas como Dreamcast.
Windows CE fue diseñado con un núcleo totalmente nuevo, distinto al del resto de sus sistemas y optimizado para dispositivos con evidentes limitaciones técnicas. Aspectos como la interfaz gráfica quedaban en un segundo plano y podían ser modificados por las empresas que hacían uso de él. Como desarrollo interno, dio lugar a sistemas operativos para Pocket PC y fue el precursor del de Zune y de Windows Phone. Actualmente ha quedado en desuso en favor de Windows XP Embedded y de Windows Embedded Standard, usados en la mayoría de cajeros y terminales públicos hoy en día.

Windows Embedded Automotive


Utilizado en varios coches de marcas como FIAT, Nissan o Ford.
Pensar en sistemas operativos para automóviles es cada vez más frecuente, pero a Microsoft ya le vino esta idea a mediados de los noventa, cuando comenzó a idear un sistema derivado de Windows CE que funcionaría en los paneles de navegación de todo tipo de vehículos. Hoy en día, muchos sistemas de comunicación por Bluetooth integrados (manos libres, GPS, reproducción de música...) llevan detrás esta tecnología. Su última versión se basa Windows 7.

OSEK


En los automóviles de las constructoras que forman parte de este consorcio, como BMW, Chrysler, Opel o Renault.
Las siglas de OSEK hacen referencia tanto a un consorcio de empresas como a un estándar abierto de sistema operativo e interfaz de comunicaciones básicos que rige más de la mitad de la industria del automóvil. La portabilidad de OSEK hace posible que pueda ser llevado incluso a sistemas con un microprocesador de 8 bits.

vxWorks


Se halla en una gran variedad de dispositivos: desde aviones a fotocopiadoras; desde navegadores GPS a routers.
Desarrollado por la empresa Wind River Systems, este sistema operativo en tiempo real (RTOS) ha sido llevado a infinidad de dispositivos. Incluso ha controlado el cerebro de varios vehículos espaciales como el Sojourner, el rastreador enviado a Marte, convirtiéndose en el SO que más lejos ha viajado en la historia de la Informática.

FreeBSD


Lo utilizamos en televisores, routers y sistemas de seguridad entre otros.
Aunque FreeBSD es un sistema operativo completo, son varios los proyectos que han derivado para portarse a sistemas embebidos. Como curiosidad, cabe destacar que es la base sobre la que se apoya CellOS, el sistema que rige Playstation 3 y su Cross Media Bar (XMB)

ThreadX


Se encuentra en impresoras, cámaras digitales, módems y sondas espaciales.
Como vxWorks, es un sistema operativo en tiempo real, es decir, que ha sido diseñado específicamente para trabajar en condiciones de rápida respuesta. Una de las empresas que ha apostado recientemente por su uso es HP, que lo incluye para gestionar la mayoría de modelos de sus impresoras de tinta y láser.

Android


Aunque no lo creas, además de en los móviles... en microondas y lavadoras.
Por extraño que parezca, la aparición de Android en dispositivos poco comunes es un paso natural en su evolución como sistema operativo libre. La empresa Touch Revolution desarrolló hace unos meses el panel Nimble NIM1000, que puede incrustarse en todo tipo de electrodomésticos: desde teléfonos fijos a microondas y lavadoras. Así podrás saber qué tiempo hace antes de poner la colada.


Espero que con ésta explicación que de bien claro lo que un sistema integrado o embebido es, y sepamos la importancia que estos tienen en nuestros días.
Esto viene a reforzar más aquel famoso dicho - lo mejor viene en paquetes pequeños -

Referencias

[Emb Comp Lab] Lenguajes de Alto y Bajo Nivel

¿Cómo decirle a las computadoras qué deben hacer, cuándo deben hacerlo y cómo deben hacerlo?

Es una pregunta que en nuestros días ya no es difícil responder, al igual que nosotros nos comunicamos por medio de un lenguaje, las computadoras también se "comunican" con nosotros por medio de un lenguaje.

Las computadoras solo entienden un solo lenguaje, el conocido código binario (0 y 1); para nosotros los humanos es sumamente complicado comunicarnos de es manera, es por ello que nos vimos en la tarea de crear "traductores" que nos permitieran hablar con las computadoras, los lenguajes de programación.

Lenguajes de Programación



"Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones, y es utilizado para controlar el comportamiento físico y lógico de una máquina."

Un lenguaje de programación permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo estos datos deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico.

Los lenguajes de programación se pueden clasificar atendiendo a varios criterios, los principales son:
  • Según el nivel de abstracción
  • Según la forma de ejecución
  • Según el paradigma de programación que poseen cada uno de ello

Nos centraremos en la primera clasificación, Nivel de Abstracción

ABSTRACCIÓN: es un mecanismo y una práctica de reducir los detalles del factor hacia fuera de modo que uno pueda centrarse en algunos conceptos a la vez. Con la abstracción nos referimos a centrarnos cada vez mas en ciertos factores de la programación, dejando otros para que la maquina se haga cargo de ellos directamente.

Lenguajes de Bajo Nivel


Los primeros operadores de computadoras decidieron hacer un traductor para reemplazar los 0 y 1 por palabras o abstracción de palabras y letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma estructura del lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.
La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones"

Son lenguajes totalmente dependientes de la máquina y estan prácticamente diseñados a la medida del hardware para aprovechar al máximo las características del mismo. Es por ello que el programa que se realiza con este tipo de lenguajes no se pueden migrar o utilizar en otras maquinas, ya que cada microcontrolador, microprocesador, chip, etcétera, tiene su propia arquitectura y su propio set de instrucciones y caracteristicas de memoria.
Dentro de este grupo se encuentran:

  • Lenguaje Máquina: este lenguaje ordena a la máquina las operaciones fundamentales para su funcionamiento. Cnsiste en la combinación de 0's y 1's para formar las ordenes entendibles por el hardware de la maquina. Este lenguaje es mucho más rápido que los lenguajes de alto nivel. La desventaja es que son bastantes difíciles de manejar y usar, además de tener códigos fuente enormes donde encontrar un fallo es casi imposible. 
  • Lenguaje Ensamblador: es un derivado del lenguaje maquina y esta formado por abreviaturas de letras y números llamadas mnemotécnicos. Con la aparición de este lenguaje se crearon los programas traductores para poder pasar los programas escritos en lenguaje ensamblador a lenguaje máquina. Como ventaja con respecto al código máquina es que los códigos fuentes eran más cortos y los programas creados ocupaban menos memoria. Las desventajas de este lenguaje siguen siendo prácticamente las mismas que las del lenguaje ensamblador, añadiendo la dificultad de tener que aprender un nuevo lenguaje difícil de probar y mantener. 

Pros


  • Adaptación: Máxima entre programación y aprovechamiento del recurso de la máquina.
  • Velocidad: Máxima al contar con un acceso directo a los recursos, sin capas intermedias.

Contras

  • Portabilidad: Mínima por estar restringido a las especificaciones del fabricante.
  • Abstracción: Mínima por depender completamente de la técnica del hardware.
  • Uso: Requiere de la máxima atención y de una organización estructurada en base a los planos del hardware y del objetivo del software.
  • Se trabaja a nivel de instrucciones, es decir, su programación es al más fino detalle.
  • Está orientado a la máquina.
  • El programador debe conocer más de un centenar de instrucciones.
La programación en un lenguaje de bajo nivel tiene como ventajas una mayor adaptación al equipo, además de la posibilidad de obtener la máxima velocidad con el mínimo uso de memoria. Sin embargo tiene importantes inconvenientes, como la imposibilidad de escribir código independiente de la máquina y la mayor dificultad en la programación y en la comprensión de los programas

Lenguajes de Alto Nivel


Un lenguaje de programación de alto nivel se caracteriza por expresar los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de a la capacidad ejecutora de las máquinas. Se tratan de lenguajes independientes de la arquitectura del ordenador. Por lo que, en principio, un programa escrito en un lenguaje de alto nivel, lo puedes migrar de una máquina a otra sin ningún tipo de problema.

Estos lenguajes permiten al programador olvidarse por completo del funcionamiento interno de la maquina/s para la que están diseñando el programa. Tan solo necesitan un traductor que entiendan el código fuente como las características de la maquina.
Suelen usar tipos de datos para la programación y hay lenguajes de propósito general (cualquier tipo de aplicación) y de propósito especifico.

Están dirigidos a solucionar problemas mediante el uso de EDD's.

EDD [Estructuras Dinámicas de Datos]: Son estructuras que pueden cambiar de tamaño durante la ejecución del programa. Nos permiten crear estructuras de datos que se adapten a las necesidades reales de un programa.

Dentro de este grupo se encuentran:
  • BASIC, COBOL, FORTRAN, PASCAL
  • C, C++, C#, Objective-C
  • LISP, PROLOG
  • Java, Python, Perl
Entre muchos otros, que ya conocemos.

Ventajas

  • Genera un código más sencillo y comprensible.
  • Escribir un código válido para diversas máquinas y, posiblemente, sistemas operativos.
  • Reducen en gran medida la cantidad de horas hombre para programar.

Inconvenientes

  • Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
  • Algunos requieren que la máquina cliente posea una determinada plataforma, compilador, librerías, etcétera.

Comparación



Un ejemplo para comprender la diferencia entre los lenguajes de alto nivel y los lenguajes de más bajo nivel es: un lenguaje de bajo nivel está más cerca de las características de un lenguaje tipo máquina en particular, y más alejado de poder ser comprendido por un humano. Cuanto más alto es el nivel del lenguaje, más sencillo es comprenderlo y utilizarlo.

Existe también una estrecha relación entre las sentencias en lenguaje de alto nivel y sus formas en lenguaje máquina codificada (lenguaje de bajo nivel). La principal diferencia aquí es que en los lenguajes de alto nivel se utilizan símbolos como: `X', `Y', `Z', `A', etc para “sumar”, `M' para “multiplicar”, etc; mientras que en un lenguaje ensamblador o máquina se requieren códigos numéricos del estilo: OC1A4, AV7J9, etc, para que sea comprensible por la máquina.

La programación en un lenguaje de alto nivel requiere, por tanto, algún tipo de interfaz con el lenguaje máquina para que el programa pueda ejecutarse. Las interfaces más comunes son: un “compilador”, y un “intérprete”. El compilador traduce el programa a otro equivalente en el lenguaje `X' de la máquina “residente” como un paso separado antes de la ejecución del programa, en cambio, el intérprete ejecuta directamente las instrucciones en un lenguaje `Y' de alto nivel, sin un paso de procesamiento previo.

La compilación es, en general, un proceso más eficiente que la interpretación en la mayoría de los tipos de máquina, esto se debe principalmente a que las sentencias dentro de un “bucle” deben ser reinterpretadas cada vez que se ejecutan por un intérprete, con un compilador, cada sentencia es interpretada y luego traducida a lenguaje máquina solo una vez.

Normalmente la interpretación es preferible a la compilación en un entorno de programación experimental o de educación, donde cada nueva ejecución del programa implica un cambio en el propio texto del programa. La calidad de diagnóstico y depuración que soportan los lenguajes interpretados es generalmente mejor que la de los lenguajes compilados, puesto que los mensajes de error se refieren directamente a sentencias del texto del programa original.

Referencias

[MDE Lab] Las tendencias de desarrollo en los dispositivos móviles

Todos los años desde el 2008 Web Directions lleva a cabo un estudio para evaluar el panorama actual del desarrollo móvil. El objetivo es comprobar la evolución de las principales plataformas móviles y detectar tendencias en relación al desarrollo de webs y aplicaciones móviles. Este año, el estudio se realizó durante el mes de Febrero entre una muestra de más de 1.300 desarrolladores y diseñadores.

Las principales conclusiones de este estudio son:
  • Durante el 2010 se produjo un boom en el interés que los desarrolladores mostraron por el HTML5, así como por el desarrollo de aplicaciones nativas para plataformas móviles (como iOS o Android) mediante tecnologías web.
  • Android desbanca al iPhone como plataforma móvil preferida por los desarrolladores.
  • Queda demostrado que existe una correlación clara entre los dispositivos móviles y las plataformas que los desarrolladores usan, y aquellas para las que desarrollan.
  • Se confirma que los desarrolladores cada vez más testean sus webs y aplicaciones móviles en una gran variedad de dispositivos y de navegadores móviles.
  • iPhone, iPad y Android (móviles y tablets) son los dispositivos que centran la mayor parte de la atención de los desarrolladores, abriéndose un destacable hueco con respecto al resto de plataformas y dispositivos móviles.
  • A pesar de que los desarrolladores expresan su confianza en la creación de aplicaciones nativas usando HTML5, muestran sus reservas en materia de usabilidad.

A continuacion les dejo unas imagenes sobre las tendencias de desarrollo de aplicaciones del 2011 y la evolucion de los Sistemas Operativos



Tendencias para el comercio electrónico móvil

Asimismo, ya se anticipan las tendencias que marcarán el comercio electrónico móvil los próximos años:
  • Publicidad “hiperlocal”, basada en el análisis estadístico del comportamiento de compra de los usuarios y en la geolocalización, para mejor segmentación de la audiencia.
  • Mayor adopción de la banca móvil, e incremento del uso de los pagos remotos en tiendas y comercios.
  • Apuesta por los cupones y descuentos canjeables en tiendas físicas desde el propio dispositivo móvil, sin necesidad de ser impresos.

Como información adicional de interés les comparto esta imagen donde se ilustra la evolución de los Sistemas Operativos Móviles



Esta liga tiene información valiosa para todo desarrollador, incluye como se muestra la situación de las diversas plataformas en el mercado, recomiendo que la visiten Batalla por la Web Móvil

Referencias