martes, 28 de febrero de 2012

Microcontrolador PIC y Ejemplo de su Programación

Antes de realizar la tarea PIC(la cual ya tengo algunas ideas, y la mayoría de las cosas que necesito), me puse a investigar sobre diversas cosas sobre los PIC, como su programación y su funcionamiento. Esto lo hice para saber como realizar las conexiones, ya que previamente había trabajado con los GAL en algunos proyectos básicos, y estoy familiarizado con ciertas reglas, como que cierto pin del chip debe ir a tierra y otro debe ir a a corriente.
Aunque no lo parezca esto es muy importante, sin saber esto uno puede simplemente quemar el microchip y darlo por perdido, es por esto que decidí investigar primero al respecto. Primero que nada ¿Qué es un PIC?.

PIC - Descripción


Los PIC(Peripheral Interface Controller) son una familia de microcontroladores fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica de General Instrument.


Los hay disponibles de distintas capacidades, desde algunos tipos básicos con poca memoria, hasta los que tienen convertidores Analógico a Digital (ADC) incluidos o incluso los que llevan dentro PWMs (Pulse Width Modulators = Moduladores de Ancho de Pulso)

Mi PIC - PIC16F628A

El PIC que compré, es el PIC16F628A, lo cual lo hace diferente a los demás y con diferentes características. El PIC16F628A cuenta con programación de bajo voltaje, modo reloj de baja velocidad, oscilador interno de 4MHz, memoria, y otras cosas más.

Las especificaciones del PIC16F628A:


 Parameter Name Value
 Program Memory Type Flash
 Program Memory (KB) 3.5
 CPU Speed (MIPS) 5
 RAM Bytes 224
 Data EEPROM (bytes) 128
 Digital Communication Peripherals 1-A/E/USART,
 Capture/Compare/PWM Peripherals 1 CCP
 Timers 2 x 8-bit, 1 x 16-bit
 Comparators 2
 Temperature Range (C) -40 to 125
 Operating Voltage Range (V) 2 to 5.5
 Pin Count 18

Ahora para saber que tipo de conexiones podemos hacer, y que funciones tiene cada pin, necesitamos ver el diagrama del PIC en cuestión. Este dirá para que sirve cada pin del PIC, y donde debemos conectar a positivo y negativo para darle alimentación. El diagrama es el siguiente:

Viendo esto es difícil entender que es cada cosa, además de los voltajes positivo y negativo. Para esto se puede usar la siguiente tabla que describe el significado de cada pin.

Nombre del Pin 
Descripción
RA0/AN0
Puerto bidireccional.
Entrada del comparador análogo
RA1/AN1
Puerto bidireccional.
Entrada del comparador análogo
RA2/AN2/Vref
Puerto bidireccional.
Entrada del comparador análogo. Salida VREF
RA3/AN3/CMP1
Puerto bidireccional.
Entrada del comparador análogo. Salida del comparador 1
RA4/T0CKI/CMP2
Puerto bidireccional.
Input del timer 0.
Salida del comparador 2
RA5/MCLR/VPP
Puerto bidireccional.
Master Clear. Cuando es configurado, es un reset activo en el dispositivo. Voltaje de salida programado.
RA6/OSC2/CLKOUT
Puerto bidireccional.
Oscilador de cristal de salida.
Salida de reloj con un 1/4 de la frecuencia de OSC1.
RA7/OSC1/CLKIN
Puerto bidireccional.
Oscilador de cristal de entrada. Entrada de reloj externo.
RB0/INT
Puerto bidireccional (8 bits).
Interruptor externo
RB1/RX/DT
Puerto bidireccional (8 bits).
I/O de datos sincronizados.
Puerto recibidor USART.
RB2/TX/CK
Puerto bidireccional (8 bits).
Puerto transmisor USART.
I/O de reloj sincronizado
RB3/CCP1
Puerto bidireccional.
I/O de Comparación y Captura de PWM
RB4/PGM
Puerto bidireccional (8 bits) 
Puerto de programación de bajo voltaje.
RB5
Puerto bidireccional (8 bits).
RB6/T1OSO/T1CKI/PGC
Puerto bidireccional (8 bits).
Salida del oscilador Timer1.
Reloj de programación ICSP.
RB7/T1OSI/PGD
Puerto bidireccional (8 bits).
Entrada del oscilador Timer1.
I/O de datos ICSP.
Vss
Referencia de tierra para los puertos de I/O
VDD
Suministro positivo para lógica y puertos de I/O

Con puertos bidireccionales, nos referimos a puertos que podemos usar tanto como entrada como de salida.El reloj o Clk, es usado frecuentemente para darle una temporización al microcontrolador, si es necesario.

Programación del PIC:

Suponiendo que ya sabemos como se conecta el PIC, es decir, saber cuales son las entradas y salidas,que pines del PIC van a tierra, y cuales a corriente, podemos comenzar a programar el PIC. Lo anterior es muy importante saberlo, ya que sino terminaremos quemando el PIC desde antes de probar si nuestra programación funciona.

Para programar el PIC es necesario lo siguiente:
  • Tener un PIC
  • Armar o comprar un programador de PICs
  • Software para programar el PIC
  • Software para compilar código en .hex
Programador PIC-500

Como mencioné, mi PIC es el PIC16F628A. El programador que compré es el PIC-500, que se conecta mediante cable serial, lo cual no lo hace muy portable en estos días ya que la mayoría de las PCs y laptops modernas no cuentan con esta entrada, pero en mi caso tengo una vieja PC que aún cuenta con entrada serial. El beneficio del programador PIC-500 es el precio, ya que es mucho más barato que el PIC-600, pero en fin de cuentas ambos pueden servir.


El programador PIC-500 está basado en el programador JDM, la comunicación con la PC es a través del puerto serial RS232 y se recomienda usar el software IC Prog para cargar la información. Cuenta con una base de 8 y otra de 18 patas para memorias y PICs, respectivamente, cable DB9 de 1,8 m de longitud y software (ICprog). Soporta la siguiente variedad de PICs: 12C5XX, 12C67X, 24CXX, 16C55X, 16C61, 16C62X, 16C71, 16C71X, 16C8X, 16F8X y memorias 24LCxx.

mikroBasic for PIC

El programador venía con un CD que contenía el programa ICprog, usado para cargar los .hex en el PIC, pero no tenía soporte para el PIC16F628A, por lo tanto descargue uno del siguiente link:


Y para programar el PIC use mikroBasic PRO for PIC, donde ya tenía incluido un pequeño ejemplo de un LED parpadeante, que usé para probar si funcionaba el programador. El código es muy sencillo, configura todos los puertos A, y puertos B como salidas(podemos ver aquí cuales son), y se hace un ciclo infinito donde se da una salida de 1 y luego 0, alternándose cada segundo. El código es el siguiente:

Escrito el código, debemos compilarlo dando click en build, en el programa mikroBasic, esto nos generara un archivo .hex en la carpeta donde estemos guardando nuestro código. Con esto ya podemos abrir ICprog y abrir dicho archivo .hex, para poder programarlo en el PIC.


Aquí un video del circuito funcionando:



Como se puede observar en el video, el PIC tiene dos conexiones, hacia el además del LED. En el pin 14, se conecta a corriente positiva, y en el pin 5 se conecta a tierra. Esto se debe hacer correctamente o el PIC puede quemarse o dejar de funcionar. 

Referencias:

Client-Server Mergesort

I always wanted to try some client-server stuff. Until now I've never programmed anything at all using client-server and sockets, and this week I decided to try something, seeing that I couldn't make any good progress with MPI for python, so that is what I'm going to explain, the results of my client-server script.

First of all, I started investigating about Python sockets, because I find Python to be a very comfortable language to program on(not simple, just comfortable). So searching in the internet I found a very simple example using sockets, but I couldn't understand it so I investigated more about each function that the program used. When I understood the majority of it, I started to modify it to create a mergesort. The result is the following:

Client Part:


The client side is pretty simple, it creates a socket to connect to the server, and asks for the list to be ordered. This input however, must be on a format X-X-X-X-X(where the X's are the numbers to order). The input then is sent to the server, and the server itself "translate" the string into a list of integers, so it is easier to order them. If the string is "exit", the client breaks the loop and closes the socket, if not then it will wait for the sorted list from the server.

If an incorrect input was sent to the server, the client prints just that "Invalid Input. Try Again". And finally if the input was correct, the client prints the sorted list


Server Part:



The server part is the one that will make the whole sorting operations and stuff. Here i have functions to do the mergesort, and another to convert the received string from the client to a manipulable list of integers. The server creates a socket, and binds it to a certain specified IP and port, in this case the IP is "localhost" to test it locally. Then we tell the socket to listen to a maximum number of n_sockets, specified in the execution arguments.

The while loop will append a number 1 to a list called clients, which will be used to determine the number of clients in the server(but in this case the program is pretty much limited to one, because with more, the server will only process them in the connection order), and then when the client disconnects using "exit", the server will pop a value from the list and check if it is empty, to close the server.

Execution

To execute the program, first the server code must be executed, using the syntax ./server.py port, where port is the number of the port to be used. If the port is not specified the program will use the port 9090 by default.
After the server, the client must be executed with the command: ./client.py nickname port, where the nickname is just a name to be used in the "command line", and the port is the port to connect, which must be the same than the server.

An example is the following:

Server Side:


Client Side:



Problems

The problem I still have with this code is that the server only works well with one single client. With more than one, the server has to wait to the input of the clients in the order they connect, which is horribly innefficient, but I'll try to fix that in the meantime.

lunes, 27 de febrero de 2012

API de Android - Paquetes importantes para mi Aplicación

Para el proyecto de Dispositivos Móviles, haré uso de Android como plataforma para programar. Por lo tanto, es necesario conocer las herramientas con las que cuento, y para esto, en esta entrada me dedicaré a escribir sobre los paquetes importantes que encontré que me puedan ayudar a desarrollar mi proyecto.

Inicialmente, nombraré las partes del celular que se harán uso(tentativamente). 
(Nota: SÍ, es requisito que sea un celular, ya que la app hará uso de telefonía para comunicarse con emergencias y otros números telefónicos importantes)

Partes importantes que se harán uso en el celular:
  • GPS
  • Telefonía
  • Mensajería(SMS)
  • Base de datos con las coordenadas de los contactos, y sus teléfonos
GPS - android.location

En cuanto a la localización GPS para llamar al hospital o policia más cercano, Encontré el paquete android.location que contiene clases relacionadas con la geolocalización y otros servicios relacionados. Aquí  mostraré solo las que considero más importantes para mi proyecto.

Interfaces
GpsStatus.ListenerInterfaz usada para recibir notificaciones cuando se cambia el estado del GPS
LocationListenerUsada para recibir notificaciones cuando la localizacion cambia.

Clases
AddressClase que representa una direccion que es un conjunto de strings que describen una localización.
Criteria
Clase que indica el criterio para seleccionar el proveedor de la localización.
GpsSatelliteClase que representa el estado actual del satélite GPS.
GpsStatusClase que representa el estado actual del motor 
LocationClase que representa una localización geográfica detectada en un cierto tiempo.
LocationManagerClase que provee acceso a los servicios de localización del sistema.

Uso en mi proyecto:

Estas clases sirven para manejar las funciones que se necesitarían en la localización GPS, en caso de implementarlo en mi proyecto. Usando estas clases e interfaces, podría saber cada cuando cambia de estado el GPS para saber si se encuentra en una nueva localización, y actualizar alguna base de datos con los contactos más cercanos para recibir ayuda médica, o de la policía.

También la clase Address, provee información en un string, que podría servir para dar la localización actual a una persona cercana en un mensaje SMS, en caso de otro tipo de emergencia familiar o algo por el estilo.

Telefonía - android.telephony.gsm

Para la parte de telefonía, que requeriría las funciones de llamar, enviar mensajes y algunas otras cosas básicas, encontré el paquete android.telephony.gsm que proporciona clases para manejar algunas funciones de telefonía.

Clases
CellLocationClase abstracta que representa la localización del dispositivo
PhoneNumberUtilsUtilidades para manipular Strings de teléfonos.
PhoneStateListenerClase usada para verificar cambios específicos en los estados de la telefonía del dispositivo.
Signal StrengthClase que contiene información relacionada con la intensidad de señal del teléfono
SmsManagerManeja información sobre operaciones SMS, como mandar datos, mensajes, etc.
SmsMessageServicio de envió de mensajes SMS cortos.
TelephonyManagerClase que provee información sobre los servicios de telefonía en el dispositivo.

Uso en mi proyecto:

La telefonía será una parte importante de mi aplicación. Por lo tanto, es necesario saber con que herramientas cuento para manejar las llamadas y mensajes, y como y a quién se envían esto. Esta clase la tendré que manipular junto con la de GPS para lograr hacer una base de datos de teléfonos y localizaciones, que se actualice cada cierto tiempo, y para así, en el momento de realizar una llamada de emergencia mediante mi aplicación, la aplicación sepa cual es el contacto más cercano para pedir ayuda.

Base de Datos - android.database

Para la base de datos, el API de android tiene el paquete android.database para manejar bases de datos.
Las interfaces y clases importantes son las siguientes:

Interfaces
CursorLa interface provee acceso de escritura-lectura aleatorio al result set que es retornado por la búsqueda en la base de datos
DatabaseErrorHandlerInterface que deja a la aplicación definir las acciones a tomar después de ciertos errores detectados en la base de datos

Clases
ContentObserverRecibe una llamada cuando cambie el contenido.
CursorJoin
Junta dos cursores usando las columnas especificadas.
DatabaseUtilsMetodos estaticos de utilidad para manejar bases de datos y cursores.
DatasetObserverRecibe una llamada cuando un set de datos sufre cambios o es invalido
DefaultDatabaseErrorHandlerClase usada para definir las acciones a tomar cuando una corrupción en la base de datos es reportada por sqlite
MatrixCursorImplementación de cursor mutable respaldado por un arreglo de objetos.

Uso en mi aplicación:

La base de datos será una parte importante de mi proyecto, ya que contendrá en ella la información sobre las coordenadas de los hospitales, contactos, estaciones de policía y sus teléfonos. Esta base de datos sería en el mejor caso actualizada cada que se cambia de localización, lo cual sería cada cierto tiempo como 10 min o algo así. Esto para que en el momento en el que la aplicación se ejecute, ya esté listo el número de teléfono del contacto más cercano.

Voz - android.speech

Una de las cosas que me gustaría implementar, pero sería secundaria en caso de tener tiempo, es un mensaje pre-grabado. Esto podría generar problemas al enviarlo a emergencias, ya que se le daría un mal uso, o podría mal interpretarse, pero aun así me gustaría implementarlo para las llamadas de emergencia a contactos o de otro tipo que no afecte a los servicios de emergencias. De cualquier manera, encontré el paquete android.speech, que maneja funcionalidades relacionadas.

Las clases e interfaces son las siguientes:

Interfaces
RecognitionListenerUsado para recibir notificaciones del reconocedor de voz cuando algún evento relacionado ocurra.

Clases
RecognitionServiceClase base para implementaciones del servicio de reconocimiento.
RecognizerIntent
Constantes para soportar el reconocimiento de voz, iniciando desde un intento.
RecognizerResultsIntentConstantes con intentos relacionados en enseñar los resultados del reconocimiento de voz.
SpeechRecognizerEsta clase provee acceso al servicio de reconocimiento de voz.

Uso en mi aplicación:

Quizás en sí esto no es lo que busco, pero es lo más cercano. Mi idea es utilizar el reconocimiento de voz para grabar un mensaje para cada tipo de emergencia(opcionalmente). Esto para mandarlo a determinados contactos en dicho caso de emergencia si la persona no puede hablar o no tiene tiempo para hacerlo.

Pruebas - junit.framework

Para realizar las pruebas al código, simplemente eso. Existe también un paquete android.test, pero preferí junit por haber trabajado con el anteriormente.

Las clases e interfaces son las siguientes:

Interfaces
TestPrueba a correr para recoger resultados
TestListener
Un listener para el progreso de la prueba.

Clases

AssertSet con mètodos del tipo assert(afirmar)
TestCase
Define un TestCase para correr múltiples pruebas.
TestFailureRecolecta la prueba fallada junto con al excepción arrojada.
TestResultRecolecta los resultados de un determinado TestCase.
TestSuiteUn TestSuite son varias pruebas compuestas.


Errores

AssertionFailedErrorArrojado cuando un assert es fallido.
ComparisonFailure
Arrojado cunado una comparación entre Strings es fallida.



Y esas son los paquetes más importantes a primera vista. También faltaría ver lo que es necesario para programar la interfaz gráfica, que tengo entendido se hace con xml. Pero eso lo veré más adelante.


Referencias:

jueves, 23 de febrero de 2012

Wiki Contributions - Week 4

For this week in the class, I installed all the tools needed to compile and run MPI codes using python as a programming languages. I had issues with that, because python wasn't updated, and some other stuff was needed in order to build and install packages, so I actually didn't had a chance to program with it this week, but I'll do it.

The links to the wiki:
Future contributions
  • I'm going to do something with MPI, probably for the next week. My idea is to do something like merge sort, or anything that sends some data in order for the server to do something with it.

Nominations

- Isaias: Mergesort in CUDA
- Rafa and Juan Carlos: MPI with C-C++, with good examples

miércoles, 22 de febrero de 2012

Tarea Intro - Lenguaje Ensamblador

Para la tarea introductoria de Cómputo Integrado, escogí realizar algunos programas, cada uno aumentando un poco gradualmente la dificultad para poder aprender a hacer códigos sencillos en ensamblador desde cero. En esta entrada, explicaré cada paso del proceso, y colocaré los códigos que me ayudaron a entender mejor sobre el lenguaje ensamblador.

Presentación




Proceso


Como mencioné anteriormente, para realizar la tarea introductoria, realicé diferentes programas con poca dificultad en C, pero aumentando poco a poco su dificultad en ensamblador. Esto lo consideré ya que inicialmente no comprendía absolutamente nada del código que compilaba desde C. Por lo tanto inicie desde eso, moví líneas, quite código, agregué algunas cosas solo para ver como se comportaba, y continué así hasta que logre realizar un código desde cero.

Parte 1: Compilar desde C

Como ya expliqué como compilar desde C a ensamblador en un post anterior para laboratorio, omitiré esa parte, e iré directamente al código.

El código que use para esta parte o fase de la tarea, fue un simple hola mundo, nada fuera de lo común. En el aprendí que al inicio de cada código de ensamblador, se reserva espacio para las variables, y aprendí como es que funcionan las impresiones en el mismo, moviendo el string deseado al inicio del stack. El código es el siguiente:



Parte 2: Modificación Mínima

Para la parte 2, compile un código desde C a ensamblador, y después lo modifiqué un poco para ver como se comportaba. Para esto use un simple código en C que imprimía los números pares entre 1 y 10. El código es el siguiente:


Parte 3: Modificación Moderada


En esta parte, realicé modificaciones al código anterior, para que imprimiera un pequeño mensaje avisando cuando es par y cuando impar. Las modificaciones fueron hechas con el fin de saber si podía codificar yo mismo, es decir, si ya podía entender lo suficiente para saber donde poner qué. Por lo tanto, el código puede ser mucho más óptimo, De cualquier forma, el código es el siguiente:


Parte 4: Programación desde cero

Para terminar, hicé lo que esperaba como resultado del proceso, hacer un programa en lenguaje ensamblador desde cero. Inicialmente la programación me tomo cerca de una hora en tener lo básico, pero me tardé más de  2 horas en encontrar un error. El programa fue la impresión de la serie de fibonacci, el cual explique solamente el equivalente en operaciones en otros lenguajes de alto nivel, como se puede ver:

Sintáxis AT&T(GAS)

Como previo a la tarea introductoria, decidí investigar un poco sobre la sintaxis que utiliza el GNU Assembler, al pasar el código de C a ensamblador. Esta sintaxis es llamada AT&T y su ventaja es la compatibilidad con GCC para generare el código ensamblador de un determinado código en lenguaje C. 

Para entender un poco del mismo, empezaré con un simple hola mundo, para comprender las operaciones con el stack y demás, y luego explicaré como funcionan los ciclos for y while, además de las condiciones en lenguaje ensamblador usando como ejemplo un programa sencillo para imprimir números pares.

Información General:
  • At&T tiene la forma instruccion orígen, destino. Como por ejemplo movl $1, %28(esp). La instrucción mueve el número uno, al offset 28 del stack pointer.
  • $ es usado para valores literales, % para registros.
  • Los sufijos al final de las instrucciones para designar el tamaño del operando que se manipulará:
    • b = byte (8 bit)
    • s = short (16 bit entero) o un solo (32-bit punto flotante)
    • w = word (16 bit)
    • l = long (32 bit entero or 64-bit punto flotante)
    • q = quad (64 bit)
    • t = ten bytes (80-bit punto flotante)
Hola Mundo

Que mejor forma de empezar en un nuevo lenguaje que con un hola mundo. Primero que nada lo haremos en C, y lo pasaremos a ensamblador usando el comando gcc -S nombrearchivo.c. El código en C, y su compilación-ejecución, es el siguiente:

Código:


Compilación y Ejecución:


Como se puede ver, todo funciona correctamente, ahora podemos pasarlo a ensamblador usando el siguiente comando:


Esto nos generará un archivo ".s"(en mi caso llamado hello.s), el cual podemos abrir para ver el código equivalente en lenguaje ensamblador. El código del hola mundo en ensamblador es el siguiente:


La información inicial, es agregada por el compilador gcc al generar el archivo .s, pero esta no afecta realmente el desempeño de nuestro programa, así que puede ser omitida. Después podemos encontrar la etiqueta .LC0, que declara un string llamado "Hola Mundo", que será utilizado más adelante para imprimirlo. 

Como etiqueta podemos usar prácticamente cualquier combinación alfanumérica, precedida por un punto, en este caso LC0 es el nombre por default que agrega el compilador gcc.

Después se declara la etiqueta main como global, para que todos puedan acceder a ella, y decimos que main es una función. Dentro de la etiqueta main es donde encontramos la parte importante. Las primeras cuatro líneas son típicas en una surutina, lo que hacen es guardar espacio para las variables locales.

Después, se mueve el string guardado en la etiqueta .LC0 hacia al inicio del stack, y lo imprimimos. En este caso gcc cambio la función printf del código en C, por la función puts, pero la aplicación es similar. Al final, guardamos 0 en eax, como nuestro valor del return(guardar valores de retorno en eax es algo común). Al final la instrucción "leave" libera la memoria del stack y retorna el control.

Ciclos y Condiciones

Para entender un poco más sobre ensamblador y los ciclos en este lenguaje, hice un simple programa que imprime los numeros pares entre el 1 y el 10(para hacerlo corto), y lo pase a lenguaje ensamblador para ver como se comportan. Los códigos en lenguaje C son los siguientes;


No tienen nada fuera de lo común, un simple main con una sola variable, un ciclo que se repite hasta el 10, y una condición que decide si el contador será par o no para poder imprimirlo si es par. Para pasarlos a ensamblador es el mismo procedimiento que en el hola mundo. 

Los códigos en ensamblador de los códigos pasados, son los siguientes:

                                    while                                                                            for


Mi primera impresión fue que los códigos eran muy parecidos, excepto que el código del for tenía una etiqueta más separada, explicaré por qué.

Ciclo For

Como se mencionó anteriormente las líneas que se ven de rojo son etiquetas, básicamente sirven para controlar el flujo del programa y moverse a ellas a determinadas condiciones y puntos en el programa. Al inicio de la etiqueta main, igual que en el hola mundo , empezamos con las mismas primeras cuatro líneas para reservar espacio para las variables locales. En este caso se reservan 32 bytes en el stack. La siguiente línea del main, mueve el valor 1, a la posición 28(%esp), esto ya que es un entero, y ocupara 4 bits(32-4 = 28). Si desearamos agregar alguna otra variable entera, e inicializarla sería simplemente agregar una línea como esta: movl $0, 24(%esp), restando cada vez 4 por entero.

Después se usa la instrucción jump para brincar desde main, a la etiqueta .L2, donde lo primero que hacemos es comparar si el valor guardado en la posición 28(%esp), que sería nuestra variable "i", es menor o igual a 10, si esto es así se manda el control del flujo a .L4.

Aqui se harán los contenidos del for, donde inicialmente movemos el valor de 28(%esp) a eax, y le aplicamos una operación AND, al este valor, y el valor 1. Esto es usado para saber si el número es par o impar, luego comparamos eax, consigo mismo, esto es para saber si es 0 o no, si no es 0, es decir no es par, se dará un brinco a .L3, donde se le sumará uno al valor guardado en la posición 28(%esp). Si es igual a 0, se continua en .L4, omitiendo la instrucción jne.

Las siguientes líneas son usadas para imprimir el número par. Primero, movemos el contenido de la etiqueta .LC0(el string "%d\n") hacia eax, después movemos el valor guardado en la posición 28(%esp) a edx. Movemos edx(ahora la variable "i"), a la posición 4(%esp), y después eax(el string) a la posición %esp. Esto podemos visualizarlo como posiciones en memoria conjuntas, ya que ponemos el string al inicio del stack, y justo después colocamos la variable que el string va a imprimir. Entonces llamamos printf para imprimir esos valores.

Ciclo While

En el ciclo while, se realiza prácticamente lo mismo, pero a diferencia del for, no agrega una etiqueta para realizar la suma al contador, y el brinco que se hace al comparar el número de repeticiones y el contador, se hace con jne, lo que significa que brinca cuando no sea igual a 10.

Al terminar, disminuyendo algunas lineas de código para el for, quite una etiqueta, y ajuste algunas lineas para que funcionara igualmente, y se redució un poco el código. Para terminar como el siguiente:


Comparaciones

De esta manera, el código del while y del for es prácticamente lo mismo, la única diferencia es la condición para brincar a la etiqueta que se repetirá(L3).
  • En el for, el brinco es jle, que significa, que se hará un brinco, si la condición anterior es menor o igual. En el código esto significa que si el valor del registro "28(%esp)" (que sería nuestra variable "i"), es menor o igual a 10, será mandado a la etiqueta L3.
  • En el while, el brinco es jn, que significa que se hará un brinco cuando la condición no sea igual. En el código esto significa que si el valor del registro "28(%esp)", no es igual a 10, brincará a la etiqueta L3. 
Referencias:

sábado, 18 de febrero de 2012

Conectividad en los Dispositivos Móviles

La conectividad en los dispositivos móviles es una parte muy importante de ellos hoy en día. Para la gente ya no es suficiente con que cuente con cámara, o mp3, las personas buscan los mejores dispositivos con Wi-Fi, 3G u otro tipo de conectividad que les permita mantenerse en contacto en sus redes sociales y demás.

En este post hablaremos acerca de los diferentes tipos de conectividad con los que cuentan actualmente los dispositivos móviles, sobre las tecnologías pasadas, y lo que podemos esperar del futuro. 
Además se hará mención de la seguridad de estos tipos de conexiones y los rangos que tienen de distancia hacia antenas o routers.

Conectividad inalámbrica

La conectividad inalámbrica se realiza por ondas electromagnéticas en el aire, invisibles al ojo humano y por obvia razón se realiza sin necesidad de cables, lo que la hace más portable. La transmisión y recepción de la información se hace a través de puertos. Normalmente suelen ser más baratas, ya que no se gasta en cables y otros dispositivos, pero el hecho de que pueden ser accedidas sin necesitar conectarse a un punto de acceso físicamente, las hace más inseguras, y por lo tanto se suele invertir en la seguridad de las mismas.

Las revolución de las redes inalámbricas ha traído cambios importantes a la telecomunicación, y hace de las redes integradas una realidad. Al liberar al usuario de tener que conectarse mediante cables, redes de comunicaciones personales, LANs inalámbricas, redes móviles de radio y celulares prometen una computación distribuida completa en cualquier lugar, en cualquier momento.

Hoy en día cualquier dispositivo móvil cuenta con algún tipo de conectividad inalámbrica, desde los celulares normales, donde la usamos para hablar por teléfono prácticamente desde donde sea, hasta los más actuales tablets y smartphones que cuentan con tecnologías Wi-Fi.

En cuanto a gasto de batería, cada tipo diferente de conectividad varía, es de esperarse que al tener activado Wi-Fi, la batería se acabe más rápidamente, pero en otros casos como 3G o GSM, al ser el sistema de telefonía móvil, no se debería de pensar en cuanta batería se gasta con ellos encendidos en el celular, ya que normalmente se piensa en la duración de batería promedio con ello encendido.

IR(Infrarrojo)

El infrarrojo es un tipo de tecnología inalámbrica en dispositivos o sistemas que comparten datos mediante radiación infrarroja. El infrarrojo es energía electromagnética a una longitud de onda un tanto más larga que la de la luz roja. 

El infrarrojo es usado para comunización y control en cortas y medias distancias. Algunos sistemas operan en un modo de linea de visión , lo que significa que debe haber una linea visual no obstruida en el espacio entre el transmisor y el recibidor. Otros sistemas operan en un modo no difuso, o llamado modo de dispersión. En este sistema no es necesario que el transmisor y recibidor estén directamente visibles uno del otro, un ejemplo sería el control de una televisión, que normalmente no requiere que se apunte directamente a ella para cambiar un canal o realizar alguna función.

La tecnología de infrarrojos es usada también para detectar intrusos, controles de robots, micrófonos inalámbricos, headsets, modems, impresoras y otros periféricos.

A diferencia de conexiones inalámbricas de radio frecuencia, el infrarrojo no puede pasar por las paredes. Por ello, la comunicación infrarroja no es posible entre diferentes cuartos de una casa, o entre diferentes casas de un vecindario. Esto puede ser una gran desventaja, pero lo convierte en una tecnología más privada que las de radio frecuencia. 

Alcance

El infrarrojo es diseñado para facilitar las comunicaciones punto a punto entre dispositivos electrónicos como: computadoras, teléfonos celulares, periféricos, etc, usando conexiones de comunicación infrarroja directas a través de espacio libre. 

El rango de comunicaciones del infrarrojo está entre 10cm y 1.5m, aunque este rango puede ser aumentado si el poder del dispositivo es incrementado. Las velocidades de transmisión están entre 9600bps - 4Mbps


Seguridad


Debido al hecho que las ondas infrarrojas no pasan a través de paredes, la tecnología infrarroja ofrece un esquema de seguridad comparable con los sistemas alámbricos, ya que es difícil por ejemplo, espiar una comunicación infrarroja de línea de visión, sin estar en el mismo espacio físico que el dispositivo infrarrojo.

Bluetooth

El bluetooth es una tecnología de ondas de radio con corto alcance, 2.4Ghz, con el objetivo de simplificar comunicaciones entre dispositivos. Esto es posible ya que simplifica la sincronización entre datos de los dispositivos móviles y computadoras. Permite comunicaciones hasta 10 metros, lo que lo hace versátil para hacer actividades a distancia, como transferir archivos entre celulares o de celular a computadora, sin necesidad de cables, o de estar relativamente cerca entre dispositivos(cosa que el infrarrojo necesitaba).





Las ventajas del bluetooth son:
  • Eliminación de la necesidad de conexiones por cable entre los productos y accesorios electrónicos.
  • Intercambio de archivos entre usuarios de Bluetooth.
  • Sincronización y transferencia de archivos entre dispositivos.
  • Conexión a determinados contenidos en áreas públicas.
Seguridad
  • La Clave de linkado es generada durante una fase de inicialización, cuando dos dispositivos empiezan a comunicarse. Según la especificación BlueTooth, la clave es generada durante la fase de inicialización cuando el usuario introduce un PIN idéntico en ambos dispositivos. Después de completarse la inicialización, los dispositivos se autentican de manera automática y transparente y se lleva a cabo el cifrado de la conexión. 

  • La información de usuario es protegida por cifrado de la carga útil (payload), ya que el código de acceso y la cabecera del paquete nunca son cifrados. El cifrado se lleva a cabo con el algoritmo de cifrado E0, que consiste básicamente de tres partes:
Alcance

El alcance del bluetooth, ronda entre los 5-10 metros, y la conexión se realiza entre dispositivos como computadoras, celulares, laptops, tablets y demás.Aun así, esta distancia puede ser incrementada en los dispositivos hasta 100m, pero no es algo común.
La transmisión de datos es de 1Mbps normalmente.

GSM

GSM(Global System for Mobile communication) o Sistema global para las comunicaciones móviles es un sistema de telefonía móvil digital ampliamente usado en Europa y otras partes del mundo. GSM digitaliza y comprime la información, para después mandarla por un canal con otras dos corrientes de información del usuario, cada una en su slot de tiempo. Opera en dos frecuencias, 900Mhz o 1800Mhz.

Los servicios móviles con GSM fueron lanzados primeramente en Fnlandia en el año 1991. Hoy en día más de 690 redes móviles proveen servicios GSM a lo largo de 213 países. 
Debido a que muchos operadores de red GSM tienen acuerdos con operadores foráneos, los usuarios pueden continuar a usar sus celulares aunque viajen a otros paises. GSM junto con otras tecnologías es parte de la evolución de las telecomunicaciones móviles inalámbricas que incluye HSCSD(High-Speed Circuit-Switched Data),   General Packet Radio System (GPRS), Enhanced Data GSM Environment (EDGE), y Universal Mobile Telecommunications Service (UMTS). 

Una de las características principales del estándar GSM es el módulo de identidad del suscriptor, conocida comúnmente como tarjeta SIM. La tarjeta SIM es una tarjeta inteligente desmontable que contiene la información de suscripción del usuario, parámetros de red y directorio telefónico. Esto permite al usuario mantener su información después de cambiar su teléfono. Paralelamente, el usuario también puede cambiar de operador de telefonía, manteniendo el mismo equipo simplemente cambiando la tarjeta SIM.


Alcance


Para tener conexión GSM se hace uso de antenas, y por lo tanto el alcance es algunas veces reducido dependiendo de la distancia hacia ellas, y también de la frecuencia con la que opera el dispositivo.

Seguridad
  • GSM fue diseñado con un nivel moderado de seguridad. El sistema fue diseñado para autentificar al subscriptor usando una clave pre compartida y un desafío-respuesta. Las comunicaciones entre el subscriptor y la estación base pueden ser encriptadas. El desarrollo del UMTS introdujo un Modulo de Identidad Universal del Subscriptor (Universal Subscriber Identity Module), que utiliza una clave de auntenticidad más larga para dar una mayor seguridad, y para autentificar mutuamente al usuario y la red, a diferencia del GSM que solo autentifica el usuario a la red y no al revés. 
  • GSM usa diversos algoritmos de encriptación para la seguridad. Los cifradores A5/1, A5/2, y A5/3 son usados para asegurar la privacidad de voz por teléfono. A5/1 fue el primero en ser desarrollado y es un algoritmo fuerte usado en Europa y Estados Unidos, A5/2 es más débil y es usado en otros países. 
  • GSM usa GPRS(General Packet Radio Service) para transmisión de datos, como navegar en internet. 
3G

3G (tercera generación) es un servicio de transmisión de voz y datos a través de telefonía móvil mediante UMTS (Universal Mobile Telecommunications System).

Los servicios asociados con la tercera generación proporcionan la posibilidad de transferir tanto voz y datos (una llamada telefónica o una videollamada) y datos no-voz (como la descarga deprogramas, intercambio de correos electrónicos, y mensajería instantánea).

Aunque esta tecnología estaba orientada a la telefonía móvil, desde hace unos años las operadoras de telefonía móvil ofrecen servicios exclusivos de conexión a Internet mediante módem USB, sin necesidad de adquirir un teléfono móvil, por lo que cualquier computadora puede disponer de acceso a Internet. Existen otros dispositivos como algunos ultrapórtátiles (netbooks) que incorporan el módem integrado en el propio equipo, pero requieren de una tarjeta SIM para su uso, por lo que en este caso sí es necesario estar dado de alta con un número de teléfono.

Seguridad
  • Las redes 3G ofrecen una mayor seguridad que sus predecesores. Al permitir al Equipo de Usuario (User Equipment) autentificar la red a la que esta adjunta, el usuario puede asegurarse de que la red es la intencionada y no una impostora. Las redes 3G usan el cifrado de bloques KASUMI en vez de el viejo A5/1. Sin embargo, se han identificado debilidades serias en el cifrado KASUMI.
  • Además de la infraestructura de seguridad de las redes 3G, se ofrece seguridad de punto a punto cuando los marcos de aplicación como el IMS son accesados, aunque esta no es una propiedad estrictamente del 3G.
4G


4G es el nombre dado a la tecnología móvil de la cuarta generación de dispositivos móviles como los teléfonos celulares. Está disponible desde 2009, donde comenzó con algunos proveedores en Estados Unidos. No hay un acuerdo en la industria sobre los estándares que debe cumplir el 4G, actualmente sus características simplemente son metas más que requerimientos.A diferencia de las demás generaciones de tecnología móvil, 4G es ampliamente usado para acceder a internet en computadoras, además de comunicarse vía teléfono celular.

Una de las tecnologías clave del 4G en adelante, es el llamado OWA(Open Wireless Architecture), que soporta múltiples interfaces inalámbricas en el aire en una plataforma de arquitectura abierta.
De un sistema 4G se espera que proporcione una banda ancha móvil basada en IP, segura y comprensiva para laptops, modems inalámbricos, smartphones y otros dispositivos móviles.
  • Algunos usos:
  • Acceso a Internet
  • Telefonía IP
  • Servicios de Juegos
  • Multimedia Streaming
Seguridad

Además de aumentar la velocidad de transmisión de datos, 4G incrementa las medidas de seguridad.

Alcance


El alcance total es bastante variable, depende del número de usuarios, geografía física, y por supuesto la distancia hacia una torre.
La distancia puede llegar a ser de entre 30 y 50 kilómetros.

Wifi


Wi-Fi, es una tecnología de redes inalámbricas usadas a lo largo del planeta. Wi-Fi se refiere a cualquier sistema que usa el estándar 802.11, que fue desarrollado por el Instituto de Ingenieros Eléctricos y Electrónicos(IEEE). El término Wi-Fi se le atribuye a Wi-Fi Alliance, un grupo de comercio que inicio la comercialización de la tecnología.


En una red Wi-Fi, las computadoras con tarjetas de red Wifi se conectan de manera inalámbrica a un router inalámbrico. El router es conectado a internet mediante un módem, typicamente mediante un cabe.

Las redes Wifi pueden ser abiertas, para que cualquier persona pueda usarlas, o cerradas en donde una contraseña es necesaria para poder usarlas. Un área cubierta por acceso a internet, es llamada punto de acceso wifi.

La tecnología Wifi hace uso de radio para la comunicación, típicamente en una frecuencia de 2.4 Ghz. Los dispositivos electrónicos que están Certificados en Wifi, están garantizados para interoperar entre ellos sin importar la marca. 

Seguridad

El principal problema de seguridad en las redes WiFi es su acceso simplificado a distancia, ya que a diferencia de las redes alámbricas, para WiFi no es necesaria una conexión física hacia la red, y puede ser accedida desde lugares fuera de los deseados, si no se tiene la seguridad y encriptación adecuada.
  • Un método para arreglar esto es solo permitir computadoras con direcciones MAC determinada  unirse a la red. 
  • La encriptación WEP(Wired Equivalent Privacy) fue diseñada para protegerse del espionaje, pero ya no es considerada segura. Herramientas como AirSnort o Aircrack-ng pueden recuperar fácilmente las claves de encriptación WEP. 
  • Por la inseguridad del WEP, la Wi-Fi Alliance aprobó la Wi-Fi Protected Access(WPA) que usa TKIP. WPA fue específicamente diseñado para trabajar con equipo más viejo usualmente mediante actualización de firmware. Aunque es mas seguro que WEP, sigue teniendo vulnerabilidades. 
  • La más segura WPA2 usa el Estándar de Encriptación Avanzado, presentado en el año 2004, y la mayoría de los dispositivos Wi-Fi actuales lo soporta. WPA2 es compatible con WPA.
Alcance
  • Cuaquier usuario a 61 metros del punto de acceso, puede conectarse a internet mediante WiFi, aunque para tener mejores tasas de transmisión de datos, se necesitan distancias de 30 metros o menos. Las tiendas suelen vender ampliadores de señal para extender estas distancias.
  • Las nuevas tecnologías WiFi extienden el rango de 91.5 metros a 183 metros y más, incrementando las tasas de transmisión de datos.
WiMax


WiMAX es una tecnología de acceso a banda ancha inalámbrica basada en IP, que proporciona un desempeño similar a redes Wi-Fi/802.11 con la cobertura y calidad de servicio de redes celulares. WiMAX es un acrónimo de "Worlwide Interoperarability for Microwave Access".


WiMAX es un sistema de comunicaciones digitales inalámbrico, también conocido como IEEE 802.16, y es pensado para redes de área metropolitana inalámbricas. Con WiMAX, las tasas de transmisión de datos de WiFi son soportadas, pero el problema de la interferencia es minimizado. WiMAX opera en frecuencias licenciadas tanto como en no licenciadas, proporcionando un ambiente regulado y un modelo económico viable para los portadores inalámbricos.

Alcance

WiMAX puede proveer acceso a banda ancha inalámbrica hasta a 50 Km para estaciones fijas, y entre 5 y 15 Km para estaciones móviles. En contraste, las redes de área local WiFi están limitadas en la mayoría de los casos a 30-100m.

Seguridad

  • La seguridad de WiMax soporta dos encriptaciones estándar de alta calidad, DES3 y AES. El estándar define un procesador de seguridad dedicado a bordo de la estación base. Además hay requerimientos de encriptación mínimos para el trafico y para la autenticidad punto a punto.
  • El tráfico en una red WiMax debe ser encriptado usando un modo de contador con Cipher Block Chaining Message Authentication Code Protocol(CCMP) que usa AES para seguridad de transmisión y autenticidad de la integridad de datos.
  • La metodología PKM-EAP(Extensible Authentication Protocol) es usada en la autenticidad punto a punto, la cual depende en el estándar TLS de encriptación de claves públicas.

Referencias:

jueves, 16 de febrero de 2012

Wiki Contributions - Week 3


In this week, I investigated a little about Cuda C syntax, I know it's pretty much C, but it contains some new stuff that I think needed to be explained, so it would be easier to pass other language programs to CUDA in order to run them in the GPU. Also it's pretty much the only thing I can do with the GPU team, because I don't have a CUDA enabled GPU, anyway I'm planning to also do parallel programming stuff in other languages(python, java, [also I'm particularly interested a lot in Perl now because of this, I want to do something similar, but legal]).

Anyway my contributions to the wiki for the class were the following:

  • CUDA Abstractions(Kernels, Threads[Grids and Blocks], Memory, Host and Device) with code, and CUDA Language Extensions, Function Type qualifiers, variable qualifiers, etc.
  • Cuda C compiling guide in Linux, this is a small guide for compiling CUDA code (which doesn't require Nvidia graphic cards). So, because it is a guide and not information itself, I think it's better to post it here in my blog, and put a link in the wiki just in case somebody need it.
And in the laboratory:
Future contributions

And what I'm planning to do in a near future:
- Compile CUDA C code, to learn about common mistakes and what can I do. The area in which I can help is to learn the much I can the language extensions and other CUDA C stuff in case we need it.
- Parallel scipt in some language to copy something from webpages, like the Pirate Bay one, but legal.

Nomination

My nomination of this week is again Isaias, because he told me that I can compile CUDA C code in my computer(but not run it), and also he made some CUDA C code about sum of arrays which is a pretty good advance.

miércoles, 15 de febrero de 2012

Compiling Cuda C code in Linux

If you don't know how to do it, here I'll explain in short how do you install the CUDA toolkit and what do you need in order to compile CUDA C code.

First of all, this is just to COMPILE, not to run, I can't do that part of the guide because I don't own a Nvidia graphics card or whatsoever, and of course I'm not going to post someone else's guide to that if I can't test if it works. Knowing that lets begin.

First, download the CUDA Toolkit 4.1 from here. I downloded the Ubuntu 10.04 version because I have Ubuntu 10.10 which is an earlier version and I didn't had any problem with it. It weights around 189 MB so be patient while it downloads.

When the download finishes, run the downloaded package. It should be called something like cudatoolkit_4.1.28_linux_ubuntu10.04.run(depending on the version you download, and your OS this will change obviously), give it executing permissions using chmod a+x cudatoolkit_4.1.28_linux_ubuntu10.04.run and run it with ./_ubuntu10.04.run.

If you can't, use sudo su and type your password to identify yourself as root, and run it again. This should produce an output like this:


As we can see, it will ask you the install directory, if we don't really care just press enter and it will be installed on /usr/local/cuda.

When it finishes we will probably need to set the PATH to this directory, or else we will not be able to compile our code, to check if your PATH is set try using the nvcc command, if you don't have the PATH set, the terminal will output something like "No command 'nvcc' found...", in that case we will need to set the PATH using: export PATH=$PATH:/usr/local/cuda/bin. Like this:


As we can see at first it didn't recognize the nvcc command, but after setting the PATH the nvcc command was recognized.

Now we can try to compile our own code in CUDA C, for this you can use the following Hello World example:


Try to compile it with nvcc filename.cu(notice the .cu extension). It should just produce a file named filename.cu.cpp.ii. Like this:
If you get the "Error trying to exec 'cc1plus'" message, install g++ and that should fix it.

As a compiler, if the code has syntax errors, or something like that, it shows you the line and the type of error the code has. For example making a simple ";" missing error produces the following feedback at compiling.(Which in this case doesn't tell anything about the ";" missing)


And that is all about compiling CUDA, for other weekly reports in class, I will probably try to compile some Merge Sort, Bubble Sort, or something like that in CUDA and I will ask someone else to run it for me.