Archivo

Entradas Etiquetadas ‘flash’

[Arduino] Utilizando la memoria Flash en lugar de la SRAM para constantes

Viernes, 2 de Diciembre de 2011 Gaspar Fernández Sin comentarios

temp_ardublogOtra cosa no, pero los Arduino no son conocidos por su gran memoria RAM, y es que, por ejemplo en la serie Diecimila, con el Atmega168 tenemos 1Kb de RAM, con el Atmega328, hay 2Kb de RAM, aunque puede que para algunos de nuestros programas nos quedemos un poco cortos.

Una gran ayuda para esto puede ser utilizar las constantes que cree nuestro programa, en forma numérica de tabla de valores constante, o de cadena de caracteres, por ejemplo, para enviar mensajes predeterminados por el Serial, decir el nombre de la aplicación, la versión, etc.

PROGMEM

Será una macro creada para almacenar datos en espacio de programa. El programa no ocupará más, y tendremos más memoria libre para utilizar y reservar a nuestro antojo.

Antes de utilizar PROGMEM, debemos hacer

1
#include <avr/pgmspace.h>

y así poder tener acceso a todas las funciones adicionales que nos proporciona esta biblioteca.

Viendo la memoria libre

Hay una función que encontré aquí, un poco chapucera, pero eficiente (en la web hay mejores funciones, pero esta es la primera que encontramos), y que calcula el espacio que queda en la memoria (en bytes):

1
2
3
4
5
6
7
8
9
10
11
12
13
// this function will return the number of bytes currently free in RAM
// written by David A. Mellis
// based on code by Rob Faludi http://www.faludi.com
int availableMemory() {
  int size = 1024; // Use 2048 with ATmega328
  byte *buf;

  while ((buf = (byte *) malloc(--size)) == NULL);

  free(buf);

  return size;
}

Con esta función podemos ver la memoria que nos queda:

PROGMEM CON NÚMEROS (int, float, char, byte, unsingeds…)

Para probarlo, lo mejor es ver una demostración (no he incluido la función availableMemory(), copiad y pegad de arriba):

1
2
3
4
5
6
7
8
9
10
11
12
void setup()
{
  Serial.begin(9600);
}

PROGMEM int numero=25;
void loop()
{
  Serial.println(numero, DEC);
  Serial.println(availableMemory(), DEC);
  delay(1000);
}

Podemos ver cómo numero está declarado como PROGMEM int, bien, eliminemos el PROGMEM y vemos qué hace, ¡tenemos 2 bytes menos libres! Aquí demostramos que de verdad no estamos utilizando la RAM.

Arrays de números

Ahora viene lo bueno, no hacemos nada si sólo almacenamos en Flash valores, por separado, lo interesante es poder almacenar arrays con lo que tendremos muchas más posibilidades.
Por ejemplo, podemos hacer:

1
2
3
4
5
6
7
8
9
10
11
12
PROGMEM int numeros[]={10, 29, 38, 47, 56, 64, 73, 82, 91, 0};

void loop()
{
  static int pos=0;
  Serial.println(pgm_read_word(&numeros[pos++]));
  Serial.println(availableMemory(), DEC);
  if (pos==10)
    pos=0;

  delay(1000);
}

Cada segundo mostrará por pantalla un número del array de enteros, y todos estarán en Flash, el coste de eso será de unos 100bytes más en el binario que, por tanto también irá a Flash, además de algunos ciclos de procesador; aunque en este caso, importa más la memoria.

He utilizado pgm_read_word() porque el array es de enteros (2 bytes = 1 word), si nuestra variable fuera de 1 byte (char, byte) se podrá utilizar pgm_read_byte() y si la variable es de 4 bytes (long) podremos utilizar pgm_read_dword(), para variables tipo float tenemos de igual manera pgm_read_float().

Cadenas de caracteres sin buffer

Para escribir cadenas de caracteres, lo mejor es utilizar un buffer (pero ya estamos gastando memoria), por tanto vamos a hacer un ejemplo para imprimir por el Serial sin necesidad de utilizar buffer:

1
2
3
4
5
6
7
8
9
10
11
12
13
char mens[] PROGMEM = "Hola mundo cruel y despiadado";

void loop()
{
  char *mem=mens;

  while (pgm_read_byte(mem) != 0x00) /* Comparamos con \0, un terminador */
    Serial.print(pgm_read_byte(mem++));
  Serial.println();

  Serial.println(availableMemory());
  delay(1000);
}

Podemos hacer el mensaje más largo, que seguimos consumiendo la misma cantidad de memorial. Para imprimir por el Serial con esta técnica podemos crear una función (printpgm()):

1
2
3
4
5
6
7
8
void printpgm(char *texto)
{
  char *mem=texto;

  while (pgm_read_byte(mem) != 0x00) /* Comparamos con \0, un terminador */
    Serial.print(pgm_read_byte(mem++));
  Serial.println();
}

o como comentan aquí, modificar la clase HardwareSerial para incluir un método que imprima cadenas de caracteres procedentes de la memoria de programa.
Y creando estas funciones nos llevamos alguna que otra sorpresa en memoria libre (aunque pequeña).

Limitando el uso de Flash en Firefox

Miércoles, 20 de Julio de 2011 Gaspar Fernández 2 comentarios

Hace dos días leo en Usemos Linux un artículo sobre administrar el uso de Flash desde Firefox, aunque yo estaba preparando una recopilación parecida de extensiones que nos ayudarán para limitar el uso de esta tecnología.

Introducción

Debo destacar que Flash me parece una tecnología muy pesada, que encierra errores del pasado para asegurar retrocompatibilidad y eso se traduce en bajo rendimiento. Es multiplataforma, aunque a duras penas, y beneficia muchas veces a plataformas Windows.

Aunque tenemos alternativas, muchas veces se puede hacer lo mismo utilizando HTML+Javascript / Ajax o HTML5, también tenemos Silverlight / Moonlight (aunque el remedio no sea muy diferente a la enfermedad), a veces, tanto diseñadores como programadores se ponen en contra del mundo creando páginas con bastantes flash empotrados, por ejemplo, dificultando la navegación por la web, consumiendo ancho de banda y, a veces, consumiendo nuestro procesador haciendo que todo nuestro sistema nos vaya más lento.

I. Stop Autoplay

Es mi preferido, me permite, desactivar todos los elementos que se reproduzcan automáticamente, como música, vídeos empotrados, Flash o Silverlight, permitiendo reproducirlos cuando hacemos click sobre ellos.

Permite introducir máscaras para que no haya que pulsar sobre ciertos elementos y se reproduzcan automáticamente, pero yo prefiero hacer click si voy a reproducir.

Es muy útil para el primer caso descrito arriba, webs con muchos elementos flash que nos incomodan, nos permite pasar un poco de todos ellos ganando rendimiento y comodidad; por cierto, también es muy útil para juegos de Facebook donde te pones a aceptar regalos y cada vez que aceptas se carga el juego, con esto se acabaron los problemas.

Tiene cierto parecido con Flashblock, pero me gusta mucho más Stop Autoplay.

Lo podemos descargar desde aquí. Según dice el autor hubo problemas con votos negativos en la página de complementos de Mozilla y tuvo que retirarlo.

II. Low Quality Flash

Esta extensión hace que todos los elementos Flash se reproduzcan en baja resolución. Si tienes un ordenador con algunos años lo agradecerás…

Se puede descargar desde aquí.

Actualización 20/07/2011 10:16 — No funciona en Firefox 5, habrá que esperar un poco, o modificar el plugin a mano, creo que no hace nada que FF5 haya prohibido.

III. Flashtoggle y QuickJava

Nos permiten activar y desactivar Flash globalmente. Podemos desactivar Flash en cualquier momento, aunque para reactivarlo hace falta recargar la página.

QuickJava nos permite activar y desactivar Java / Javascript / Flash / Silverlight / Imágenes / CSS por lo que es mucho más completo.

Podemos bajarlos desde aquí: Flashtoggle / QuickJava

IV. Flash Resizer

Otra joya que nos permite ver un elemento Flash con menor o mayor tamaño del que viene en una web de una forma muy sencilla… redimensionándolo con el ratón.

Lo podemos bajar de su página oficial.

Algo más

Bueno, todo esto está muy bien, pero no podemos olvidarnos de Flash Video Replacer, extensión de la que ya hablé hace un año más o menos, que reemplaza el vídeo flash empotrado por un reproductor del sistema que sin duda irá más rápido y aprovechará mejor la aceleración hardware.

Curioso e interesante III: Licencias libres, sistemas de productividad, diseño web, Linux 5%

Jueves, 15 de Julio de 2010 Gaspar Fernández Sin comentarios

En los últimos días me he encontrado con información interesante, ¡echadle un vistazo!

Categories: General Tags: , , , , , ,

Visita otras webs de la red