desktop

Raspberry Pi se renueva con su modelo B+

:LOL: por eso mejor espero un tantito hasta que se vaya depurando todos esos fallos y luego me la compro :)

¿Cuánto vas a esperar?

Total, todavía no lo han traído en mi local más cecano. No olvides que aunque haya pasado seis meses, puede tener la peor versión que todavía no ha vendido.

No se si esperar un poco más hasta que salga la nueva revisión. Raspberry Pi 2 para mi, bajo mi punto de vista, está hecho con actualizaciones menores, y no ha incluido el reloj de serie y hay que recurrir al famoso DS1307 por nombrar alguno.

rtcpi4.jpg


Dejaré pasar unos meses como tu, y lo compraré.

Saludos.
 
Para que se den una idea del poder de este tipo de placas, yo estoy usando un BeagleBone Black (BBB), que tiene un poco más de uP, pero al lado del Raspberry no tiene la gran ventaja multimedia de resolver los codecs por hard.

Sin embargo, con el BBB me dá para tomar una señal PAL/NTSC en blanco y negro (70nS por pixel), mostrar en pantalla con el OpenCv y procesar la imagen (aplicar filtros, máscaras, realce de contraste, etc). La ventaja que creo que tiene el BBB respecto al Raspberry, es la comunidad y que tooodo es abierto.
 
Si es cuestión de potencia, poes e Galileo o el Odroe.


Viendo lo visto por todo internet, para el precio que pago. Mejor Raspberry Pi 2, ya que cuesta más barato, hay más información e incluso libros en papel, muchos documentos y ejemplos por Internet, así que los demás no les veo mucha ventaja a cara el futuro.

Lo que le deberían poner en P 2 era un reloj incorporado, USB 3, más procesador, y más cosas. Ojalá en el Pi 3 dentro de un par de años haga algo decente.

Lo que pasa que estas gente su filosifía es barato y que lo pueda tener todo el mundo, por eso es el más recomendado en documentación.

Saludos.

Saludos.
 
Yo creo que más allá de la potencia, lo importante es conseguir una buena comunidad que ayude, porque salvo que la tengas muy clara, para resolver ciertos proyectos, estos bichos suelen ser demasiados complejos.
 
Pues si, tiene que ser muy apoyado por la comunidad o se quedará en el olvido. Mira como Rapberry Pi 2 a pesar de ser muy nuevo y menos potente la mayoría opta por él.

¿Por qué?

Saludos.
 
Para que se den una idea del poder de este tipo de placas, yo estoy usando un BeagleBone Black (BBB), que tiene un poco más de uP, pero al lado del Raspberry no tiene la gran ventaja multimedia de resolver los codecs por hard.

Sin embargo, con el BBB me dá para tomar una señal PAL/NTSC en blanco y negro (70nS por pixel), mostrar en pantalla con el OpenCv y procesar la imagen (aplicar filtros, máscaras, realce de contraste, etc). La ventaja que creo que tiene el BBB respecto al Raspberry, es la comunidad y que tooodo es abierto.

Lo interesante de la Beaglebone es que tiene un microcontrolador Sitara, no es solo microprocesador, trae módulos analógicos, salidas PWM, módulos de comunicación.
Pero es cierto que ya tendrían que avanzar con el microprocesador, ya es algo viejito el Cortex A8, quedó en tecnología de 45 nm. El A7 multicore me parece el procesador perfecto para estas placas, buena eficiencia y se deja agregar núcleos sin usar disipador. No sé porque no lo toma Texas Instruments para producirlo, tanto que hincha las bolas con la eficiencia energética. Bueno, es el que usa la nueva Raspberry.

Y sino se podrían jugar con uno de estos:
a15.jpg

Pero si puede ser que la vean orientada a aplicaciones industriales donde le saca soberbia ventaja a cualquier microcontrolador de gama media.
 
Los PRU del BBB son un golazo, tenés 2 uP aparte que te permite aislarte del principal y por ende si estás en Linux (o cualquier SO que no sea RT) podés manjear puertos/memoria en tiempo real.

Por ej. no sería muy difícil armarte un generador muuuy interesante con eso.
 
Última edición:
Dices bien, cosmefulanito04... en cuanto los vi, me dije que ya tenía resuelto algo tan vital como el redibujado de displays de segmentos. O la comunicación serie con otros dispositivos. Y todo ello sin preocuparme de interrupciones en la CPU principal.

Impresionante... tienes 3 CPU independientes a tu disposición...
 
Para responder las preguntas que me fueron hechas sobre que es lo que pienso hacer con la software Mathematica y SystemModeler de Wolfram y de porqué requiero de tanta capacidad de procesamiento como lo ofrecen las placas LPCXpresso, lo que sigue. Aquí encuentran un hilo en este foro en que presento los datos sobre el proyecto motivo de estos estudios.
Se trata de usar la modelación y la posibilidad resultante de simular la modelación de mi sistema de control de escotas. Verificar la calidad del modelo que pienso desarrollar de mi sistema de control de escotas el introducir valores medidos en la hardware real me apoyará. Ademas existen funciones en Mathematica, llamadas "solver", que pueden definir una función que se aproxime a valores medidos. Entendiendo y portando lo que existe, "Mathematica y Wolfram Language" en el RaspBerry Pi y la comunicación existente entre SystemModeler y la placa Teensy 3.1 que usa el protocolo "Firmata" como implementación del nivel 2, "nivel de presentación", quiero beneficiarme partiendo de algo que existe! Dentro del nivel 2 del modelo de comunicación OSI de 7 niveles, es donde se reflejan las funcionalidades de la "hardware" como registros y periferias. Mi idea es que un protocolo que se beneficie de las definiciones dentro de las librerías CMSIS existentes para los controladores del tipo ARM Cortex Mx, podría crear una "representación" de las funcionalidades de una cierta instancia de controlador usando las definiciones en la libreria "*.h" a incluir que existen. NXP es ejemplar en la calidad de su soporte de CMSIS.
 
Última edición:
Pruebas de velocidad (preliminar) de la nueva Raspberry Pi 2.

Pruebas de CPU y de rendimiento de bases de datos.

Resultados de CPU: Una Pi 2 es cinco veces más rápida que una Raspberry 512 MB, a igual frecuencia, y siete veces a velocidad normal.

Resultados de base de datos: doble de velocidad que la de 512 MB, a igual frecuencia, pero hay que tener en cuenta algunos detalles indicados en el mensaje enlazado.
 
En mi caso Joaquín, la placa RaspBerry Pi no es mas que plataforma de estudio para entender como dialogar entre software de Wolfram en el ordenador con aquella en la placa RaspBerry Pi. Ademas me va a servir para estudiar y aprender algo sobre Linux. Ahí estoy bastante seguro que la placa RaspBerry Pi 2 me va a alcanzar. Lo mismo es aplicable a la placa "Teensy 3.1". Ella puede comunicarse con SystemModeler de Wolfram en el ordenador usando el protocolo "Firmata". Pienso usar ese entorno para poder de allí partir desde un sistema que funciona a mi objetivo de implementar el diálogo entre las placas LPCXpresso con los controladores ARM Cortex Mx de NXP. Hoy me compré y me descargue los 2 libros sobre el entorno de "FreeRTOS" para la placa LPCXpresso1769 y el manual de referencia. tengo la intención de usar FreeRTOS en las placas de mi sistema de control de escotas del modelo de mi velero! Quizá en un futuro la placa RaspBerry Pi 2 o alguna posterior me permitirán sumar la función de "webserver" en mi modelo y usar el Internet como medio de comunicación!
 
Quizá en un futuro la placa RaspBerry Pi 2 o alguna posterior me permitirán sumar la función de "webserver" en mi modelo y usar el Internet como medio de comunicación!
Todas las placas con microprocesador (y algunas con microcontrolador) ya tienen servidores web. Un servidor web no es muy complicado. Ejemplo en Arduino. En máquinas como Raspberry y siguientes, también es sencillo, ya que traen el Apache: Servidor web con Raspberry Pi
 
Estuve jugando un poco con assembler para ver la diferencia con C (usando GCC como compilador).

La operación realizada fue aplicar una máscara a una imagen en blanco y negro, es decir por un lado tengo el puntero de la imagen original y por el otro un puntero de una imagen que contiene todos los bytes en 0xFF menos aquellos bytes que deseo llevar a 0x00 (negro), para luego aplicar una AND entre las dos imágenes.

Se usa OpenCv para obtener la imagen original a partir de un archivo y al finalizar la rutina, se guarda el resultado en otro archivo.

Código en C:

PHP:
void enmascarar(void *ptr,void *image_data,unsigned int tamanio)
{
	unsigned int cont_tamanio;

	for(cont_tamanio=0;cont_tamanio<tamanio;cont_tamanio++)
    {
		*(unsigned char*)(image_data+cont_tamanio)&=*(unsigned char*)(ptr+cont_tamanio);
    }
}

Código en Assembler común:

PHP:
.global enmascarar
.type enmascarar, %function

enmascarar:
   push {r4-r10}
   
   mov r4, #0
 
   LOOP:      
    ldrb r5, [r0, r4]
    ldrb r6, [r1, r4]
    
    AND r5, r5, r6
    
    strb r5, [r1, r4]    
   
   add r4, r4, #1
   cmp r2, r4
   BNE	LOOP
   
   pop {r4-r10}
   mov pc, lr

En Assembler, r0-r3 son los registros usados como argumentos de la función (en este caso r3 no se usa), r4-r11 se pueden usar como registros de uso general, pero deberán guardarse antes de usar y al final de la rutina devolver sus valores. En este caso la función no devuelve nada, pero en caso de hacerlo, se hace mediante el registro r0-r1.

El código se puede mejorar un poco ahorrando la instrucción "ADD" y "CMP" usando directamente una resta ("SUB") y en vez de usar r4 como índice, se podrían usar los punteros originales de esta forma:

PHP:
ldrb r5, [r0]!

Carga en r5 el contenido apuntado por r0 y suma en 1 a r0. Será necesario usar otro registro como puntero de destino:
PHP:
...
mov r7, r1
LOOP:
...
  strb r5, [r7]!

Código en Assembler usando instrucciones NEON:

PHP:
.global enmascarar
.type enmascarar, %function

enmascarar: @r0: ptr de la máscara, r1: ptr de la imagen (destino), r2: cantidad de píxeles
   push {r4-r10}
   mov r2, r2, LSR#4 @Al trabajar con variables de 128bits (qn), trabajo de a 16bytes => la cantidad de píxeles deberán ser divididos por 16 o desplazar 4 veces a la derecha los bits 
   mov r5, r1
   mov r4, #0
   
   LOOP:      
     vld1.8 {q0}, [r0]! @Cargo los 1eros 16 bytes de la máscara y le sumo 16 a r0 (!= suma el índice por la cantidad de bytes leídos)
     vld1.8 {q1}, [r1]! @Similar al anterior
    
     vand q2, q0, q1
     
     vst1.8 {q2}, [r5]! @Almaceno en la memoria apuntada por r5 el resultado de la operación.       
   
   add r4, r4, #1
   cmp r2, r4
   BNE	LOOP
   
   pop {r4-r10}
   mov pc, lr

Al igual que antes, el loop se podría resolver con el uso de "SUB" en vez de "ADD" y "CMP".

Llamada reiterativa en todos los casos:

PHP:
unsigned int current_timestamp() {
    struct timeval te;
    gettimeofday(&te, NULL); // get current time
    return te.tv_usec; 
}

main()
{
 ...
  for(cont=0; cont<10; cont++)
    {
        t_0=current_timestamp();
        enmascarar(ptr, img->imageData, img->width*img->height);
        t_1=current_timestamp();

        printf("La diferencia de tiempo (uS): %d\n",(t_1-t_0));
    }
 ...
}

Resultados:

- Con C:

consola dijo:
La diferencia de tiempo (uS): 8691
La diferencia de tiempo (uS): 8669
La diferencia de tiempo (uS): 8647
La diferencia de tiempo (uS): 8661
La diferencia de tiempo (uS): 8652
La diferencia de tiempo (uS): 8700
La diferencia de tiempo (uS): 8995
La diferencia de tiempo (uS): 8687
La diferencia de tiempo (uS): 8683
La diferencia de tiempo (uS): 8678

- Con Assembler común:

consola dijo:
La diferencia de tiempo (uS): 3483
La diferencia de tiempo (uS): 3445
La diferencia de tiempo (uS): 3309
La diferencia de tiempo (uS): 3385
La diferencia de tiempo (uS): 3448
La diferencia de tiempo (uS): 3422
La diferencia de tiempo (uS): 3429
La diferencia de tiempo (uS): 3431
La diferencia de tiempo (uS): 3386
La diferencia de tiempo (uS): 3424

- Con Assembler usando instrucciones Neon:

consola dijo:
La diferencia de tiempo (uS): 1091
La diferencia de tiempo (uS): 1123
La diferencia de tiempo (uS): 1120
La diferencia de tiempo (uS): 1128
La diferencia de tiempo (uS): 1110
La diferencia de tiempo (uS): 1125
La diferencia de tiempo (uS): 1121
La diferencia de tiempo (uS): 1122
La diferencia de tiempo (uS): 1197
La diferencia de tiempo (uS): 1124

Hay una diferencia considerable a pesar de que la operación es simplemente una "AND", incluso el tiempo obtenido por la función "current_timestamp" tal vez no sea la mejor referencia de tiempo, pero dá una buena idea de la optimización del uso de Assembler en ciertas rutinas críticas.

Les dejo la imagen original y su resultado.

NOTA: originalmente en el programa guardo el archivo en BMP, por el tamaño, el foro no me dejo subir dicho archivo, por lo tanto lo convertí a jpg. Podía haber obtenido el jpg directamente desde el OpenCv, pero bue... no lo hice, tampoco cambia el resultado obtenido.
 

Adjuntos

  • lena.jpg
    lena.jpg
    153.7 KB · Visitas: 10
  • Resultado.jpg
    Resultado.jpg
    137.4 KB · Visitas: 10
Hola amigos, en la página de Internet anunciando la disponibilidad de la nueva placa RaspBerry Pi 2, aquí el enlace. En el párrafo inmediatamente encima de donde se menciona que Windows 10 será disponible, menciona que va a tomar unas semanas para hacer disponible distribuciones apoyadas en la versión anterior de Linux que realmente apoyen los múltiples núcleos. eso sí, también menciona que nuevas distribuciones de Linix, como Ubuntu, ahora funcionan en la nueva versión!
 
Estuve jugando un poco con assembler para ver la diferencia con C (usando GCC como compilador).

Hay una diferencia considerable a pesar de que la operación es simplemente una "AND", incluso el tiempo obtenido por la función "current_timestamp" tal vez no sea la mejor referencia de tiempo, pero da una buena idea de la optimización del uso de Assembler en ciertas rutinas críticas.
Hola.

Deberías echar un vistazo a la sección 1.4.3. Automatic vectorization, de la documentación de ARM, donde explica qué opciones poner para que el compilador pueda optimizar una operación de vectorización.

Y en la sección anterior, la 1.4.2. Intrinsics, te indica cómo incorporar los registros NEON al programa en C.

Con un poco de habilidad, se puede conseguir un código final casi igual al del ensamblador.
 
Del código Neon que publiqué, todavía se puede mejorar un poco:

PHP:
.global enmascarar
.type enmascarar, %function

enmascarar: @r0: ptr de la máscara, r1: ptr de la imagen (destino), r2: cantidad de píxeles
   push {r4-r10}
   mov r2, r2, LSR#5 @Se trabaja con 4 variables del tipo dn
   mov r5, r1
   
   LOOP_ENMASCARAR:      
     vld4.8 {d0-d3}, [r0]! @Cargo los 1eros 32 bytes de la máscara y le sumo 32 a r0 (!= suma el índice por la cantidad de bytes leídos)
     vld4.8 {d4-d7}, [r1]! @Similar al anterior
    
     vand d0, d0, d4
     vand d1, d1, d5
     vand d2, d2, d6
     vand d3, d3, d7
     
     vst4.8 {d0-d3}, [r5]! @Almaceno en la memoria apuntada por r5 el resultado de la operación.       
   
   subs r2, r2, #1
   BNE	LOOP_ENMASCARAR
   
   pop {r4-r10}
   mov pc, lr

A diferencia del código anterior, ahora estoy trabajando con 4 registros de 64bits (dn) a la vez, lo que sería trabajar con 32 bytes a la vez (antes trabajaba con 16 bytes). Lamentablemente no se puede trabajar con registros de 128 bits (qn). Tal vez se me siga escapando alguna optimización, hasta donde ví, no hay forma de hacer la AND con los 4 registros a la vez.

Esta mejora trae los siguientes tiempos:

consola dijo:
La diferencia de tiempo (uS): 988
La diferencia de tiempo (uS): 994
La diferencia de tiempo (uS): 884
La diferencia de tiempo (uS): 897
La diferencia de tiempo (uS): 882
La diferencia de tiempo (uS): 901
La diferencia de tiempo (uS): 883
La diferencia de tiempo (uS): 897
La diferencia de tiempo (uS): 828
La diferencia de tiempo (uS): 945

A lo que apunto con esto, es que la cantidad de alternativas es bastante grande y dejando de lado las funciones intrínsecas que menciona el compañero de arriba, si se realiza una operación demasiado compleja donde el tiempo es vital, es muy importante aprender a usar este tipo de instrucciones.
 
Última edición:
Atrás
Arriba