Comence a compilar Fiasco, lo que hice fue seguir las instrucciones en http://os.inf.tu-dresden.de/fiasco/use.html.
1) Me baje los modulos grub l4 dde hello l4env dope preprocess de el cvs.
2) En el directorio l4 ejecuto lo siguiente:
make O=../build_user config
(lo dejo como esta)
make O=../build_user all
(Espero como 20 minutos y sale un error de sed, para arreglarlo toca entrar a l4/tool/gcc-wrap/Makefile y cambiar a:
$(VERBOSE)sed '\
s,@system@,$(SYSTEM),g;\
s,@ar@,$(AR),g;\
s,@nm@,$(NM),g;\
s,@ranlib@,$(RANLIB),g;\
s,@cc@,$(CC_$(DEFAULT_ARCH)),g;\
s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;\
s,@l4dir@,$(absfilename $(L4DIR)),g;\
s,@dropsdir@,$(DROPS_STDDIR),g;\
s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;\
s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;\
s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;\
s,@default_system@,$(DEFAULT_SYSTEM),g;\
s,@default_arch@,$(DEFAULT_ARCH),g;\
s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;\
s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;\
' $< > $@.new
por:
$(VERBOSE)sed 's,@system@,$(SYSTEM),g;s,@ar@,$(AR),g;s,@nm@,$(NM),g;s,@ranlib@,$(RANLIB),g;s,@cc@,$(CC_$(DEFAULT_ARCH)),g;s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;s,@l4dir@,$(absfilename $(L4DIR)),g;s,@dropsdir@,$(DROPS_STDDIR),g;s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;s,@default_system@,$(DEFAULT_SYSTEM),g;s,@default_arch@,$(DEFAULT_ARCH),g;s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;' $< > $@.new
No se por que mi sed no puede con las instrucciones separadas en lineas con un \,pero se arregla el problema. Luego lo dejo otra vez compilando, y me da tiempo de salir, comprar dos libros (Calicalabozo de Andrés Caicedo, y La Despedida de Milan Kundera) , comer algo y cuando vuelvo la maquina esta en un error porque no tenia instalado el doxygen, lo instalo y vuelvo a compilar, me da tiempo de organizar los libros que tengo por leer (Calicalabozo, La despedida, Despues del Hombre de Gonzalo Arango, Gato o soledad en la lluvia de Amílcar Osorio, y El libro Negro de Orhan Pamuk), tambien juego un poco en el Wii de mi hermanito, el control es loquisimo, funciona basicamente con acelerometros. por lo que no es necesario jugar parado y moverse como loco, sino tambien sentado, la parte de infrarrojos funciona siempre y cuando no le caiga sol al sensor (pense que eso solo nos pasaba en los carritos que nos ponian a hacer en la universidad) sino se enloquece, pero casi siempre esta en lugar cerrado entonces no es problema, y me imagino que funciona con conceptos de vision esteroscopica; termino de jugar y sigue compilando, me como un postre y espero, luego sale un error porque no encuentra el comando fig2dev y me toca instalar el transfig, y comienzo de nuevo, al ratico (doy gracias que no toca compilar de nuevo lo que ya ha compilado) sale un error: no puede copiar el archivo building.tex en una carpeta, ¿¿bug del Makefile de Fiasco?? el Makefile hace ejecutar el comando, con respuesta:
cp building.tex drops-building.tex
cp: cannot stat `building.tex': No such file or directory
Lo que pasa es que el Makefile entra en el directorio de trabajo, build-user/doc/.... e intenta copiar el archivo desde esa misma carpeta y hay no esta, esta en el directorio l4/doc/building-howto, solo es copiarlo de esta posicion a build_user/doc/building-howto/ y comenzar de nuevo a compilar, y ya si termina, ¡mas largo que la primera instalada de Xfree86 fue esto!.
Ahora entro en la carpeta l4/kernel/fiasco, corro el comando:
make BUILDDIR=../../../build-kernel
cd ../../../build-kernel
make menuconfig
(lo dejo como esta)
make
(Espero mientras veo Carnivale, esta buena la serie)
Sigo los pasos de la pagina para iniciarlo, un poco distinto (pa correrlo en vmware desde una imagen de un floppy) pero en esencia lo mismo.
Y listo, tengo al buen Fiasco corriendo en una maquina virtual.
Saturday, December 30, 2006
Monday, December 18, 2006
Distribuyendo mi carga
Rafa, para responder a tu comentario decidi hacer 2 cosas, comenzar a bajarme el Fiasco del cvs (y no seguir jugando con esa version de Fiasco que tenia desde hace mucho), y copiar y pegar el comentario en un nedit, separarlo por espacios y abordarlo linea por linea.
1. Middleware DICE, lenguaje de IDL y generador de stub y skeleton para los servicios de userspace.
Fiasco: http://os.inf.tu-dresden.de/DICE/
Pistachio: http://www.l4ka.org/projects/idl4/
NICTA: http://ertos.nicta.com.au/software/kenge/magpie/latest/
En Fiasco van en la version 3.1.0 (Nov/2006) y en Pistachio en la 1.0.0 (2003), y el de Nicta en la 1.0 (Dic/2004) , no he trabajado con ninguna de las tres, entonces no tengo nada que decir.
2. Codigo en C++ en el kernel. Bien organizado y con un preprocesador modificado que hace el codigo aun mas limpio.
En pistachio tambien esta en C++, ahora, lo del preprocesador, no creo que exista en pistachio, y no se hasta que punto sea una gran ventaja, confio plenamente en cpp.
3. Device Driver Environment: Entorno que permite reutilizar todos los drivers de Linux en L4
Fiasco: http://os.inf.tu-dresden.de/l4env/ (no encontre pagina de DDE)
Pistachio: http://www.l4ka.org/projects/virtualization/drivers.php
He leido un poco la forma como lo implementaron en Pistachio y me convence, aunque deberia leerlo mas a fondo.
4. El Build System es demasiado poderoso y organizado. Hace checkout del CVS y veras lo que te digo
Nunca he construido Fiasco del todo, solo he usado una imagen que habia en la pagina, y fue hace un buen rato.
Pistachio lo he compilado varias veces,y he construido aplicaciones de prueba, y si es un poco complicado, pero si uno sigue las ayudas no se pierde. (de hecho ayer recompile desde cero lo del CVS y no tuve problema).
En cuanto a bajarlo del CVS, en esas ando como desde hace 2 horas y nada que baja, ojala algun dia baje.
Uno de los aspectos que mas me hacen pensar en Pistachio:
http://ertos.nicta.com.au/press/051124_L4_Qualcomm_vfinal.pdf
Plataformas soportadas:
Fiasco:
Aun asi, voy a comenzar a trabajar tambien en Fiasco, para ver bien cual se acomoda mejor a lo que estoy buscando.
Pero si me tenes un puestico en Dresden me paso de una a Fiasco, y volvemos a Fiasco "El uKernel".
1. Middleware DICE, lenguaje de IDL y generador de stub y skeleton para los servicios de userspace.
Fiasco: http://os.inf.tu-dresden.de/DICE/
Pistachio: http://www.l4ka.org/projects/idl4/
NICTA: http://ertos.nicta.com.au/software/kenge/magpie/latest/
En Fiasco van en la version 3.1.0 (Nov/2006) y en Pistachio en la 1.0.0 (2003), y el de Nicta en la 1.0 (Dic/2004) , no he trabajado con ninguna de las tres, entonces no tengo nada que decir.
2. Codigo en C++ en el kernel. Bien organizado y con un preprocesador modificado que hace el codigo aun mas limpio.
En pistachio tambien esta en C++, ahora, lo del preprocesador, no creo que exista en pistachio, y no se hasta que punto sea una gran ventaja, confio plenamente en cpp.
3. Device Driver Environment: Entorno que permite reutilizar todos los drivers de Linux en L4
Fiasco: http://os.inf.tu-dresden.de/l4env/ (no encontre pagina de DDE)
Pistachio: http://www.l4ka.org/projects/virtualization/drivers.php
He leido un poco la forma como lo implementaron en Pistachio y me convence, aunque deberia leerlo mas a fondo.
4. El Build System es demasiado poderoso y organizado. Hace checkout del CVS y veras lo que te digo
Nunca he construido Fiasco del todo, solo he usado una imagen que habia en la pagina, y fue hace un buen rato.
Pistachio lo he compilado varias veces,y he construido aplicaciones de prueba, y si es un poco complicado, pero si uno sigue las ayudas no se pierde. (de hecho ayer recompile desde cero lo del CVS y no tuve problema).
En cuanto a bajarlo del CVS, en esas ando como desde hace 2 horas y nada que baja, ojala algun dia baje.
Uno de los aspectos que mas me hacen pensar en Pistachio:
http://ertos.nicta.com.au/press/051124_L4_Qualcomm_vfinal.pdf
Plataformas soportadas:
Fiasco:
* IA32 (Intel, AMD and compatible CPUs, i486 and above)Pistachio:
* ARM (SA1110 and PXA)
* UX (Linux usermode emulation of Fiasco/L4
- Alpha (21164, 21264)
- AMD64 (Opteron 242, Simics)
- ARM (SA1100, XScale, ARM925T)
- IA32 (Pentium and higher)
- IA64 (Itanium1, Itanium2, Ski)
- MIPS 64bit (R4000, R5000)
- PowerPC 32bit (IBM 750)
- PowerPC 64bit (Power3, Power4)
- ((((Pronto M68K jeje))))
Aun asi, voy a comenzar a trabajar tambien en Fiasco, para ver bien cual se acomoda mejor a lo que estoy buscando.
Pero si me tenes un puestico en Dresden me paso de una a Fiasco, y volvemos a Fiasco "El uKernel".
Sunday, December 17, 2006
Volviendo a pistachio
Me estoy bajando el codigo fuente de pistachio, hace un buen rato que no lo veia, y ya ni podia entender mi enredo de idrectorios, asi, que va a tocar casi desde cero. La idea seria:
1) Lograr controlar una tarjeta de red con pistachio. Primero voy a intentar con el codigo para el stack tcp/ip que viene con OSKIT, aunque igual creo que lo primero es manipular la tarjeta a bajo nivel a mano, y luego conectar esto con el oskit.
2) Hacer una aplicacion cliente/servidor entre pistachios
3) Entender bien el concepto de hilo en pistachio, la generacion de los mismos, y cuales son y para que sirven los hilos basicos de pistachio.
(Esta semana tengo que llamar a averiguar acerca del precio de las tarjetas de las CPLDs)
1) Lograr controlar una tarjeta de red con pistachio. Primero voy a intentar con el codigo para el stack tcp/ip que viene con OSKIT, aunque igual creo que lo primero es manipular la tarjeta a bajo nivel a mano, y luego conectar esto con el oskit.
2) Hacer una aplicacion cliente/servidor entre pistachios
3) Entender bien el concepto de hilo en pistachio, la generacion de los mismos, y cuales son y para que sirven los hilos basicos de pistachio.
(Esta semana tengo que llamar a averiguar acerca del precio de las tarjetas de las CPLDs)
Monday, December 04, 2006
Saturday, November 25, 2006
Buscando un foco
Bueno, no se porque busco un foco, habiendo luz ambiente, pero bueno, parece ser necesario para poder terminar haciendo algo, la cosa es la siguiente, el fin ultimo de un computador es resolver problemas, pero el meollo esta en que hay ciertos problemas que no se pueden resolver, y hay otros problemas que aunque se pueden resolver, es inutil esperar una respuesta por parte de un computador actual, entonces la cuestion radica en cambiar por completo el como se construiria el modelo matematico del sistema que quiero desarrollar, no puedo basarme en un modelo que siga a turing, pues este se basa en un modelo secuencial de calculo en el cual para resolver un problema se siguen unos pasos en donde cada paso depende de el anterior, y no es posible realizar todos los pasos en un mismo momento, de esto salen otros problemas, los problemas indistribuibles, no se bien si estos problemas se puede resolver con una maquina cuantica de calculo, pero es claro que con una maquina determinista y con un orden secuencial de calculo, no se pueden resolver ciertos problemas, la idea seria poder ya sea escoger que problemas quisiera poder resolver, o lograr demostrar cuales problemas puede resolver un sistema como el que tengo pensado.
Monday, October 30, 2006
Thursday, October 19, 2006
Que es un computador?
He estado leyendo acerca de teoria de conjuntos para poder lograr a entender bien el B-Method y en general los metodos de demostracion, tambien algo de teoria de automatas. Me gustario poder comenzar a trabajar con la definicion formal de una maquina de Turing, y a partir de ella llegar al porque es necesario todas las tecnicas que se utilizan actualmente en la implementacion de los computadores.
Basicamente una maquina de turing es un automata que tiene contacto con un medio de almacenamiento. (http://www.warthman.com/ex-turing.htm)
Una buena lectura seria el "On Computable Numbers, with an Application to the Entscheidungsproblem".
Basicamente una maquina de turing es un automata que tiene contacto con un medio de almacenamiento. (http://www.warthman.com/ex-turing.htm)
Una buena lectura seria el "On Computable Numbers, with an Application to the Entscheidungsproblem".
Sunday, October 15, 2006
Saturday, October 14, 2006
B-Method
Existe una tesis donde hacen un trabajo con el B-Method para demostrar que pistachio esta bien diseñado ( "A Formal Model of the L4 u-kernel API Using the B Method") 2.
Acerca del B-Method.
Para instalar el BToolKit:
http://www.csse.monash.edu.au/courseware/cse4213/2006/resources/linuxInstall.html
Un resumen.
http://www.csse.monash.edu.au/courseware/cse4213/2006/resources/B-summary.pdf
Interoperabilidad de componentes.
http://www.iist.unu.edu/newrh/III/1/docs/techreports/report333/P05.pdf
Bueno, buscare mas documentacion que me sirva, la idea seria poder usar esa herramienta en el paso de volver pistachio distribuido.
Acerca del B-Method.
Para instalar el BToolKit:
http://www.csse.monash.edu.au/courseware/cse4213/2006/resources/linuxInstall.html
Un resumen.
http://www.csse.monash.edu.au/courseware/cse4213/2006/resources/B-summary.pdf
Interoperabilidad de componentes.
http://www.iist.unu.edu/newrh/III/1/docs/techreports/report333/P05.pdf
Bueno, buscare mas documentacion que me sirva, la idea seria poder usar esa herramienta en el paso de volver pistachio distribuido.
Board para la CPLD y el UltraISR
Bueno, por fin termine la version 0.0.01 Beta de la tarjeta para hacer pruebas con la cpld 39K200, y tambien el UltraISR para poder programarlas, toca ver cuanto me cobran por las tarjetas.
Bueno, falta revisar bien esto, y ver si le puedo hacer mejoras.
Bueno, falta revisar bien esto, y ver si le puedo hacer mejoras.
Wednesday, October 04, 2006
Sunday, October 01, 2006
UltraISR
Casi que no lo encuentro, pero al fin encontre el documento para hacer un UltraISR, para poder programar las CPLD's de Cypress:
http://www2.mta.ac.il/~flaxer/edu/course/vhdl/isrdesign.pdf
Ahora puedo hacer pruebas con las cpld's, la cosa es conseguir la plata para hacer las tarjetas para las cpld's.
http://www2.mta.ac.il/~flaxer/edu/course/vhdl/isrdesign.pdf
Ahora puedo hacer pruebas con las cpld's, la cosa es conseguir la plata para hacer las tarjetas para las cpld's.
Wednesday, September 27, 2006
TODO
*Sistema Embebido con el 68K.
-hacer programador de las CPLD's de Cypress.
-diseñar MMU.
-diseñar modulo de audio.
-diseñar modulo de video.
-diseñar modulo RTC.
-integrar serial, video, audio, MMU, RTC, memoria, LEDS, DIPSWITCH, LCD,
-estudiar posibilidad de un medio masivo de almacenamiento.
-Buscar un SO facil de portar, ojala Pistachio.
*Sistema embebido con el 5407
*Sistema embebido con el 5485
*Estudiar posibilidad de portar Pistachio a los Coldfire, o saltar a un ARM.
*En base a lo anterior hacer un Pistachio distribuido.
*Hacer pruebas de rendimiento.
(Demas que falta algo, si algo lo agrego luego)
-hacer programador de las CPLD's de Cypress.
-diseñar MMU.
-diseñar modulo de audio.
-diseñar modulo de video.
-diseñar modulo RTC.
-integrar serial, video, audio, MMU, RTC, memoria, LEDS, DIPSWITCH, LCD,
-estudiar posibilidad de un medio masivo de almacenamiento.
-Buscar un SO facil de portar, ojala Pistachio.
*Sistema embebido con el 5407
*Sistema embebido con el 5485
*Estudiar posibilidad de portar Pistachio a los Coldfire, o saltar a un ARM.
*En base a lo anterior hacer un Pistachio distribuido.
*Hacer pruebas de rendimiento.
(Demas que falta algo, si algo lo agrego luego)
Saturday, September 16, 2006
La madre de los motorola
Hace un tiempo me tope con un buen integrado de la familia Coldfire de Freescale, el 5407, tengo 3 de estos integrados en mi caja de electonica, y no quice dejarlos llenar de polvo, me puse a la tarea de crear un sistema embebido con el integrado.
Como no sabia como funcionaba bien, me puse a investigar y cai en la familia 68 de la cual se basa la familia coldfire, y comence a diseñar un sistema completo basado en el 68000.
El sistema consta de:
1 Procesador MC68HC000FN16
2 Memorias SRAM de 128K c/u (D431000). 256K de Ram total.
2 Memorias EEPROM de 8K c/u (AT28C64B) . 64K de memoria para el "Bios" , Bootloader, como le quieran llamar.
1 Display de Cristal Liquido. Pa ver algo
8 Leds a modo de Post Code. Pa depurar.
2 Dip Switch. Uno a modo de entrada, y otro para seleccionar el numero de interrupcion.
2 Pulsadores, pa reset y pa generar una interrupcion.
1 74LS138. pa decodificar direcciones. los 16MB que direcciona el 68000 esta partido en 8.
Glue Logic:
Un monton de compuertas.
1 2n2222 todo bamba (por no poner un IC de negadores).
Mucho cable.
Condensadores (el tipico 104)
Resistencias.
Actualmente esta problematico, creo que hay algunos cables medio sueltos y es problematico pa que funcione, pero lo hace.
Fotos:
Listo, pa que corriera algo, la cosa es sencilla, primero tengo que tener el toolchain del 68K bien compilado (demas que luego digo como, es canson el proceso), y luego hacer un archivo .S donde hay un .init, y ahi un jump a el main de algun programa en C, y listo, hay van los archivos necesarios para que corra lo que tiene actualmente.
De primero la licencia de todo el codigo a continuacion:
---------------------------------- boot.S -----------------------------------
.extern start_main
.extern int_002,int_003
.extern int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.extern int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.extern int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.extern int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.extern int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.extern int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.extern int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.extern int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.extern int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.extern int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.extern int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.extern int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.extern int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.extern int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.extern int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.extern int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.extern int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.extern int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.extern int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.extern int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.extern int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.extern int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.extern int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.extern int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.extern int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.extern int_254,int_255
.global _start
.global _vectors
.text
_vectors:
.long 0x320000,0x400
.long int_002,int_003
.long int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.long int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.long int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.long int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.long int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.long int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.long int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.long int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.long int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.long int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.long int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.long int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.long int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.long int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.long int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.long int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.long int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.long int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.long int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.long int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.long int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.long int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.long int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.long int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.long int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.long int_254,int_255
_start:
move.l #0x00100000,%a0 /* Leds */
check_ram:
move.w #0x80,(%a0)
move.l #0x00300000,%a1
bucle1:
move.l %a1,(%a1)+
cmpa.l #0x00320000,%a1
blt bucle1
bucle2:
move.l -(%a1),%d0
cmp.l %a1,%d0
bne Error
cmpa.l #0x00300000,%a1
bgt bucle2
move.w #0xff,(%a0)
move.l #0x100000,%d1 /* contador de la duracion de encendido.*/
bucle3:
sub.l #0x1,%d1
bne bucle3
move.w #0x3c,(%a0)
movea.l #0x320000,%a7
movea.l #0x310000,%a6
jsr start_main
Error:
move.w #0x00,(%a0)
forever:
jmp forever
----------------------------------------------------------------------
--------------------------- main.c ---------------------------------
#include "main.h"
void start_main(void)
{
LEDS_set_byte(0);
bienvenida();
mensaje();
}
----------------------------------------------------------------
---------------------- main.h -------------------------------
#define LEDS_ADDRESS 0x00100000
#define DIP_ADDRESS 0x00200000
#define RAM_BASE_ADDRESS 0x00300000
#define RAM_USER_BASE_ADDRESS RAM_BASE_ADDRESS+SYSTEM_INFO_LENGHT
#define RAM_LENGHT 0x00020000
#define LCD_DATA_ADDRESS 0x00400000
#define LCD_CONTROL_ADDRESS 0x00400001
#define SYSTEM_INFO_LENGHT 0x00000002
#include "func.h"
#include "LCD.h"
#include "LEDS.h"
#include "DIP.h"
#include "Int.h"
struct _SYSTEM_INFO
{
unsigned char LEDS;
};
void start_main(void);
-------------------------------------------------------------------
--------------------------- LEDS.c ----------------------------
#include "LEDS.h"
#include "main.h"
void LEDS_set_byte(unsigned char dato)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
info->LEDS=dato;
LEDS_REFRESH(LEDS);
}
void LEDS_set_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
bit=1<
info->LEDS |= bit;
LEDS_REFRESH(LEDS);
}
void LEDS_clear_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
bit=1<
info->LEDS &= ~bit;
LEDS_REFRESH(LEDS);
}
--------------------------------------------------------------------
-------------------------- LEDS.h ------------------------------
#define LEDS_REFRESH(x) *x=info->LEDS
void LEDS_set_byte(unsigned char dato);
void LEDS_set_bit(unsigned char bit);
void LEDS_clear_bit(unsigned char bit);
--------------------------------------------------------------------
--------------------------- func.c -------------------------------
#include "main.h"
inline void prueba(unsigned char a);
/* espera(1) = 3.27315uS */
void esperar(unsigned long n)
{
do{}while(--n>0);
}
void bienvenida(void)
{
unsigned char *LEDS = (unsigned char *) LEDS_ADDRESS;
unsigned int p,q,dummy0, dummy1;
unsigned char k,j,i;
for(k=0;k<2;k++)
{
i=1;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
}
i=128;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
i=i>>1;
}
}
for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{
LEDS_set_byte(0);
LEDS_set_bit(j);
LEDS_set_bit(7-j);
esperar(48000);
}
}
prueba(j);
LEDS_set_byte(j);
}
__inline__ void prueba(register unsigned char a)
{
register unsigned long d3 asm("d3") = (unsigned long) a;
asm("move.b %d3,-(%sp) \n"
"jbsr LEDS_set_byte");
LEDS_set_byte((unsigned char) d3);
}
void mensaje(void)
{
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
do
{
LCD_escribir_cadena("MC68HC000FN16",100000);
LCD_posicion(0,1);
LCD_escribir_cadena("Microprocessor",100000);
LCD_limpiar();
LCD_regresar();
}while(1);
}
---------------------------------------------------------------
------------------------- func.h ----------------------------
void esperar(unsigned long n);
void bienvenida(void);
void mensaje(void);
----------------------------------------------------------------
hay mas archivos pero luego los subo que estan malucos de pegar, por ultimo el Makefile
------------------- Makefile -----------------------------
#Compilador,Linkeo y generacion del bin para C.
all:
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c func.c
m68k-elf-gcc -Os -m68000 -mshort -c -S func.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c main.c
m68k-elf-gcc -Os -m68000 -mshort -c -S main.c
m68k-elf-gcc -ggdb -O0 -m68000 -mshort -c LCD.c
m68k-elf-gcc -O0 -m68000 -mshort -c -S LCD.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c Int.c
m68k-elf-gcc -Os -m68000 -mshort -c -S Int.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c LEDS.c
m68k-elf-gcc -Os -m68000 -mshort -c -S LEDS.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c DIP.c
m68k-elf-gcc -Os -m68000 -mshort -c -S DIP.c
m68k-elf-as -m68000 -o boot.o boot.S
m68k-elf-as -m68000 -o Int_e.o Int_e.S
#m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o /usr/m68k-elf/lib/gcc/m68k-elf/4.0.1/m68000/libgcc.a -o prueba.o
m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.e
#m68k-elf-ld -dp -ggdb -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.gdb
m68k-elf-objcopy -O binary prueba.e prueba.bin
./split prueba.bin
clean:
rm *.s *.o *.bin*
-------------------------------------------------
------------------- ldscript -------------------
ENTRY(_vectors)
SECTIONS {.text 0x0000 : {*(.text)}}
-------------------------------------------------
Basicamente es todo.
TODO:
hacer un TODO completo.
Como no sabia como funcionaba bien, me puse a investigar y cai en la familia 68 de la cual se basa la familia coldfire, y comence a diseñar un sistema completo basado en el 68000.
El sistema consta de:
1 Procesador MC68HC000FN16
2 Memorias SRAM de 128K c/u (D431000). 256K de Ram total.
2 Memorias EEPROM de 8K c/u (AT28C64B) . 64K de memoria para el "Bios" , Bootloader, como le quieran llamar.
1 Display de Cristal Liquido. Pa ver algo
8 Leds a modo de Post Code. Pa depurar.
2 Dip Switch. Uno a modo de entrada, y otro para seleccionar el numero de interrupcion.
2 Pulsadores, pa reset y pa generar una interrupcion.
1 74LS138. pa decodificar direcciones. los 16MB que direcciona el 68000 esta partido en 8.
Glue Logic:
Un monton de compuertas.
1 2n2222 todo bamba (por no poner un IC de negadores).
Mucho cable.
Condensadores (el tipico 104)
Resistencias.
Actualmente esta problematico, creo que hay algunos cables medio sueltos y es problematico pa que funcione, pero lo hace.
Fotos:
Listo, pa que corriera algo, la cosa es sencilla, primero tengo que tener el toolchain del 68K bien compilado (demas que luego digo como, es canson el proceso), y luego hacer un archivo .S donde hay un .init, y ahi un jump a el main de algun programa en C, y listo, hay van los archivos necesarios para que corra lo que tiene actualmente.
De primero la licencia de todo el codigo a continuacion:
Program test to 68000 processor.
Copyright (C) 2005 Jorge Eduardo Cardona Gaviria
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
---------------------------------- boot.S -----------------------------------
.extern start_main
.extern int_002,int_003
.extern int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.extern int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.extern int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.extern int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.extern int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.extern int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.extern int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.extern int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.extern int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.extern int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.extern int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.extern int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.extern int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.extern int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.extern int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.extern int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.extern int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.extern int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.extern int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.extern int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.extern int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.extern int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.extern int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.extern int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.extern int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.extern int_254,int_255
.global _start
.global _vectors
.text
_vectors:
.long 0x320000,0x400
.long int_002,int_003
.long int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.long int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.long int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.long int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.long int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.long int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.long int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.long int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.long int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.long int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.long int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.long int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.long int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.long int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.long int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.long int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.long int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.long int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.long int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.long int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.long int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.long int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.long int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.long int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.long int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.long int_254,int_255
_start:
move.l #0x00100000,%a0 /* Leds */
check_ram:
move.w #0x80,(%a0)
move.l #0x00300000,%a1
bucle1:
move.l %a1,(%a1)+
cmpa.l #0x00320000,%a1
blt bucle1
bucle2:
move.l -(%a1),%d0
cmp.l %a1,%d0
bne Error
cmpa.l #0x00300000,%a1
bgt bucle2
move.w #0xff,(%a0)
move.l #0x100000,%d1 /* contador de la duracion de encendido.*/
bucle3:
sub.l #0x1,%d1
bne bucle3
move.w #0x3c,(%a0)
movea.l #0x320000,%a7
movea.l #0x310000,%a6
jsr start_main
Error:
move.w #0x00,(%a0)
forever:
jmp forever
----------------------------------------------------------------------
--------------------------- main.c ---------------------------------
#include "main.h"
void start_main(void)
{
LEDS_set_byte(0);
bienvenida();
mensaje();
}
----------------------------------------------------------------
---------------------- main.h -------------------------------
#define LEDS_ADDRESS 0x00100000
#define DIP_ADDRESS 0x00200000
#define RAM_BASE_ADDRESS 0x00300000
#define RAM_USER_BASE_ADDRESS RAM_BASE_ADDRESS+SYSTEM_INFO_LENGHT
#define RAM_LENGHT 0x00020000
#define LCD_DATA_ADDRESS 0x00400000
#define LCD_CONTROL_ADDRESS 0x00400001
#define SYSTEM_INFO_LENGHT 0x00000002
#include "func.h"
#include "LCD.h"
#include "LEDS.h"
#include "DIP.h"
#include "Int.h"
struct _SYSTEM_INFO
{
unsigned char LEDS;
};
void start_main(void);
-------------------------------------------------------------------
--------------------------- LEDS.c ----------------------------
#include "LEDS.h"
#include "main.h"
void LEDS_set_byte(unsigned char dato)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
info->LEDS=dato;
LEDS_REFRESH(LEDS);
}
void LEDS_set_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
bit=1<
info->LEDS |= bit;
LEDS_REFRESH(LEDS);
}
void LEDS_clear_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;
bit=1<
info->LEDS &= ~bit;
LEDS_REFRESH(LEDS);
}
--------------------------------------------------------------------
-------------------------- LEDS.h ------------------------------
#define LEDS_REFRESH(x) *x=info->LEDS
void LEDS_set_byte(unsigned char dato);
void LEDS_set_bit(unsigned char bit);
void LEDS_clear_bit(unsigned char bit);
--------------------------------------------------------------------
--------------------------- func.c -------------------------------
#include "main.h"
inline void prueba(unsigned char a);
/* espera(1) = 3.27315uS */
void esperar(unsigned long n)
{
do{}while(--n>0);
}
void bienvenida(void)
{
unsigned char *LEDS = (unsigned char *) LEDS_ADDRESS;
unsigned int p,q,dummy0, dummy1;
unsigned char k,j,i;
for(k=0;k<2;k++)
{
i=1;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
}
i=128;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
i=i>>1;
}
}
for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{
LEDS_set_byte(0);
LEDS_set_bit(j);
LEDS_set_bit(7-j);
esperar(48000);
}
}
prueba(j);
LEDS_set_byte(j);
}
__inline__ void prueba(register unsigned char a)
{
register unsigned long d3 asm("d3") = (unsigned long) a;
asm("move.b %d3,-(%sp) \n"
"jbsr LEDS_set_byte");
LEDS_set_byte((unsigned char) d3);
}
void mensaje(void)
{
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
do
{
LCD_escribir_cadena("MC68HC000FN16",100000);
LCD_posicion(0,1);
LCD_escribir_cadena("Microprocessor",100000);
LCD_limpiar();
LCD_regresar();
}while(1);
}
---------------------------------------------------------------
------------------------- func.h ----------------------------
void esperar(unsigned long n);
void bienvenida(void);
void mensaje(void);
----------------------------------------------------------------
hay mas archivos pero luego los subo que estan malucos de pegar, por ultimo el Makefile
------------------- Makefile -----------------------------
#Compilador,Linkeo y generacion del bin para C.
all:
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c func.c
m68k-elf-gcc -Os -m68000 -mshort -c -S func.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c main.c
m68k-elf-gcc -Os -m68000 -mshort -c -S main.c
m68k-elf-gcc -ggdb -O0 -m68000 -mshort -c LCD.c
m68k-elf-gcc -O0 -m68000 -mshort -c -S LCD.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c Int.c
m68k-elf-gcc -Os -m68000 -mshort -c -S Int.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c LEDS.c
m68k-elf-gcc -Os -m68000 -mshort -c -S LEDS.c
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c DIP.c
m68k-elf-gcc -Os -m68000 -mshort -c -S DIP.c
m68k-elf-as -m68000 -o boot.o boot.S
m68k-elf-as -m68000 -o Int_e.o Int_e.S
#m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o /usr/m68k-elf/lib/gcc/m68k-elf/4.0.1/m68000/libgcc.a -o prueba.o
m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.e
#m68k-elf-ld -dp -ggdb -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.gdb
m68k-elf-objcopy -O binary prueba.e prueba.bin
./split prueba.bin
clean:
rm *.s *.o *.bin*
-------------------------------------------------
------------------- ldscript -------------------
ENTRY(_vectors)
SECTIONS {.text 0x0000 : {*(.text)}}
-------------------------------------------------
Basicamente es todo.
TODO:
hacer un TODO completo.
Monday, September 11, 2006
Tesis
Dicen las malas lenguas que tengo que hacer tesis, y hasta el momento este va a ser mi proyecto, existe un uKernel llamado pistachio que lo han trabajado en Karlsruhe, la cosa es lograr hacer un pistachio distribuido que corra en varias maquinitas embebidas de un costo bien reducido.
Saturday, September 09, 2006
Subscribe to:
Posts (Atom)