Monthly Archives: Julio 2010

Creación de una imagen Emdebian para tu FriendlyArm

0
Filed under ARM, Debian, Embedded, GNU, mini2440
Tagged as , , ,

Introducción

Emdebian es una distribución Debian especialmente diseñada para dispositivos empotrados. Su principal característica radica en el poco espacio que ocupa la distribución.

Emdebian ofrece una Toolchain, 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 debootstrap o, como se hará en ésta receta, utilizando multistrap, que permite crear un sistema nuevo utilizando varios repositorios y echando mano de apt y dpkg para solucionar posibles conflictos.

Qué necesitamos

Pues como he dicho anteriormente, utilizaremos multistrap, así que nos lo instalamos en nuestra máquina (ya sabeís, apt-get o aptitude bla, bla, bla…).

Además, supondremos que seguimos las recetas anteriores sobre cómo compilar Linux para mini2440 y sobre cómo configurar u-boot para arrancar el sistema desde una micro-sd.

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.

Creación de la imagen

Como se comentó anteriormente, utilizaremos multistrap para crear la imagen de emdebian. Para ejecutar multistrap 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:

  1. [General]
  2. arch=armel
  3. directory=multistrap
  4.  
  5. #cleanup=true
  6. # same as –no-auth option if set to true
  7. # keyring packages listed in each debootstrap will
  8. # still be installed.
  9. noauth=false
  10. # extract all downloaded archives (default is true)
  11. unpack=true
  12. # aptsources is a list of sections to be used for downloading packages
  13. # and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list
  14. # of the target. Order is not important
  15. aptsources=Emdebian
  16. # the order of sections is not important.
  17. # the debootstrap option determines which repository
  18. # is used to calculate the list of Priority: required packages.
  19. debootstrap=Debian Emdebian
  20.  
  21. [Emdebian]
  22. packages=ifupdown udev procps netbase vim-tiny module-init-tools wget openssh-server screen apmd
  23. source=http://www.emdebian.org/grip/
  24. keyring=emdebian-archive-keyring
  25. suite=squeeze main
  26.  
  27. [Debian]
  28. packages=
  29. source=http://ftp.uk.debian.org/debian
  30. keyring=debian-archive-keyring
  31. suite=squeeze main

La clave arch especifica la arquitectura destino de la distribución, en éste caso armel y la clave directory especifica el directorio destino en el que se desplegará la instalación. En nuestro caso, lo hará dentro del directorio multistrap, subdirectorio del directorio en el que se encuentra nuestro archivo de configuración.

Es importante que la clave cleanup esté comentada (o puesta a false). Ésto hará que la caché de apt 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 emdebian, así que no las comentaré aquí.

Guardamos el fichero con el nombre multistrap.conf (por darle algún nombre). Después, podemos instalar:

  1. javieralso@rigoberto:~/emdebian$ ls
  2. multistrap  multistrap.conf
  3. javieralso@rigoberto:~/emdebian$ sudo multistrap –no-auth -f multistrap.conf

Podemos ver que el directorio multistrap en el que quedará instalado emdebian y el archivo de configuración están bajo el mismo directorio. Tras invocar a multistrap podremos ver como se descargan los paquetes y se desempaquetan dentro del directorio multistrap.

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 /etc/passwd aún no existe, así que nos lo creamos nosotros:

  1. javieralso@rigoberto:~/emdebian$ cd multistrap
  2. javieralso@rigoberto:~/multistrap$ sudo su
  3. rigoberto:/home/javieralso/emdebian/multistrap# echo "root:Npge08pfz4wuk:0:0:root:/root:/bin/bash" > etc/passwd
  4. rigoberto:/home/javieralso/emdebian/multistrap# echo "root:Npge08pfz4wuk:0:" > etc/group
  5. rigoberto:/home/javieralso/emdebian/multistrap#

Como podemos ver, también hemos creado el archivo /etc/group. Recordad tener cuidado con no sobreescribir los archivos de VUESTRA máquina, no la vayais a liar….

Lo que hemos hecho ha sido asignar la contraseña password al usuario root utilizando el formato de contraseña salt/password, aunque para finalizar, aún debemos hacer mas cosas:

  1. rigoberto:/home/javieralso/emdebian/mutistrap# echo "proc /proc proc none 0 0" >>etc/fstab
  2. rigoberto:/home/javieralso/emdebian/multistrap# echo "mini2440" >etc/hostname
  3. rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/console c 5 1
  4. rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/ttySAC0 c 204 64

Después de ésto, empaquetamos el directorio.

  1. rigoberto:/home/javieralso/emdebian/multistrap# tar jcf ../emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 .
  2. rigoberto:/home/javieralso/emdebian/multistrap#

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 /media/rootfs, podemos cargar ahí el sistema recién creado:

  1. rigoberto:/home/javieralso/emdebian/multistrap# cd ..
  2. rigoberto:/home/javieralso/emdebian# unp emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 /media/rootfs/
  3. rigoberto:/home/javieralso/emdebian#

Instalamos los módulos del núcleo que compilamos en su momento, para eso, nos vamos al directorio mini2440 que creamos en su día y ejecutamos lo siguiente:

  1. javieralso@rigoberto:~/kernel/mini2440# sudo make INSTALL_MOD_PATH=/media/rootfs/  O=../kernel-bin/ modules_install
  2. …………………………………………………………………………………..
  3. …………………………………………………………………………………..
  4. Lots and lots of INSTALL messages
  5. …………………………………………………………………………………..
  6. …………………………………………………………………………………..

Desmontamos la tarjeta, la insertamos en nuestra MINI2440 y arrancamos (conectando el puerto serie de la tarjeta a nuestro PC y arrancando minicom).

Cuando el sistema termine de arrancar, veremos que se para porque no encuentra el archivo /etc/inittab:

  1. …………………………………………………………………………………..
  2. …………………………………………………………………………………..
  3. …………………………………………………………………………………..
  4. …………………………………………………………………………………..
  5. …………………………………………………………………………………..
  6. mmcblk0: mmc0:b368 MSD   1.85 GiB
  7.  mmcblk0: p1 p2
  8. s3c2410-rtc s3c2410-rtc: setting system clock to 2010-07-20 23:14:47 UTC (1279667687)
  9. usb 1-1: new full speed USB device using s3c2410-ohci and address 2
  10. usb 1-1: configuration #1 chosen from 1 choice
  11. kjournald starting.  Commit interval 5 seconds
  12. EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
  13. EXT3 FS on mmcblk0p2, internal journal
  14. EXT3-fs: recovery complete.
  15. EXT3-fs: mounted filesystem with writeback data mode.
  16. VFS: Mounted root (ext3 filesystem) on device 179:2.
  17. Freeing init memory: 136K
  18. INIT: version 2.88 booting
  19. INIT: No inittab file found
  20. Enter runlevel:

Introducimos ‘s’ (single user) y cuando nos pida contraseña introducimos: “password“. De ésta forma tendremos una Shell con permisos de root muy básica, pero con la que podremos terminar de instalar el sistema.

A continuación remontamos el sistema de archivos como sistema de lectura/escritura:

  1. root@(none):~# mount -n / -o remount,rw

y después montamos el sistema de archivos /proc:

  1. root@(none):~# mount -n /proc

Ahora debemos reinstalar todos los paquetes. Aunque los paquetes ya “están” en el disco, debemos “reinstalarlos” para que se genere la base de datos del sistema:

  1. root@(none):~# cd /var/cache/apt/archives
  2. root@(none):/var/cache/apt/archives# dpkg –force-all -i libc6* libstdc++* libncurses5* dpkg_*
  3. ………………………………………………………………………………
  4. ………………………………………………………………………………
  5. lots and lots of installation messages
  6. ………………………………………………………………………………
  7. ………………………………………………………………………………
  8. root@(none):/var/cache/apt/archives# dpkg –force-all -i apt*.deb
  9. ………………………………………………………………………………
  10. ………………………………………………………………………………
  11. lots and lots of installation messages
  12. ………………………………………………………………………………
  13. ………………………………………………………………………………

Una vez que tenemos instalado apt, reinstalamos todos los paquetes configurando la lista selections de dpkg:

  1. root@(none):/var/cache/apt/archives# ls *.deb | sed ‘s/\([^_]*\)_.*/\1 install/’ | dpkg –set-selections
  2. root@(none):/var/cache/apt/archives# apt-get dselect-upgrade
  3. ………………………………………………………………………………
  4. ………………………………………………………………………………
  5. lots and lots of installation messages
  6. ………………………………………………………………………………
  7. ………………………………………………………………………………

Aquí es muy probable que se produzcan errores durante la reinstalación. cuando ésto suceda se vuelve a ejecutar apt-get dselect-upgrade hasta que se termine. Para algunos paquetes es posible incluso que tengas que tocar algo a mano, como por ejemplo para que el paquete base-files pueda instalarse correctamente, que en mi caso me fue necesario eliminar el directorio /var/mail a mano.

En éste punto ya casi hemos terminado. Ahora solo falta activar la consola a través de puerto serie:

  1. root@(none):/var/cache/apt/archives# cd /
  2. root@(none):/# echo ttySAC0 >>etc/securetty
  3. root@(none):/# printf "T0:123:respawn:/sbin/getty 115200 ttySAC0\n" >>etc/inittab

¡Y ya está! Reinicia el sistema y ya tendrás una Debian flamante corriendo en tu MINI2440. ¡¡A disfrutarla!!

  1. …………………………………………………………………………………..
  2. …………………………………………………………………………………..
  3. …………………………………………………………………………………..
  4. …………………………………………………………………………………..
  5. …………………………………………………………………………………..
  6. Mounting local filesystems…done.
  7. Activating swapfile swap…done.
  8. Cleaning up temporary files….
  9. Configuring network interfaces…done.
  10. Cleaning up temporary files….
  11. Setting kernel variables …done.
  12. Running scripts in rcS.d/ took 20 seconds.
  13. INIT: Entering runlevel: 2
  14. Using makefile-style concurrent boot in runlevel 2.
  15. apmd[1110]: apmd 3.2.1 interfacing with apm driver 1.13 and APM BIOS 1.2
  16. Starting Advanced Power Management daemon….
  17. Running scripts in rc2.d/ took 2 seconds.
  18. Debian GNU/Linux squeeze/sid MINI2440 ttySAC0
  19. MINI2440 login: root
  20. Password:
  21. Last login: Wed Jul 21 01:14:00 CEST 2010 on ttySAC0
  22. Linux MINI2440 2.6.32-rc8 #1 Mon Dec 7 16:07:52 CET 2009 armv4tl
  23. The programs included with the Debian GNU/Linux system are free software;
  24. the exact distribution terms for each program are described in the
  25. individual files in /usr/share/doc/*/copyright.
  26. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  27. permitted by applicable law.
  28. root@MINI2440:~#

Y después…

Lo próximo es la creación de una imagen opie utilizando openembedded.

Referencias

NOTA: Entrada extraída de otra antigua entrada publicada por mi en CrySoL.

Conceptos sobre planificación en Sistemas Críticos

0
Filed under Embedded, Tiempo Real
Tagged as ,

Introducción

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. Empecemos….

Asignación de prioridades

Bueno, para empezar diré que asumo que todos sabemos lo que es un Ejecutivo Cíclico y en qué consiste un Hiperciclo. También asumo que se tienen claros conceptos como Concurrencia, Período de Activación, Tiempo de Ejecución Máximo, Plazo de Respuesta y un largo etcétera.

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.

Do de éstas formas de asignación son la Asignación de mayor prioridad a las tareas de menor período (Rate monotonic scheduling) y la Asignación de mayor prioridad a las tareas de menor plazo de respuesta (Deadline monotonic sheduling). Las características de éstos sistemas de asignación son las siguientes:

  • Rate monotonic scheduling
    • Asigna mayor prioridad a las tareas cuyo período de activación (T) es menor.
    • Asignación óptima para el modelo de tareas simple: Tareas periódicas, independientes y con plazos iguales a los períodos.
    • 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.
  • Deadline monotonic scheduling
    • Asigna mayor prioridad a las tareas con menor plazo de ejecución.
    • Es válido para modelos en los que existen tareas esporádicas.
    • 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.

Factor de utlización

En un sistema crítico una medida muy importante es el Factor de Utilización 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 (U) siempre tiene que ser menor o igual a 1.

La ecuación para el cálculo de U en un sistema es la siguiente: \sum_{i=1}^N \frac{C_i}{T_i} siendo N el número de tareas en ejecución, C es el tiempo de cómputo de una tarea dada y T es el periodo de activación.

En el modelo simple de ejecución con prioridades monótonas en frecuencia, los plazos se garantizan si U \leq U_0 siendo

U_0 = N * (2^{N^{-1}} - 1)

la Utilización mínima garantizada del sistema para N tareas. Un sistema cumplirá con los plazos siempre que, como se ha comentado anteriormente, U \leq U_0. Aunque ésta no es condición necesaria, si que es suficiente.

Mas cosas

Iré añadiendo mas cosillas poco a poco, ya después del examen… :-P

Referencias

Básicamente mis apuntes de clase