<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El violador de Segmentos</title>
	<atom:link href="http://elvioladordesegmentos.net/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://elvioladordesegmentos.net</link>
	<description>Blog sobre TI&#039;s, GNU, Programación, Electrónica y demás tontunas...</description>
	<lastBuildDate>Sun, 27 Nov 2011 20:18:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Creación de una imagen Emdebian para tu FriendlyArm</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/07/22/creacion-de-una-imagen-emdebian-para-tu-friendlyarm/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/07/22/creacion-de-una-imagen-emdebian-para-tu-friendlyarm/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 13:08:28 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[GNU/Linux]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=314</guid>
		<description><![CDATA[En una entrada anterior escribí sobre <a href="http://elvioladordesegmentos.net/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">cómo compilar e instalar u-boot en una tarjeta mini2440</a> y después escribí otra receta sobre <a href="http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-compilando-linux/">cómo compilar Linux para la misma tarjeta</a>. Ahora falta la última parte: instalar un sistema operativo, en concreto una versión de <em>Debian</em> para dispositivos empotrados: <a href="http://www.emdebian.org/">Emdebian</a>.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p><a href="http://www.emdebian.org/">Emdebian</a> es una distribución <a href="http://www.debian.org">Debian</a> especialmente diseñada para dispositivos empotrados. Su principal característica radica en el poco espacio que ocupa la distribución.</p>
<p><em>Emdebian</em> ofrece una <em>Toolchain</em>, un conjunto de herramientas de compilación cruzadas para crear paquetes para nuestra plataforma y repositorios con paquetes que ofrecen soporte a arquitecturas arm, ia64, m68k, mips, mipsel, powerpc y sparc. La instalación puede realizarse desde una máquina Debian con una arquitectura distinta a la arquitectura destino sin ningún tipo de problema utilizando <a href="http://packages.debian.org/lenny/debootstrap">debootstrap</a> o, como se hará en ésta receta, utilizando <a href="http://packages.debian.org/squeeze/multistrap">multistrap</a>, que permite crear un sistema nuevo utilizando varios repositorios y echando mano de <em>apt</em> y <em>dpkg</em> para solucionar posibles conflictos.</p>
<h2>Qué necesitamos</h2>
<p>Pues como he dicho anteriormente, utilizaremos <em>multistrap</em>, así que nos lo instalamos en nuestra máquina (ya sabeís, <em>apt-get</em> o <em>aptitude</em> bla, bla, bla&#8230;).</p>
<p>Además, supondremos que seguimos las recetas anteriores sobre <a href="http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-compilando-linux/">cómo compilar Linux para mini2440</a> y sobre <a href="http://elvioladordesegmentos.net/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">cómo configurar u-boot para arrancar el sistema desde una micro-sd</a>.</p>
<p>Deberemos tener una tarjeta microSD con dos particiones, una para el núcleo y otra que dejaremos para el sistema (como se explicó en la receta sobre la compilación de Linux). Tendremos el árbol de directorios resultante de la compilación de Linux, pues lo necesitaremos para instalar los módulos del núcleo.</p>
<h2>Creación de la imagen</h2>
<p>Como se comentó anteriormente, utilizaremos <em>multistrap</em> para crear la imagen de <em>emdebian</em>. Para ejecutar <em>multistrap</em> antes deberemos crear un archivo de configuración en el que especificaremos los repositorios desde los que descargaremos los paquetes, la arquitectura destino y el directorio que se utilizará como destino para la instalación, entre otras cosas. El archivo que he utilizado yo es el siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">[General]
</div>
</li>
<li class="li1">
<div class="de1">arch=armel
</div>
</li>
<li class="li1">
<div class="de1">directory=multistrap
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">#cleanup=true
</div>
</li>
<li class="li1">
<div class="de1"># same as &#8211;no-auth option if set to true
</div>
</li>
<li class="li1">
<div class="de1"># keyring packages listed in each debootstrap will
</div>
</li>
<li class="li1">
<div class="de1"># still be installed.
</div>
</li>
<li class="li1">
<div class="de1">noauth=false
</div>
</li>
<li class="li2">
<div class="de2"># extract all downloaded archives (default is true)
</div>
</li>
<li class="li1">
<div class="de1">unpack=true
</div>
</li>
<li class="li1">
<div class="de1"># aptsources is a list of sections to be used for downloading packages
</div>
</li>
<li class="li1">
<div class="de1"># and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list
</div>
</li>
<li class="li1">
<div class="de1"># of the target. Order is not important
</div>
</li>
<li class="li2">
<div class="de2">aptsources=Emdebian
</div>
</li>
<li class="li1">
<div class="de1"># the order of sections is not important.
</div>
</li>
<li class="li1">
<div class="de1"># the debootstrap option determines which repository
</div>
</li>
<li class="li1">
<div class="de1"># is used to calculate the list of Priority: required packages.
</div>
</li>
<li class="li1">
<div class="de1">debootstrap=Debian Emdebian
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">[Emdebian]
</div>
</li>
<li class="li1">
<div class="de1">packages=ifupdown udev procps netbase vim-tiny module-init-tools wget openssh-server screen apmd
</div>
</li>
<li class="li1">
<div class="de1">source=http://www.emdebian.org/grip/
</div>
</li>
<li class="li1">
<div class="de1">keyring=emdebian-archive-keyring
</div>
</li>
<li class="li2">
<div class="de2">suite=squeeze main
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">[Debian]
</div>
</li>
<li class="li1">
<div class="de1">packages=
</div>
</li>
<li class="li1">
<div class="de1">source=http://ftp.uk.debian.org/debian
</div>
</li>
<li class="li2">
<div class="de2">keyring=debian-archive-keyring
</div>
</li>
<li class="li1">
<div class="de1">suite=squeeze main</div>
</li>
</ol>
</div>
<p>La clave <em>arch</em> especifica la arquitectura destino de la distribución, en éste caso <em>armel</em> y la clave <em>directory</em> especifica el directorio destino en el que se desplegará la instalación. En nuestro caso, lo hará dentro del directorio <em>multistrap</em>, subdirectorio del directorio en el que se encuentra nuestro archivo de configuración.</p>
<p>Es importante que la clave <em>cleanup</em> esté comentada (o puesta a <em>false</em>). Ésto hará que la caché de <em>apt</em> no se limpie tras la instalación, pues necesitaremos los paquetes para reinstalarlos en el último paso desde la plataforma destino. El resto de opciones del archivo se pueden ver en la página sobre <em>emdebian</em>, así que no las comentaré aquí.</p>
<p>Guardamos el fichero con el nombre <em>multistrap.conf</em> (por darle algún nombre). Después, podemos instalar:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~/emdebian$ ls
</div>
</li>
<li class="li1">
<div class="de1">multistrap &nbsp;multistrap.conf
</div>
</li>
<li class="li1">
<div class="de1">javieralso@rigoberto:~/emdebian$ sudo multistrap &#8211;no-auth -f multistrap.conf</div>
</li>
</ol>
</div>
<p>Podemos ver que el directorio <em>multistrap</em> en el que quedará instalado <em>emdebian</em> y el archivo de configuración están bajo el mismo directorio. Tras invocar a <em>multistrap</em> podremos ver como se descargan los paquetes y se desempaquetan dentro del directorio <em>multistrap</em>.</p>
<p>Ahora tendremos un sistema muy básico que todavía no es funcional del todo. Tendremos que reinstalar todos los paquetes en el sistema destino, para lo cual deberemos poder logearnos. Como la distribución que tenemos es muy básica, no podremos hacerlo, puesto que <em>/etc/passwd</em> aún no existe, así que nos lo creamos nosotros:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~/emdebian$ cd multistrap
</div>
</li>
<li class="li1">
<div class="de1">javieralso@rigoberto:~/multistrap$ sudo su
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# echo &quot;root:Npge08pfz4wuk:0:0:root:/root:/bin/bash&quot; &gt; etc/passwd
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# echo &quot;root:Npge08pfz4wuk:0:&quot; &gt; etc/group
</div>
</li>
<li class="li2">
<div class="de2">rigoberto:/home/javieralso/emdebian/multistrap#</div>
</li>
</ol>
</div>
<p>Como podemos ver, también hemos creado el archivo <em>/etc/group</em>. Recordad tener cuidado con no sobreescribir los archivos de <strong>VUESTRA</strong> máquina, no la vayais a liar&#8230;.</p>
<p>Lo que hemos hecho ha sido asignar la contraseña <em>password</em> al usuario <em>root</em> utilizando el formato de contraseña <em>salt/password</em>, aunque para finalizar, aún debemos hacer mas cosas:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/mutistrap# echo &quot;proc /proc proc none 0 0&quot; &gt;&gt;etc/fstab
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# echo &quot;mini2440&quot; &gt;etc/hostname
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/console c 5 1
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/ttySAC0 c 204 64</div>
</li>
</ol>
</div>
<p>Después de ésto, empaquetamos el directorio.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# tar jcf ../emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 .
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap#</div>
</li>
</ol>
</div>
<p>Ahora, suponiendo que hemos montado la partición 2 de la tarjeta microSD (donde se supone que vamos a instalar el sistema) en el directorio <em>/media/rootfs</em>, podemos cargar ahí el sistema recién creado:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian/multistrap# cd ..
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian# unp emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 /media/rootfs/
</div>
</li>
<li class="li1">
<div class="de1">rigoberto:/home/javieralso/emdebian#</div>
</li>
</ol>
</div>
<p>Instalamos los módulos del núcleo que compilamos en su momento, para eso, nos vamos al directorio <em>mini2440</em> que creamos en su día y ejecutamos lo siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~/kernel/mini2440# sudo make INSTALL_MOD_PATH=/media/rootfs/ &nbsp;O=../kernel-bin/ modules_install
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">Lots and lots of INSTALL messages
</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</div>
</li>
</ol>
</div>
<p>Desmontamos la tarjeta, la insertamos en nuestra <em>MINI2440</em> y arrancamos (conectando el puerto serie de la tarjeta a nuestro PC y arrancando <em>minicom</em>).</p>
<p>Cuando el sistema termine de arrancar, veremos que se para porque no encuentra el archivo <em>/etc/inittab</em>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">mmcblk0: mmc0:b368 MSD &nbsp; 1.85 GiB
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;mmcblk0: p1 p2
</div>
</li>
<li class="li1">
<div class="de1">s3c2410-rtc s3c2410-rtc: setting system clock to 2010-07-20 23:14:47 UTC (1279667687)
</div>
</li>
<li class="li1">
<div class="de1">usb 1-1: new full speed USB device using s3c2410-ohci and address 2
</div>
</li>
<li class="li2">
<div class="de2">usb 1-1: configuration #1 chosen from 1 choice
</div>
</li>
<li class="li1">
<div class="de1">kjournald starting. &nbsp;Commit interval 5 seconds
</div>
</li>
<li class="li1">
<div class="de1">EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
</div>
</li>
<li class="li1">
<div class="de1">EXT3 FS on mmcblk0p2, internal journal
</div>
</li>
<li class="li1">
<div class="de1">EXT3-fs: recovery complete.
</div>
</li>
<li class="li2">
<div class="de2">EXT3-fs: mounted filesystem with writeback data mode.
</div>
</li>
<li class="li1">
<div class="de1">VFS: Mounted root (ext3 filesystem) on device 179:2.
</div>
</li>
<li class="li1">
<div class="de1">Freeing init memory: 136K
</div>
</li>
<li class="li1">
<div class="de1">INIT: version 2.88 booting
</div>
</li>
<li class="li1">
<div class="de1">INIT: No inittab file found
</div>
</li>
<li class="li2">
<div class="de2">Enter runlevel:</div>
</li>
</ol>
</div>
<p>Introducimos &#8216;s&#8217; (single user) y cuando nos pida contraseña introducimos: &#8220;<em>password</em>&#8220;. De ésta forma tendremos una Shell con permisos de root muy básica, pero con la que podremos terminar de instalar el sistema.</p>
<p>A continuación remontamos el sistema de archivos como sistema de lectura/escritura:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@(none):~# mount -n / -o remount,rw</div>
</li>
</ol>
</div>
<p>y después montamos el sistema de archivos <em>/proc</em>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@(none):~# mount -n /proc</div>
</li>
</ol>
</div>
<p>Ahora debemos reinstalar todos los paquetes. Aunque los paquetes ya &#8220;están&#8221; en el disco, debemos &#8220;reinstalarlos&#8221; para que se genere la base de datos del sistema:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@(none):~# cd /var/cache/apt/archives
</div>
</li>
<li class="li1">
<div class="de1">root@(none):/var/cache/apt/archives# dpkg &#8211;force-all -i libc6* libstdc++* libncurses5* dpkg_*
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li2">
<div class="de2">lots and lots of installation messages
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">root@(none):/var/cache/apt/archives# dpkg &#8211;force-all -i apt*.deb
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">lots and lots of installation messages
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
</ol>
</div>
<p>Una vez que tenemos instalado <em>apt</em>, reinstalamos todos los paquetes configurando la lista <em>selections</em> de <em>dpkg</em>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@(none):/var/cache/apt/archives# ls *.deb | sed &#8216;s/\([^_]*\)_.*/\1 install/&#8217; | dpkg &#8211;set-selections
</div>
</li>
<li class="li1">
<div class="de1">root@(none):/var/cache/apt/archives# apt-get dselect-upgrade
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li2">
<div class="de2">lots and lots of installation messages
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
</ol>
</div>
<p>Aquí es muy probable que se produzcan errores durante la reinstalación. cuando ésto suceda se vuelve a ejecutar <em>apt-get dselect-upgrade</em> hasta que se termine. Para algunos paquetes es posible incluso que tengas que tocar algo a mano, como por ejemplo para que el paquete <em>base-files</em> pueda instalarse correctamente, que en mi caso me fue necesario eliminar el directorio <em>/var/mail</em> a mano.</p>
<p>En éste punto ya casi hemos terminado. Ahora solo falta activar la consola a través de puerto serie:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">root@(none):/var/cache/apt/archives# cd /
</div>
</li>
<li class="li1">
<div class="de1">root@(none):/# echo ttySAC0 &gt;&gt;etc/securetty
</div>
</li>
<li class="li1">
<div class="de1">root@(none):/# printf &quot;T0:123:respawn:/sbin/getty 115200 ttySAC0\n&quot; &gt;&gt;etc/inittab</div>
</li>
</ol>
</div>
<p>¡Y ya está! Reinicia el sistema y ya tendrás una Debian flamante corriendo en tu MINI2440. ¡¡A disfrutarla!!</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..
</div>
</li>
<li class="li1">
<div class="de1">Mounting local filesystems&#8230;done.
</div>
</li>
<li class="li1">
<div class="de1">Activating swapfile swap&#8230;done.
</div>
</li>
<li class="li1">
<div class="de1">Cleaning up temporary files&#8230;.
</div>
</li>
<li class="li1">
<div class="de1">Configuring network interfaces&#8230;done.
</div>
</li>
<li class="li2">
<div class="de2">Cleaning up temporary files&#8230;.
</div>
</li>
<li class="li1">
<div class="de1">Setting kernel variables &#8230;done.
</div>
</li>
<li class="li1">
<div class="de1">Running scripts in rcS.d/ took 20 seconds.
</div>
</li>
<li class="li1">
<div class="de1">INIT: Entering runlevel: 2
</div>
</li>
<li class="li1">
<div class="de1">Using makefile-style concurrent boot in runlevel 2.
</div>
</li>
<li class="li2">
<div class="de2">apmd[1110]: apmd 3.2.1 interfacing with apm driver 1.13 and APM BIOS 1.2
</div>
</li>
<li class="li1">
<div class="de1">Starting Advanced Power Management daemon&#8230;.
</div>
</li>
<li class="li1">
<div class="de1">Running scripts in rc2.d/ took 2 seconds.
</div>
</li>
<li class="li1">
<div class="de1">Debian GNU/Linux squeeze/sid MINI2440 ttySAC0
</div>
</li>
<li class="li1">
<div class="de1">MINI2440 login: root
</div>
</li>
<li class="li2">
<div class="de2">Password:
</div>
</li>
<li class="li1">
<div class="de1">Last login: Wed Jul 21 01:14:00 CEST 2010 on ttySAC0
</div>
</li>
<li class="li1">
<div class="de1">Linux MINI2440 2.6.32-rc8 #1 Mon Dec 7 16:07:52 CET 2009 armv4tl
</div>
</li>
<li class="li1">
<div class="de1">The programs included with the Debian GNU/Linux system are free software;
</div>
</li>
<li class="li1">
<div class="de1">the exact distribution terms for each program are described in the
</div>
</li>
<li class="li2">
<div class="de2">individual files in /usr/share/doc/*/copyright.
</div>
</li>
<li class="li1">
<div class="de1">Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
</div>
</li>
<li class="li1">
<div class="de1">permitted by applicable law.
</div>
</li>
<li class="li1">
<div class="de1">root@MINI2440:~#</div>
</li>
</ol>
</div>
<h2>Y después&#8230;</h2>
<p>Lo próximo es la creación de una imagen <a href="http://opie.handhelds.org/cgi-bin/moin.cgi/">opie</a> utilizando <a href="http://wiki.openembedded.net/index.php/Main_Page">openembedded</a>.</p>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.emdebian.org/">Página oficial de Emdebian</a></li>
<li><a href="http://code.google.com/p/mini2440/wiki/Emdebian">Manual de instalación utilizando debootstrap</a></li>
<li><a href="http://www.emdebian.org/multistrap/">Configuración de Multistrap</a></li>
<li><a href="http://permalink.gmane.org/gmane.linux.debian.devel.embedded/5160">Lista de correo de debian-embedded</a></li>
<li><a href="http://wiki.debian.org/EmDebian/DeBootstrap">DebianWiki</a></li>
</ul>
<p><strong>NOTA:</strong> Entrada extraída de otra <a href="http://crysol.org/es/node/1384">antigua entrada</a> publicada por mi en <a href="http://crysol.org">CrySoL</a>.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/07/22/creacion-de-una-imagen-emdebian-para-tu-friendlyarm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conceptos sobre planificación en Sistemas Críticos</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/07/13/conceptos-sobre-planificacion-en-sistemas-criticos/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/07/13/conceptos-sobre-planificacion-en-sistemas-criticos/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 20:33:14 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Tiempo Real]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=291</guid>
		<description><![CDATA[Actualmente me estoy preparando el que espero sea el último examen de la carrera (que bien suena, pensé que nunca llegaría a decirlo :-P), que oficialmente es mañana. El caso es que a éstas alturas del verano y tras haber pasado, pongamos (por poner), 24 meses en los que se puede decir que me ha pasado de todo, ahora estoy que no me entra nada en la cabeza ni soy capaz de estar mas de cinco minutos concentrado con nada, así que me he dicho "pues escribe a ver si así te concentras mas", y aquí estoy.

Sobre lo que voy a escribir ahora es acerca de algunos conceptos sobre planificación en Sistemas Críticos, que es el tema que me ocupa ahora (y que, para qué engañarnos, el que mas me preocupa). Hay montones de ecuaciones que en principio son sencillas, pero numerosas, y además varios tipos de protocolos y de tipos de asignaciones de prioridad, así que lo mejor que puedo hacer es resumirlas y ya de paso tenerlas a mano, pues me parecen tan útiles como interesantes.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>Actualmente me estoy preparando el que espero sea el último examen de la carrera (que bien suena, pensé que nunca llegaría a decirlo <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ), que oficialmente es mañana. El caso es que a éstas alturas del verano y tras haber pasado, pongamos (por poner), 24 meses en los que se puede decir que me ha pasado de todo, ahora estoy que no me entra nada en la cabeza ni soy capaz de estar mas de cinco minutos concentrado con nada, así que me he dicho &#8220;pues escribe a ver si así te concentras mas&#8221;, y aquí estoy.</p>
<p>Sobre lo que voy a escribir ahora es acerca de algunos conceptos sobre planificación en Sistemas Críticos, que es el tema que me ocupa ahora (y que, para qué engañarnos, el que mas me preocupa). Hay montones de ecuaciones que en principio son sencillas, pero numerosas, y además varios tipos de protocolos y de tipos de asignaciones de prioridad, así que lo mejor que puedo hacer es resumirlas y ya de paso tenerlas a mano, pues me parecen tan útiles como interesantes. Empecemos&#8230;.</p>
<h2>Asignación de prioridades</h2>
<p>Bueno, para empezar diré que asumo que todos sabemos lo que es un <em>Ejecutivo Cíclico</em> y en qué consiste un <em>Hiperciclo</em>. También asumo que se tienen claros conceptos como <em>Concurrencia</em>, <em>Período de Activación</em>, <em>Tiempo de Ejecución Máximo</em>, <em>Plazo de Respuesta</em> y un largo etcétera.</p>
<p>Dicho todo lo anterior, prosigamos. Formas de asignar prioridades a las distintas tareas de un ejecutivo cíclico puede haber muchas: según el preriodo de activación de las tareas, el tiempo de cómputo, el número de recursos que se utilizan o la cantidad de procesos con los que se comparten ciertos recursos, por poner unos ejemplos.</p>
<p>Do de éstas formas de asignación son la <b>Asignación de mayor prioridad a las tareas de menor período</b> (<em>Rate monotonic scheduling</em>) y la <b>Asignación de mayor prioridad a las tareas de menor plazo de respuesta</b> (<em>Deadline monotonic sheduling</em>). Las características de éstos sistemas de asignación son las siguientes:</p>
<ul>
<li><em>Rate monotonic scheduling</em></li>
<ul>
<li> Asigna mayor prioridad a las tareas cuyo período de activación (<em>T</em>) es menor.</li>
<li> Asignación óptima para el modelo de tareas simple: Tareas <b>periódicas</b>, independientes y con plazos <b>iguales a los períodos</b>.</li>
<li>Si se pueden garantizar los plazos de un sistema de tareas con otra asignación de prioridades, se pueden garantizar con la asignación monónota en frecuencia.</li>
</ul>
<li><em>Deadline monotonic scheduling</em></li>
<ul>
<li>Asigna mayor prioridad a las tareas con menor plazo de ejecución.</li>
<li>Es válido para modelos en los que existen tareas esporádicas.</li>
<li>Si los plazos son menores o iguales que los períodos, la asignación de mayor prioridad a las tareas de menor plazo de respuesta es óptima.</li>
</ul>
</ul>
<h2>Factor de utlización</h2>
<p>En un sistema crítico una medida muy importante es el <em>Factor de Utilización</em> del procesador. Éste factor muestra la relación existente entre el tiempo de cómputo de una tarea dada y su periodo de activación, dando una idea del uso total del procesador. El factor de utilización (<em>U</em>) siempre tiene que ser menor o igual a 1.</p>
<p>La ecuación para el cálculo de <em>U</em> en un sistema es la siguiente: <a href="http://wordpress.org/extend/plugins/easy-latex/" target="_blank" title="\sum_{i=1}^N \frac{C_i}{T_i}"><img src="http://l.wordpress.com/latex.php?latex=%5Csum_%7Bi%3D1%7D%5EN%20%5Cfrac%7BC_i%7D%7BT_i%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="\sum_{i=1}^N \frac{C_i}{T_i}" /></a> siendo <em>N</em> el número de tareas en ejecución, <em>C</em> es el tiempo de cómputo de una tarea dada y <em>T</em> es el periodo de activación.</p>
<p>En el modelo simple de ejecución con prioridades monótonas en frecuencia, los plazos se garantizan si <a href="http://www.Thulasidas.com/latex" target="_blank" title="U \leq U_0"><img src="http://l.wordpress.com/latex.php?latex=U%20%5Cleq%20U_0&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="U \leq U_0" /></a> siendo </p>
<p><center><a ><img src="http://l.wordpress.com/latex.php?latex=U_0%20%3D%20N%20%2A%20%282%5E%7BN%5E%7B-1%7D%7D%20-%201%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="U_0 = N * (2^{N^{-1}} - 1)" /></a></center></p>
<p>la <b>Utilización mínima garantizada del sistema para N tareas</b>. Un sistema cumplirá con los plazos siempre que, como se ha comentado anteriormente, <img src="http://l.wordpress.com/latex.php?latex=U%20%5Cleq%20U_0&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="U \leq U_0" style="vertical-align:-20%;" class="tex" alt="U \leq U_0" />. Aunque ésta no es condición necesaria, si que es suficiente.</p>
<h2>Mas cosas</h2>
<p>Iré añadiendo mas cosillas poco a poco, ya después del examen&#8230; <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<h2>Referencias</h2>
<p>Básicamente mis apuntes de clase</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/07/13/conceptos-sobre-planificacion-en-sistemas-criticos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snippets de C++</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/05/23/snippets-de-c/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/05/23/snippets-de-c/#comments</comments>
		<pubDate>Sun, 23 May 2010 12:53:24 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=269</guid>
		<description><![CDATA[Snippets de código en C++ muy simples pero que suelo olvidar con frecuencia y me hacen perder tiempo buscando.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>Snippets de código en C++ muy simples pero que suelo olvidar con frecuencia y me hacen perder tiempo buscando.</p>
<h2>de <em>int</em> a <em>string</em></h2>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;sstream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> var = <span class="nu0">25</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">string</span> varStr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">std::<span class="me2">ostringstream</span> buffer;</div>
</li>
<li class="li1">
<div class="de1">buffer &lt;&lt; var;</div>
</li>
<li class="li1">
<div class="de1">varStr = var.<span class="me1">str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
</ol>
</div>
<h2>Generar un fichero (de texto)</h2>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include&lt;fstream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ofstream fileStream<span class="br0">&#40;</span>fileName.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fileStream &lt;&lt; _dotStream.<span class="me1">str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fileStream.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fileStream.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;;</div>
</li>
</ol>
</div>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.wlug.org.nz/ConvertingAnIntegerToaStringInCpp">http://www.wlug.org.nz/ConvertingAnIntegerToaStringInCpp</a></li>
<li><a href="http://www.cpp-home.com/archives/67.htm">http://www.cpp-home.com/archives/67.htm</a></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/05/23/snippets-de-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El ayuntamiento de Ciudad Real inventa denuncias</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/05/01/el-ayuntamiento-de-ciudad-real-inventa-denuncias/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/05/01/el-ayuntamiento-de-ciudad-real-inventa-denuncias/#comments</comments>
		<pubDate>Sat, 01 May 2010 22:12:17 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=260</guid>
		<description><![CDATA[De como se inventan las denuncias en tan insigne ayuntamiento]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
Si no lo digo reviento. Y es que todo sucedió un fatídico 29 de Octubre de 2009, a eso de las 9:00AM, en la glorieta que hay en la esquina de la Ronda Granada con la el Paseo Carlos Eraña, en Ciudad Real capital.</p>
<p>A continuación de dicha glorieta hay un bonito paso de peatones sin semáforo y al lado un Insituto, que a la hora de los hechos estaba, como es de suponer, rebosante de hormonas entrando en él&#8230;.</p>
<p>Pues a esto que voy yo, como todos los días a <b>TRABAJAR</b> (es lo que tenemos las personas honradas, que como no estafamos, tenemos que trabajar nos guste o no) y me veo que dirigiendo el tráfico había un policía local. Ciertamente he de decir, que cuando lo ví no supe exactamente que estaba indicando, así que como había bastante tráfico (esa glorieta y la de la Estación de Autobuses dan verdadero miedo a ciertas horas de la mañana) pues me dije <em>&#8220;Bueno, lo que haga el de delante, como vamos en primera&#8230;.&#8221;</em>. Y así fue, yo en primera, paso la glorieta, como el que venía delante de mi, que cruza el paso de peatones mientras la gente está esperando en la acera. Yo, incauto de mi, decido pasar también (no sé, puede que tuviera algo que ver el hecho de que no me dijeron alto ni el policía cambió de actitud&#8230;) y mientras estoy pasando, el buen hombre me da la señal de alto.</p>
<p>Frenazo que te crió (en la autoescuela parece ser que no enseñan que un policía puede decirte &#8220;alto&#8221; mientras ya estás cruzando). El caso es que paro, pero en la segunda mitad del paso de peatones, ya saliendo. Se me acerca el buen hombre y me dice con semblante serio:</p>
<p>Poli: -<em>&#8220;¿Qué pasa con usted?&#8221;</em><br />
Yo: -<em>&#8220;Ehmmmmm, lo siento, ya estaba cruzando cuando dió la señal de STOP, no me ha dado tiempo a parar antes&#8230;&#8221;</em><br />
Poli: -<em>&#8220;Bueno, no se preocupe, continúe, pero tenga mas cuidado la próxima vez&#8230;&#8221;</em></p>
<p>Se vé que en la jerga de los hombres encargados de velar por el bien <em>&#8220;No se preocupe&#8221;</em> significa <b>4 puntos, Retirada temporal del permiso de conducción y 200 euros por las molestias</b>. </p>
<p>Si señores si, eso fue lo que me llegó en una bonita notificación el día 28 de Diciembre de 2009 (y no, no era broma muy a mi pesar). ¿El motivo? <em>&#8220;No obedecer las órdenes o señales de los agentes de la autoridad, sin peligro para otros&#8221;</em>. Pues si. El buen hombre dice que no le obedecí (lo que da a entender que no paré y que me fui). Claro, como <em>&#8220;no pasaba nada&#8221;</em> y no me dió denuncia, yo ahora no puedo demostrar que <b>esa denuncia es totalmente falsa</b>. ¡¡Qué bien!!</p>
<p>El caso es que un amigo que conoce el funcionamiento de la policía local bastante bien (creo recordar que fue él quien me lo dijo, pero puede que me equivoque) me dijo: &#8220;Recurre, como ésta gente solo quiere tu dinero lo mas probable es que te perdonen la retirada. Te tienen que poner la denuncia completa para que no se note que van a lo que van&#8230;.&#8221;. </p>
<p>Así lo hice, recurrí, y hoy al llegar al pueblo me encuentro una bonita notificación (siempre son buenas noticias, <b>SIEMPRE</b>) diciéndome que pague los 200 euros que me piden y me deje de gilipolleces (pero edulcorado con jerga judicial, que aquí te llaman Gilipollas con clase y estilo&#8230;). Eso si, ME HAN PERDONADO EL CARNET DE CONDUCIR. Ohhhh, no puedo mas que llorar ante tal muestra de compasión y benevolencia&#8230;</p>
<p>Pues nada, ésto es lo que me ha pasado. Tenía que contarlo, ya que siento una sensación de indefensión y de impotencia que muy pocas veces antes había sentido. Si señor, ahora siento seguridad cada vez que veo un coche de los locales por Ciudad Real, o cada vez que voy andando por el centro una mañana y me los encuentro paseando el tipito por la Plaza Mayor y aledaños a ver que se puede rascar&#8230;</p>
<p>He de decir, sin embargo, que de los 10 años que llevo viviendo en Ciudad Real, hasta hace algo menos de un año no sabía ni que teníamos policía local. Bueno, si que lo sabía, evidentemente, pero no porque los viese paseando o patrullando. Y es que la crisis está haciendo estragos, ya lo dicen en TeleMadrid&#8230;</p>
<p>Pues nada, un hurra por nuestra Alcaldesa, que ha encontrado la forma de solucionar los problemas económicos del ayuntamiento de tan insigne ciudad y otro hurra por el Agente 200-098, seguro que se llevó una palmadita en la espalda y todo&#8230;</p>
<p>Yo mientras tanto, como persona honrada que soy, seguiré durmiendo una media de cuatro horas al día para llegar a tiempo al trabajo y a mis estudios, que para que nos puedan robar con tanta impunidad, antes tenemos que tener algo&#8230;
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/05/01/el-ayuntamiento-de-ciudad-real-inventa-denuncias/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Snippets de SQLite en python</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/04/29/snipplets-de-sqlite-en-python/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/04/29/snipplets-de-sqlite-en-python/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 19:19:35 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=244</guid>
		<description><![CDATA[Algunos snipplets útiles para manejo de bases de datos <a href="http://www.sqlite.org">SQLite</a> desde Python. Iré poniendo mas conforme los vaya utilizando.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>Algunos snipplets útiles para manejo de bases de datos <a href="http://www.sqlite.org">SQLite</a> desde Python.</p>
<h2>Qué instalar</h2>
<p>Lo primero, por supuesto, es instalar el wrapper:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ apt-get <span class="kw2">install</span> python-pysqlite1<span class="nu0">.1</span></div>
</li>
</ol>
</div>
</div>
<h2>Cargando la base de datos</h2>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>: <span class="kw1">import</span> sqlite</div>
</li>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>: db = sqlite.<span class="me1">Connection</span><span class="br0">&#40;</span><span class="st0">&quot;db1&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>La base de datos que hemos cargado se llama <em>db1</em>. <em>db</em> es una instancia de la clase <em>sqlite.Connection</em>, con la que podremos acceder a la base de datos.</p>
<h2>Obteniendo un cursor y generando una consulta</h2>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>: <span class="kw1">import</span> sqlite</div>
</li>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>: db = sqlite.<span class="me1">Connection</span><span class="br0">&#40;</span><span class="st0">&quot;db1&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>: cursor = db.<span class="me1">cursor</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">In <span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span>: cursor.<span class="me1">execute</span><span class="br0">&#40;</span><span class="st0">&quot;Select * from deviceSamples where Sample = %i&quot;</span>, <span class="br0">&#40;</span><span class="nu0">225</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">In <span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span>: <span class="kw1">for</span> item <span class="kw1">in</span> cursor:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&#8230;: &nbsp; &nbsp; <span class="kw1">print</span> item</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&#8230;: &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&#8230;: &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="nu0">1394</span>, <span class="st0">&#8216;-79&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#40;</span><span class="nu0">1395</span>, <span class="st0">&#8216;-87&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="nu0">1396</span>, <span class="st0">&#8216;-89&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="nu0">1397</span>, <span class="st0">&#8216;-94&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="nu0">1398</span>, <span class="st0">&#8216;-79&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="nu0">1399</span>, <span class="st0">&#8216;-92&#8242;</span>, <span class="st0">&#8216;XX:XX:XX:XX:XX:XX&#8217;</span>, <span class="nu0">225</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Obtiene una instancia de <em>Cursor</em>, a través de la cual se pueden realizar consultas. En el ejemplo se realiza una consulta parametrizada y después se muestran todos los resultados obtenidos.</p>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/04/29/snipplets-de-sqlite-en-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculando probabilidades condicionales: Teorema de Bayes</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/04/21/calculando-probabilidades-condicionales-teorema-de-bayes/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/04/21/calculando-probabilidades-condicionales-teorema-de-bayes/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 18:41:04 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[Matemáticas]]></category>

		<guid isPermaLink="false">http://elvioladordesegmentos.net/?p=173</guid>
		<description><![CDATA[El <em>Teorema de Bayes</em> ofrece un método matemático que nos permite contestar a preguntas relacionadas con la probabilidad condicional inversa en ciertas situaciones. Por ejemplo, si tenemos dos eventos $$A$$ y $$B$$ y se conocen $$P(A&#124;B)$$ y $$P(B)$$, podemos deducir con relativa facilidad $$P(B&#124;A)$$. Ésto, que a simple vista puede parecer carente de significado, resume aspectos tan cotidianos de nuestra vida como nuestra forma de tomar ciertas decisiones.
]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>El <em>Teorema de Bayes</em> ofrece un método matemático que nos permite contestar a preguntas relacionadas con la probabilidad condicional inversa en ciertas situaciones. Por ejemplo, si tenemos dos eventos <a href="http://wordpress.org/extend/plugins/easy-latex/" target="_blank" title="A"><img src="http://l.wordpress.com/latex.php?latex=A&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="A" /></a> y <a href="http://www.Thulasidas.com/latex" target="_blank" title="B"><img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="B" /></a> y se conocen <a ><img src="http://l.wordpress.com/latex.php?latex=P%28A%7CB%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" style="vertical-align:-20%;" class="tex" alt="P(A|B)" /></a> y <img src="http://l.wordpress.com/latex.php?latex=P%28B%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B)" style="vertical-align:-20%;" class="tex" alt="P(B)" />, podemos deducir con relativa facilidad <img src="http://l.wordpress.com/latex.php?latex=P%28B%7CA%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B|A)" style="vertical-align:-20%;" class="tex" alt="P(B|A)" />. Ésto, que a simple vista puede parecer carente de significado, resume aspectos tan cotidianos de nuestra vida como nuestra forma de tomar ciertas decisiones.</p>
<h2>Algunos conceptos</h2>
<p>Antes de empezar de lleno a hablar de la <em>Regla de Bayes</em> no estarían mal un par de definiciones. A mi al menos me fueron de ayuda cuando empecé en ésto del cálculo probabilístico&#8230; <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Básicamente lo que tenemos que saber es que cuando nos encontramos algo como <img src="http://l.wordpress.com/latex.php?latex=P%28B%7CA%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B|A)" style="vertical-align:-20%;" class="tex" alt="P(B|A)" />, lo que estaremos viendo es simplemente ésto:</p>
<p style="text-align: center;"><em>&#8220;La probabilidad de que habiendo sucedido <img src="http://l.wordpress.com/latex.php?latex=A&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="A" style="vertical-align:-20%;" class="tex" alt="A" />, suceda <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" />.&#8221;</em></p>
<p>Es decir, la <em>probabilidad condicional de <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" /> dado <img src="http://l.wordpress.com/latex.php?latex=A&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="A" style="vertical-align:-20%;" class="tex" alt="A" /></em>.</p>
<p>La Regla de Bayes hace un planteamiento &#8220;inverso&#8221; de la probabilidad condicional. Básicamente supondremos que <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" /> ha sucedido y en base a ello nos interesaremos por la probabilidad de que <img src="http://l.wordpress.com/latex.php?latex=A&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="A" style="vertical-align:-20%;" class="tex" alt="A" /> halla sido el desencadenante de <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" />. Es decir, ahora calcularemos <img src="http://l.wordpress.com/latex.php?latex=P%28A%7CB%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A|B)" style="vertical-align:-20%;" class="tex" alt="P(A|B)" />.</p>
<p>Para aclarar todo ésto un poco, supongamos que la acción <img src="http://l.wordpress.com/latex.php?latex=A&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="A" style="vertical-align:-20%;" class="tex" alt="A" /> es estar resfriado y la acción <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" /> es tener fiebre. Sabemos que existe una probabilidad dada (y de hecho relativamente alta) de tener fiebre si estamos resfriados (<img src="http://l.wordpress.com/latex.php?latex=P%28B%7CA%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B|A)" style="vertical-align:-20%;" class="tex" alt="P(B|A)" />). Por tanto, si vamos a un médico a que nos diagnostique y ve que tenemos fiebre (<img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" />) determinará las probabilidades de que dicha fiebre halla sido causada por un resfriado (<img src="http://l.wordpress.com/latex.php?latex=P%28A%7CB%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A|B)" style="vertical-align:-20%;" class="tex" alt="P(A|B)" />).</p>
<h2>Regla de Bayes</h2>
<p>Generalizando el ejemplo anterior, la Regla de Bayes nos ayudará en el caso de que tengamos un conjunto de causas <img src="http://l.wordpress.com/latex.php?latex=C%20%3D%20%5C%7BA_%7B1%7D%2C%20A_%7B2%7D%2C%20A_%7B3%7D%2C%20...%20%2C%20A_%7BN%7D%5C%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="C = \{A_{1}, A_{2}, A_{3}, ... , A_{N}\}" style="vertical-align:-20%;" class="tex" alt="C = \{A_{1}, A_{2}, A_{3}, ... , A_{N}\}" /> excluyentes entre si, un efecto <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" /> que ha sucedido, un conjunto de probabilidades <img src="http://l.wordpress.com/latex.php?latex=%5C%7BP%28B%7CA_%7B1%7D%29%2C%20P%28B%7CA_%7B2%7D%29%2C%20P%28B%7CA_%7B3%7D%29%2C%20...%20%2C%20P%28B%7CA_%7BN%7D%29%5C%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="\{P(B|A_{1}), P(B|A_{2}), P(B|A_{3}), ... , P(B|A_{N})\}" style="vertical-align:-20%;" class="tex" alt="\{P(B|A_{1}), P(B|A_{2}), P(B|A_{3}), ... , P(B|A_{N})\}" /> y necesitemos saber la probabilidad de que hallan sucedido cada una de las posibles causas (vamos, lo que hace <a href="http://es.wikipedia.org/wiki/House_M._D.">House</a> metiéndose con el escote de Cuddy, pero matemáticamente).</p>
<p>Para determinar la probabilidad que han tenido cada una de las causas de suceder partimos de lo siguiente:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28B%7CA_%7B1%7D%29%20%3D%20%5Cfrac%7BP%28B%20%5Cwedge%20A_%7B1%7D%29%7D%7BP%28A_%7B1%7D%29%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B|A_{1}) = \frac{P(B \wedge A_{1})}{P(A_{1})}" style="vertical-align:-20%;" class="tex" alt="P(B|A_{1}) = \frac{P(B \wedge A_{1})}{P(A_{1})}" /></center></p>
<p>y del mismo modo sabemos que</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%7CB%29%20%3D%20%5Cfrac%7BP%28B%20%5Cwedge%20A_%7B1%7D%29%7D%7BP%28B%29%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}|B) = \frac{P(B \wedge A_{1})}{P(B)}" style="vertical-align:-20%;" class="tex" alt="P(A_{1}|B) = \frac{P(B \wedge A_{1})}{P(B)}" /></center></p>
<p>con lo cual es fácil deducir que <img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%7CB%29P%28B%29%20%3D%20P%28A_%7B1%7D%7CB%29P%28A_%7B1%7D%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}|B)P(B) = P(A_{1}|B)P(A_{1})" style="vertical-align:-20%;" class="tex" alt="P(A_{1}|B)P(B) = P(A_{1}|B)P(A_{1})" />, de donde obtenemos la probabilidad de que <img src="http://l.wordpress.com/latex.php?latex=A_%7B1%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="A_{1}" style="vertical-align:-20%;" class="tex" alt="A_{1}" /> halla sido causante de <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" />:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%7CB%29%20%3D%20%5Cfrac%7BP%28B%7CA_%7B1%7D%29P%28A_%7B1%7D%29%7D%7BP%28B%29%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}|B) = \frac{P(B|A_{1})P(A_{1})}{P(B)}" style="vertical-align:-20%;" class="tex" alt="P(A_{1}|B) = \frac{P(B|A_{1})P(A_{1})}{P(B)}" /></center></p>
<p>Pero además sabemos que <img src="http://l.wordpress.com/latex.php?latex=B&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="B" style="vertical-align:-20%;" class="tex" alt="B" /> es debida a alguna de las causas  del conjunto <img src="http://l.wordpress.com/latex.php?latex=P&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P" style="vertical-align:-20%;" class="tex" alt="P" /> que definimos anteriormente, es decir</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28B%29%20%3D%20P%5B%28A_%7B1%7D%5Cwedge%20B%29%20%5Cbigcup%20%28A_%7B2%7D%5Cwedge%20B%29%20%5Cbigcup%20%28A_%7B3%7D%5Cwedge%20B%29%20%5Cbigcup%20...%20%5Cbigcup%20%28A_%7BN%7D%5Cwedge%20B%29%5D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B) = P[(A_{1}\wedge B) \bigcup (A_{2}\wedge B) \bigcup (A_{3}\wedge B) \bigcup ... \bigcup (A_{N}\wedge B)]" style="vertical-align:-20%;" class="tex" alt="P(B) = P[(A_{1}\wedge B) \bigcup (A_{2}\wedge B) \bigcup (A_{3}\wedge B) \bigcup ... \bigcup (A_{N}\wedge B)]" /></center></p>
<p>Como éstas causas son excluyentes entre si, al aplicar las <a href="http://www.uniquindio.edu.co/uniquindio/ntic/trabajos/6/grupo3/probabilidad/paginas/reglaspro.htm" target="_blank">Reglas de la adición</a> obtenemos</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28B%29%20%3D%20P%28A_%7B1%7D%29P%28B%7CA_%7B1%7D%29%2BP%28A_%7B2%7D%29P%28B%7CA_%7B2%7D%29%2BP%28A_%7B3%7D%29P%28B%7CA_%7B3%7D%29%2B%20...%20%2BP%28A_%7BN%7D%29P%28B%7CA_%7BN%7D%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(B) = P(A_{1})P(B|A_{1})+P(A_{2})P(B|A_{2})+P(A_{3})P(B|A_{3})+ ... +P(A_{N})P(B|A_{N})" style="vertical-align:-20%;" class="tex" alt="P(B) = P(A_{1})P(B|A_{1})+P(A_{2})P(B|A_{2})+P(A_{3})P(B|A_{3})+ ... +P(A_{N})P(B|A_{N})" /></center></p>
<p>Si ahora sustituimos el denominador en la ecuación con la que calculamos <img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%7CB%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}|B)" style="vertical-align:-20%;" class="tex" alt="P(A_{1}|B)" /> anteriormente, obtendremos la <strong>Regla de Bayes</strong> generalizada:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%7CB%29%20%3D%20%5Cfrac%7BP%28A_%7B1%7D%29P%28B%7CA_%7B1%7D%29%7D%7BP%28A_%7B1%7D%29P%28B%7CA_%7B1%7D%29%2BP%28A_%7B2%7D%29P%28B%7CA_%7B2%7D%29%2BP%28A_%7B3%7D%29P%28B%7CA_%7B3%7D%29%2B%20...%20%2BP%28A_%7BN%7D%29P%28B%7CA_%7BN%7D%29%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}|B) = \frac{P(A_{1})P(B|A_{1})}{P(A_{1})P(B|A_{1})+P(A_{2})P(B|A_{2})+P(A_{3})P(B|A_{3})+ ... +P(A_{N})P(B|A_{N})}" style="vertical-align:-20%;" class="tex" alt="P(A_{1}|B) = \frac{P(A_{1})P(B|A_{1})}{P(A_{1})P(B|A_{1})+P(A_{2})P(B|A_{2})+P(A_{3})P(B|A_{3})+ ... +P(A_{N})P(B|A_{N})}" /></center></p>
<p>A las probabilidades <img src="http://l.wordpress.com/latex.php?latex=P%28A_%7B1%7D%2C%20P%28A_%7B2%7D%29%2C%20P%28A_%7B3%7D%29%2C%20...%20P%28A_%7BN%7D%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(A_{1}, P(A_{2}), P(A_{3}), ... P(A_{N})" style="vertical-align:-20%;" class="tex" alt="P(A_{1}, P(A_{2}), P(A_{3}), ... P(A_{N})" /> se las conoce como <em>probabilidades sin corregir</em> o <em>probabilidades a &#8220;priori&#8221;</em>.</p>
<h2>Un ejemplo</h2>
<p>Ahora veámoslo todo con un ejemplo. Supongamos que la probabilidad de encontrar una mujer morena en Sudámerica sea <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cs%29%3D0.7&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|s)=0.7" style="vertical-align:-20%;" class="tex" alt="P(m|s)=0.7" />, la probabilidad de encontrar una mujer morena en Centroamérica es de <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cc%29%3D0.9&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|c)=0.9" style="vertical-align:-20%;" class="tex" alt="P(m|c)=0.9" /> y la probabilidad de encontrar una mujer morena en Norteamércia es de <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cn%29%3D0.4&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|n)=0.4" style="vertical-align:-20%;" class="tex" alt="P(m|n)=0.4" />.</p>
<p>Si se realiza un concurso de belleza para elegir Miss América y el 30% de las participantes son sudaméricanas, el 20% centroaméricanas y el 50% norteaméricanas y nos presentan a una mujer morena ¿de qué parte de América viene?</p>
<p>Analizando los datos dados podemos obtener las siguientes probabilidades &#8220;a priori&#8221;:</p>
<p>Probabilidad de que la mujer sea una concursante centroaméricana: <img src="http://l.wordpress.com/latex.php?latex=P%28c%29%3D0.2&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(c)=0.2" style="vertical-align:-20%;" class="tex" alt="P(c)=0.2" />.<br />
Probabilidad de que la mujer sea una concursante sudaméricana: <img src="http://l.wordpress.com/latex.php?latex=P%28s%29%3D0.3&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(s)=0.3" style="vertical-align:-20%;" class="tex" alt="P(s)=0.3" />.<br />
Probabilidad de que la mujer sea una concursante norteaméricana: <img src="http://l.wordpress.com/latex.php?latex=P%28n%29%3D0.5&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(n)=0.5" style="vertical-align:-20%;" class="tex" alt="P(n)=0.5" /></p>
<p>La probabilidad de hallar una morena según la región es:</p>
<p>Probabilidad de encontrar una morena estando en Sudamérica: <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cs%29%3D0.7&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|s)=0.7" style="vertical-align:-20%;" class="tex" alt="P(m|s)=0.7" />.<br />
Probabilidad de encontrar una morena estando en Centroamérica: <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cc%29%3D0.2&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|c)=0.2" style="vertical-align:-20%;" class="tex" alt="P(m|c)=0.2" />.<br />
Probabilidad de encontrar una morena estando en Norteamérica: <img src="http://l.wordpress.com/latex.php?latex=P%28m%7Cn%29%3D0.4&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(m|n)=0.4" style="vertical-align:-20%;" class="tex" alt="P(m|n)=0.4" />.</p>
<p>Nuestro objetivo es determinar la probabilidad de que la morena que acabamos de conocer sea de una u otra parte del continente, es decir, buscamos <img src="http://l.wordpress.com/latex.php?latex=P%28c%7Cm%29%2C%20P%28s%7Cm%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(c|m), P(s|m)" style="vertical-align:-20%;" class="tex" alt="P(c|m), P(s|m)" /> y <img src="http://l.wordpress.com/latex.php?latex=P%28n%7Cm%29&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(n|m)" style="vertical-align:-20%;" class="tex" alt="P(n|m)" /> sabiendo que el suceso <img src="http://l.wordpress.com/latex.php?latex=m%20%3D%20%22morena%22&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="m = "morena"" style="vertical-align:-20%;" class="tex" alt="m = "morena"" /> sucedió:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=P%28s%7Cm%29%20%3D%20%5Cfrac%7BP%28m%7Cs%29P%28s%29%7D%7BP%28m%7Cs%29P%28s%29%2BP%28m%7Cs%29P%28c%29%2BP%28m%7Cs%29P%28n%29%7D&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(s|m) = \frac{P(m|s)P(s)}{P(m|s)P(s)+P(m|s)P(c)+P(m|s)P(n)}" style="vertical-align:-20%;" class="tex" alt="P(s|m) = \frac{P(m|s)P(s)}{P(m|s)P(s)+P(m|s)P(c)+P(m|s)P(n)}" /></center><br />
Sustituyendo:<br />
<center><img src="http://l.wordpress.com/latex.php?latex=P%28s%7Cm%29%20%3D%20%5Cfrac%7B0.7%2A.03%7D%7B0.7%2A0.3%20%2B%200.9%2A0.2%20%2B%200.4%2A0.5%7D%20%3D%200.36&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(s|m) = \frac{0.7*.03}{0.7*0.3 + 0.9*0.2 + 0.4*0.5} = 0.36" style="vertical-align:-20%;" class="tex" alt="P(s|m) = \frac{0.7*.03}{0.7*0.3 + 0.9*0.2 + 0.4*0.5} = 0.36" /></center><br />
Del mismo modo obtendremos <img src="http://l.wordpress.com/latex.php?latex=P%28c%7Cm%29%3D0.31&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(c|m)=0.31" style="vertical-align:-20%;" class="tex" alt="P(c|m)=0.31" /> y <img src="http://l.wordpress.com/latex.php?latex=P%28n%7Cm%29%3D0.33&#038;bg=242323&#038;fg=FFFFFF&#038;s=0" title="P(n|m)=0.33" style="vertical-align:-20%;" class="tex" alt="P(n|m)=0.33" /> de donde podemos deducir que lo mas probable es que la morena que acabamos de conocer sea sudaméricana.</p>
<p>Para el cálculo de dichos valores se ha utilizado la siguiente tabla:<br />

<table id="wp-table-reloaded-id-1-no-1" class="wp-table-reloaded wp-table-reloaded-id-1">
<thead>
	<tr class="row-1">
		<th class="column-1"></th><th class="column-2">Sudamericana</th><th class="column-3">Centroamericana</th><th class="column-4">Norteamericana</th><th class="column-5">P(Morena)</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2">
		<td class="column-1">Mujer Morena</td><td class="column-2">0.21</td><td class="column-3">0.18</td><td class="column-4">0.20</td><td class="column-5">0.59</td>
	</tr>
	<tr class="row-3">
		<td class="column-1">Mujer no morena</td><td class="column-2">0.09</td><td class="column-3">0.02</td><td class="column-4">0.30</td><td class="column-5">0.41</td>
	</tr>
	<tr class="row-4">
		<td class="column-1">P(origen)</td><td class="column-2">0.30</td><td class="column-3">0.20</td><td class="column-4">0.50</td><td class="column-5">1</td>
	</tr>
</tbody>
</table>
<br />
En la tabla, las probabilidades marginales informan de la probabilidad del color de piel independientemente de la región geográfica y viceversa.</p>
<h2>Referencias</h2>
<p>La práctica totalidad de ésta entrada se ha obtenido de unos apuntes online de la Facultad de Ciencias Económicas &#8211; Sede Trelew de la Universidad Nacional de la Patagonia.</p>
<p>Éste documento no pretende ser una guía para la utilización de la Regla de Bayes, sino que se trata de un resumen a título personal para asentar mejor los conocimientos adquiridos.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/04/21/calculando-probabilidades-condicionales-teorema-de-bayes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC y el padding</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/03/31/gcc-y-el-padding/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/03/31/gcc-y-el-padding/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 16:26:41 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arquitectura]]></category>

		<guid isPermaLink="false">http://jalsoez.dyndns.org/blog/?p=138</guid>
		<description><![CDATA[Discusión sobre problemas de Alineamiento de datos y Padding cuando se compila con GCC.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>Hace poco, en el trabajo, me encontraba realizando la implementación del protocolo descrito en la <a href="http://www.faqs.org/rfcs/rfc908.html">RFC 908</a> para usarla en un pequeño microcontrolador de Atmel.</p>
<p>Una vez implementado y compilado todo, me dispuse a realizar las correspondientes pruebas y vi que en ciertas funciones sucedían cosas muy extrañas. En concreto, tenía definidas varias estructuras en las que se almacenaba toda la información de estado y control del protocolo y descubrí que al intentar recorrer todos sus miembros con un puntero a <em>char</em> las cosas no cuadraban. Leía valores que se suponía que no estaban ahí o al calcular el tamaño de los mensajes basándome en el tamaño de las estructuras (calculadas usando <em>sizeof</em>) estos no eran los que tenían que ser&#8230;.</p>
<p>¿Qué estaba sucediendo?</p>
<h2>El problema: Padding</h2>
<p>Pues si. Enseguida imaginé cual podría ser el problema: el <em>Padding</em>. La verdad es que es un error un poco de novatos, pero yo caí. Generalmente los programadores en lenguajes como <em>C</em> raramente suelen tener en cuenta el tema del padding a diseñar sus programas, puesto que suponen que el compilador se encargará de optimizar nuestro código y además, rara vez se trabaja a un nivel tan bajo como para que ésto sea un problema.</p>
<p>La cosa cambia si estás diseñando código para correr en un dispositivo empotrado con poca memoria o tienes que hacer manipulaciones a muy bajo nivel sobre las estructuras. En mi caso, se daban las dos situaciones, así que me puse a investigar un poco y ésto fue lo que aprendí.</p>
<p>¿Qué es exactamente el padding? Bueno, empecemos por el principio:</p>
<h2>El Alineamiento</h2>
<p>¿Y ésto qué es?. Bueno, dependiendo del tipo de máquina que estemos utilizando y del tipo de dato con el que estemos trabajando, el rango de direcciones en las que se puede almacenar dicho dato debe cumplir una u otra característica. Me explico: supongamos que estamos trabajando en una máquina de 32 bits. En éste caso, tendremos una máquina con una alineación de memoria de 4 bytes. Es decir, cualquier lectura de memoria se hace de cuatro en cuatro bytes y todas las posibles direcciones de memoria que se leen serán múltiplo de 4. Por tanto, una lectura, supongamos en la dirección 0x00abcd0034 sería correcta, mientras que si intentásemos leer de la dirección 0x00abcd0031 no podríamos, pues esa dirección no está alineada a 4 bytes (no es múltiplo de 4).  Si queremos leer ese byte en concreto, deberemos leer la dirección 0x00abcd0030 y después acceder a los bits &lt;8:15&gt;<br />
Hay que hacer una pequeña aclaración y comentar que ésto es para el caso de que nuestra máquina sea de 32 bits pero use una memoria de 8 bits. También podemos tener  máquinas con un bus de memoria de igual longitud que los datos que utiliza, en cuyo caso, el alineamiento de las posiciones de memoria sería 1, es decir, se puede leer y escribir en cualquier dirección, pero se leerán 32 bits (o los que tenga el ancho del bus) de cada vez. Para lo que voy a explicar, me parece mas conveniente el modelo de máquina de 32 bits con un bus de 8, aunque esto es aplicable a cualquier tipo de arquitectura.</p>
<p>Si en la máquina de la que estamos hablando queremos guardar un <em>char</em>, dicha variable la podremos guardar, como podemos imaginar, en cualquier dirección (un <em>char</em>, como todos sabemos, ocupa 8 bits). Decimos que el alineamiento de éste tipo de variables es de un byte. Ésto sucede porque, en nuestra máquina de 32 bits, para leer un char, leeremos 32 bits (4 bytes) de una vez, y entre esos 4 bytes, estará el que buscamos.<br />
La cosa cambia si ahora en lugar de querer almacenar un simple <em>char</em> queremos guardar un <em>short</em> (típicamente 16 bits). En éste caso solo podremos almacenarlo en direcciones múltiplo de 2. ¿Y ésto a cuento de qué?. Pues como algunos habréis imaginado (y si no lo habéis imaginado yo os lo cuento), si en cada lectura que realiza nuestro procesador leemos 4 bytes y un <em>short</em> son 2 bytes, tendremos que colocar dicha variable bien en los dos primeros bytes o bien en los dos últimos. Por supuesto también podríamos colocarlo en los bytes 2 y 3, pero si permitimos ese tipo de cosas nada impediría que el primer byte de un <em>short</em> cayese en el último byte de una palabra leída y el segundo en el primer byte de la palabra siguiente. Mas claramente: nuestra máquina lee las direcciones 0&#215;0000, 0&#215;0004, 0&#215;0008, etc&#8230;. Nuestro <em>short</em> correría el riesgo de caer entre las direcciones 0&#215;0003 y 0&#215;0004. ¿Cual es la pega de ésto? Obviamente que el procesador debería realizar dos lecturas a memoria: una a la dirección 0&#215;0000 y otra a la dirección 0&#215;0004 para recuperar los dos &#8220;trozos&#8221; de <em>short</em>. Ahora se ve claro por qué hace falta definir ésto del alineamiento de los tipos de datos: Ahorra trabajo y tiempo al procesador.<br />
Decimos entonces que un <em>short</em> está alineado a dos bytes.</p>
<p>Como podremos imaginar, para el caso de un <em>int</em> o incluso de un <em>double</em>, la alineación tiene que ser forzosamente a 4 bytes, es decir, deben de estar almacenados en direcciones múltiplos de 4.</p>
<h2>Ahora si, el Padding</h2>
<p>Muy bien, ahora que ya hemos entendido en qué consiste la alineación, podemos hablar del <em>Padding</em>, que no es ni mas ni menos que bytes de &#8220;relleno&#8221; que se utilizan para forzar el alineamiento de los miembros de una estructura, en el caso del lenguaje <em>C</em>. Veamoslo con un ejemplo:<br />
En el siguiente código podemos ver que tenemos definida una estructura formada por un <em>char</em> y un <em>int</em>: </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span>** argv<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">struct</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">char</span> a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> b;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> padding;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">char</span>* p = <span class="br0">&#40;</span><span class="kw4">char</span> *<span class="br0">&#41;</span>&amp;padding;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; padding.<span class="me1">a</span> = <span class="st0">&#8216;z&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; padding.<span class="me1">b</span> = 0x6fabada6;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;longitud de padding: %i<span class="es0">\n</span>&quot;</span>, <span class="kw4">sizeof</span><span class="br0">&#40;</span>padding<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Datos originales:<span class="es0">\n</span><span class="es0">\t</span>a &#8212;&gt; %c<span class="es0">\n</span><span class="es0">\t</span>b &#8212;&gt; 0x%x<span class="es0">\n</span>&quot;</span>, padding.<span class="me1">a</span>, padding.<span class="me1">b</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = <span class="st0">&#8216;a&#8217;</span>; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0xbe; p++;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; *p = 0xba; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0&#215;12; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0&#215;34;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Datos modificados:<span class="es0">\n</span><span class="es0">\t</span>a &#8212;&gt; %c<span class="es0">\n</span><span class="es0">\t</span>b &#8212;&gt; 0x%x<span class="es0">\n</span>&quot;</span>, padding.<span class="me1">a</span>, padding.<span class="me1">b</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Antes de compilar ni ejecutar nada podemos suponer que el tamaño de nuestra estructura (en una máquina de 32 bits) debería ser de 5 bytes: 4 bytes del <em>int</em> y 1 del <em>char</em>. El código simplemente imprime la longitud de la estructura, los datos originalmente almacenados en ella y después, a través de un puntero <em>char</em> recorre dicha estructura y modifica los datos. Finalmente, vuelve a imprimir los datos guardados en la estructura.<br />
Ahora ya podemos compilarlo y ejecutarlo obteniendo la siguiente salida:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">longitud de padding: <span class="nu0">8</span></div>
</li>
<li class="li1">
<div class="de1">Datos originales:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; a &#8212;&gt; z</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; b &#8212;&gt; 0x6fabada6</div>
</li>
<li class="li2">
<div class="de2">Datos modificados:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; a &#8212;&gt; a</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; b &#8212;&gt; 0x6fabad34</div>
</li>
</ol>
</div>
<p> <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' />  ¿qué ha pasado? ¿y esa longitud 8 en lugar de 5? Sencillo: nuestra máquina es de 32 bits. Para poder forzar el alineamiento correcto de las variables que componen la estructura tiene &#8220;rellenar&#8221; el hueco ocupado entre el <em>char</em> y el <em>int</em> para que éste último comience en una dirección múltiplo de 4 (o en el caso de un PC de 32 bits, se lea en la siguiente dirección de memoria, porque en éste caso, el bus de la memoria coincide con el del micro). Es decir, es como si hubiésemos declaro <em>padding</em> de ésta otra forma:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">char</span> a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">char</span> dummy1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">char</span> dummy2;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">char</span> dummy3;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> b;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> padding;</div>
</li>
</ol>
</div>
<p>de modo que <em>dummy?</em> son solo para rellenar (<em>padding</em>) y hacer que <em>b</em> empiece donde debe, respetando así el alineamiento. Si no fuese así y quisiéramos acceder a <em>a</em>, seguiríamos usando una lectura, mientras que para acceder a <em>b</em> la cosa cambiaría, ya que necesitaríamos una lectura para acceder a los tres primeros bytes y una segunda lectura mas para acceder al último. Después habría que realizar desplazamientos y ajustes para obtener el valor final.<br />
De ahí que veamos otro efecto colateral a la salida de la ejecución del código: El último valor leído de <em>b</em> no coincide con el esperado. De hecho solo hemos modificado el primer byte. Los otros tres bytes que hemos recorrido han sido los del padding.</p>
<p>Ésto abre la veda para hacer pequeños &#8220;experimentos&#8221;. Por ejemplo, si cambiamos <em>a</em> y <em>b</em> de posiciones relativas veremos que el tamaño sigue siendo 8. ¿De verdad sigue haciendo falta relleno? Ahora se supone que leemos primero el <em>int</em> y que por tanto <em>b</em> lo podremos leer sin problemas&#8230;. Pues la respuesta es si y no.  En realidad ahora no hay padding, pero si que es cierto que la estructura sigue ocupando 8 bytes en memoria, pues tendremos que hacer dos lecturas para acceder a todos sus miembros.</p>
<p>Pero podemos hacer mas cosillas: Por ejemplo, podemos declarar otro miembro de tipo <em>short</em> entre <em>a</em> y <em>b</em> y ver qué pasa con el tamaño. ¿Ha cambiado? ¡¡NO!! ¿y eso?. Pues porque al encontrarse el <em>short</em> entre un <em>char</em> y un <em>int</em>, puede utilizar tres de los bytes de padding para almacenarse, por lo que ahora habrá un padding de un solo byte. Si en lugar de eso declaramos el <em>short</em> después de <em>b</em>, veremos que la cosa cambia bastante. Ahora estaremos usando 12 bytes. Queda bastante claro todo ésto ¿no?.</p>
<h2>Evitando el padding con GCC</h2>
<p>Una pregunta bastante obvia que puede asaltar a cualquier lector es: <em>¿y si no quiero que haya padding porque me hace desperdiciar memoria o me viene fatal para recorrer mi estructura?</em>. Bueno, GCC permite forzar el padding que nosotros queramos usando <em>pragmas</em>. En concreto se usa el <em>pragma pack</em>. Veámoslo con un ejemplo sobre nuestro código anterior:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span>** argv<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">#pragma pack(push,1)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">struct</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">char</span> a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> b;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> padding;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">#pragma pack(pop)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">char</span>* p = <span class="br0">&#40;</span><span class="kw4">char</span> *<span class="br0">&#41;</span>&amp;padding;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; padding.<span class="me1">a</span> = <span class="st0">&#8216;z&#8217;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; padding.<span class="me1">b</span> = 0x6fabada6;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;longitud de padding: %i<span class="es0">\n</span>&quot;</span>, <span class="kw4">sizeof</span><span class="br0">&#40;</span>padding<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Datos originales:<span class="es0">\n</span><span class="es0">\t</span>a &#8212;&gt; %c<span class="es0">\n</span><span class="es0">\t</span>b &#8212;&gt; 0x%x<span class="es0">\n</span>&quot;</span>, padding.<span class="me1">a</span>, padding.<span class="me1">b</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; *p = <span class="st0">&#8216;a&#8217;</span>; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0xbe; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0xba; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0&#215;12; p++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; *p = 0&#215;34;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Datos modificados:<span class="es0">\n</span><span class="es0">\t</span>a &#8212;&gt; %c<span class="es0">\n</span><span class="es0">\t</span>b &#8212;&gt; 0x%x<span class="es0">\n</span>&quot;</span>, padding.<span class="me1">a</span>, padding.<span class="me1">b</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>El primer <em>pragma</em> establece que se fuerce un padding de 1 byte y lo &#8220;apila&#8221; en una pila que usa el compilador. De ésta forma podemos ir forzando varios paddings y cuando se use <em>pragma pack(pop)</em> sacaremos el último padding que hayamos usado y volveremos al anterior. En nuestro caso, volveremos al padding por defecto de nuestra máquia, puesto que solo hemos hecho un <em>push</em>.</p>
<p>Si ahora ejecutamos el código veremos que si que sucede lo esperado: <em>padding</em> ocupa 5 bytes y recorriendo la estructura con un puntero a <em>char</em> conseguimos modificar todos los datos como esperábamos.</p>
<p>Yo personalmente opto por no &#8220;forzar&#8221; las cosas. Un consejo para definir estructuras es ir declarando sus componentes por orden de menor a mayor tamaño. De ésta forma, quedarán organizados de una forma bastante óptima. También habrá que cuidar los recorridos por los miembros de la estructura, utilizando funciones específicas para ello.</p>
<p>Claro que también puede haber situaciones en las que no quede mas remedio. Por ejemplo, otra cosa en la que actualmente ando liado es la implementanción de un pequeño driver para un sistema de archivos <a href="http://es.wikipedia.org/wiki/Tabla_de_Asignaci%C3%B3n_de_Archivos">FAT32</a> que deberá correr en microcontroladores AVR con muy pocas capacidades. Para poder interpretar las tablas de asignación de archivos he de leer bloques del medio en el que tengo almacenados los datos y después interpretar esa información acorde a la estructura que define a dicha tabla. El problema me viene, al igual que comenté al comienzo de ésta entrada, en que si bien en el caso del microcontrolador (con un bus de 8 bits) los datos leídos <em>casan</em> perfectamente con las estructuras necesarias, para el caso de los tests en el PC esto no es así, ya que las estructuras utilizan muchos tipos de 8 y 16 bits y el padding generado para forzar el alineamiento hace que los datos leídos no concuerden con los campos a los que tienen que ir a parar. En éste caso, tengo dos opciones: o una vez leído el bloque (y guardado temporalmente en un array de char) voy rellenando todas las estructuras campo a campo (algo muy muy lento para un microcontrolador y que necesita gran cantidad de código) o bien fuerzo el alineamiento a un byte para evitarme el padding y genero un puntero a la estructura que me interesa guardando en él la dirección de comienzo de mi array a char. De ésta manera podré recorrer mas fácilmente la estructura, sabiendo que para el micro no supondrá coste alguno y que para el PC generaré algo de código extra (al tener que forzar el alineamiento), pero realmente como mi intención es usar el PC sólo para validar los algorítmos, no importa que sea algo ineficiente si con ello consigo el efecto deseado.</p>
<p>Bajo mi punto de vista (y por lo que acabamos de ver también), creo que forzar paddings puede suponer que en algunas arquitecturas el procesador tenga que realizar mas trabajo. En un PC puede que sea (o no) despreciable, pero desde luego en un sistema empotrado ello supone pérdida de tiempo, consumo de energía y consumo de memoria de código (necesitaremos mas código para codificar las operaciones, como es lógico suponer). Ya es decisión de cada uno optar por una u otra forma de implementar.</p>
<h2>Referencias</h2>
<p>Pues como siempre, navegando por Internet uno encuentra muchas cosas. En <a href="http://bytes.com/topic/c/answers/543879-what-structure-padding">http://bytes.com/topic/c/answers/543879-what-structure-padding</a> encontré una explicación bastante clara de todo ésto del alineamiento y del padding.
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/03/31/gcc-y-el-padding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actualizando GoogleMaps en Android (con CyanogenMod-2.4.5)</title>
		<link>http://elvioladordesegmentos.net/index.php/2010/02/22/actualizando-googlemaps-en-android-con-cyanogenmod-2-4-5/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2010/02/22/actualizando-googlemaps-en-android-con-cyanogenmod-2-4-5/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 14:00:50 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://jalsoez.dyndns.org/blog/?p=132</guid>
		<description><![CDATA[Cómo actualizar GoogleMaps en una Rom CyanogenMod-2.4.5]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Actualización</h2>
<p>A todos los que tengais instalado en vuestro HTC Magic la versión CyanogenMod-2.4.5 os habrá pasado que no podeis actualizar la aplicación <b>GoogleMaps</b> debido a no sé que problema (exactamente creo que lo que sucede es que se encuentra instalado en una partición motada como de solo lectura). Buscando por ahí encontré como poder actualizar: El proceso pasa por desinstalar la versión vieja un poco &#8220;a lo bestia&#8221; e instalar encima otra nueva.</p>
<p>Utilizando <a href="http://developer.android.com/guide/developing/tools/adb.html">adb</a> los comandos a introducir son los siguientes:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">adb root</div>
</li>
<li class="li1">
<div class="de1">adb remount</div>
</li>
<li class="li1">
<div class="de1">adb shell <span class="kw2">find</span> /system /data -name \*google\*maps.apk\* -o -name Maps.apk -delete</div>
</li>
<li class="li1">
<div class="de1">adb uninstall com.google.android.apps.maps</div>
</li>
</ol>
</div>
<p>Una vez desinstalada la aplicación, buscamos un apk de GoogleMaps y los instalamos, bien copiándolo a la tarjeta SD y ejecutando ahí o bien usando el propio adb.</p>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.elandroidelibre.com/2009/11/google-navigaton-para-todos-ya.html">GoogleMaps navigation para todos</a></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2010/02/22/actualizando-googlemaps-en-android-con-cyanogenmod-2-4-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ARM mini2440: Configurando uBoot para arranque desde SD para FriendlyArm</title>
		<link>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-configurando-uboot-para-arranque-desde-sd-para-friendlyarm/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-configurando-uboot-para-arranque-desde-sd-para-friendlyarm/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 14:39:48 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[uBoot]]></category>

		<guid isPermaLink="false">http://jalsoez.dyndns.org/blog/?p=129</guid>
		<description><![CDATA[Cómo hacer arrancar nuestro Kernel desde una tarjeta SD en nuestra querida <em>FriendlyARM</em>.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>Después de haber <a href="http://jalsoez.dyndns.org/blog/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">compilado e instalado uBoot</a> en nuestra tarjeta de desarrollo <a href="http://www.friendlyarm.net/products/mini2440">mini2440</a> y de haberle <a htef="http://jalsoez.dyndns.org/blog/index.php/2009/12/31/arm-mini2440-compilando-linux/">compilado una imágen Linux</a> ahora nos proponemos configurar uBoot para el arranque de dicho kernel.<br />
uBoot permite mucha flexibilidad a la hora de instalar y arrancar imágenes desde la memoria. Aún así, aquí sólo explicaré el procedimiento que he utilizado yo para poder cargar y ejecutar Linux desde una tarjeta SD, ya que además de parecerme los mas fácil y cómodo a la hora de actualizar (tan solo hay que copiar la nueva imagen a la SD), mantendremos intacta la NAND interna de nuestra tarjeta, que sabemos que tiene vida limitada, y aunque muy larga, no deja de ser eso, limitada.</p>
<h2>Qué necesitamos</h2>
<p>Pues como dije antes, se supone que debemos de haber leído, comprendido y ejecutado las dos recetas que se mencionan mas arriba.<br />
De la segunda receta obtenemos la imagen del núcleo que vamos a utilizar en nuestra tarjeta, <em>uImage</em>.<br />
A continuación, hay que preparar la tarjeta de memoria. Yo en mi caso tengo una partición <em>ext3</em> de unos 128MB que utilizo para tal fin. Lo del tamaño no importa mucho (ejem), pero nunca por mucho trigo fue mal año (ejem, ejem), así que si nos sobra espacio, podremos utilizarlo para guardar ahí backups y cosas de esas (es lo que yo hago).<br />
También es aconsejable que dicha partición se la primera particion de la unidad (primaria, claro está), ésto no es muy crítico, pero mi configuración tiene ésto en cuenta, con lo cual si situas la partición en otro sitio, deberás especificarlo en la configuración.<br />
Evidentemente no me voy a poner a explicar cómo hacer dicha partición, ya somos todos muy grandecitos para hacerlo solitos, así que cuando termines, te espero mas abajo&#8230;</p>
<h2>Configurando uBoot</h2>
<p>Una vez que  tienes la partición hecha, copias la imagen <em>uImage</em> que compilaste en su día a dicha partición e insertas la tarjeta en el lector de tu mini2440. Conectas el puerto serie, abres minicom con la configuración que usaste para instalar uBoot y arrancas. Cuando salga el mensaje de que pulses una tecla para cancelar el arranque procedes:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">U-Boot <span class="nu0">1.3</span><span class="nu0">.2</span>-mini2440 <span class="br0">&#40;</span>Oct <span class="nu0">15</span> <span class="nu0">2009</span> &#8211; <span class="nu0">19</span>:<span class="nu0">42</span>:<span class="nu0">55</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">I2C: &nbsp; ready</div>
</li>
<li class="li1">
<div class="de1">DRAM: &nbsp;<span class="nu0">64</span> MB</div>
</li>
<li class="li1">
<div class="de1">Flash: &nbsp;<span class="nu0">2</span> MB</div>
</li>
<li class="li2">
<div class="de2">NAND: &nbsp;<span class="nu0">128</span> MiB</div>
</li>
<li class="li1">
<div class="de1">Found Environment offset <span class="kw1">in</span> OOB..</div>
</li>
<li class="li1">
<div class="de1">USB: &nbsp; S3C2410 USB Deviced</div>
</li>
<li class="li1">
<div class="de1">In: &nbsp; &nbsp;serial</div>
</li>
<li class="li1">
<div class="de1">Out: &nbsp; serial</div>
</li>
<li class="li2">
<div class="de2">Err: &nbsp; serial</div>
</li>
<li class="li1">
<div class="de1">MAC: <span class="nu0">08</span>:<span class="nu0">08</span>:<span class="nu0">11</span>:<span class="nu0">18</span>:<span class="nu0">12</span>:<span class="nu0">27</span></div>
</li>
<li class="li1">
<div class="de1">Hit any key to stop autoboot: &nbsp;<span class="nu0">0</span> </div>
</li>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># </span></div>
</li>
</ol>
</div>
<p>Lo primero que vamos a hacer, para asegurarnos de que todo va sobre ruedas, es hacer el arranque &#8220;a mano&#8221;, de modo que sepamos exactamente qué parámetros tenemos que dar a uBoot para que cargue correctamente nuestro núcleo. Una vez que ya sepamos estos parámetros, configuraremos uBoot correctamente para que se haga todo de forma automática cada vez que encendamos nuestra tarjeta. Algunos de los comandos que se mostrarán ahora ya nos sonarán de la receta en la que instalamos uBoot, aún así los volveré a explicar ahora.<br />
Lo primero es inicializar la tarjeta SD:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># mmcinit</span></div>
</li>
<li class="li1">
<div class="de1">trying to detect SD Card&#8230;</div>
</li>
<li class="li1">
<div class="de1">Manufacturer: &nbsp; &nbsp; &nbsp; 0x1b, OEM <span class="st0">&quot;SM&quot;</span></div>
</li>
<li class="li1">
<div class="de1">Product name: &nbsp; &nbsp; &nbsp; <span class="st0">&quot;UD &nbsp; &quot;</span>, revision <span class="nu0">1.0</span></div>
</li>
<li class="li2">
<div class="de2">Serial number: &nbsp; &nbsp; &nbsp;<span class="nu0">2697000253</span></div>
</li>
<li class="li1">
<div class="de1">Manufacturing <span class="kw2">date</span>: <span class="nu0">12</span>/<span class="nu0">2006</span></div>
</li>
<li class="li1">
<div class="de1">CRC: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0&#215;78, b0 = <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">READ_BL_LEN=</span><span class="nu0">15</span>, <span class="re2">C_SIZE_MULT=</span><span class="nu0">7</span>, <span class="re2">C_SIZE=</span><span class="nu0">3453</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">size</span> = <span class="nu0">2329935872</span></div>
</li>
<li class="li2">
<div class="de2">MINI2440 <span class="re3"># </span></div>
</li>
</ol>
</div>
<p>Una vez que la tarjeta ha sido detectada e inicializada correctamente, se carga la imagen:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># ext2load mmc <span class="nu0">0</span>:<span class="nu0">1</span> 0&#215;32000000 uImage</span></div>
</li>
<li class="li1">
<div class="de1"><span class="nu0">2148500</span> bytes <span class="kw2">read</span></div>
</li>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># </span></div>
</li>
</ol>
</div>
<p>Lo que hemos hecho ha sido decirle a uBoot que cargue el archivo <em>uImage</em> que se encuentra en la partición 1 de la tarjeta 0 (<em>0:1</em>) cuyo tipo es extX (<em>ext2load</em>) a partir de la dirección de memoria 0&#215;32000000. Recordemos que en ésta imagen ya definimos el entrypoint, entre otras cosas, por lo que no necesitaremos definirlo mas.<br />
Ahora ya solo queda arrancar:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># bootm</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">## Booting kernel from Legacy Image at <span class="nu0">32000000</span> &#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Image Name: &nbsp; Angstrom/<span class="nu0">2.6</span><span class="nu0">.31</span>+git/mini2440</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Created: &nbsp; &nbsp; &nbsp;<span class="nu0">2009</span><span class="nu0">-12</span><span class="nu0">-10</span> &nbsp; <span class="nu0">4</span>:<span class="nu0">50</span>:<span class="nu0">52</span> UTC</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;Image Type: &nbsp; ARM Linux Kernel Image <span class="br0">&#40;</span>uncompressed<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Data Size: &nbsp; &nbsp;<span class="nu0">2148436</span> Bytes = &nbsp;<span class="nu0">2</span> MB</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Load Address: <span class="nu0">30008000</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Entry Point: &nbsp;<span class="nu0">30008000</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Verifying Checksum &#8230; OK</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;Loading Kernel Image &#8230; OK</div>
</li>
<li class="li1">
<div class="de1">OK</div>
</li>
<li class="li1">
<div class="de1">Starting kernel &#8230;</div>
</li>
<li class="li1">
<div class="de1">&lt;Lots and lots of logs&#8230;.&gt;</div>
</li>
<li class="li1">
<div class="de1">Failed to execute /sbin/init. &nbsp;Attempting defaults&#8230;</div>
</li>
<li class="li2">
<div class="de2">Kernel panic &#8211; not syncing: No init found. &nbsp;Try passing <span class="re2">init=</span> option to kernel.</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&lt;c002b4c8&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>unwind_backtrace+0&#215;0/0xdc<span class="br0">&#41;</span> from <span class="br0">&#91;</span>&lt;c0301dd0&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>panic+0&#215;34/0&#215;118<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&lt;c0301dd0&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>panic+0&#215;34/0&#215;118<span class="br0">&#41;</span> from <span class="br0">&#91;</span>&lt;c0026544&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>init_post+0&#215;134/0x16c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&lt;c0026544&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>init_post+0&#215;134/0x16c<span class="br0">&#41;</span> from <span class="br0">&#91;</span>&lt;c00085c4&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>kernel_init+0xd8/0x10c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&lt;c00085c4&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>kernel_init+0xd8/0x10c<span class="br0">&#41;</span> from <span class="br0">&#91;</span>&lt;c00277d8&gt;<span class="br0">&#93;</span> <span class="br0">&#40;</span>kernel_thread_exit+0&#215;0/0&#215;8<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Como podemos observar, el núcleo ha arrancado correctamente aunque veamos un nunca bienvenido <em>kernel panic</em>. Éste es debido a que no tenemos sistema alguno instalado, con lo cual, cuando el kernel termina de cargar e inicializar el sistema no es capaz de lanzar el proceso <em>Init</em>, con lo que se detiene.<br />
De momento no lo necesitamos, éso será el contenido de una próxima receta. Con que arranque el núcleo nos daremos por satisfechos <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> .<br />
Puesto que ya hemos visto que nuestra configuración funciona, la guardamos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># setenv bootcmd </span><span class="st0">&#8216;mmcinit; fat2load mmc 0:1 0&#215;32000000 uImage; bootm&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># saveenv </span></div>
</li>
<li class="li1">
<div class="de1">Saving Environment to NAND&#8230;</div>
</li>
<li class="li1">
<div class="de1">Erasing Nand&#8230;Writing to Nand&#8230; <span class="kw1">done</span></div>
</li>
</ol>
</div>
<p>El comando <em>setenv</em> sirve para asignar valores a las variables de entorno de uBoot. En éste caso configuramos la variable <em>bootcmd</em> que es la que contiene los comandos que se ejecutarán en el arranque. Dichas instrucciones son las que probamos anteriormente para la carga del núcleo.<br />
<em>saveenv</em> como su nombre indica, sirve para hacer persistente el contenido de las variables de entorno, de forma que esten ahí cada vez que arranquemos la tarjeta.<br />
Con ésto ya debería ser suficiente para que tu núcleo arranque correctamente, pero ya que estamos metidos con uBoot vamos a hacer algo mas: Vamos a configurarlo para decirle en qué partición de la tarjeta tenemos instalado el sistema, así como con qué parámetros debe de arrancar el núcleo, ya que con los que arranca por defecto probablemente no tengamos acceso a un terminal desde el puerto serie (cosa que a veces puede ser muy útil).<br />
Para esto deberemos tocar otra variable de entorno, en éste caso <em>bootargs</em> que contiene los parámetros que son pasados al kernel:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># setenv bootargs </span><span class="st0">&#8216;root=/dev/mmcblk0p2 rootwait=4 rw init=/sbin/init noinitrd console=ttySAC0,115200&#8242;</span></div>
</li>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># saveenv</span></div>
</li>
<li class="li1">
<div class="de1">Saving Environment to NAND&#8230;</div>
</li>
<li class="li1">
<div class="de1">Erasing Nand&#8230;Writing to Nand&#8230; <span class="kw1">done</span></div>
</li>
</ol>
</div>
<p>Lo que hemos hecho ha sido decirle que tenemos el sistema instalado en la partición 2 de la tarjeta SD (<em>boot=/dev/mmcblk0p2</em>), la ruta de init, y desde donde se puede acceder a la consola y a qué velocidad.<br />
La partición que se ha indicado como partición del sistema deberá ser forzosamente ext3, así que recomiendo que el espacio que te sobró en tu SD lo dediques a una partición para el sistema (cuando haga la preceptiva receta <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ).<br />
Ahora podemos ver el contenido de nuestras variables de entorno:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># printenv</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">bootdelay=</span><span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">baudrate=</span><span class="nu0">115200</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ethaddr=</span><span class="nu0">08</span>:<span class="nu0">08</span>:<span class="nu0">11</span>:<span class="nu0">18</span>:<span class="nu0">12</span>:<span class="nu0">27</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">ipaddr=</span><span class="nu0">10.0</span><span class="nu0">.0</span><span class="nu0">.111</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">serverip=</span><span class="nu0">10.0</span><span class="nu0">.0</span><span class="nu0">.4</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">netmask=</span><span class="nu0">255.255</span><span class="nu0">.255</span><span class="nu0">.0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">usbtty=</span>cdc_acm</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mini2440=</span><span class="re2">mini2440=</span>0tb</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">bootargs_base=</span><span class="re2">console=</span>ttySAC0,<span class="nu0">115200</span> noinitrd</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">bootargs_init=</span><span class="re2">init=</span>/sbin/init</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">root_nand=</span><span class="re2">root=</span>/dev/mtdblock3 <span class="re2">rootfstype=</span>jffs2</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">root_mmc=</span><span class="re2">root=</span>/dev/mmcblk0p2 <span class="re2">rootdelay=</span><span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">root_nfs=</span>/mnt/nfs</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">set_root_nfs=</span>setenv root_nfs <span class="re2">root=</span>/dev/nfs rw <span class="re2">nfsroot=</span><span class="re0">$<span class="br0">&#123;</span>serverip<span class="br0">&#125;</span></span>:<span class="re0">$<span class="br0">&#123;</span>root_nfs<span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ifconfig_static=</span>run setenv ifconfig <span class="re2">ip=</span><span class="re0">$<span class="br0">&#123;</span>ipaddr<span class="br0">&#125;</span></span>:<span class="re0">$<span class="br0">&#123;</span>serverip<span class="br0">&#125;</span></span>::<span class="re0">$<span class="br0">&#123;</span>netmask<span class="br0">&#125;</span></span>:mini2440:eth0</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ifconfig_dhcp=</span>run setenv ifconfig <span class="re2">ip=</span>dhcp</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ifconfig=</span><span class="re2">ip=</span>dhcp</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">set_bootargs_mmc=</span>setenv bootargs <span class="re0">$<span class="br0">&#123;</span>bootargs_base<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>bootargs_init<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>mini2440<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>root_mmc<span class="br0">&#125;</span></span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">set_bootargs_nand=</span>setenv bootargs <span class="re0">$<span class="br0">&#123;</span>bootargs_base<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>bootargs_init<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>mini2440<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>root_nand<span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">set_bootargs_nfs=</span>run set_root_nfs; setenv bootargs <span class="re0">$<span class="br0">&#123;</span>bootargs_base<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>bootargs_init<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>mini2440<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>root_nfs<span class="br0">&#125;</span></span> <span class="re0">$<span class="br0">&#123;</span>ifconfig<span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mtdids=</span><span class="re2">nand0=</span>mini2440-nand</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mtdparts=</span><span class="re2">mtdparts=</span>mini2440-nand:256k<span class="br0">&#40;</span>u-boot<span class="br0">&#41;</span>,128k<span class="br0">&#40;</span>u-boot_env<span class="br0">&#41;</span>,5m<span class="br0">&#40;</span>kernel<span class="br0">&#41;</span>,125568k<span class="br0">&#40;</span>rootfs<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">bootargs=</span><span class="re2">root=</span>/dev/mmcblk0p2 <span class="re2">rootwait=</span><span class="nu0">4</span> rw <span class="re2">init=</span>/sbin/init noinitrd <span class="re2">console=</span>ttySAC0,<span class="nu0">115200</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">&quot;ootcmd=&quot;</span>mmcinit</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">filesize=</span>20C8EC</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">partition=</span>nand0,<span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mtddevnum=</span><span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mtddevname=</span>u-boot</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">bootcmd=</span>mmcinit; fat2load mmc <span class="nu0">0</span>:<span class="nu0">1</span> 0&#215;32000000 uImage; bootm</div>
</li>
<li class="li1">
<div class="de1">Environment <span class="kw2">size</span>: <span class="nu0">1209</span>/<span class="nu0">131068</span> bytes</div>
</li>
<li class="li1">
<div class="de1">MINI2440 <span class="re3"># </span></div>
</li>
</ol>
</div>
<p>Ahí podremos ver el contenido de todas las variables de entorno de uBoot. Aparte de las explicadas hay algunas interesantes como por ejemplo <em>ifconfig</em> que sirve para configurar si queremos que ejecute un cliente dhcp al arranque o si queremos darle una ip estática, <em>bootdelay</em> , que sirve para configurar el retardo en el arranque o baudrate, que como podemos imaginar, sirve para configurar la velocidad del puerto serie.<br />
Si reiniciamos ahora nuestra mini2440, podremos ver que arranca el núcleo perfectamente, aunque sin sistema poco podemos hacer&#8230; Paciencia&#8230;. <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<h2>Referencias</h2>
<ul>
<li><a href="http://code.google.com/p/mini2440/wiki/UbootLoadSDKernel">Entrada en el wiki del mini2440 en googlecode</a></li>
<li><a href="http://wiki.linuxmce.org/index.php/Mini2440">Otro wiki sobre la compilación e instalación del núcleo</a></li>
<li><a href="http://www.denx.de/wiki/U-Boot">Manual de uBoot</a></li>
</ul>
<p><b>NOTA:</b> Entrada extraída de otra <a href="http://crysol.org/es/node/1276">antigua entrada</a> publicada por mi en <a href="http://crysol.org">CrySoL</a>.
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-configurando-uboot-para-arranque-desde-sd-para-friendlyarm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ARM mini2440: Compilando Linux para FriendlyArm</title>
		<link>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-compilando-linux/</link>
		<comments>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-compilando-linux/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 13:34:50 +0000</pubDate>
		<dc:creator>javieralso</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[GNU/Linux]]></category>

		<guid isPermaLink="false">http://jalsoez.dyndns.org/blog/?p=124</guid>
		<description><![CDATA[En una entrada anterior escribí sobre <a href="http://elvioladordesegmentos.net/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">cómo compilar e instalar u-boot en una tarjeta mini2440</a>. Ahora voy a explicar cómo compilar un núcleo Linux para ésta misma plataforma. En una próxima receta tengo intención de explicar los pasos para configurar u-boot y hacer arrancable éste núcleo en nuestra amada tarjeta. De momento, vamos lo que interesa: El núcleo.]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<h2>Introducción</h2>
<p>En una entrada anterior escribí sobre <a href="http://elvioladordesegmentos.net/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">cómo compilar e instalar u-boot en una tarjeta mini2440</a>. Ahora voy a explicar cómo compilar un núcleo Linux para ésta misma plataforma. En una próxima receta tengo intención de explicar los pasos para configurar u-boot y hacer arrancable éste núcleo en nuestra amada tarjeta. De momento, vamos lo que interesa: El núcleo.</p>
<h2>Descargando los fuentes</h2>
<p>Los fuentes del núcleo ya parcheados para su uso en nuestra arquitectura los descargamos de su repositorio git:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ <span class="kw2">mkdir</span> kernel ; <span class="kw3">cd</span> kernel</div>
</li>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ git clone git://repo.or.cz/linux<span class="nu0">-2.6</span>/mini2440.git</div>
</li>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ <span class="kw2">mkdir</span> kernel-bin</div>
</li>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ <span class="kw3">cd</span> mini2440</div>
</li>
</ol>
</div>
<p>Con ésto ya tendremos creada la jerarquía de directorios necesaria y los fuentes descargados.<br />
Para la compilación, usaré la misma toolchain que utilicé en la <a href="http://elvioladordesegmentos.net/index.php/2009/10/24/instalando-uboot-en-una-mini2440-friendlyarm/">receta sobre u-boot</a>, así que después de leerla y configurar la toolchain contiuaremos.</p>
<p>Lo primero que necesitaremos es crear el archivo de configuración (<em>.config</em>) con las opciones del núcleo. Suponiendo que estamos en el directorio <em>mini2440</em> creado anteriormente, ejecutamos</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ <span class="re2">CROSS_COMPILE=</span>arm-none-linux-gnueabi- <span class="re2">ARCH=</span>arm <span class="kw2">make</span> <span class="re2">O=</span>../kernel-bin/ mini2440_defconfig</div>
</li>
</ol>
</div>
<p>Ésto generará la configuración a partir de una template existente en los propios fuentes y prácticamente no tendremos que tocar nada mas.</p>
<h2>Configuración del display</h2>
<p>En el código descargado existe un bug que hace que la imagen mostrada en el display aparezca desplazada 13 pixeles hacia la derecha. Preguntándo a Google encontré cómo arreglarlo. La solución pasa por editar en uno de los fuentes los parámetros de configuración del display. Sé que hubiese resultado mas cómodo generar el parche y ponerlo aquí sin mas para que se aplique, pero así explico con un poco mas de detalle que es lo que hay que hacer, no sea que alguien utilice otro tipo de display y tenga que editar de forma distinta los fuentes.</p>
<p>El archivo a editar es <em>mini2440/arch/arm/mach-s3c2440/mach-mini2440.c</em>. Aquí, entre otras cosas, se inicializan muchas de las estructuras utilizadas por el núcleo con parámetros específicos de nuestra arquitectura. En nuestro caso habrá que modificar los parámetros del display TFT de 3&#8217;5&#8243; con touchscreen, que es el que tengo yo. En otro caso y dependiendo del display que tengas tu, puede que tengas que modificar o no dicho archivo con distintos parámetros.</p>
<p>Buscamos el siguiente código (a partir de la línea 227):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">static</span> <span class="kw4">struct</span> s3c2410fb_display mini2440_lcd_cfg<span class="br0">&#91;</span><span class="br0">&#93;</span> __initdata = <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="br0">&#123;</span>&nbsp;<span class="coMULTI">/* mini2440 + 3.5&quot; TFT + touchscreen &#8211; old model &quot;N35&quot; */</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _LCD_DECLARE<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">7</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* The 3.5 is quite fast */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">240</span>, <span class="nu0">21</span>, <span class="nu0">38</span>, <span class="nu0">6</span>, &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* x timing */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">320</span>, <span class="nu0">4</span>, <span class="nu0">4</span>, <span class="nu0">2</span>,&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* y timing */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">60</span><span class="br0">&#41;</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* refresh rate */</span></div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</div>
</li>
</ol>
</div>
<p>Cómo podemos observar, este fragmento corresponde al display de 3&#8217;5&#8243; con touchscreen del mini2440 (seleccionado por defecto en la configuración que creamos anteriormente). Dentro de los parámetros <em>x timing</em>, cambiamos el valor 38 por 25, restando así el offset de 13 pixels que hay en el eje X del display.<br />
El código entonces deberá quedar tal que así:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">static</span> <span class="kw4">struct</span> s3c2410fb_display mini2440_lcd_cfg<span class="br0">&#91;</span><span class="br0">&#93;</span> __initdata = <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="br0">&#123;</span>&nbsp;<span class="coMULTI">/* mini2440 + 3.5&quot; TFT + touchscreen &#8211; old model &quot;N35&quot; */</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _LCD_DECLARE<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">7</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* The 3.5 is quite fast */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">240</span>, <span class="nu0">21</span>, <span class="nu0">25</span>, <span class="nu0">6</span>, &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* x timing */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">320</span>, <span class="nu0">4</span>, <span class="nu0">4</span>, <span class="nu0">2</span>,&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* y timing */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">60</span><span class="br0">&#41;</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* refresh rate */</span></div>
</li>
<li class="li2">
<div class="de2">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</div>
</li>
<li class="li1">
<div class="de1">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</div>
</li>
</ol>
</div>
<p>Repito, ésto está probado para mi display, si tu display es distinto, deberás buscar la sección correspondiente en el archivo y &#8220;ajustarlo&#8221; según tus necesidades.</p>
<p>Una vez editado, proseguimos con la compilación.</p>
<h2>Compilando</h2>
<p>Después de generada la configuración y arreglado el pequeño bug del que hablé antes, ya podemos compilar:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">javieralso@rigoberto:~$ <span class="re2">CROSS_COMPILE=</span>arm-none-linux-gnueabi- <span class="re2">ARCH=</span>arm <span class="kw2">make</span> <span class="re2">O=</span>../kernel-bin/</div>
</li>
</ol>
</div>
<p>Y a esperar (no mucho, un café mientras ves el youtube <img src='http://elvioladordesegmentos.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).</p>
<p>Suponiendo que ya has terminado de compilar y todo ha ido a las mil maravillas, ahora toca crear la imagen que u-boot cargará y arrancará. Para ello utilizamos la herramienta <em>mkimage</em> que podemos encontrar en el directorio <em>tools</em> de la distribución u-boot que compilamos en su momento.</p>
<p>el comando a introducir será el siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">avieralso@rigoberto:~$ mkimage -A arm -O linux -T kernel -C none -a 0&#215;30008000 -e 0&#215;30008000 -d ../kernel-bin/<span class="kw2">arch</span>/arm/boot/zImage ./uImage</div>
</li>
</ol>
</div>
<p>Deberemos usar el path completo a mkimage si no lo tenemos en nuestro path.</p>
<p>Éste comando crea una imagen para arm (<em>-A arm</em>), sistema operativo linux y tipo de imagen un núcleo. Además, no se usará compresión (<em>-O linux -T kernel -C none</em>). La imagen creada será cargada por u-boot a partir de la dirección 0&#215;30008000 y el punto de entrada (dirección a partir de la cual arranca la imagen) será la misma dirección (<em>-a 0&#215;30008000 -e 0&#215;30008000</em>).<br />
La imagen se llamará <em>uImage</em> y quedará almacenada en el directorio actual.</p>
<h2>Lo próximo&#8230;</h2>
<p>En una próxima receta explicaré la configuración de u-boot poniendo como ejemplo la instalación de nuestra imagen para que sea cargada desde una tarjeta microSD (o desde donde queramos).<br />
Después explicaré como compilar desde cero una imagen de <a href="http://opie.handhelds.org/cgi-bin/moin.cgi/">opie</a> utilizando la toolchain de <a href="http://wiki.openembedded.net/index.php/Main_Page">openembedded</a> e instalarla, junto con las librerías generadas durante la compilación de éste núcleo.<br />
Finalmente hablaré sobre como compilar una aplicación para opie utilizando <em>bitbake</em>, el script de compilación automatizado de openembedded.</p>
<h2>Referencias</h2>
<p>Como siempre muchísimas, pero la principal, de la que lo he seguido todo, ha sido el siguiente enlace:</p>
<ul>
<li><a href"http://wiki.linuxmce.org/index.php/Mini2440">http://wiki.linuxmce.org/index.php/Mini2440</a></li>
<li><a href="http://www.friendlyarm.net/forum/topic/107?lang=en">Hilo sobre el bug del display en el foro del mini2440</a>
</ul>
<p>Un saludo</p>
<p><b>NOTA:</b> Entrada extraída de otra <a href="http://crysol.org/es/node/1273">antigua entrada</a> publicada por mi en <a href="http://crysol.org">CrySoL</a>.
</div>
]]></content:encoded>
			<wfw:commentRss>http://elvioladordesegmentos.net/index.php/2009/12/31/arm-mini2440-compilando-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

