From 0975cd73dc3c293658535e9fc4ee456477d5d3ef Mon Sep 17 00:00:00 2001 From: Carlos Camargo Date: Sun, 12 Sep 2010 19:57:04 -0500 Subject: [PATCH] aaa --- Examples/drivers/blink/blinker.c | 2 +- Examples/sram_gpio/src/jz_init_sram.c | 4 +- course/.docs/book/biblio.bib | 2131 ++++++++++++ course/.docs/book/biblio.bib.bak | 2123 ++++++++++++ course/.docs/book/commons.tex | 367 +++ course/.docs/book/commons.tex.backup | 367 +++ course/.docs/book/education.tex | 809 +++++ course/.docs/book/education.tex.backup | 815 +++++ course/.docs/book/embedded.tex | 647 ++++ course/.docs/book/embedded.tex.backup | 645 ++++ course/.docs/book/intro.tex | 471 +++ course/.docs/book/intro.tex.backup | 472 +++ course/.docs/book/note_tmp.tex | 349 ++ course/.docs/book/note_tmp.tex.backup | 351 ++ course/.docs/book/platform.tex | 2245 +++++++++++++ course/.docs/book/platform.tex.backup | 2874 +++++++++++++++++ course/.docs/book/problem.tex | 516 +++ course/.docs/book/review.tex | 564 ++++ course/.docs/book/review.tex.backup | 563 ++++ course/.docs/book/thesis.aux | 79 + course/.docs/book/thesis.bbl | 126 + course/.docs/book/thesis.blg | 51 + course/.docs/book/thesis.dvi | Bin 0 -> 77700 bytes course/.docs/book/thesis.kilepr | 209 ++ course/.docs/book/thesis.tex | 73 + course/.docs/book/thesis.toc | 18 + course/.docs/book/title.tex | 40 + course/.docs/cambio_categoria/biblio.log | 32 + course/.docs/cambio_categoria/biblio.tex | 2 + .../.docs/cambio_categoria/biblio.tex.backup | 2 + course/.docs/cambio_categoria/biblio.tex~ | 2 + course/.docs/cambio_categoria/biblio_EL.bib | 190 ++ .../.docs/cambio_categoria/biblio_EL.bib.bak | 181 ++ course/.docs/cambio_categoria/chapter1.tex | 666 ++++ .../cambio_categoria/chapter1.tex.backup | 658 ++++ course/.docs/cambio_categoria/chapter1.tex~ | 512 +++ course/.docs/cambio_categoria/chapter2.tex | 24 + .../cambio_categoria/chapter2.tex.backup | 16 + course/.docs/cambio_categoria/chaptera.tex | 2245 +++++++++++++ course/.docs/cambio_categoria/embedded.kilepr | 159 + course/.docs/cambio_categoria/embedded.tex | 647 ++++ .../.docs/cambio_categoria/embedded_book.aux | 21 + .../.docs/cambio_categoria/embedded_book.bbl | 15 + .../.docs/cambio_categoria/embedded_book.blg | 45 + .../.docs/cambio_categoria/embedded_book.dvi | Bin 0 -> 171828 bytes .../.docs/cambio_categoria/embedded_book.log | 380 +++ .../.docs/cambio_categoria/embedded_book.pdf | Bin 0 -> 104382 bytes .../.docs/cambio_categoria/embedded_book.tex | 61 + .../cambio_categoria/embedded_book.tex.backup | 57 + .../.docs/cambio_categoria/embedded_book.toc | 3 + .../.docs/cambio_categoria/introduction.tex | 47 + .../cambio_categoria/introduction.tex.backup | 47 + .../.docs/cambio_categoria/introduction.tex~ | 47 + course/.docs/cambio_categoria/main.aux | 79 + course/.docs/cambio_categoria/main.bbl | 51 + course/.docs/cambio_categoria/main.blg | 47 + course/.docs/cambio_categoria/main.log | 475 +++ course/.docs/cambio_categoria/main.pdf | Bin 0 -> 648643 bytes course/.docs/cambio_categoria/main.tex.backup | 56 + course/.docs/cambio_categoria/main.tex~ | 56 + course/.docs/cambio_categoria/main.toc | 20 + course/.docs/cambio_categoria/src/hello | Bin 0 -> 104401 bytes course/.docs/cambio_categoria/src/hello.c | 17 + course/.docs/cambio_categoria/src/hello.o | Bin 0 -> 1188 bytes course/.docs/cambio_categoria/src/test | Bin 0 -> 9203 bytes course/.docs/cambio_categoria/title.tex | 41 + .../.docs/cambio_categoria/title.tex.backup | 41 + course/.docs/cambio_categoria/title.tex~ | 41 + lua/examples/Makefile | 2 +- lua/examples/lua_blink_led/Makefile | 1 - lua/examples/lua_calls_C1/top1.lua | Bin 5636 -> 104 bytes lua/examples/lua_calls_C5/Makefile | 14 +- lua/examples/lua_calls_C5/liba_wrapper.c | 4 +- lua/examples/lua_calls_C5/test.lua | 18 +- 74 files changed, 23913 insertions(+), 20 deletions(-) create mode 100644 course/.docs/book/biblio.bib create mode 100644 course/.docs/book/biblio.bib.bak create mode 100644 course/.docs/book/commons.tex create mode 100644 course/.docs/book/commons.tex.backup create mode 100644 course/.docs/book/education.tex create mode 100644 course/.docs/book/education.tex.backup create mode 100644 course/.docs/book/embedded.tex create mode 100644 course/.docs/book/embedded.tex.backup create mode 100644 course/.docs/book/intro.tex create mode 100644 course/.docs/book/intro.tex.backup create mode 100644 course/.docs/book/note_tmp.tex create mode 100644 course/.docs/book/note_tmp.tex.backup create mode 100644 course/.docs/book/platform.tex create mode 100644 course/.docs/book/platform.tex.backup create mode 100644 course/.docs/book/problem.tex create mode 100644 course/.docs/book/review.tex create mode 100644 course/.docs/book/review.tex.backup create mode 100644 course/.docs/book/thesis.aux create mode 100644 course/.docs/book/thesis.bbl create mode 100644 course/.docs/book/thesis.blg create mode 100644 course/.docs/book/thesis.dvi create mode 100644 course/.docs/book/thesis.kilepr create mode 100644 course/.docs/book/thesis.tex create mode 100644 course/.docs/book/thesis.toc create mode 100644 course/.docs/book/title.tex create mode 100644 course/.docs/cambio_categoria/biblio.log create mode 100644 course/.docs/cambio_categoria/biblio.tex create mode 100644 course/.docs/cambio_categoria/biblio.tex.backup create mode 100644 course/.docs/cambio_categoria/biblio.tex~ create mode 100644 course/.docs/cambio_categoria/biblio_EL.bib create mode 100644 course/.docs/cambio_categoria/biblio_EL.bib.bak create mode 100644 course/.docs/cambio_categoria/chapter1.tex create mode 100644 course/.docs/cambio_categoria/chapter1.tex.backup create mode 100644 course/.docs/cambio_categoria/chapter1.tex~ create mode 100644 course/.docs/cambio_categoria/chapter2.tex create mode 100644 course/.docs/cambio_categoria/chapter2.tex.backup create mode 100644 course/.docs/cambio_categoria/chaptera.tex create mode 100644 course/.docs/cambio_categoria/embedded.kilepr create mode 100644 course/.docs/cambio_categoria/embedded.tex create mode 100644 course/.docs/cambio_categoria/embedded_book.aux create mode 100644 course/.docs/cambio_categoria/embedded_book.bbl create mode 100644 course/.docs/cambio_categoria/embedded_book.blg create mode 100644 course/.docs/cambio_categoria/embedded_book.dvi create mode 100644 course/.docs/cambio_categoria/embedded_book.log create mode 100644 course/.docs/cambio_categoria/embedded_book.pdf create mode 100644 course/.docs/cambio_categoria/embedded_book.tex create mode 100644 course/.docs/cambio_categoria/embedded_book.tex.backup create mode 100644 course/.docs/cambio_categoria/embedded_book.toc create mode 100644 course/.docs/cambio_categoria/introduction.tex create mode 100644 course/.docs/cambio_categoria/introduction.tex.backup create mode 100644 course/.docs/cambio_categoria/introduction.tex~ create mode 100644 course/.docs/cambio_categoria/main.aux create mode 100644 course/.docs/cambio_categoria/main.bbl create mode 100644 course/.docs/cambio_categoria/main.blg create mode 100644 course/.docs/cambio_categoria/main.log create mode 100644 course/.docs/cambio_categoria/main.pdf create mode 100644 course/.docs/cambio_categoria/main.tex.backup create mode 100644 course/.docs/cambio_categoria/main.tex~ create mode 100644 course/.docs/cambio_categoria/main.toc create mode 100755 course/.docs/cambio_categoria/src/hello create mode 100644 course/.docs/cambio_categoria/src/hello.c create mode 100644 course/.docs/cambio_categoria/src/hello.o create mode 100755 course/.docs/cambio_categoria/src/test create mode 100644 course/.docs/cambio_categoria/title.tex create mode 100644 course/.docs/cambio_categoria/title.tex.backup create mode 100644 course/.docs/cambio_categoria/title.tex~ diff --git a/Examples/drivers/blink/blinker.c b/Examples/drivers/blink/blinker.c index b24ab0a..13a08b6 100644 --- a/Examples/drivers/blink/blinker.c +++ b/Examples/drivers/blink/blinker.c @@ -102,7 +102,7 @@ static int __init blink_init(void) { printk(KERN_INFO "BLINK module is Up.\n"); - Major = register_chrdev(252, DEVICE_NAME, &fops); + Major = register_chrdev(0, DEVICE_NAME, &fops); if (Major < 0) { printk(KERN_ALERT "Registering char device failed with %d\n", Major); diff --git a/Examples/sram_gpio/src/jz_init_sram.c b/Examples/sram_gpio/src/jz_init_sram.c index 86a487c..23071c7 100644 --- a/Examples/sram_gpio/src/jz_init_sram.c +++ b/Examples/sram_gpio/src/jz_init_sram.c @@ -34,6 +34,7 @@ main () JZ_PIO *pio; int *virt_addr; + // Set GPIOB26 as part of External Memory Controller pio = jz_gpio_map (CS2_PORT); jz_gpio_as_func (pio, CS2_PIN, 0); @@ -51,9 +52,10 @@ main () printf ("Writing Memory..\n"); - srand48(0x3c); +// srand48(0x3c); for (i = 0; i < FPGA_SIZE/4; i++) +// virt_addr[i] = (lrand48() & 0x00ff); virt_addr[i] = (lrand48() & 0x00ff); printf ("Reading Memory..\n"); diff --git a/course/.docs/book/biblio.bib b/course/.docs/book/biblio.bib new file mode 100644 index 0000000..b13b49d --- /dev/null +++ b/course/.docs/book/biblio.bib @@ -0,0 +1,2131 @@ +@comment{This file has been generated by Pybliographer} + + +@Article{RK95, + Author = {Rosenchein, S. and Kaelbling, L.}, + Title = {A {S}ituated {V}iew of {R}epresentation and {C}ontrol. + {S}pecial {I}ssue on {C}omputational {R}esearch on + {I}nteraction and {A}gency}, + Journal = {Special Issue on Computational Research on Interaction + and Agency, Elsevier Science}, + year = 1995 +} + +@Article{MWMJ95, + Author = {{M. Wooldridge} and {M. Jennings}}, + Title = {Intelligent {A}gents: {T}heory and {P}ractice}, + Journal = {The Knowledge Engineering Review}, + year = 1995 +} + +@PhdThesis{GT98, + Author = {{G. Tempesti}}, + Title = {A {S}elf {R}eparing {M}ultiplexer-{B}ased {FPGA} + {I}nspired by {B}iological {P}rocesses}, + School = {\'Ecole Polytechnique F\'ed\'erale de Laussane}, + month = {8 } # jul, + year = 1998 +} + +@Article{RLKR99, + Author = {S. H. Russ, A. Lambert, R. King}, + Title = {An {A}rtificial {I}mmune {S}ystem {M}odel for {T}ask + {A}llocation}, + Journal = {Submitted to IPPS/SPDP + http://citeseer.ist.psu.edu/115327.html}, + year = 1999 +} + +@Article{BPG, + Author = {{Brian P. Gerkey} and {Maja J. Mataric.}}, + Title = {A formal analysis and taxonomy of task allocation in + multi-robot systems.}, + Journal = {International journal of robotics research, 23(9)} +} + +@Article{VPSB04, + Author = {{V. Parunak} and {S. Brueckner} and {J. Sauter}}, + Title = {Digital {P}heromones for {C}oordination of {U}nmanned + {V}ehicles}, + Journal = {Workshop on Environments for Multi-agent Systems}, + year = 2004 +} + +@Article{BETG+97, + Author = {{Bonabeau E.} and {Theraulaz G.} and {Deneubourg + J.-L.} and {Aron S.} and {Camazine S.}}, + Title = {Self-{O}rganisation in {S}ocial {I}nsects}, + Journal = {TREE}, + Volume = {12}, + Number = {5}, + Pages = {188-193.}, + year = 1997 +} + +@InBook{PMPN+66, + Author = {{P. Marchal} and {P. Naussbaum} and {C. Piguet} and + {S. Durand} and D, Mange and {E. Sanchez} and {A. + Stauffer} and {G. Tempesti}}, + Editor = {{E. Sanchez} and {M. Tomassini}}, + Title = {Embryonics: {T}he {B}irth of {S}ynthetic {L}ife}, + Pages = {166-197}, + Publisher = {Lecture notes in Computer Science, Springer, Berlin}, + year = 1966 +} + +@Article{LD06, + Author = {{Linux Devices}}, + Title = {First {C}olombian {L}inux {SBC} runs {D}ebian}, + Journal = {http://www.linuxfordevices.com/c/a/News/First-Colombian-Linux-SBC-runs-Debian/}, + month = {24 } # apr, + year = 2006 +} + +@TechReport{ED00, + Author = {{E. D'Hondt}}, + Title = {Exploring the {A}morphous {C}omputing {P}aradigm}, + Institution = {VUB, Bruxelles}, + year = 2000 +} + +@Book{Holl90, + Author = {{B. Holldobler} and {E. Wilson}}, + Title = {The Ants}, + Publisher = {Springer-Verlag}, + year = 1990 +} + +@Article{Her07, + Author = {{Herianto} and {T. Sakakibara} and {D. Kurabayashi} }, + Title = { {A}rtificial {P}heromone {S}ystem {U}sing {RFID} for + {N}avigation of {A}utonomous {R}obots}, + Journal = {Journal of Bionic Engineering, Elsevier Limited and + Science Press}, + year = 2007 +} + +@Book{ARC98, + Author = {{Arkin R. C.}}, + Title = {Behavior-{B}ased {R}obotics}, + Publisher = {The MIT press, Cambridge, MA}, + year = 1998 +} + +@Misc{IBSS98, + Author = {{I. Bowman} and {S. Siddiqi} and {M. Tanuan}}, + Title = {Concrete {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://docs.huihoo.com/linux/kernel/a2/index.html}, + month = {12 } # feb, + year = 1998 +} + +@InProceedings{JTMA02, + Author = {{J. Timmis} and {M. Ayara} and {R. Duncan}}, + Title = {Towards {I}mmune {I}nspired {F}ault {T}olerance {I}n + {E}mbedded {S}ystems}, + BookTitle = {Proceedings of 9th {I}nternational {C}onference on + {N}eural {I}nformation {P}rocessing}, + Publisher = {IEEE}, + year = 2002 +} + +@Article{KLAG03, + Author = {{Kristina Lerman} and {Aram Galstyan}}, + Title = {Agent {M}emory and {A}daptation in {M}ulti-{A}gent + {S}ystems.}, + Journal = {Proceedings of the International Conference on + Autonomous Agents and Multi-Agent Systems}, + month = jul, + year = 2003 +} + +@Misc{MLH98, + Author = {{Michael L. Haungs}}, + Title = {The {E}xecutable and {L}inking {F}ormat ({ELF})}, + HowPublished = {http://www.cs.ucdavis.edu/~haungs/paper/node1.html}, + month = {21 } # sep, + year = 1998 +} + +@InBook{EA01, + Author = {{E. Arts} and {R. Harwing} and {M. Schuurmans}}, + Editor = {{J. Denning}}, + Title = {Ambient {I}ntelligence}, + Pages = {235-250}, + Publisher = {McGraw-Hill}, + year = 2001 +} + +@Book{Mok90, + Author = {Mokyr, Joel}, + Title = {The {L}ever of {R}iches, {T}echnological {C}reativity + and {E}conomic {P}rogress.}, + Publisher = {Oxford University Press}, + year = 1990 +} + +@Misc{And, + Author = {Google}, + Title = {Android {P}roject}, + HowPublished = {URL: http://www.android.com/} +} + +@PhdThesis{EP04, + Author = {{E. Petraglio}}, + Title = {Fault {T}olerant {S}elf-{R}eplication {S}ystems}, + School = {\'Ecole Polytechnique F\'ed\'erale de Lausanne}, + year = 2004 +} + +@Article{KSMS97, + Author = {{Ken Sugawara} and {Masaki Sano}}, + Title = {Cooperative acceleration of task performance: + {F}oraging behavior of interacting multi-robots system.}, + Journal = {Physica, D100:343-354}, + year = 1997 +} + +@Article{MRT04, + Author = {{P Mohr} and {N Ryan} and {J. Timmis}}, + Title = {Exploiting {I}mmunological {P}roperties for + {U}biqitous {C}omputing {S}ystems}, + Journal = {ICARIS 2004}, + month = sep, + year = 2004 +} + +@Book{NRC01, + Author = {{National Research Council}}, + Title = {Embedded {E}verywhere}, + Publisher = {National Academic Press}, + year = 2001 +} + +@Misc{HLSIM, + Author = {MIT}, + Title = {H{LSIM} - {T}he {H}igh {L}evel {S}imulator}, + HowPublished = {http://swiss.ai.mit.edu/prouects/amorphous} +} + +@Article{KBCR10, + Author = {{Kerstin Balka} and {Christina Raasch} and {Cornelius + Herstatt}}, + Title = {Open {S}ource {I}nnovation: {A} study of openness and + community expectations}, + Journal = {DIME Conference, Milano}, + year = 2010 +} + +@MastersThesis{AW04, + Author = {{A. Warner}}, + Title = {A {S}elf {T}riggered {R}eadout for a {T}ime + {P}rojection {C}hamber}, + School = {MIT Physics Department}, + year = 2004 +} + +@Article{KLAM04, + Author = {{K. Lerman} and {A. Martinoli} and {A. Galstyan}}, + Title = {A review of probabilistic macroscopic models for swarm + robotic systems}, + Journal = {Proceedings of the International Conference on the + Simulation of Adaptive Behavior}, + month = aug, + year = 2004 +} + +@Book{FGYL+04, + Author = {{F. Gruau} and {Y. Lhuiller} and {P. Reitz} and {O. + Temam}}, + Title = {Blob {C}omputing}, + Publisher = {Computing Frontiers 2004 ACM SIGMicro}, + year = 2004 +} + +@Article{JSCC04c, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {S. Bolivar}}, + Title = {Metodolog\'{\i}a de {I}mplementaci\'on de + {A}ut\'omatas {C}elulares en {FPGA}}, + Journal = {Memorias del X Workshop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@Article{AB97, + Author = {Arkin, R. and Balch, T.}, + Title = {Principles and {P}ractice in {R}eview}, + Journal = {Journal of Experimental and Theoretical Artificial + Intelligence 9}, + year = 1997 +} + +@InBook{APaET03, + Author = {{A. Purhonen and E. Tuulari}}, + Editor = {T. Basten, {M. Geilen and H. de Groot}}, + Title = {Ambient {I}ntelligence and the {D}evelopment of + {E}mbedded {S}ystem {S}oftware}, + Pages = {51 - 66}, + Publisher = {Kluwer Academic Publishers}, + year = 2003 +} + +@InBook{PRGJ, + Author = {{P. Raven} and {G. Johnson}}, + Title = {Biology}, + Chapter = {50 The Immune System}, + Publisher = {Mc Graw Hill} +} + +@InProceedings{KAK01, + Author = {{K. A. Kahng}}, + Title = {Design {T}echnology {P}roductivity in the {DSM} {E}ra.}, + BookTitle = {A{SP}-{DAC}}, + year = 2001 +} + +@Article{KLCJ+0, + Author = {{Kristina Lerman} and {Chris Jones} and {Aram + Galstyan} and {Maja J Matar\'{\i}c}}, + Title = {Analysis of {D}ynamic {T}ask {A}llocation in + {M}ulti-{R}obot {S}ystems}, + Journal = {International Journal of Robotics Research}, + month = mar, + year = 200 +} + +@Article{Tee81, + Author = {Teece, D}, + Title = {The {M}arket for {K}now-how. {T}echnology {T}ransfer: + {N}ew {I}ssues, {N}ew {A}nalysis}, + Journal = {Special issue of the Annals of the American Academy of + Political and Social Science}, + year = 1981 +} + +@Article{DGJT+00, + Author = {{D. Gracias} and {J. Tien} and {T. Breen} and {C. Hsu} + and {G. Whitesides}}, + Title = {Forming {E}lectrical {N}etworks in {T}hree + {D}imensions by {S}elf-{A}ssembly}, + Journal = {Science}, + year = 2000 +} + +@Article{WSCC, + Author = {{W. Spraul} and {C. Camargo} and {A. Wang}}, + Title = {Proyecto {SAKC}}, + Journal = {URL:http://en.qi-hardware.com/wiki/SAKC} +} + +@PhdThesis{CT04, + Author = {{C. Teuscher}}, + Title = {Amorphous {M}embrane {B}lending: {F}rom {R}egular to + {I}rregular {C}ellular {C}omputing {M}achines}, + School = {\'Ecole Polytechnique F\'ed\'erale de Lausanne}, + year = 2004 +} + +@Article{AA97, + Author = {{A. Avizienis}}, + Title = {Toward systematic design of fault tolerant systems}, + Journal = {Computer}, + year = 1997 +} + +@PhdThesis{Cor05, + Author = {{Luis Alejandro Cort\'es}}, + Title = {Verification and {S}cheduling {T}echniques for + {R}eal-{T}ime {E}mbedded {S}ystems}, + School = {Link\"opings universitet Institute of Technology}, + publisher = {UniTryck}, + year = 2005 +} + +@Article{MW93, + Author = {{M. Weiser}}, + Title = {Some computer science issues in ubiquitous computing}, + Journal = {Commun. ACM}, + year = 1993 +} + +@TechReport{WH93, + Author = {W. Heimerdinger, C. Weinstock}, + Title = {A {C}onceptual {F}ramework for {S}ystem {F}ault + {T}olerance}, + Institution = {CMU/SEI-92-TR-033}, + year = 1992 +} + +@Book{CH06, + Author = {{C. Hallinan}}, + Title = {Embedded {L}inux {P}remiere {A} {P}ractical + {R}eal-{W}orld {A}pproach}, + Publisher = {Prentice Hall}, + month = {18 } # sep, + year = 2006 +} + +@Book{Web04, + Author = {Weber, S.}, + Title = {The {S}uccess of {O}pen {S}ource}, + Publisher = {Harvard University Press}, + year = 2004 +} + +@Article{MMQR06, + Author = {{Mamei M} and {Quaglieri R} and {Zambonelli F.}}, + Title = {Making tuple space physical with {RFID} tags}, + Journal = {Proceedings of ACM Symposium on Applied Computing}, + year = 2006 +} + +@Misc{Mae, + Author = {Nokia}, + Title = {Maemo {P}roject}, + HowPublished = {URL: http://www.maemo.org/} +} + +@PhdThesis{MO90, + Author = {{M. Odedra}}, + Title = {Information {T}echnology {T}ransfer to {D}eveloping + {C}ountries: {C}ase studies from {K}enya, {Z}ambia and + {Z}imbabwe}, + School = {London School of Economics}, + year = 1990 +} + +@Article{Mo94, + Author = {{M. odedra-straub}}, + Title = {The {M}yths and {I}llusions of {T}echnology {T}ransfer}, + Journal = {IFIP World Congress Proceedings}, + month = aug, + year = 1994 +} + +@Article{ETPoSSI(09, + Author = {{European Technology Platform on Smart Sistem + Integration (EPoSS)}}, + Title = {European {T}echnology {P}latform on {S}mart {S}ystems + {I}ntegration. {S}trategic {R}esearch {A}genda 2009}, + year = 2009 +} + +@Misc{BBCM01, + Author = {{B. Bonabeau C. Meyer}}, + Title = {Swarm {I}ntelligence: {A} whole new way to think about + business}, + HowPublished = {Harvard Business Review}, + year = 2001 +} + +@Article{LGM+01, + Author = {Lerman, K. and Galstyan, A. and Martinoli, A. and + Ijspeert, A.}, + Title = {A {M}acroscopic {A}nalytical {M}odel of + {C}ollaboration in {D}istributed {R}obotic {S}ystems.}, + Journal = {Artificial Life 7}, + year = 2001 +} + +@InProceedings{DS02, + Author = {{D. Servant}}, + Title = {Combining amorphous computing and reactive agent-based + systems: a paradigm for pervasive intelligence?}, + BookTitle = {First international joint conference on {A}utonomous + agents and muktiagent systems: part 1}, + year = 2002 +} + +@Article{CFK97, + Author = {Cao, Y. and Fukunaga, A. and Kahng, A.}, + Title = {Cooperative {M}obile {R}obotics: {A}ntecedents and + {D}irections}, + Journal = {Autonomous Robots 4}, + year = 1997 +} + +@Article{FTUT94, + Author = {{Fukuda T.} and {Ueyama T.}}, + Title = {Cellular {R}obotics and {M}icro {R}obotics {S}ystems}, + Journal = {World Scientific Series in Robotics and Automated + Systems, Singapore}, + Volume = {10}, + year = 1994 +} + +@Article{JM03, + Author = {Jones, C. and Mataric, M.}, + Title = {Adaptive {D}ivision of {L}abor in {L}arge-{S}cale + {M}inimalist {M}ulti-{R}obot {S}ystems}, + Journal = {Proceedings of the IEEE/RSJ International Conference + on Robotics and Intelligent Systems (IROS). Las Vegas, + Nevada}, + year = 2003 +} + +@MastersThesis{JL02, + Author = {{J. Lifton}}, + Title = {Pushpin {C}omputing: a {P}latform for {D}istributed + {S}ensor {N}etworks}, + School = {Massachusetts Institute of Technology}, + month = sep, + year = 2002 +} + +@Misc{A1, + Author = {{Aleph 1}}, + Title = {Building the {T}oolchain}, + HowPublished = {http://www.aleph1.co.uk/node/279} +} + +@TechReport{Vc08, + Author = {{VDC corp.}}, + Title = {Embedded {S}oftware 2008 {M}arket {I}ntelligence + {S}ystem}, + Institution = {VDC Research Group}, + year = 2008 +} + +@Article{WAAM02, + Author = {{William Agassounon} and {Alcherio Martinoli}}, + Title = {A macroscopic model of an aggregation experiment using + embodied agents in groups of time-varying sizes.}, + Journal = {Proc. of the IEEE Conf. on System, man and Cybernetics + SMC-02, Hammamet, Tunisia.}, + month = oct, + year = 2002 +} + +@Article{GTDM97, + Author = {{G. Tempesti} and {D. Mange} and {A. Stauffer}}, + Title = {A {R}obust {M}uliplexer-based {FPGA} {I}nspired by + {B}iological {S}ystems}, + Journal = {Speciall Issue of Journal of Systems Architecture on + Dep endable Parralled Computer System}, + year = 1997 +} + +@Article{AT99, + Author = {{A. Tyrrell}}, + Title = {Computer {K}now {T}hy {S}elf: {A} {B}iological {W}ay + to {L}ook at {F}ault {T}olerance}, + Journal = {2nd Euromicro/IEEE workshop on Dependable Computing + Systems}, + year = 1999 +} + +@PhdThesis{CO00, + Author = {{C. Ortega-Sanchez}}, + Title = {Embryonics: a {B}io-{I}nspired {F}ault-{T}olerant + {M}ulticellular {S}ystem}, + School = {The University of York}, + month = may, + year = 2000 +} + +@Book{KYJM+08, + Author = {{Karim Yaghmour} and {Jon Masters} and {Gilad + Ben-Yossef} and {Philippe Gerum}}, + Title = {Building {E}mbedded {L}inux {S}ystems}, + Publisher = {O'REILLY}, + year = 2008 +} + +@Article{YTGT+04, + Author = {{Y. Thoma} and {G. Tempesti} and {E. Sanchez} and {J. + Moreno.}}, + Title = {P{OE}tic: {A}n {E}lectronic {T}issue for + {B}io-{I}nspired {C}ellular {A}pplications}, + Journal = {BioSystems}, + Pages = {191-200}, + year = 2004 +} + +@Book{DMMT98, + Author = {{D. Mange} and {M. Tomassini}}, + Editor = {{D. Mange} and {M. Tomassini}}, + Title = {Bio-inspired {C}omputing {M}achines: {T}owards {N}ovel + {C}omputational {A}rchitectures}, + Publisher = {Presses Polytechniques et Universitaires Romandes, + Lausanne, Switzerland}, + year = 1998 +} + +@Article{CMCfMR04, + Author = {{R. LeGrand}}, + Title = {Closed-{L}oop {M}otion {C}ontrol for {M}obile + {R}obotics}, + Journal = {Embedded Programming - Circuit Cellar}, + Volume = {169}, + month = aug, + year = 2004 +} + +@Article{RMRT03, + Author = {{R. Menezes} and {R. Tolksdorf}}, + Title = {A {N}ew {A}pproach to {S}calable {L}inda-systems + {B}ased on {S}warms}, + Journal = {ACM SAC}, + year = 2003 +} + +@Article{Jol77, + Author = {Jolly, James A.}, + Title = {The {T}echnology {T}ransfer {P}rocess: {C}oncepts, + {F}ramework and {M}ethodology.}, + Journal = {The Journal of Technology Transfer. Springer}, + year = 1977 +} + +@InProceedings{GTDR+02, + Author = {{G. Tempesti} and {D. Roggen} and {E. Sanchez} and {Y. + Thoma} and {R. Canham} and {A. Tyrrell} and {J.-M. + Moreno.}}, + Title = {A {POE}tic {A}rchitecture for {B}io-{I}nspired + {S}ystems}, + Editor = {{R.K. Standish} and {M.A. Bedau} and {H.A. Abbass}}, + Publisher = {MIT Press, Cambridge, Massachusetts}, + journal = {8th Int. Conf. of Artificial Life VIII,}, + year = 2002 +} + +@Article{RW04, + Author = {{R. Want}}, + Title = {Enabling {U}biquitous {S}ensing with {RFID}}, + Journal = {IEEE Computer}, + year = 2004 +} + +@Article{Pir00, + Author = {Pirjanian, P.}, + Title = {Multiple {O}bjective {B}ehavior-based {C}ontrol.}, + Journal = {Robotics and Autonomous Systems 31}, + year = 2000 +} + +@Article{HYKL06, + Author = {{Henry Y. K. Lau} and {Vicky W. K. Wong}}, + Title = {An {I}mmunity {B}ased {D}istributed + {M}ultiagent-{C}ontrol {F}ramework}, + Journal = {Systems, Man and Cybernetics, Part A, IEEE + Transactions on}, + month = jan, + year = 2006 +} + +@Article{JLea02, + Author = {{J. Lifton} and {et al}}, + Title = {Pushpin computing system overview: {A} platform for + distributed, embedded ubiquitous sensor networks}, + Journal = {International Conference on Pervasive Computing}, + year = 2002 +} + +@Misc{GGR02, + Author = {Ghosh, R. A. and {G. Robles} and {R. Glott.}}, + Title = {Free/{L}ibre and {O}pen {S}ource {S}oftware: {S}urvey + and {S}tudy. {T}echnical report {U}niversity of + {M}aastricht, {T}he {N}etherlands: {I}nternational + {I}nstitute of {I}nfonomics}, + HowPublished = {URL: http://www.infonomics.nl/FLOSS/report/index.htm}, + year = 2002 +} + +@PhdThesis{MJM94, + Author = {{Maja J Mataric}}, + Title = {Interaction and {I}ntelligent {B}ehavior}, + School = {MASSACHUSETTS INSTITUTE OF TECHNOLOGY}, + month = may, + year = 1994 +} + +@Article{SOQX04, + Author = {{S. Olariu1} and {Q. Xu} and {A. Y. Zomaya}}, + Title = {An {E}nergy-{E}fficient {S}elf-{O}rganization + {P}rotocol for {W}ireless {S}ensor {N}etworks}, + Journal = {Intelligent Sensors, Sensor Networks and Information + Processing Conference}, + year = 2004 +} + +@Article{Mat97, + Author = {Mataric, M.}, + Title = {Behavior-{B}ased {C}ontrol: {E}xamples from + {N}avigation, {L}earning, and {G}roup {B}ehavior}, + Journal = {Journal of Experimental and Theoretical Artificial + Intelligence, special issue on Software Architectures + for Physical Agents Hexmoor, H., Horswill, I., and + Kortenkamp, D., eds}, + year = 1997 +} + +@Article{ST92, + Author = {{Sandler Todd}}, + Title = {Collective {A}ction: {T}heory and {A}pplications}, + Journal = {Ann Arbor: University of Michigan Press}, + year = 1992 +} + +@Book{CHEO06, + Editor = {{Charlotte Hess} and {Elinor Ostrom}}, + Title = {Understanding {K}nowledge as a {C}ommons: {F}rom + {T}heory to {P}ractice}, + Publisher = {The MIT Press}, + month = dec, + year = 2006 +} + +@Misc{Mot, + Author = {Motorola}, + Title = {M{OTODEV} {P}roject}, + HowPublished = {URL: + http://developer.motorola.com/platforms/mobile-linux/} +} + +@Article{HIH02, + Author = {{Hann I. H.}}, + Title = {Delayed {R}eturns to {O}pen {S}ource {P}articipation: + {A}n {E}mpirical {A}nalysis of the {A}pache {HTTP} + {S}erver {P}roject}, + Journal = {Workshop on Open Source Software: Economics, Law and + Policy, Toulouse, France.}, + year = 2002 +} + +@InProceedings{GT04, + Author = {{G. Tempesti}}, + Title = {Processor {A}rchitectures for {O}ntogenesis}, + BookTitle = {Proceedings of the 2004 {NASA}/{D}o{D} {C}onference on + {E}volution {H}ardware}, + year = 2004 +} + +@Misc{emQ, + Author = {emQbit}, + Title = {{e}m{Q}bit {L}inux {P}owered {D}evices {C}ompany}, + HowPublished = {URL: http://www.emqbit.com/} +} + +@PhdThesis{DR05, + Author = {{Dominic Rath}}, + Title = {Open {O}n-{C}hip {D}ebugger}, + School = {University of Applied Sciences Augsburg}, + year = 2005 +} + +@Article{MMZF05, + Author = {{Mamei M} and {Zambonelli F}}, + Title = {Physical deployment of digital pheromones through + {RFID} technology}, + Journal = {Swarm Intelligence Symposium}, + year = 2005 +} + +@Article{ST02, + Author = {S. Thayer, S. Singh}, + Title = {Development of an {I}mmunology-{B}ased {M}ulti-{R}obot + {C}oordination {A}lgorithm for exploration and + {M}apping {D}omains}, + Journal = {IROS 2002: IEEE/RSJ International Conference on + Intelegent Robots and Systems}, + year = 2002 +} + +@MastersThesis{YW04, + Author = {{Y. Wang}}, + Title = {Rules of {B}lob {D}isplacement}, + School = {Laboratoire de Recherche en Informatique, Universit\'e + Paris ud-XI}, + month = jun, + year = 2004 +} + +@Article{Mar04, + Author = {Mart\'{\i}nez, H\'ector}, + Title = {Apropiaci\'on de conocimiento en {C}olombia. {E}l caso + de los contratos de importaci\'on de tecnolog\'{\i}a}, + Journal = {Revista Cuadernos de Econom\'{\i}a}, + year = 2004 +} + +@Article{TKYI+05, + Author = {{Tanaka K} and {Yo Ishigaki} and {Inoue H} and {Itoh + M}}, + Title = {Safety monitoring system by autonomous mobile sensors + utilizing pheromone communication}, + Journal = {Proceedings of the International Conference on + Computational Intelligence for Modelling, Control and + Automation; International Conference on Intelligent + Agents, Web Technologies and Internet Commerce}, + year = 2005 +} + +@Unpublished{WCI, + Author = {{Worldwide CDIO Initiative}}, + Title = {"{B}enefits of {CDIO}" + {URL}:http://www.cdio.org/benefits-cdio on {N}ovember, + 2009} +} + +@InBook{CMS06, + Author = {{Charles M. Schweik}}, + Editor = {{Charlotte Hess} and {Elinor Ostrom}}, + Title = {Understanding {K}nowledge as a {C}ommons: {F}rom + {T}heory to {P}ractice}, + Chapter = {Free/Open-Source Software as a Framework for + Establishing Commons in Science}, + Publisher = {The MIT Press}, + year = 2006 +} + +@MastersThesis{JS02, + Author = {{J. Silber}}, + Title = {A cooperative {C}ommunication {P}rotocol for + {W}ireless {A}d-hoc {N}etworks}, + School = {Massachusetss Institute of Technology}, + month = jun, + year = 2002 +} + +@InBook{DJM+02, + Author = {Dudek, G. and Jenkin, M. and Milios, E. and (2002). A + Taxonomy of Multirobot Systems. In Balch, {T. and + Parker}, L.}, + Editor = {Balch, T. and Parker, L.}, + Title = {Robot {T}eams: {F}rom {D}iversity to {P}olymorphism}, + Chapter = {A Taxonomy of Multirobot Systems}, + Pages = {3-22}, + Publisher = {Natick, Massachusetts: A.K. Peters}, + year = 2002 +} + +@Article{EL94, + Author = {{Edelstein-Keshet L}}, + Title = {{i}mple model for trail-following behaviour; trunk + trails versus individual foragers}, + Journal = {Journal of Mathematical Biology}, + year = 1994 +} + +@Article{DCRN97, + Author = {{D. Coore} and {R. Nagpal} and {R. Weiss}}, + Title = {Paradigm for {S}tructure in an {A}morphous {C}omputer}, + Journal = {AI Memo No. 1614, + http://www.swiss.ai.nit.edu/projects/amorphous}, + month = oct, + year = 1997 +} + +@InBook{BAH88, + Author = {{Bernardo A. Huberman} and {Tad Hogg. In}, editor}, + Editor = {{B. A. Huberman}}, + Title = {The {E}cology of {C}omputation}, + Chapter = {The behavior of computational ecologies.}, + Publisher = {Amsterdam, Elsevier (North-Holland).}, + year = 1988 +} + +@Article{CVJ03, + Author = {{Chris V. Jones} and {Maja J Mataric.}}, + Title = {Adaptive task allocation in large-scale multi-robot + systems}, + Journal = {Proceedings of the IEEE International Conference on + Intelligent Robots and Systems Las Vegas, NV}, + year = 2003 +} + +@PhdThesis{DC99, + Author = {{D. Coore}}, + Title = {Botanical {C}omputing: {A} {D}evelopmental {A}pproach + to {G}enerating {I}nterconnected {T}opologies on an + {A}morphous {C}omputer}, + School = {Massachusetss Institute of Technology}, + year = 1999 +} + +@Article{HSL+04, + Author = {Hearn, Gregory N. and Simpson, Lynette E. and Lennie, + June and Kimber, Megan P.}, + Title = {I{CT}s and regional sustainability: {A} critique and a + way forward}, + Journal = {Community Informatics Research Network Conference and + Colloquium 2004: Sustainability and community + technology}, + year = 2004 +} + +@PhdThesis{AM99, + Author = {{A. Martinoli}}, + Title = {Swarm {I}ntelligence in {A}utonomous {C}ollective + {R}obotics: {F}rom {T}ools to the {A}nalysis and + {S}ynthesis of {D}istributed {C}ontrol {S}trategies}, + School = {EPFL}, + year = 1999 +} + +@Article{FC92, + Author = {{Flaviu Cristian}}, + Title = {Understanding {F}ault-{T}olerant {D}istributed + {S}ystems}, + Journal = {Communications of the ACM}, + month = jan, + year = 1992 +} + +@Article{JSCC03, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {A. Delgado}}, + Title = {El {P}roblema {SAT}: {E}nfoque {C}omparativo con {ADN} + y {FPGA}}, + Journal = {Memorias del IX Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2003 +} + +@Article{EFC01, + Author = {{Edward F. Crawley}}, + Title = {The {CDIO} {S}yllabus {A} {S}tatement of {G}oals for + {U}ndergraduate {E}ngineering {E}ducation}, + Journal = {URL:http://www.cdio.org}, + year = 2001 +} + +@Article{FW00, + Author = {Forbes, Naushad and Wield, David}, + Title = {Managing {R}\&{D} in technology-followers}, + Journal = {Research Policy}, + month = sep, + year = 2000 +} + +@InProceedings{FGPM02b, + Author = {{F. Gruau.} and {P. Malbos.}}, + Title = {The Blob: A Basic Topological Concept for + Hardware-free Distributed Computation}, + BookTitle = {Unconventional Models of Computation, Third + International Conference, UMC 2002, Kobe, Japan, + October 15-19, 2002, Proceedings}, + Editor = {Cristian Calude and Michael J. Dinneen and Ferdinand + Peper}, + Volume = {2509}, + Series = {Lecture Notes in Computer Science}, + Pages = {151--163}, + Publisher = {Springer}, + year = 2002 +} + +@Book{FB97, + Author = {F. Balarin, M. Chiodo, P. Gisto}, + Title = {Hardware-{S}oftawre {C}o-{D}esign of {E}mbedded + {S}ystems}, + Publisher = {Klewer Academic Publishers}, + year = 1997 +} + +@InBook{AMAJI99, + Author = {{A. Martinoli} and {A. J. Ijspeert} and {L. M. + Gambardella}}, + Editor = {{Dario Floreano} and {Jean-Daniel Nicoud} and + {Francesco Mondada}}, + Title = {Proceedings of the 5th {E}uropean {C}onference on + {A}dvances in {A}rtificial {L}ife}, + Chapter = {A probabilistic model for understanding and comparing + collective aggregation mechanisms.}, + Publisher = {Springer}, + year = 1999 +} + +@Book{MDBU93, + Author = {{McFarland D.} and {Bosser U.}}, + Title = {Intelligent {B}ehavior in {A}nimals and {R}obots}, + Publisher = {MIT Press, Cambridge, MA}, + year = 1993 +} + +@Article{GLRBR+, + Author = {{G. Lazea} and {R. B. Rusu} and {R. Robotin} and {R. + Sime}}, + Title = {The {Z}ee{RO} {M}obile {R}obot - {A} {M}odular + {A}rchitecture} +} + +@Article{EBMD99, + Author = {{E. Bonabeau} and {M. Dorigo} and {G. Theraulaz}}, + Title = {Swarm {I}ntelligence}, + Journal = {Oxford University Press}, + year = 1999 +} + +@Book{GC04, + Author = {{Goel Cohen}}, + Title = {Technology transfer: strategic management in + developing countries}, + Publisher = {Sage Publications inc}, + year = 2004 +} + +@TechReport{AAJL01, + Author = {{A. Avizienis} and {J. Laprie} and {B. Randell}}, + Title = {Fundamental {C}oncepts of {D}ependability}, + Institution = {UCLA, LAAS, Newcastle University}, + year = 2001 +} + +@Article{PHVD97, + Author = {{Panurak H V D}}, + Title = {Go to the ant}, + Journal = {Engineering principles for natural multi-agent + systems. Annals of Operations Research}, + year = 1997 +} + +@Article{FM02, + Author = {Fredslund, J. and Mataric, M.}, + Title = {A {G}eneral, {L}ocal {A}lgorithm for {R}obot + {F}ormations.}, + Journal = {IEEE Transactions on Robotics and Automation, Special + Issue on Multi- Robot Systems 18}, + year = 2002 +} + +@Misc{DC97, + Author = {{D. Coore}}, + Title = {Establishing a {C}oordinate {S}ystem on an {A}morphous + {C}omputer}, + HowPublished = {http://swiss.ai.mit.edu/projects/amorphous}, + year = 1997 +} + +@Article{TUTF, + Author = {{Tsuyoshi UEYAMA} and {Toshio FUKUDA}}, + Title = {Self-organization of {C}ellular {R}obots using + {R}andom {W}alk with {S}imple {R}ules} +} + +@PhdThesis{RN01, + Author = {{R. Nagpal}}, + Title = {Programmeble {S}elf-{A}ssembly: {CO}nstructing + {G}lobal {S}hape using {B}iologically-inspired {L}ocal + {I}nteractions and {O}rigami {M}athematics.}, + School = {MIT. Department of Electrical Engineering and Computer + Science.}, + month = jun, + year = 2001 +} + +@Misc{Oxygen, + Author = {MIT}, + Title = {Proyecto {O}x\'{\i}geno}, + HowPublished = {http://oxygen.lcs.mit.edu/} +} + +@Article{Mat95, + Author = {Mataric, M.}, + Title = {Designing and {U}nderstanding {A}daptive {G}roup + {B}ehavior.}, + Journal = {Adaptive Behavior 4}, + year = 1995 +} + +@Article{AARA01, + Author = {{A. Avizienis} and {R. Avizienis}}, + Title = {An {I}mmune system paradigm for the design of fault + tolerance systems}, + Journal = {Workshop 3: Evaluating and Architecting Systems for + Dependability (EASY)}, + year = 2001 +} + +@Article{JLXJ, + Author = {{Jiming Liu} and {Xiaolong Jin} and {Kwok Ching Tsui}}, + Title = {Autonomy-{O}riented {C}omputing ({AOC}):{F}ormulating + {C}omputational {S}ystems {W}ith {A}utonomous + {C}omponents} +} + +@PhdThesis{WB02, + Author = {{W. Butera}}, + Title = {Programming a {P}aintable {C}omputing}, + School = {Massachusetts Institute of Technology}, + month = feb, + year = 2002 +} + +@Article{Gat98, + Author = {Gat, E.}, + Title = {On {T}hree-{L}ayer {A}rchitectures}, + Journal = {In Artificial Intelligence and Mobile Robotics, AAAI + Press}, + year = 1998 +} + +@Article{ECJM+09, + Author = {{E. Crawley} and {J. Malmqvist} and {D. Brodeur} and + {B. Lucas}}, + Title = {C{DIO} {S}yllabus, {L}eadership and {E}ntrepreneurship}, + Journal = {5th International CDIO conference}, + year = 2009 +} + +@Article{MO91, + Author = {{M. Odedra}}, + Title = {Information {T}echnology {T}ransfer to {D}eveloping + {C}ountries {I}s it really taking place?}, + Journal = {The 4th IFIF.TC9 International Conference on Human + Choice and Computers, North Holland, Amsterdam, + Netherlands, HCC 4 held jointly with the CEC FAST + Programme.}, + year = 1991 +} + +@Article{FGJT00, + Author = {{F. Gruau} and {J. Tromp}}, + Title = {Cellular {G}ravity}, + Journal = {Parallel Processing Letters}, + month = dec, + year = 2000 +} + +@Misc{SAS03, + Author = {Schweik, C. M and {A. Semenov}}, + Title = {The {I}nstitutional {D}esign of '{O}pen {S}ource' + {P}rogramming: {I}mplications for {A}ddressing + {C}omplex {P}ublic {P}olicy and {M}anagement {P}roblems}, + HowPublished = {URL: + http://www.firstmonday.org/issues/issue8\_1/schweik/}, + year = 2003 +} + +@Misc{XZ01, + Author = {{X. Zhang}}, + Title = {Bio-{I}nspired {F}ault-{T}olerant {H}ardware {S}ystem}, + HowPublished = {http://www.cems.uwe.ac.uk/~xzhang/}, + month = dec, + year = 2001 +} + +@Misc{CCb, + Author = {{Creative Commons}}, + Title = {Licencias {C}reative {C}ommons}, + HowPublished = {URL: http://creativecommons.org/licenses.}, + year = 2004 +} + +@Article{JF, + Author = {{J Feldman}}, + Title = {The {L}inux startup process}, + Journal = {The Linux Expertise Center, Hewlett-Packard Company} +} + +@Book{JVN66, + Author = {{J. Von Neumann}}, + Title = {Theory of {S}elf-{R}eproducing {A}utomata.}, + Publisher = {University of Illinois Press. Edited and completed by + A. W. Burks}, + year = 1966 +} + +@Book{VSPB+00, + Author = {{V. Subrahmanian} and {P. Bonatti} and {J. Dix} and + {et al}}, + Title = {Heterogeneous {A}gent {S}ystems}, + Publisher = {MIT Press}, + year = 2000 +} + +@Article{HA99, + Author = {H. Abelson, D. Allen, D. Coore}, + Title = {Amorphous {C}omputing}, + Journal = {http://www.ai.mit.edu/publications/pubsDB/pubs.html}, + month = {29 } # aug, + year = 1999 +} + +@Article{AC09, + Author = {{A. Cortesi}}, + Title = {Elinor {O}strom, the commons problem and {O}pen + {S}ource}, + Journal = {URL: + http://corte.si/posts/opensource/ostrom/index.html}, + year = 2009 +} + +@InCollection{FGGM04, + Author = {{F. Gruau} and {G. Moszkowski}}, + Title = {The {B}lob {D}ivision {A} "{H}ardware-{F}ree", {T}ime + {E}fficient, {S}elf-{R}eproduction on 2{D} {C}ellular + {A}utomaton}, + BookTitle = {Biologically {I}nspired {A}pproaches to {A}dvanced + {I}nformation {T}echnology: {F}irst {I}nternational + {W}orkshop, {B}io{ADIT} 2004, {L}ausanne, {S}witzerland}, + Publisher = {Springer}, + journal = {Computing Frontiers}, + year = 2004 +} + +@Misc{CC06, + Author = {{C. Camargo}}, + Title = {First {C}olombian {L}inux {SBC} runs {D}ebian}, + HowPublished = {URL: + http://www.linuxfordevices.com/c/a/News/First-Colombian-Linux-SBC-runs-Debian/}, + year = 2006 +} + +@Article{MFA92, + Author = {{Mussa-Ivaldi F. A.} and Giszter, S.}, + Title = {Vector field approximation: a computational paradigm + for motor control and learning}, + Journal = {Biological Cybernetics 67}, + year = 1992 +} + +@Misc{Wik, + Author = {Wikipedia}, + Title = {Wikipedia, the free encyclopedia}, + HowPublished = {http://en.wikipedia.org/} +} + +@Book{EO90, + Author = {{Elinor Ostrom}}, + Title = {Governing the {C}ommons: {T}he {E}volution of + {I}nstitutions for {C}ollective {A}ction ({P}olitical + {E}conomy of {I}nstitutions and {D}ecisions) + ({P}aperback)}, + Publisher = {Cambridge University Press}, + month = nov, + year = 1990 +} + +@Book{VWJ+03, + Author = {{Van Wendel} and Joode, R. and {J. A. de Bruijn} and + {M. J. G. van Eeten}}, + Title = {Protecting the {V}irtual {C}ommons: + {S}elf-{O}rganizing {O}pen {S}ource and {F}ree + {S}oftware {C}ommunities and {I}nnovative + {I}ntellectual {P}roperty {R}egimes.}, + Publisher = {Asser Press}, + journal = {The Hague: Asser Press.}, + year = 2003 +} + +@InBook{JaMJM05, + Author = {{Jones and Maja J Mataric}}, + Editor = {{Sam S. Ge} and {Frank L. Lewis}}, + Title = {Autonomous {M}obile {R}obots: {S}ensing, {C}ontrol, + {D}ecision-{M}aking, and {A}pplications}, + Chapter = {Behavior-Based Coordination in Multi-Robot Systems}, + Publisher = {Marcel Dekker, Inc}, + year = 2005 +} + +@Article{PDDM+01, + Author = {{Payton D} and {Daily M} and {Estowski R} and {Howard + M} and {Lee C}}, + Title = {Pheromone robotics}, + Journal = {Autonomous Robots}, + year = 2001 +} + +@Book{JCAR05, + Author = {{J. Corbet} and {A. Rubini} and {G. Kroah-Hartman}}, + Title = {Linux {D}evice {D}rivers, {T}hird {E}dition}, + Publisher = {O'Reilly}, + year = 2005 +} + +@Article{Bro91, + Author = {Brooks, R.}, + Title = {Intelligence {W}ithout {R}epresentation}, + Journal = {Artificial Intelligence 47}, + year = 1991 +} + +@Article{IAI, + Author = {{Innovation Associates Inc.}}, + Title = {Technology {T}ransfer and {C}ommercialization + {P}artnerships {E}xecutive {S}ummary} +} + +@Book{LWS92, + Author = {{Lydia Woods Schindler}}, + Title = {Understanding the {I}mmune {S}ystem {H}ow {I}t {W}orks}, + Publisher = {US Department of health and human services.}, + year = 1992 +} + +@Article{GT95, + Author = {{G. Tempesti}}, + Title = {A new {S}elf-reproducing {C}ellular {A}utomation + {C}apable of {C}onctruction and {C}omputation.}, + Journal = {Lecture Notes in Artificial Intelligence, Springer + Verlag 3rd European Conference on Artificial Life}, + year = 1995 +} + +@Article{JSCC04, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {A. Delgado}}, + Title = {Implementaci\'on de {C}hip de {ADN} en {FPGA}}, + Journal = {Memorias del X Workshop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@Book{EC68, + Author = {{E. Codd}}, + Title = {Celullar {A}utomata}, + Publisher = {Academic Press}, + year = 1968 +} + +@Article{KLCJ+, + Author = {{Kristina Lerman} and {Chris Jones} and {Aram + Galstyan} and {Maja J Mataric}}, + Title = {Analysis of {D}ynamic {T}ask {A}llocation in + {M}ulti-{R}obot {S}ystems} +} + +@InProceedings{SSST02, + Author = {{S. Singh. S. Thayer}}, + Title = {Kilorobot {S}earch and {R}escue {U}sing an + {I}mmunologically {I}nspired {A}pproach}, + BookTitle = {Distributed {A}utonomous {R}obotic {S}ystems}, + Publisher = {Springer-Verlag}, + month = jun, + year = 2002 +} + +@Article{MDAG99, + Author = {{M. Duque} and {A. Gauthier}}, + Title = {Formaci\'on de {I}negnieros para la {I}nnovaci\'on y + el {D}esarrollo {T}ecnol\'ogico en {C}olombia}, + Journal = {Revista de la Facultad de Minas - Universidad Nacional + de Colombia}, + month = dec, + year = 1999 +} + +@Article{EO92, + Author = {{E. OSTROM}}, + Title = {The {R}udments of a theory of the {O}rigins, + {S}urvival, and {P}erformance of {C}ommon-{P}roperty + {I}nstitutions}, + Journal = {BROMLEY, D.W. et al. (eds.) Making the Commons Work: + Theory, Practice, and Policy. San Francisco, CA: ICS + Press}, + year = 1992 +} + +@Article{AD, + Author = {{Ancona D.}}, + Title = {Leadership in the {A}ge of {U}ncertainty}, + Journal = {http://mitleadership.mit.edu/pdf/LeaderShipinanAgeofUncertainty-researchbrief.pdf} +} + +@Article{J.B96, + Author = {{J .M. BALAND} and {J.P. PLATTEAU}}, + Title = {Halting {D}egradation of {N}atural {R}esources. {I}s + {T}here a {R}ole for {R}ural {C}ommunities?}, + Journal = {Oxford: Clarendon Press}, + year = 1996 +} + +@Misc{RN98, + Author = {R. Nagpal, D. Coore}, + Title = {An {A}lgorithm for group {F}ormation in an {A}morphous + {C}omputer}, + HowPublished = {http://www.swiss.ai.mit.edu/projects/amorphous/}, + year = 1998 +} + +@Article{MIM99, + Author = {Martinoli, A. and Ijspeert, A. and Mondada, F}, + Title = {Understanding {C}ollective {A}ggregation {M}echanisms: + {F}rom {P}robabilistic {M}odeling to {E}xperiments with + {R}eal {R}obots}, + Journal = {Robotics and Autonomous Systems}, + year = 1999 +} + +@Article{KGSB95, + Author = {{K. Goel} and {Sayers B.}}, + Title = {Modelling {G}lobal-{O}riented {E}nergy {T}ecnology + {T}ransfer to {DC}s}, + Journal = {Sixth Global Warning International Conference, San + Francisco}, + year = 1995 +} + +@InBook{KLAM05, + Author = {{Kristina Lerman} and {Alcherio Martinoli} and {Aram + Galstyan}}, + Editor = {{Sahin E.} and {Spears W.}}, + Title = {Swarm {R}obotics {W}orkshop: {S}tate-of-the-art + {S}urvey,}, + Chapter = {A review of probabilistic macroscopic models for swarm + robotic systems}, + Publisher = {Springer-Verlag, Berlin Heidelberg}, + year = 2005 +} + +@Article{GH03, + Author = {{G. Hertel}}, + Title = {Motivation of software developers in {O}pen {S}ource + projects: an {I}nternet-based survey of contributors to + the {L}inux kernel}, + Journal = {Research Policy In Open Source Software Development, + Vol. 32, No. 7}, + year = 2003 +} + +@Article{BC86, + Author = {Brooks, R. and Connell, J}, + Title = {Asynchronous {D}istributed {C}ontrol {S}ystems for a + {M}obile {R}obot}, + Journal = {In Proceedings of SPIE's Cambridge Symposium on + Optical and Optoelectronic Engineering. Cambridge, MA}, + year = 1986 +} + +@Article{NLBP92, + Author = {{N. Lynch} and {B. Patt-Shamir}}, + Title = {Distributed {A}lgorithms {L}ecture {N}otes for 6.852}, + Journal = {MIT press}, + year = 1992 +} + +@Article{Con92, + Author = {Connell, J.}, + Title = {A {H}ybrid {A}rchitecture {A}pplied to {R}obot + {N}avigation}, + Journal = {Proceedings IEEE Conference on Robotics and + Automation, Nice, France}, + year = 1992 +} + +@Book{May08, + Author = {Mayer, Gene}, + Title = {Immunology - {C}hapter {O}ne: {I}nnate (non-specific) + {I}mmunity {M}icrobiology and {I}mmunology {O}n-{L}ine + {T}extbook}, + Publisher = {USC School of Medicine}, + month = {6 } # aug, + year = 2008 +} + +@Misc{MSES+96, + Author = {{M. Sipper} and {E. Sanchez} and {D. Mange} and {M. + Tomassini} and {A. P\'erez-Uribe} and {A. Stauffer}}, + Title = {The {POE} {M}odel of {B}io-{I}nspired {H}ardware + {S}ystems}, + HowPublished = {http://www.cs.bgu.ac.il/~sipper/poe.html}, + year = 1996 +} + +@Article{FPFS+05, + Author = {{F. Pedraza} and {F. Segura} and {C. Camargo} and {A. + Gauthier}}, + Title = {Control {A}daptativo {E}mbebido}, + Journal = {Memorias del XI workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@Misc{BG, + Author = {{Bill Gatliff}}, + Title = {Porting and {U}sing {N}ewlib in {E}mbedded {S}ystems}, + HowPublished = {http://venus.billgatliff.com/node/3} +} + +@TechReport{DZSC+07, + Author = {{D Zuluaga} and {S Campos} and {M Tovar} and {R + Rodr\'{\i}guez} and {J S\'anchez} and {A Aguilera} and + {L Land\'{\i}nez} and {J Medina}}, + Title = {Informe de {V}igilancia {T}ecnol\'ogica: + {A}plicaciones de la {E}lectr\'onica en el {S}ector + {A}gr\'{\i}cola}, + Institution = {COLCIENCIAS}, + year = 2007 +} + +@Book{Sta99, + Author = {Stallman, R. M.}, + Editor = {{C. DiBona} and {S. Ockman} and {M. Stone}}, + Title = {The {GNU} {O}perating {S}ystem and the {F}ree + {S}oftware {M}ovement {V}oices from the {O}pen {S}ource + {R}evolution}, + Publisher = {O'Reilly and Associates}, + year = 1999 +} + +@Book{Ark88, + Author = {Arkin, R.}, + Title = {Behavior-{B}ased {R}obotics}, + Publisher = {Cambridge, MA: MIT Press.}, + year = 1988 +} + +@InBook{MHLS99, + Author = {{M. Huhns} and {L. Stephens}}, + Title = {Multi {A}gent {S}ystems: {A} {M}odern {A}pproach to + {A}rtificial {I}ntelligence}, + Chapter = {2}, + Publisher = {The MIT Press}, + year = 1999 +} + +@Misc{RN99, + Author = {{R. Nagpal}}, + Title = {Organizing a {G}lobal {C}oordinate {S}ystem from + {L}ocal {I}nformation on an {A}morphous {C}omputer}, + HowPublished = {AI Memo No 1666 MIT}, + year = 1999 +} + +@Book{entry-0, + Author = {{J. Holland}}, + Title = {Adaptation in {N}atural and {A}rtificial {S}ystems}, + Publisher = {MIT Press, Cambridge, MA}, + journal = {MIT Press}, + year = 1992 +} + +@InBook{DJR95, + Author = {Donald, B. and Jennings, J. and Rus, D.}, + Editor = {Goldberg, K. and Halperin, D. and Latombe, J.-C. and + Wilson, R.}, + Title = {International {W}orkshop on the {A}lgorithmic + {F}oundations of {R}obotics}, + Chapter = {Information Invariants for Distributed Manipulation}, + year = 1995 +} + +@Article{TI96, + Author = {{Texas Instruments}}, + Title = {I{EEE} {S}td 1149.1 ({JTAG}) {T}estability}, + Journal = {1997 Semiconductor Group}, + year = 1996 +} + +@Article{KLRR99, + Author = {{R. L. King; A. B. Lambert; S. H. Russ; and D. S. + Reese}}, + Title = {The {B}iological {B}asis of the {I}mmune {S}ystem as a + {M}odel for {I}ntelligent {A}gents}, + Journal = {IPDPS 1999 Workshop}, + year = 1999 +} + +@Article{Rey87, + Author = {Reynolds, C.}, + Title = {Flocks, {H}erds, and {S}chools: {A} {D}istributed + {B}ehavior {M}odel.}, + Journal = {Computer Graphics 21}, + year = 1987 +} + +@PhdThesis{AMPt99, + Author = {{A. Martinoli} and PhD thesis, PhD Thesis No 2069, + EPFL}, + Title = {Swarm {I}ntelligence in {A}utonomous {C}ollective + {R}obotics: {F}rom {T}ools to the {A}nalysis and + {S}ynthesis of {D}istributed {C}ontrol {S}trategies.}, + School = {PhD Thesis No 2069, EPFL}, + year = 1999 +} + +@Misc{AG10, + Author = {{A. Grove}}, + Title = {How {A}merica {C}an {C}reate {J}obs}, + HowPublished = {http://www.businessweek.com/magazine/content/10\_28/b4186048358596.htm}, + month = may, + year = 2010 +} + +@Book{MR94, + Author = {{M. Resnick}}, + Title = {Turtles, {T}ermites and {T}raffic {J}ams + {E}xplorations in {M}assively {P}arallel {M}icroworlds}, + Publisher = {The MIT Press Cambridge, Massachusetts}, + year = 1994 +} + +@Article{HM99, + Author = {Holland, O. and Melhuish, C.}, + Title = {Stigmergy, {S}elf-organization, and {S}orting in + {C}ollective {R}obotics.}, + Journal = {Artificial Life 5}, + year = 1999 +} + +@InBook{ME02, + Author = {Martinoli, A. and Easton, K.}, + Editor = {Siciliano, B. Dario, P.}, + Title = {Experimental {R}obotics {VIII}}, + Chapter = {Modeling Swarm Robotic Systems}, + Publisher = {Springer-Verlag}, + year = 2002 +} + +@TechReport{RN98b, + Author = {R. Nagpal, D. Coore}, + Title = {An {A}lgorithm for group {F}ormation and {M}aximal + {I}ndependent {S}et in an {A}morphous {C}omputer}, + Institution = {AI Memo 1626, MIT Artificial Intelligence Laboratory}, + month = {16 } # feb, + year = 1998 +} + +@InBook{KLAG04, + Author = {{Kristina Lerman} and {Aram Galstyan}}, + Title = {Collectives and design of complex systems}, + Chapter = {Two Paradigms for the Design of Artificial Collectives}, + Publisher = {Springer Verlag, New York,}, + year = 2004 +} + +@Article{Don95, + Author = {Donald, B.}, + Title = {Information {I}nvariants in {R}obotics}, + Journal = {Artificial Intelligence 72}, + year = 1995 +} + +@Article{JEFS05, + Author = {{J. Espinosa} and {F. Segura} and {C. Camargo}}, + Title = {Evoluci\'on de un {A}rreglo de {C}\'elulas + {U}tilizando {A}lgoritmos {G}en\'eticos}, + Journal = {Memorias del XI Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@Article{Ost00, + Author = {Ostrom, Elinor}, + Title = {Reformulating the {C}ommons}, + Journal = {Swiss Political Science Review, Volume 6, Number 1}, + year = 2000 +} + +@Article{SS06, + Author = {{S. Shah}}, + Title = {Motivation, {G}overnance, and the {V}iality of + {H}ybrid {F}orms in {O}pen {S}ource {S}oftware + {D}evelopment}, + Journal = {Management Science}, + month = jul, + year = 2006 +} + +@Article{CC08, + Author = {{C. Camargo}}, + Title = {E{CBOT} y {ECB}\_{A}{T}91 {P}lataformas {A}biertas + para el {D}ise\~no de {S}istemas {E}mbebidos y + {C}o-{D}ise\~no {HW}/{SW}}, + Journal = {VIII Jornadas de Computaci\'on Reconfigurable y + Aplicaciones}, + month = sep, + year = 2008 +} + +@Article{TT03, + Author = {T. TERADA, M. TSUKAMOTO, {* K. HAYAKAWA* and A. + KASHITANI}}, + Title = {Ubiquitous {C}omputing {U}sing {R}ule-{B}ased {I}/{O} + {C}ontrol {D}evices}, + Journal = {Proc. of 15th International Comference on Ubiquitous + Computing (UbiComp 2003)}, + month = oct, + year = 2003 +} + +@Article{AGH+00, + Author = {Alur, R. and Grosu, R. and Hur, Y. and Kumar, V. and + Lee, I.}, + Title = {Modular {S}pecification of {H}ybrid {S}ystems in + {CHARON}}, + Journal = {Proceedings of the 3rd International Workshop on + Hybrid Systems: Computation and Control. Pittsburgh, PA}, + year = 2000 +} + +@Article{CFK97b, + Author = {Cao, Y. and Fukunaga, A. and Kahng, A.}, + Title = {Cooperative {M}obile {R}obotics: {A}ntecedents and + {D}irections}, + Journal = {Autonomous Robots 4}, + year = 1997 +} + +@Article{Mat95b, + Author = {Mataric, M.}, + Title = {Issues and {A}pproaches in the {D}esign of + {C}ollective {A}utonomous {A}gents.}, + Journal = {Robotics and Autonomous Systems 16(2-4)}, + year = 1995 +} + +@Article{FBFP07, + Author = {{F. Bar} and {F. Pisani} and {M. Weber}}, + Title = {Mobile technology appropriation in a distant mirror: + baroque infiltration, creolization and cannibalism.}, + Journal = {Seminario sobre Desarrollo Econ\'omico, Desarrollo + Social y Comunicaciones M\'oviles en Am\'erica Latina. + Buenos Aires}, + month = apr, + year = 2007 +} + +@Misc{entry-0b, + Author = {EPFL}, + Title = {{e}-puck {EPFL} education robot}, + HowPublished = {http://www.e-puck.org/} +} + +@Misc{JK00, + Author = {{J. Kuan}}, + Title = {Open source software as consumer integration into + production}, + HowPublished = {URL: http://hdl.handle.net/2038/1113}, + year = 2000 +} + +@Article{SKAA02, + Author = {{Sanza Kazadi} and {A. Abdul-Khaliq} and {Ron + Goodman.}}, + Title = {On the convergence of puck clustering systems.}, + Journal = {Robotics and Autonomous Systems, 38(2):93-117}, + year = 2002 +} + +@Article{htt, + Author = {http://www.poetictissue.org}, + Title = {Proyecto {POE}tic {T}issue} +} + +@InBook{TB99, + Author = {{Tucker Balch.}}, + Editor = {{Oren Etzioni} and {Jorg P. Muller} and {Jeffrey M. + Bradshaw}}, + Title = {Proceedings of the {T}hird {I}nternational + {C}onference on {A}utonomous {A}gents}, + Chapter = {The impact of diversity on performance in multi-robot + foraging.}, + Publisher = {ACM Press}, + year = 1999 +} + +@Article{SKKT04, + Author = {{Sugawara K} and {Kazama T} and {Watanabe T}}, + Title = {Foraging behavior of interacting robots with virtual + pheromone}, + Journal = {Proceedings of the IEEE/RSJ International Conference + on Intelligent Robots and Systems}, + year = 2004 +} + +@PhdThesis{AB94, + Author = {{A. Berlin}}, + Title = {Towards {I}ntelligent {S}tructures: {A}ctive {C}ontrol + of {B}ucling}, + School = {MIT. Department of Electrical Engineering and Computer + Science}, + month = may, + year = 1994 +} + +@InBook{DGMJM02, + Author = {{Dani Goldberg} and {Maja J Mataric.}}, + Editor = {{Tucker Balch} and {Lynne E. Parker}}, + Title = {Robot {T}eams: {F}rom {D}iversity to {P}olymorphism}, + Chapter = {Design and evaluation of robust behavior-based + controllers for distributed multi-robot collection + tasks.}, + Publisher = {AK Peters}, + year = 2002 +} + +@Article{JL60, + Author = {{J. Licklider}}, + Title = {Man-{C}omputer {S}ymbiosis}, + Journal = {IRE Transactions on Human Factors in Electronics}, + year = 1960 +} + +@MastersThesis{MJF05, + Author = {{Mesa J. F.} and {Polo A. A.}}, + Title = {C{ONSTRUYENDO} {UN} {JINU} {DE} {LA} + {INFORMACI}\'{O}{N}}, + School = {PONTIFICIA UNIVERSIDAD JAVERIANA Facultad de + Ingenier\'{\i}a}, + month = feb, + year = 2005 +} + +@Article{Mat92, + Author = {Mataric, M.}, + Title = {Integration of {R}epresentation {I}nto {G}oal-{D}riven + {B}ehavior-{B}ased {R}obots}, + Journal = {IEEE Transactions on Robotics and Automation 8(3)}, + year = 1992 +} + +@Article{CC, + Author = {{C. Camargo}}, + Title = {E{CB}\_{A}{T}91 y {ECBOT} {P}lataformas {A}biertas + para el desarrollo de {S}istemas {E}mbebidos}, + Journal = {URL: http://wiki.emqbit.com/free-ecb-at91} +} + +@Book{BETG94, + Author = {{Bonabeau E.} and {Theraulaz G}}, + Title = {Intelligence {C}ollective}, + Publisher = {Hermes, Paris, France}, + year = 1994 +} + +@Article{JSCC04b, + Author = {{J. Sep\'ulveda} and {C. Camargo}}, + Title = {Implementaci\'on de un {S}istema {I}nmune{A}rtificial + sobre un {FPGA} para {R}econocimiento de {P}atrones}, + Journal = {Memorias del X WorkShop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@Article{SS02, + Author = {S. Sathyanath, F. Sahin}, + Title = {A{ISIMAM} - {A}n {A}rtificial {I}mmune {S}ystem + {B}ased {I}ntelligent {M}ulti-{A}gent {M}odel and its + {A}pplication to a {M}ine {D}etection}, + Journal = {ICARIS 2002}, + month = sep, + year = 2002 +} + +@Article{KPJZ, + Author = {{Kamal Premaratne} and {Jinsong Zhang}}, + Title = {Location {I}nformation-{A}ided {T}ask-{O}riented + {S}elf-{O}rganization of {A}d-{H}oc {S}ensor {S}ystems} +} + +@Misc{IB98, + Author = {{I. Bowman}}, + Title = {Conceptual {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://docs.huihoo.com/linux/kernel/a1/}, + year = 1998 +} + +@Book{CJ97, + Author = {{C. Jacob}}, + Title = {Ilustrating {E}volutionary {C}omputation with + {M}athematica}, + Publisher = {Morgan Kaufmann}, + year = 1997 +} + +@Article{Kur99, + Author = {D. Kurabayashi}, + Title = { {T}oward {R}ealization of {C}ollective {I}ntelligence + and {E}mergent {R}obotics}, + Journal = {Proceedings of IEEE International Conference on + Systems, Man, and Cybernetics}, + year = 1999 +} + +@Article{BGRTV03, + Author = {{B.P. Gerkey} and {R. T. Vaughan} and {A. Howard}}, + Title = {The {P}layer/{S}tage project: {T}ools for + {M}ulti-robot and {D}istributed {S}ensor {S}ystems,}, + Journal = {Proceedings of the International Conference on + Advanced Robotics (ICAR)}, + Pages = {317-323}, + year = 2003 +} + +@Misc{RS07, + Author = {{R. Stallman}}, + Title = {Philosophy of the {GNU} project.}, + HowPublished = {URL: http://www.gnu.org/philosophy/}, + year = 2007 +} + +@Article{MMZF07, + Author = {{Mamei M.} and {Zambonelli F.}}, + Title = {Pervasive {P}heromone-{B}ased {I}nteraction with + {RFID} {T}ags}, + Journal = {ACM Transactions on Autonomous and Adaptive Systems}, + year = 2007 +} + +@InProceedings{DBAT02, + Author = {{D. Bradley} and {A. Tyrrell}}, + Title = {A {H}ardware {I}mmune {S}ystem for {B}enchmark {S}tate + {M}achine {E}rror {D}etection}, + BookTitle = {Congress on {E}volutionary {C}omputation}, + year = 2002 +} + +@Article{LG02, + Author = {Lerman, K. and Galstyan, A.}, + Title = {Mathematical {M}odel of {F}oraging in a {G}roup of + {R}obots: {E}ffects of {I}nterference}, + Journal = {Autonomous Robots 13}, + year = 2002 +} + +@InProceedings{FGPM02, + Author = {{F. Gruau} and {P. Malbos}}, + Title = {The {B}lob: {A} {B}asic {T}opological {C}oncept for + {H}ardware-free {D}istributed {C}omputation}, + BookTitle = {Unconventional {M}odels of {C}omputation, {T}hird + {I}nternational {C}onference, {UMC} 2002}, + Editor = {{C. Calude} and {M. Dinneen} and {F. Peper}}, + Volume = {2509}, + Series = {Lecture Notes in Computer Science}, + Pages = {151--163}, + Publisher = {Springer}, + chapter = {The Blob: A Basic Topological Concept for + Hardware-free Distributed Computation}, + year = 2002 +} + +@Article{Par98b, + Author = {Parker, L.}, + Title = {A{LLIANCE}: {A}n {A}rchitecture for {F}ault-tolerant + {M}ulti-robot {C}ooperation. |}, + Journal = {Transactions on Robotics and Automation 14(2)}, + year = 1998 +} + +@InProceedings{YTDR+04, + Author = {{Y. Thoma} and {D. Roggen} and {E. Sanchez} and + J.Moreno}, + Title = {Prototyping with a bio-inspired reconfigurable chip}, + BookTitle = {15th {IEEE} {I}nternational {W}orkshop on {R}apid + {S}ystem {P}rototyping ({RSP} 2004)}, + Organization = {IEEE Computer Society, Los Alamitos, California, 2004}, + year = 2004 +} + +@Misc{CL84, + Author = {{C. Langton}}, + Title = {Self-{R}eproduction in {C}ellular automata}, + HowPublished = {Physica D, 10:135-144}, + year = 1984 +} + +@MastersThesis{MTRR07, + Author = {{M. Tovar} and {R. Rodr\'{\i}guez}}, + Title = {P{ROSPECTIVA} {Y} {VIGILANCIA} {TECNOL}\'{O}{GICA} + {DE} {LA} {ELECTR}\'{O}{NICA} {EN} {COLOMBIA}.}, + School = {Universidad Nacional de Colombia}, + year = 2007 +} + +@InBook{Par97, + Author = {Parker, L.}, + Editor = {Bolles, R., Bunke}, + Title = {Intelligent robots: {S}ensing, modeling, and planning}, + Chapter = {Behavior-Based Cooperative Robotics Applied to + Multi-Target Observation}, + Publisher = {R. Bolles, H. Bunke, and H. Noltemeier. World + Scientific}, + year = 1997 +} + +@Book{Arr62, + Author = {Arrow, Kenneth}, + Title = {Economic {W}elfare and the {A}llocation of {R}esources + for {I}nvention}, + Publisher = {Princeton University Press}, + year = 1962 +} + +@MastersThesis{MB05, + Author = {{M. Broxton}}, + Title = {Localization and {S}ensing {A}pplications in the + {P}ushpin {C}omputing {N}etwork}, + School = {MIT Media Lab}, + month = jan, + year = 2005 +} + +@Article{UNE, + Author = {UNESCO-Uruguay}, + Title = {Rasgos {P}rincipales de la {I}nstitucionalizaci\'on de + la {C}iencia, la {T}ecnolog\'{\i}a y la {I}nnovaci\'on + en {A}m\'erica {L}atina y el {C}aribe y {T}endencias de + la {C}ooperaci\'on {I}nternacional}, + Journal = {http://www.unesco.org.uy/} +} + +@Article{OBHM02, + Author = {{O. Babaoglu} and {H. Meling} and {A. Montresor}}, + Title = {A {F}ramework for the {D}evelopment of {A}gent-{B}ased + {P}eer-to-{P}eer {S}ystems}, + Journal = {IEEE ICDCS}, + year = 2002 +} + +@InProceedings{WBaVB, + Author = {{W. Buttera and V. Bove}}, + Title = {Literally embedded processors}, + BookTitle = {S{PIE} {M}edia {P}rocessors}, + year = 2001 +} + +@Article{DBCO00, + Author = {{D. Bradley} and {C. Ortega-Sanchez} and {A. Tyrrell}}, + Title = {Embryonic +{I}mmunotronics: abio-{I}nspired {A}pproach + to {F}ault {T}olerance}, + Journal = {The Second NASA/DoD Workshop on Evolvable Hardware}, + year = 2000 +} + +@Article{ST01, + Author = {S. Singh, S. Thayer}, + Title = {Immunology {D}irected {M}ethods for {D}istributed + {R}obotics: {A} {N}ovel, {I}mmunity-{B}ased + {A}rchitecture for {R}obust {C}ontrol \& {C}oordination}, + Journal = {Proceedings of SPIE: Mobile Robots XVI}, + month = nov, + year = 2001 +} + +@Article{KSMS+, + Author = {{Ken Sugawara} and {Masaki Sano} and {Ikuo Yoshihara} + and {K. Abe.}}, + Title = {Cooperative behavior of interacting robots.}, + Journal = {Artificial Life and Robotics, 2} +} + +@Article{WM91, + Author = {{Mark Weiser}}, + Title = {The {C}omputer for the 21st {C}entury}, + Journal = {http://www.ubiq.com/hy\'ertext/weiser/SciAmDraft3.html} +} + +@Article{Bro86, + Author = {Brooks, R.}, + Title = {A {R}obust {L}ayered {C}ontrol {S}ystem for a {M}obile + {R}obot.}, + Journal = {IEEE Journal of Robotics and Automation}, + year = 1986 +} + +@Misc{QH, + Author = {{Qi Hardware}}, + Title = {Qi {H}ardware {C}opyleft {H}ardware {P}roject}, + HowPublished = {URL: http://en.qi-hardware.com/} +} + +@Article{GM(.I.W01, + Author = {Gerkey, B. and Mataric, M. and (2001). . In . Waikiki, + Hawaii, pp. 341-352.}, + Title = {Principled {C}ommunication for {D}ynamic {M}ulti- + {R}obot {T}ask {A}llocation}, + Journal = {Proceedings International Symposium on Experimental + Robotics 2000, Waikiki, Hawaii}, + year = 2001 +} + +@Article{MMDG04, + Author = {Meinzen-Dick, Ruth and {Monica Di Gregorio} and {Nancy + McCarthy}}, + Title = {Methods for {S}tudying {C}ollective {A}ction in + {R}ural {D}evelopment}, + Journal = {CAPRi Working Paper, no. 33. International Food Policy + Research Institute, 2033 K Street, N.W., Washington, DC + 20006. http://www.capri.cgiar.org/pdf/capriwp33.pd}, + year = 2004 +} + +@Misc{FSF, + Author = {{Free Software Foundation}}, + Title = {G{NU} {G}eneral {P}ublic {L}icense}, + HowPublished = {URL: http://www.gnu.org/copyleft/gpl.html} +} + +@Article{AJI+01, + Author = {{A. J. Ijspeert} and {A. Martinoli} and {A. Billard} + and {L. M. Gambardella}}, + Title = {Collaboration through the exploitation of local + interactions in autonomous collective robotics: {T}he + stick pulling experiment.}, + Journal = {Autonomous Robots, 11}, + year = 2001 +} + +@PhdThesis{CVJ05, + Author = {{Chris V. Jones}}, + Title = {A {P}rincipled {D}esign {M}ethodology for {M}inimalist + {M}ulti-{R}obot {S}ystem {C}ontrollers}, + School = {FACULTY OF THE GRADUATE SCHOOL UNIVERSITY OF SOUTHERN + CALIFORNIA}, + month = aug, + year = 2005 +} + +@TechReport{DP93, + Author = {{David Powell}}, + Title = {Distributed {F}ault {T}olerance {L}essons {L}earnt + from {D}elta-4}, + Institution = {LAAS-CNRS\#93192}, + journal = {Workshop on Fault-Tolerant Architectures}, + year = 1993 +} + +@Article{CC05, + Author = {{C. Camargo}}, + Title = {Implementaci\'on de {S}istemas {D}igitales {C}omplejos + {U}tilizando {S}istemas {E}mbebidos}, + Journal = {Memorias del XI Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@Article{LG03, + Author = {Lerman, K. and Galstyan, A.}, + Title = {Macroscopic {A}nalysis of {A}daptive {T}ask + {A}llocation in {R}obots.}, + Journal = {Proceedings of the IEEE/RSC International Conference + on Intelligent Robots and Systems. Las Vegas, Nevada}, + year = 2003 +} + +@Misc{Wikb, + Author = {Wikipedia}, + Title = {Richard {S}tallman}, + HowPublished = {URL: http://es.wikipedia.org/wiki/Richard\_Stallman} +} + +@Article{RJSB+98, + Author = {{R. Jackman} and {S. Brittain} and {M. Prentiss} and + {G. Whitesides}}, + Title = {Design and {F}abrication of topologically {C}omplex, + {T}hree-{D}imensional {M}icrostructures}, + Journal = {Science}, + year = 1998 +} + +@Article{Par98, + Author = {Parker, L.}, + Title = {Toward the {A}utomated {S}ynthesis of {C}ooperative + {M}obile {R}obot {T}eams}, + Journal = {Proceedings of SPIE Mobile Robots XIII volume 3525. + Boston, MA}, + year = 1998 +} + +@Article{RAG+02, + Author = {{R. A. Ghosh} and {R. Glott} and {B. Krieger} and {G. + robles}}, + Title = {Free/{L}ibre and {O}pen {S}ource {S}oftware: {S}urvey + and {S}tudy}, + Journal = {Deliverable D18: FINAL REPORT}, + year = 2002 +} + +@Book{RL07, + Author = {{R Love}}, + Title = {Linux {S}ystem {P}rogramming}, + Publisher = {O'Reilly Media, Inc.}, + year = 2007 +} + diff --git a/course/.docs/book/biblio.bib.bak b/course/.docs/book/biblio.bib.bak new file mode 100644 index 0000000..50e2f20 --- /dev/null +++ b/course/.docs/book/biblio.bib.bak @@ -0,0 +1,2123 @@ +@comment{This file has been generated by Pybliographer} + + +@Article{RK95, + Author = {Rosenchein, S. and Kaelbling, L.}, + Title = {A {S}ituated {V}iew of {R}epresentation and {C}ontrol. + {S}pecial {I}ssue on {C}omputational {R}esearch on + {I}nteraction and {A}gency}, + Journal = {Special Issue on Computational Research on Interaction + and Agency, Elsevier Science}, + year = 1995 +} + +@Article{MWMJ95, + Author = {{M. Wooldridge} and {M. Jennings}}, + Title = {Intelligent {A}gents: {T}heory and {P}ractice}, + Journal = {The Knowledge Engineering Review}, + year = 1995 +} + +@Article{RLKR99, + Author = {S. H. Russ, A. Lambert, R. King}, + Title = {An {A}rtificial {I}mmune {S}ystem {M}odel for {T}ask + {A}llocation}, + Journal = {Submitted to IPPS/SPDP + http://citeseer.ist.psu.edu/115327.html}, + year = 1999 +} + +@Article{BPG, + Author = {{Brian P. Gerkey} and {Maja J. Mataric.}}, + Title = {A formal analysis and taxonomy of task allocation in + multi-robot systems.}, + Journal = {International journal of robotics research, 23(9)} +} + +@Article{VPSB04, + Author = {{V. Parunak} and {S. Brueckner} and {J. Sauter}}, + Title = {Digital {P}heromones for {C}oordination of {U}nmanned + {V}ehicles}, + Journal = {Workshop on Environments for Multi-agent Systems}, + year = 2004 +} + +@Article{BETG+97, + Author = {{Bonabeau E.} and {Theraulaz G.} and {Deneubourg + J.-L.} and {Aron S.} and {Camazine S.}}, + Title = {Self-{O}rganisation in {S}ocial {I}nsects}, + Journal = {TREE}, + Volume = {12}, + Number = {5}, + Pages = {188-193.}, + year = 1997 +} + +@InBook{PMPN+66, + Author = {{P. Marchal} and {P. Naussbaum} and {C. Piguet} and + {S. Durand} and D, Mange and {E. Sanchez} and {A. + Stauffer} and {G. Tempesti}}, + Editor = {{E. Sanchez} and {M. Tomassini}}, + Title = {Embryonics: {T}he {B}irth of {S}ynthetic {L}ife}, + Pages = {166-197}, + Publisher = {Lecture notes in Computer Science, Springer, Berlin}, + year = 1966 +} + +@Article{LD06, + Author = {{Linux Devices}}, + Title = {First {C}olombian {L}inux {SBC} runs {D}ebian}, + Journal = {http://www.linuxfordevices.com/c/a/News/First-Colombian-Linux-SBC-runs-Debian/}, + month = {24 } # apr, + year = 2006 +} + +@Article{NLBP92, + Author = {{N. Lynch} and {B. Patt-Shamir}}, + Title = {Distributed {A}lgorithms {L}ecture {N}otes for 6.852}, + Journal = {MIT press}, + year = 1992 +} + +@Book{Holl90, + Author = {{B. Holldobler} and {E. Wilson}}, + Title = {The Ants}, + Publisher = {Springer-Verlag}, + year = 1990 +} + +@Article{Her07, + Author = {{Herianto} and {T. Sakakibara} and {D. Kurabayashi} }, + Title = { {A}rtificial {P}heromone {S}ystem {U}sing {RFID} for + {N}avigation of {A}utonomous {R}obots}, + Journal = {Journal of Bionic Engineering, Elsevier Limited and + Science Press}, + year = 2007 +} + +@Book{ARC98, + Author = {{Arkin R. C.}}, + Title = {Behavior-{B}ased {R}obotics}, + Publisher = {The MIT press, Cambridge, MA}, + year = 1998 +} + +@Book{RL07, + Author = {{R Love}}, + Title = {Linux {S}ystem {P}rogramming}, + Publisher = {O'Reilly Media, Inc.}, + year = 2007 +} + +@Misc{IBSS98, + Author = {{I. Bowman} and {S. Siddiqi} and {M. Tanuan}}, + Title = {Concrete {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://docs.huihoo.com/linux/kernel/a2/index.html}, + month = {12 } # feb, + year = 1998 +} + +@Article{MDAG99, + Author = {{M. Duque} and {A. Gauthier}}, + Title = {Formaci\'on de {I}negnieros para la {I}nnovaci\'on y + el {D}esarrollo {T}ecnol\'ogico en {C}olombia}, + Journal = {Revista de la Facultad de Minas - Universidad Nacional + de Colombia}, + month = dec, + year = 1999 +} + +@Article{KLAG03, + Author = {{Kristina Lerman} and {Aram Galstyan}}, + Title = {Agent {M}emory and {A}daptation in {M}ulti-{A}gent + {S}ystems.}, + Journal = {Proceedings of the International Conference on + Autonomous Agents and Multi-Agent Systems}, + month = jul, + year = 2003 +} + +@Book{EO90, + Author = {{Elinor Ostrom}}, + Title = {Governing the {C}ommons: {T}he {E}volution of + {I}nstitutions for {C}ollective {A}ction ({P}olitical + {E}conomy of {I}nstitutions and {D}ecisions) + ({P}aperback)}, + Publisher = {Cambridge University Press}, + month = nov, + year = 1990 +} + +@Misc{MLH98, + Author = {{Michael L. Haungs}}, + Title = {The {E}xecutable and {L}inking {F}ormat ({ELF})}, + HowPublished = {http://www.cs.ucdavis.edu/~haungs/paper/node1.html}, + month = {21 } # sep, + year = 1998 +} + +@Article{J.B96, + Author = {{J .M. BALAND} and {J.P. PLATTEAU}}, + Title = {Halting {D}egradation of {N}atural {R}esources. {I}s + {T}here a {R}ole for {R}ural {C}ommunities?}, + Journal = {Oxford: Clarendon Press}, + year = 1996 +} + +@InBook{EA01, + Author = {{E. Arts} and {R. Harwing} and {M. Schuurmans}}, + Editor = {{J. Denning}}, + Title = {Ambient {I}ntelligence}, + Pages = {235-250}, + Publisher = {McGraw-Hill}, + year = 2001 +} + +@Misc{SAS03, + Author = {Schweik, C. M and {A. Semenov}}, + Title = {The {I}nstitutional {D}esign of '{O}pen {S}ource' + {P}rogramming: {I}mplications for {A}ddressing + {C}omplex {P}ublic {P}olicy and {M}anagement {P}roblems}, + HowPublished = {URL: + http://www.firstmonday.org/issues/issue8\_1/schweik/}, + year = 2003 +} + +@Article{JSCC04b, + Author = {{J. Sep\'ulveda} and {C. Camargo}}, + Title = {Implementaci\'on de un {S}istema {I}nmune{A}rtificial + sobre un {FPGA} para {R}econocimiento de {P}atrones}, + Journal = {Memorias del X WorkShop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@PhdThesis{EP04, + Author = {{E. Petraglio}}, + Title = {Fault {T}olerant {S}elf-{R}eplication {S}ystems}, + School = {\'Ecole Polytechnique F\'ed\'erale de Lausanne}, + year = 2004 +} + +@Article{KSMS97, + Author = {{Ken Sugawara} and {Masaki Sano}}, + Title = {Cooperative acceleration of task performance: + {F}oraging behavior of interacting multi-robots system.}, + Journal = {Physica, D100:343-354}, + year = 1997 +} + +@Article{MRT04, + Author = {{P Mohr} and {N Ryan} and {J. Timmis}}, + Title = {Exploiting {I}mmunological {P}roperties for + {U}biqitous {C}omputing {S}ystems}, + Journal = {ICARIS 2004}, + month = sep, + year = 2004 +} + +@Book{NRC01, + Author = {{National Research Council}}, + Title = {Embedded {E}verywhere}, + Publisher = {National Academic Press}, + year = 2001 +} + +@Misc{HLSIM, + Author = {MIT}, + Title = {H{LSIM} - {T}he {H}igh {L}evel {S}imulator}, + HowPublished = {http://swiss.ai.mit.edu/prouects/amorphous} +} + +@MastersThesis{AW04, + Author = {{A. Warner}}, + Title = {A {S}elf {T}riggered {R}eadout for a {T}ime + {P}rojection {C}hamber}, + School = {MIT Physics Department}, + year = 2004 +} + +@Article{KLAM04, + Author = {{K. Lerman} and {A. Martinoli} and {A. Galstyan}}, + Title = {A review of probabilistic macroscopic models for swarm + robotic systems}, + Journal = {Proceedings of the International Conference on the + Simulation of Adaptive Behavior}, + month = aug, + year = 2004 +} + +@Book{FGYL+04, + Author = {{F. Gruau} and {Y. Lhuiller} and {P. Reitz} and {O. + Temam}}, + Title = {Blob {C}omputing}, + Publisher = {Computing Frontiers 2004 ACM SIGMicro}, + year = 2004 +} + +@Misc{MSES+96, + Author = {{M. Sipper} and {E. Sanchez} and {D. Mange} and {M. + Tomassini} and {A. P\'erez-Uribe} and {A. Stauffer}}, + Title = {The {POE} {M}odel of {B}io-{I}nspired {H}ardware + {S}ystems}, + HowPublished = {http://www.cs.bgu.ac.il/~sipper/poe.html}, + year = 1996 +} + +@Article{AB97, + Author = {Arkin, R. and Balch, T.}, + Title = {Principles and {P}ractice in {R}eview}, + Journal = {Journal of Experimental and Theoretical Artificial + Intelligence 9}, + year = 1997 +} + +@InBook{APaET03, + Author = {{A. Purhonen and E. Tuulari}}, + Editor = {T. Basten, {M. Geilen and H. de Groot}}, + Title = {Ambient {I}ntelligence and the {D}evelopment of + {E}mbedded {S}ystem {S}oftware}, + Pages = {51 - 66}, + Publisher = {Kluwer Academic Publishers}, + year = 2003 +} + +@InBook{PRGJ, + Author = {{P. Raven} and {G. Johnson}}, + Title = {Biology}, + Chapter = {50 The Immune System}, + Publisher = {Mc Graw Hill} +} + +@Article{Par98, + Author = {Parker, L.}, + Title = {Toward the {A}utomated {S}ynthesis of {C}ooperative + {M}obile {R}obot {T}eams}, + Journal = {Proceedings of SPIE Mobile Robots XIII volume 3525. + Boston, MA}, + year = 1998 +} + +@Article{Tee81, + Author = {Teece, D}, + Title = {The {M}arket for {K}now-how. {T}echnology {T}ransfer: + {N}ew {I}ssues, {N}ew {A}nalysis}, + Journal = {Special issue of the Annals of the American Academy of + Political and Social Science}, + year = 1981 +} + +@Article{DGJT+00, + Author = {{D. Gracias} and {J. Tien} and {T. Breen} and {C. Hsu} + and {G. Whitesides}}, + Title = {Forming {E}lectrical {N}etworks in {T}hree + {D}imensions by {S}elf-{A}ssembly}, + Journal = {Science}, + year = 2000 +} + +@Article{WSCC, + Author = {{W. Spraul} and {C. Camargo} and {A. Wang}}, + Title = {Proyecto {SAKC}}, + Journal = {URL:http://en.qi-hardware.com/wiki/SAKC} +} + +@PhdThesis{CT04, + Author = {{C. Teuscher}}, + Title = {Amorphous {M}embrane {B}lending: {F}rom {R}egular to + {I}rregular {C}ellular {C}omputing {M}achines}, + School = {\'Ecole Polytechnique F\'ed\'erale de Lausanne}, + year = 2004 +} + +@Article{AA97, + Author = {{A. Avizienis}}, + Title = {Toward systematic design of fault tolerant systems}, + Journal = {Computer}, + year = 1997 +} + +@PhdThesis{Cor05, + Author = {{Luis Alejandro Cort\'es}}, + Title = {Verification and {S}cheduling {T}echniques for + {R}eal-{T}ime {E}mbedded {S}ystems}, + School = {Link\"opings universitet Institute of Technology}, + publisher = {UniTryck}, + year = 2005 +} + +@Article{MW93, + Author = {{M. Weiser}}, + Title = {Some computer science issues in ubiquitous computing}, + Journal = {Commun. ACM}, + year = 1993 +} + +@TechReport{WH93, + Author = {W. Heimerdinger, C. Weinstock}, + Title = {A {C}onceptual {F}ramework for {S}ystem {F}ault + {T}olerance}, + Institution = {CMU/SEI-92-TR-033}, + year = 1992 +} + +@Article{HIH02, + Author = {{Hann I. H.}}, + Title = {Delayed {R}eturns to {O}pen {S}ource {P}articipation: + {A}n {E}mpirical {A}nalysis of the {A}pache {HTTP} + {S}erver {P}roject}, + Journal = {Workshop on Open Source Software: Economics, Law and + Policy, Toulouse, France.}, + year = 2002 +} + +@Book{Web04, + Author = {Weber, S.}, + Title = {The {S}uccess of {O}pen {S}ource}, + Publisher = {Harvard University Press}, + year = 2004 +} + +@Article{MMQR06, + Author = {{Mamei M} and {Quaglieri R} and {Zambonelli F.}}, + Title = {Making tuple space physical with {RFID} tags}, + Journal = {Proceedings of ACM Symposium on Applied Computing}, + year = 2006 +} + +@Article{LG03, + Author = {Lerman, K. and Galstyan, A.}, + Title = {Macroscopic {A}nalysis of {A}daptive {T}ask + {A}llocation in {R}obots.}, + Journal = {Proceedings of the IEEE/RSC International Conference + on Intelligent Robots and Systems. Las Vegas, Nevada}, + year = 2003 +} + +@Misc{Mae, + Author = {Nokia}, + Title = {Maemo {P}roject}, + HowPublished = {URL: http://www.maemo.org/} +} + +@PhdThesis{MO90, + Author = {{M. Odedra}}, + Title = {Information {T}echnology {T}ransfer to {D}eveloping + {C}ountries: {C}ase studies from {K}enya, {Z}ambia and + {Z}imbabwe}, + School = {London School of Economics}, + year = 1990 +} + +@PhdThesis{AMPt99, + Author = {{A. Martinoli} and PhD thesis, PhD Thesis No 2069, + EPFL}, + Title = {Swarm {I}ntelligence in {A}utonomous {C}ollective + {R}obotics: {F}rom {T}ools to the {A}nalysis and + {S}ynthesis of {D}istributed {C}ontrol {S}trategies.}, + School = {PhD Thesis No 2069, EPFL}, + year = 1999 +} + +@Article{Mo94, + Author = {{M. odedra-straub}}, + Title = {The {M}yths and {I}llusions of {T}echnology {T}ransfer}, + Journal = {IFIP World Congress Proceedings}, + month = aug, + year = 1994 +} + +@Article{ETPoSSI(09, + Author = {{European Technology Platform on Smart Sistem + Integration (EPoSS)}}, + Title = {European {T}echnology {P}latform on {S}mart {S}ystems + {I}ntegration. {S}trategic {R}esearch {A}genda 2009}, + year = 2009 +} + +@Misc{BBCM01, + Author = {{B. Bonabeau C. Meyer}}, + Title = {Swarm {I}ntelligence: {A} whole new way to think about + business}, + HowPublished = {Harvard Business Review}, + year = 2001 +} + +@Article{LGM+01, + Author = {Lerman, K. and Galstyan, A. and Martinoli, A. and + Ijspeert, A.}, + Title = {A {M}acroscopic {A}nalytical {M}odel of + {C}ollaboration in {D}istributed {R}obotic {S}ystems.}, + Journal = {Artificial Life 7}, + year = 2001 +} + +@InProceedings{DS02, + Author = {{D. Servant}}, + Title = {Combining amorphous computing and reactive agent-based + systems: a paradigm for pervasive intelligence?}, + BookTitle = {First international joint conference on {A}utonomous + agents and muktiagent systems: part 1}, + year = 2002 +} + +@Article{CFK97, + Author = {Cao, Y. and Fukunaga, A. and Kahng, A.}, + Title = {Cooperative {M}obile {R}obotics: {A}ntecedents and + {D}irections}, + Journal = {Autonomous Robots 4}, + year = 1997 +} + +@Article{FTUT94, + Author = {{Fukuda T.} and {Ueyama T.}}, + Title = {Cellular {R}obotics and {M}icro {R}obotics {S}ystems}, + Journal = {World Scientific Series in Robotics and Automated + Systems, Singapore}, + Volume = {10}, + year = 1994 +} + +@MastersThesis{JL02, + Author = {{J. Lifton}}, + Title = {Pushpin {C}omputing: a {P}latform for {D}istributed + {S}ensor {N}etworks}, + School = {Massachusetts Institute of Technology}, + month = sep, + year = 2002 +} + +@Misc{A1, + Author = {{Aleph 1}}, + Title = {Building the {T}oolchain}, + HowPublished = {http://www.aleph1.co.uk/node/279} +} + +@TechReport{Vc08, + Author = {{VDC corp.}}, + Title = {Embedded {S}oftware 2008 {M}arket {I}ntelligence + {S}ystem}, + Institution = {VDC Research Group}, + year = 2008 +} + +@Article{WAAM02, + Author = {{William Agassounon} and {Alcherio Martinoli}}, + Title = {A macroscopic model of an aggregation experiment using + embodied agents in groups of time-varying sizes.}, + Journal = {Proc. of the IEEE Conf. on System, man and Cybernetics + SMC-02, Hammamet, Tunisia.}, + month = oct, + year = 2002 +} + +@Article{GTDM97, + Author = {{G. Tempesti} and {D. Mange} and {A. Stauffer}}, + Title = {A {R}obust {M}uliplexer-based {FPGA} {I}nspired by + {B}iological {S}ystems}, + Journal = {Speciall Issue of Journal of Systems Architecture on + Dep endable Parralled Computer System}, + year = 1997 +} + +@Article{AT99, + Author = {{A. Tyrrell}}, + Title = {Computer {K}now {T}hy {S}elf: {A} {B}iological {W}ay + to {L}ook at {F}ault {T}olerance}, + Journal = {2nd Euromicro/IEEE workshop on Dependable Computing + Systems}, + year = 1999 +} + +@PhdThesis{CO00, + Author = {{C. Ortega-Sanchez}}, + Title = {Embryonics: a {B}io-{I}nspired {F}ault-{T}olerant + {M}ulticellular {S}ystem}, + School = {The University of York}, + month = may, + year = 2000 +} + +@Book{KYJM+08, + Author = {{Karim Yaghmour} and {Jon Masters} and {Gilad + Ben-Yossef} and {Philippe Gerum}}, + Title = {Building {E}mbedded {L}inux {S}ystems}, + Publisher = {O'REILLY}, + year = 2008 +} + +@Article{YTGT+04, + Author = {{Y. Thoma} and {G. Tempesti} and {E. Sanchez} and {J. + Moreno.}}, + Title = {P{OE}tic: {A}n {E}lectronic {T}issue for + {B}io-{I}nspired {C}ellular {A}pplications}, + Journal = {BioSystems}, + Pages = {191-200}, + year = 2004 +} + +@Book{DMMT98, + Author = {{D. Mange} and {M. Tomassini}}, + Editor = {{D. Mange} and {M. Tomassini}}, + Title = {Bio-inspired {C}omputing {M}achines: {T}owards {N}ovel + {C}omputational {A}rchitectures}, + Publisher = {Presses Polytechniques et Universitaires Romandes, + Lausanne, Switzerland}, + year = 1998 +} + +@Article{CMCfMR04, + Author = {{R. LeGrand}}, + Title = {Closed-{L}oop {M}otion {C}ontrol for {M}obile + {R}obotics}, + Journal = {Embedded Programming - Circuit Cellar}, + Volume = {169}, + month = aug, + year = 2004 +} + +@Article{RMRT03, + Author = {{R. Menezes} and {R. Tolksdorf}}, + Title = {A {N}ew {A}pproach to {S}calable {L}inda-systems + {B}ased on {S}warms}, + Journal = {ACM SAC}, + year = 2003 +} + +@InProceedings{GTDR+02, + Author = {{G. Tempesti} and {D. Roggen} and {E. Sanchez} and {Y. + Thoma} and {R. Canham} and {A. Tyrrell} and {J.-M. + Moreno.}}, + Title = {A {POE}tic {A}rchitecture for {B}io-{I}nspired + {S}ystems}, + Editor = {{R.K. Standish} and {M.A. Bedau} and {H.A. Abbass}}, + Publisher = {MIT Press, Cambridge, Massachusetts}, + journal = {8th Int. Conf. of Artificial Life VIII,}, + year = 2002 +} + +@Article{RW04, + Author = {{R. Want}}, + Title = {Enabling {U}biquitous {S}ensing with {RFID}}, + Journal = {IEEE Computer}, + year = 2004 +} + +@InBook{MHLS99, + Author = {{M. Huhns} and {L. Stephens}}, + Title = {Multi {A}gent {S}ystems: {A} {M}odern {A}pproach to + {A}rtificial {I}ntelligence}, + Chapter = {2}, + Publisher = {The MIT Press}, + year = 1999 +} + +@Article{HYKL06, + Author = {{Henry Y. K. Lau} and {Vicky W. K. Wong}}, + Title = {An {I}mmunity {B}ased {D}istributed + {M}ultiagent-{C}ontrol {F}ramework}, + Journal = {Systems, Man and Cybernetics, Part A, IEEE + Transactions on}, + month = jan, + year = 2006 +} + +@Article{JLea02, + Author = {{J. Lifton} and {et al}}, + Title = {Pushpin computing system overview: {A} platform for + distributed, embedded ubiquitous sensor networks}, + Journal = {International Conference on Pervasive Computing}, + year = 2002 +} + +@Misc{RN99, + Author = {{R. Nagpal}}, + Title = {Organizing a {G}lobal {C}oordinate {S}ystem from + {L}ocal {I}nformation on an {A}morphous {C}omputer}, + HowPublished = {AI Memo No 1666 MIT}, + year = 1999 +} + +@Misc{GGR02, + Author = {Ghosh, R. A. and {G. Robles} and {R. Glott.}}, + Title = {Free/{L}ibre and {O}pen {S}ource {S}oftware: {S}urvey + and {S}tudy. {T}echnical report {U}niversity of + {M}aastricht, {T}he {N}etherlands: {I}nternational + {I}nstitute of {I}nfonomics}, + HowPublished = {URL: http://www.infonomics.nl/FLOSS/report/index.htm}, + year = 2002 +} + +@PhdThesis{MJM94, + Author = {{Maja J Mataric}}, + Title = {Interaction and {I}ntelligent {B}ehavior}, + School = {MASSACHUSETTS INSTITUTE OF TECHNOLOGY}, + month = may, + year = 1994 +} + +@Article{ST92, + Author = {{Sandler Todd}}, + Title = {Collective {A}ction: {T}heory and {A}pplications}, + Journal = {Ann Arbor: University of Michigan Press}, + year = 1992 +} + +@Book{CHEO06, + Editor = {{Charlotte Hess} and {Elinor Ostrom}}, + Title = {Understanding {K}nowledge as a {C}ommons: {F}rom + {T}heory to {P}ractice}, + Publisher = {The MIT Press}, + month = dec, + year = 2006 +} + +@Misc{Mot, + Author = {Motorola}, + Title = {M{OTODEV} {P}roject}, + HowPublished = {URL: + http://developer.motorola.com/platforms/mobile-linux/} +} + +@InBook{JaMJM05, + Author = {{Jones and Maja J Mataric}}, + Editor = {{Sam S. Ge} and {Frank L. Lewis}}, + Title = {Autonomous {M}obile {R}obots: {S}ensing, {C}ontrol, + {D}ecision-{M}aking, and {A}pplications}, + Chapter = {Behavior-Based Coordination in Multi-Robot Systems}, + Publisher = {Marcel Dekker, Inc}, + year = 2005 +} + +@InProceedings{GT04, + Author = {{G. Tempesti}}, + Title = {Processor {A}rchitectures for {O}ntogenesis}, + BookTitle = {Proceedings of the 2004 {NASA}/{D}o{D} {C}onference on + {E}volution {H}ardware}, + year = 2004 +} + +@Misc{Wik, + Author = {Wikipedia}, + Title = {Wikipedia, the free encyclopedia}, + HowPublished = {http://en.wikipedia.org/} +} + +@PhdThesis{DR05, + Author = {{Dominic Rath}}, + Title = {Open {O}n-{C}hip {D}ebugger}, + School = {University of Applied Sciences Augsburg}, + year = 2005 +} + +@Article{MMZF05, + Author = {{Mamei M} and {Zambonelli F}}, + Title = {Physical deployment of digital pheromones through + {RFID} technology}, + Journal = {Swarm Intelligence Symposium}, + year = 2005 +} + +@Article{ST02, + Author = {S. Thayer, S. Singh}, + Title = {Development of an {I}mmunology-{B}ased {M}ulti-{R}obot + {C}oordination {A}lgorithm for exploration and + {M}apping {D}omains}, + Journal = {IROS 2002: IEEE/RSJ International Conference on + Intelegent Robots and Systems}, + year = 2002 +} + +@MastersThesis{YW04, + Author = {{Y. Wang}}, + Title = {Rules of {B}lob {D}isplacement}, + School = {Laboratoire de Recherche en Informatique, Universit\'e + Paris ud-XI}, + month = jun, + year = 2004 +} + +@Article{Mar04, + Author = {Mart\'{\i}nez, H\'ector}, + Title = {Apropiaci\'on de conocimiento en {C}olombia. {E}l caso + de los contratos de importaci\'on de tecnolog\'{\i}a}, + Journal = {Revista Cuadernos de Econom\'{\i}a}, + year = 2004 +} + +@Article{TKYI+05, + Author = {{Tanaka K} and {Yo Ishigaki} and {Inoue H} and {Itoh + M}}, + Title = {Safety monitoring system by autonomous mobile sensors + utilizing pheromone communication}, + Journal = {Proceedings of the International Conference on + Computational Intelligence for Modelling, Control and + Automation; International Conference on Intelligent + Agents, Web Technologies and Internet Commerce}, + year = 2005 +} + +@Unpublished{WCI, + Author = {{Worldwide CDIO Initiative}}, + Title = {"{B}enefits of {CDIO}" + {URL}:http://www.cdio.org/benefits-cdio on {N}ovember, + 2009} +} + +@Article{TI96, + Author = {{Texas Instruments}}, + Title = {I{EEE} {S}td 1149.1 ({JTAG}) {T}estability}, + Journal = {1997 Semiconductor Group}, + year = 1996 +} + +@MastersThesis{JS02, + Author = {{J. Silber}}, + Title = {A cooperative {C}ommunication {P}rotocol for + {W}ireless {A}d-hoc {N}etworks}, + School = {Massachusetss Institute of Technology}, + month = jun, + year = 2002 +} + +@Article{RAG+02, + Author = {{R. A. Ghosh} and {R. Glott} and {B. Krieger} and {G. + robles}}, + Title = {Free/{L}ibre and {O}pen {S}ource {S}oftware: {S}urvey + and {S}tudy}, + Journal = {Deliverable D18: FINAL REPORT}, + year = 2002 +} + +@Article{Par98b, + Author = {Parker, L.}, + Title = {A{LLIANCE}: {A}n {A}rchitecture for {F}ault-tolerant + {M}ulti-robot {C}ooperation. |}, + Journal = {Transactions on Robotics and Automation 14(2)}, + year = 1998 +} + +@Article{EL94, + Author = {{Edelstein-Keshet L}}, + Title = {{i}mple model for trail-following behaviour; trunk + trails versus individual foragers}, + Journal = {Journal of Mathematical Biology}, + year = 1994 +} + +@Article{DCRN97, + Author = {{D. Coore} and {R. Nagpal} and {R. Weiss}}, + Title = {Paradigm for {S}tructure in an {A}morphous {C}omputer}, + Journal = {AI Memo No. 1614, + http://www.swiss.ai.nit.edu/projects/amorphous}, + month = oct, + year = 1997 +} + +@InBook{BAH88, + Author = {{Bernardo A. Huberman} and {Tad Hogg. In}, editor}, + Editor = {{B. A. Huberman}}, + Title = {The {E}cology of {C}omputation}, + Chapter = {The behavior of computational ecologies.}, + Publisher = {Amsterdam, Elsevier (North-Holland).}, + year = 1988 +} + +@Article{CVJ03, + Author = {{Chris V. Jones} and {Maja J Mataric.}}, + Title = {Adaptive task allocation in large-scale multi-robot + systems}, + Journal = {Proceedings of the IEEE International Conference on + Intelligent Robots and Systems Las Vegas, NV}, + year = 2003 +} + +@Book{VWJ+03, + Author = {{Van Wendel} and Joode, R. and {J. A. de Bruijn} and + {M. J. G. van Eeten}}, + Title = {Protecting the {V}irtual {C}ommons: + {S}elf-{O}rganizing {O}pen {S}ource and {F}ree + {S}oftware {C}ommunities and {I}nnovative + {I}ntellectual {P}roperty {R}egimes.}, + Publisher = {Asser Press}, + journal = {The Hague: Asser Press.}, + year = 2003 +} + +@Misc{XZ01, + Author = {{X. Zhang}}, + Title = {Bio-{I}nspired {F}ault-{T}olerant {H}ardware {S}ystem}, + HowPublished = {http://www.cems.uwe.ac.uk/~xzhang/}, + month = dec, + year = 2001 +} + +@Article{HSL+04, + Author = {Hearn, Gregory N. and Simpson, Lynette E. and Lennie, + June and Kimber, Megan P.}, + Title = {I{CT}s and regional sustainability: {A} critique and a + way forward}, + Journal = {Community Informatics Research Network Conference and + Colloquium 2004: Sustainability and community + technology}, + year = 2004 +} + +@PhdThesis{AM99, + Author = {{A. Martinoli}}, + Title = {Swarm {I}ntelligence in {A}utonomous {C}ollective + {R}obotics: {F}rom {T}ools to the {A}nalysis and + {S}ynthesis of {D}istributed {C}ontrol {S}trategies}, + School = {EPFL}, + year = 1999 +} + +@Misc{RN98, + Author = {R. Nagpal, D. Coore}, + Title = {An {A}lgorithm for group {F}ormation in an {A}morphous + {C}omputer}, + HowPublished = {http://www.swiss.ai.mit.edu/projects/amorphous/}, + year = 1998 +} + +@Article{JSCC03, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {A. Delgado}}, + Title = {El {P}roblema {SAT}: {E}nfoque {C}omparativo con {ADN} + y {FPGA}}, + Journal = {Memorias del IX Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2003 +} + +@Article{EFC01, + Author = {{Edward F. Crawley}}, + Title = {The {CDIO} {S}yllabus {A} {S}tatement of {G}oals for + {U}ndergraduate {E}ngineering {E}ducation}, + Journal = {URL:http://www.cdio.org}, + year = 2001 +} + +@Article{FW00, + Author = {Forbes, Naushad and Wield, David}, + Title = {Managing {R}\&{D} in technology-followers}, + Journal = {Research Policy}, + month = sep, + year = 2000 +} + +@InProceedings{FGPM02b, + Author = {{F. Gruau.} and {P. Malbos.}}, + Title = {The Blob: A Basic Topological Concept for + Hardware-free Distributed Computation}, + BookTitle = {Unconventional Models of Computation, Third + International Conference, UMC 2002, Kobe, Japan, + October 15-19, 2002, Proceedings}, + Editor = {Cristian Calude and Michael J. Dinneen and Ferdinand + Peper}, + Volume = {2509}, + Series = {Lecture Notes in Computer Science}, + Pages = {151--163}, + Publisher = {Springer}, + year = 2002 +} + +@Book{FB97, + Author = {F. Balarin, M. Chiodo, P. Gisto}, + Title = {Hardware-{S}oftawre {C}o-{D}esign of {E}mbedded + {S}ystems}, + Publisher = {Klewer Academic Publishers}, + year = 1997 +} + +@Article{KSMS+, + Author = {{Ken Sugawara} and {Masaki Sano} and {Ikuo Yoshihara} + and {K. Abe.}}, + Title = {Cooperative behavior of interacting robots.}, + Journal = {Artificial Life and Robotics, 2} +} + +@InBook{AMAJI99, + Author = {{A. Martinoli} and {A. J. Ijspeert} and {L. M. + Gambardella}}, + Editor = {{Dario Floreano} and {Jean-Daniel Nicoud} and + {Francesco Mondada}}, + Title = {Proceedings of the 5th {E}uropean {C}onference on + {A}dvances in {A}rtificial {L}ife}, + Chapter = {A probabilistic model for understanding and comparing + collective aggregation mechanisms.}, + Publisher = {Springer}, + year = 1999 +} + +@Book{MDBU93, + Author = {{McFarland D.} and {Bosser U.}}, + Title = {Intelligent {B}ehavior in {A}nimals and {R}obots}, + Publisher = {MIT Press, Cambridge, MA}, + year = 1993 +} + +@Article{GLRBR+, + Author = {{G. Lazea} and {R. B. Rusu} and {R. Robotin} and {R. + Sime}}, + Title = {The {Z}ee{RO} {M}obile {R}obot - {A} {M}odular + {A}rchitecture} +} + +@Article{EBMD99, + Author = {{E. Bonabeau} and {M. Dorigo} and {G. Theraulaz}}, + Title = {Swarm {I}ntelligence}, + Journal = {Oxford University Press}, + year = 1999 +} + +@Book{GC04, + Author = {{Goel Cohen}}, + Title = {Technology transfer: strategic management in + developing countries}, + Publisher = {Sage Publications inc}, + year = 2004 +} + +@TechReport{AAJL01, + Author = {{A. Avizienis} and {J. Laprie} and {B. Randell}}, + Title = {Fundamental {C}oncepts of {D}ependability}, + Institution = {UCLA, LAAS, Newcastle University}, + year = 2001 +} + +@Article{PHVD97, + Author = {{Panurak H V D}}, + Title = {Go to the ant}, + Journal = {Engineering principles for natural multi-agent + systems. Annals of Operations Research}, + year = 1997 +} + +@Article{FM02, + Author = {Fredslund, J. and Mataric, M.}, + Title = {A {G}eneral, {L}ocal {A}lgorithm for {R}obot + {F}ormations.}, + Journal = {IEEE Transactions on Robotics and Automation, Special + Issue on Multi- Robot Systems 18}, + year = 2002 +} + +@Misc{DC97, + Author = {{D. Coore}}, + Title = {Establishing a {C}oordinate {S}ystem on an {A}morphous + {C}omputer}, + HowPublished = {http://swiss.ai.mit.edu/projects/amorphous}, + year = 1997 +} + +@Article{TUTF, + Author = {{Tsuyoshi UEYAMA} and {Toshio FUKUDA}}, + Title = {Self-organization of {C}ellular {R}obots using + {R}andom {W}alk with {S}imple {R}ules} +} + +@PhdThesis{RN01, + Author = {{R. Nagpal}}, + Title = {Programmeble {S}elf-{A}ssembly: {CO}nstructing + {G}lobal {S}hape using {B}iologically-inspired {L}ocal + {I}nteractions and {O}rigami {M}athematics.}, + School = {MIT. Department of Electrical Engineering and Computer + Science.}, + month = jun, + year = 2001 +} + +@Misc{Oxygen, + Author = {MIT}, + Title = {Proyecto {O}x\'{\i}geno}, + HowPublished = {http://oxygen.lcs.mit.edu/} +} + +@Article{Mat95, + Author = {Mataric, M.}, + Title = {Designing and {U}nderstanding {A}daptive {G}roup + {B}ehavior.}, + Journal = {Adaptive Behavior 4}, + year = 1995 +} + +@Article{AARA01, + Author = {{A. Avizienis} and {R. Avizienis}}, + Title = {An {I}mmune system paradigm for the design of fault + tolerance systems}, + Journal = {Workshop 3: Evaluating and Architecting Systems for + Dependability (EASY)}, + year = 2001 +} + +@Article{JLXJ, + Author = {{Jiming Liu} and {Xiaolong Jin} and {Kwok Ching Tsui}}, + Title = {Autonomy-{O}riented {C}omputing ({AOC}):{F}ormulating + {C}omputational {S}ystems {W}ith {A}utonomous + {C}omponents} +} + +@PhdThesis{WB02, + Author = {{W. Butera}}, + Title = {Programming a {P}aintable {C}omputing}, + School = {Massachusetts Institute of Technology}, + month = feb, + year = 2002 +} + +@Article{Gat98, + Author = {Gat, E.}, + Title = {On {T}hree-{L}ayer {A}rchitectures}, + Journal = {In Artificial Intelligence and Mobile Robotics, AAAI + Press}, + year = 1998 +} + +@Article{ECJM+09, + Author = {{E. Crawley} and {J. Malmqvist} and {D. Brodeur} and + {B. Lucas}}, + Title = {C{DIO} {S}yllabus, {L}eadership and {E}ntrepreneurship}, + Journal = {5th International CDIO conference}, + year = 2009 +} + +@Article{MO91, + Author = {{M. Odedra}}, + Title = {Information {T}echnology {T}ransfer to {D}eveloping + {C}ountries {I}s it really taking place?}, + Journal = {The 4th IFIF.TC9 International Conference on Human + Choice and Computers, North Holland, Amsterdam, + Netherlands, HCC 4 held jointly with the CEC FAST + Programme.}, + year = 1991 +} + +@Article{FGJT00, + Author = {{F. Gruau} and {J. Tromp}}, + Title = {Cellular {G}ravity}, + Journal = {Parallel Processing Letters}, + month = dec, + year = 2000 +} + +@Book{Mok90, + Author = {Mokyr, Joel}, + Title = {The {L}ever of {R}iches, {T}echnological {C}reativity + and {E}conomic {P}rogress.}, + Publisher = {Oxford University Press}, + year = 1990 +} + +@Article{SOQX04, + Author = {{S. Olariu1} and {Q. Xu} and {A. Y. Zomaya}}, + Title = {An {E}nergy-{E}fficient {S}elf-{O}rganization + {P}rotocol for {W}ireless {S}ensor {N}etworks}, + Journal = {Intelligent Sensors, Sensor Networks and Information + Processing Conference}, + year = 2004 +} + +@Misc{CCb, + Author = {{Creative Commons}}, + Title = {Licencias {C}reative {C}ommons}, + HowPublished = {URL: http://creativecommons.org/licenses.}, + year = 2004 +} + +@Article{JF, + Author = {{J Feldman}}, + Title = {The {L}inux startup process}, + Journal = {The Linux Expertise Center, Hewlett-Packard Company} +} + +@Book{JVN66, + Author = {{J. Von Neumann}}, + Title = {Theory of {S}elf-{R}eproducing {A}utomata.}, + Publisher = {University of Illinois Press. Edited and completed by + A. W. Burks}, + year = 1966 +} + +@Book{VSPB+00, + Author = {{V. Subrahmanian} and {P. Bonatti} and {J. Dix} and + {et al}}, + Title = {Heterogeneous {A}gent {S}ystems}, + Publisher = {MIT Press}, + year = 2000 +} + +@Article{HA99, + Author = {H. Abelson, D. Allen, D. Coore}, + Title = {Amorphous {C}omputing}, + Journal = {http://www.ai.mit.edu/publications/pubsDB/pubs.html}, + month = {29 } # aug, + year = 1999 +} + +@Article{AC09, + Author = {{A. Cortesi}}, + Title = {Elinor {O}strom, the commons problem and {O}pen + {S}ource}, + Journal = {URL: + http://corte.si/posts/opensource/ostrom/index.html}, + year = 2009 +} + +@InCollection{FGGM04, + Author = {{F. Gruau} and {G. Moszkowski}}, + Title = {The {B}lob {D}ivision {A} "{H}ardware-{F}ree", {T}ime + {E}fficient, {S}elf-{R}eproduction on 2{D} {C}ellular + {A}utomaton}, + BookTitle = {Biologically {I}nspired {A}pproaches to {A}dvanced + {I}nformation {T}echnology: {F}irst {I}nternational + {W}orkshop, {B}io{ADIT} 2004, {L}ausanne, {S}witzerland}, + Publisher = {Springer}, + journal = {Computing Frontiers}, + year = 2004 +} + +@Misc{CC06, + Author = {{C. Camargo}}, + Title = {First {C}olombian {L}inux {SBC} runs {D}ebian}, + HowPublished = {URL: + http://www.linuxfordevices.com/c/a/News/First-Colombian-Linux-SBC-runs-Debian/}, + year = 2006 +} + +@Article{MFA92, + Author = {{Mussa-Ivaldi F. A.} and Giszter, S.}, + Title = {Vector field approximation: a computational paradigm + for motor control and learning}, + Journal = {Biological Cybernetics 67}, + year = 1992 +} + +@Misc{emQ, + Author = {emQbit}, + Title = {{e}m{Q}bit {L}inux {P}owered {D}evices {C}ompany}, + HowPublished = {URL: http://www.emqbit.com/} +} + +@Book{CH06, + Author = {{C. Hallinan}}, + Title = {Embedded {L}inux {P}remiere {A} {P}ractical + {R}eal-{W}orld {A}pproach}, + Publisher = {Prentice Hall}, + month = {18 } # sep, + year = 2006 +} + +@PhdThesis{DC99, + Author = {{D. Coore}}, + Title = {Botanical {C}omputing: {A} {D}evelopmental {A}pproach + to {G}enerating {I}nterconnected {T}opologies on an + {A}morphous {C}omputer}, + School = {Massachusetss Institute of Technology}, + year = 1999 +} + +@Article{PDDM+01, + Author = {{Payton D} and {Daily M} and {Estowski R} and {Howard + M} and {Lee C}}, + Title = {Pheromone robotics}, + Journal = {Autonomous Robots}, + year = 2001 +} + +@Book{JCAR05, + Author = {{J. Corbet} and {A. Rubini} and {G. Kroah-Hartman}}, + Title = {Linux {D}evice {D}rivers, {T}hird {E}dition}, + Publisher = {O'Reilly}, + year = 2005 +} + +@Article{Bro91, + Author = {Brooks, R.}, + Title = {Intelligence {W}ithout {R}epresentation}, + Journal = {Artificial Intelligence 47}, + year = 1991 +} + +@Article{IAI, + Author = {{Innovation Associates Inc.}}, + Title = {Technology {T}ransfer and {C}ommercialization + {P}artnerships {E}xecutive {S}ummary} +} + +@Book{LWS92, + Author = {{Lydia Woods Schindler}}, + Title = {Understanding the {I}mmune {S}ystem {H}ow {I}t {W}orks}, + Publisher = {US Department of health and human services.}, + year = 1992 +} + +@Article{GT95, + Author = {{G. Tempesti}}, + Title = {A new {S}elf-reproducing {C}ellular {A}utomation + {C}apable of {C}onctruction and {C}omputation.}, + Journal = {Lecture Notes in Artificial Intelligence, Springer + Verlag 3rd European Conference on Artificial Life}, + year = 1995 +} + +@InProceedings{WBaVB, + Author = {{W. Buttera and V. Bove}}, + Title = {Literally embedded processors}, + BookTitle = {S{PIE} {M}edia {P}rocessors}, + year = 2001 +} + +@Misc{JK00, + Author = {{J. Kuan}}, + Title = {Open source software as consumer integration into + production}, + HowPublished = {URL: http://hdl.handle.net/2038/1113}, + year = 2000 +} + +@Article{DBCO00, + Author = {{D. Bradley} and {C. Ortega-Sanchez} and {A. Tyrrell}}, + Title = {Embryonic +{I}mmunotronics: abio-{I}nspired {A}pproach + to {F}ault {T}olerance}, + Journal = {The Second NASA/DoD Workshop on Evolvable Hardware}, + year = 2000 +} + +@Article{KLCJ+, + Author = {{Kristina Lerman} and {Chris Jones} and {Aram + Galstyan} and {Maja J Mataric}}, + Title = {Analysis of {D}ynamic {T}ask {A}llocation in + {M}ulti-{R}obot {S}ystems} +} + +@InProceedings{SSST02, + Author = {{S. Singh. S. Thayer}}, + Title = {Kilorobot {S}earch and {R}escue {U}sing an + {I}mmunologically {I}nspired {A}pproach}, + BookTitle = {Distributed {A}utonomous {R}obotic {S}ystems}, + Publisher = {Springer-Verlag}, + month = jun, + year = 2002 +} + +@Article{FBFP07, + Author = {{F. Bar} and {F. Pisani} and {M. Weber}}, + Title = {Mobile technology appropriation in a distant mirror: + baroque infiltration, creolization and cannibalism.}, + Journal = {Seminario sobre Desarrollo Econ\'omico, Desarrollo + Social y Comunicaciones M\'oviles en Am\'erica Latina. + Buenos Aires}, + month = apr, + year = 2007 +} + +@Article{EO92, + Author = {{E. OSTROM}}, + Title = {The {R}udments of a theory of the {O}rigins, + {S}urvival, and {P}erformance of {C}ommon-{P}roperty + {I}nstitutions}, + Journal = {BROMLEY, D.W. et al. (eds.) Making the Commons Work: + Theory, Practice, and Policy. San Francisco, CA: ICS + Press}, + year = 1992 +} + +@Article{AD, + Author = {{Ancona D.}}, + Title = {Leadership in the {A}ge of {U}ncertainty}, + Journal = {http://mitleadership.mit.edu/pdf/LeaderShipinanAgeofUncertainty-researchbrief.pdf} +} + +@Article{Mat92, + Author = {Mataric, M.}, + Title = {Integration of {R}epresentation {I}nto {G}oal-{D}riven + {B}ehavior-{B}ased {R}obots}, + Journal = {IEEE Transactions on Robotics and Automation 8(3)}, + year = 1992 +} + +@TechReport{DZSC+07, + Author = {{D Zuluaga} and {S Campos} and {M Tovar} and {R + Rodr\'{\i}guez} and {J S\'anchez} and {A Aguilera} and + {L Land\'{\i}nez} and {J Medina}}, + Title = {Informe de {V}igilancia {T}ecnol\'ogica: + {A}plicaciones de la {E}lectr\'onica en el {S}ector + {A}gr\'{\i}cola}, + Institution = {COLCIENCIAS}, + year = 2007 +} + +@Article{MIM99, + Author = {Martinoli, A. and Ijspeert, A. and Mondada, F}, + Title = {Understanding {C}ollective {A}ggregation {M}echanisms: + {F}rom {P}robabilistic {M}odeling to {E}xperiments with + {R}eal {R}obots}, + Journal = {Robotics and Autonomous Systems}, + year = 1999 +} + +@Article{KGSB95, + Author = {{K. Goel} and {Sayers B.}}, + Title = {Modelling {G}lobal-{O}riented {E}nergy {T}ecnology + {T}ransfer to {DC}s}, + Journal = {Sixth Global Warning International Conference, San + Francisco}, + year = 1995 +} + +@InBook{KLAM05, + Author = {{Kristina Lerman} and {Alcherio Martinoli} and {Aram + Galstyan}}, + Editor = {{Sahin E.} and {Spears W.}}, + Title = {Swarm {R}obotics {W}orkshop: {S}tate-of-the-art + {S}urvey,}, + Chapter = {A review of probabilistic macroscopic models for swarm + robotic systems}, + Publisher = {Springer-Verlag, Berlin Heidelberg}, + year = 2005 +} + +@Article{GH03, + Author = {{G. Hertel}}, + Title = {Motivation of software developers in {O}pen {S}ource + projects: an {I}nternet-based survey of contributors to + the {L}inux kernel}, + Journal = {Research Policy In Open Source Software Development, + Vol. 32, No. 7}, + year = 2003 +} + +@Article{BC86, + Author = {Brooks, R. and Connell, J}, + Title = {Asynchronous {D}istributed {C}ontrol {S}ystems for a + {M}obile {R}obot}, + Journal = {In Proceedings of SPIE's Cambridge Symposium on + Optical and Optoelectronic Engineering. Cambridge, MA}, + year = 1986 +} + +@TechReport{ED00, + Author = {{E. D'Hondt}}, + Title = {Exploring the {A}morphous {C}omputing {P}aradigm}, + Institution = {VUB, Bruxelles}, + year = 2000 +} + +@Article{Con92, + Author = {Connell, J.}, + Title = {A {H}ybrid {A}rchitecture {A}pplied to {R}obot + {N}avigation}, + Journal = {Proceedings IEEE Conference on Robotics and + Automation, Nice, France}, + year = 1992 +} + +@Book{May08, + Author = {Mayer, Gene}, + Title = {Immunology - {C}hapter {O}ne: {I}nnate (non-specific) + {I}mmunity {M}icrobiology and {I}mmunology {O}n-{L}ine + {T}extbook}, + Publisher = {USC School of Medicine}, + month = {6 } # aug, + year = 2008 +} + +@Article{JSCC04c, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {S. Bolivar}}, + Title = {Metodolog\'{\i}a de {I}mplementaci\'on de + {A}ut\'omatas {C}elulares en {FPGA}}, + Journal = {Memorias del X Workshop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@Article{FPFS+05, + Author = {{F. Pedraza} and {F. Segura} and {C. Camargo} and {A. + Gauthier}}, + Title = {Control {A}daptativo {E}mbebido}, + Journal = {Memorias del XI workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@Misc{BG, + Author = {{Bill Gatliff}}, + Title = {Porting and {U}sing {N}ewlib in {E}mbedded {S}ystems}, + HowPublished = {http://venus.billgatliff.com/node/3} +} + +@Book{Sta99, + Author = {Stallman, R. M.}, + Editor = {{C. DiBona} and {S. Ockman} and {M. Stone}}, + Title = {The {GNU} {O}perating {S}ystem and the {F}ree + {S}oftware {M}ovement {V}oices from the {O}pen {S}ource + {R}evolution}, + Publisher = {O'Reilly and Associates}, + year = 1999 +} + +@Article{Pir00, + Author = {Pirjanian, P.}, + Title = {Multiple {O}bjective {B}ehavior-based {C}ontrol.}, + Journal = {Robotics and Autonomous Systems 31}, + year = 2000 +} + +@Article{Don95, + Author = {Donald, B.}, + Title = {Information {I}nvariants in {R}obotics}, + Journal = {Artificial Intelligence 72}, + year = 1995 +} + +@Article{KLRR99, + Author = {{R. L. King; A. B. Lambert; S. H. Russ; and D. S. + Reese}}, + Title = {The {B}iological {B}asis of the {I}mmune {S}ystem as a + {M}odel for {I}ntelligent {A}gents}, + Journal = {IPDPS 1999 Workshop}, + year = 1999 +} + +@InBook{DJR95, + Author = {Donald, B. and Jennings, J. and Rus, D.}, + Editor = {Goldberg, K. and Halperin, D. and Latombe, J.-C. and + Wilson, R.}, + Title = {International {W}orkshop on the {A}lgorithmic + {F}oundations of {R}obotics}, + Chapter = {Information Invariants for Distributed Manipulation}, + year = 1995 +} + +@InBook{CMS06, + Author = {{Charles M. Schweik}}, + Editor = {{Charlotte Hess} and {Elinor Ostrom}}, + Title = {Understanding {K}nowledge as a {C}ommons: {F}rom + {T}heory to {P}ractice}, + Chapter = {Free/Open-Source Software as a Framework for + Establishing Commons in Science}, + Publisher = {The MIT Press}, + year = 2006 +} + +@Book{Ark88, + Author = {Arkin, R.}, + Title = {Behavior-{B}ased {R}obotics}, + Publisher = {Cambridge, MA: MIT Press.}, + year = 1988 +} + +@Article{Rey87, + Author = {Reynolds, C.}, + Title = {Flocks, {H}erds, and {S}chools: {A} {D}istributed + {B}ehavior {M}odel.}, + Journal = {Computer Graphics 21}, + year = 1987 +} + +@Book{EC68, + Author = {{E. Codd}}, + Title = {Celullar {A}utomata}, + Publisher = {Academic Press}, + year = 1968 +} + +@Book{MR94, + Author = {{M. Resnick}}, + Title = {Turtles, {T}ermites and {T}raffic {J}ams + {E}xplorations in {M}assively {P}arallel {M}icroworlds}, + Publisher = {The MIT Press Cambridge, Massachusetts}, + year = 1994 +} + +@Article{HM99, + Author = {Holland, O. and Melhuish, C.}, + Title = {Stigmergy, {S}elf-organization, and {S}orting in + {C}ollective {R}obotics.}, + Journal = {Artificial Life 5}, + year = 1999 +} + +@InBook{ME02, + Author = {Martinoli, A. and Easton, K.}, + Editor = {Siciliano, B. Dario, P.}, + Title = {Experimental {R}obotics {VIII}}, + Chapter = {Modeling Swarm Robotic Systems}, + Publisher = {Springer-Verlag}, + year = 2002 +} + +@TechReport{RN98b, + Author = {R. Nagpal, D. Coore}, + Title = {An {A}lgorithm for group {F}ormation and {M}aximal + {I}ndependent {S}et in an {A}morphous {C}omputer}, + Institution = {AI Memo 1626, MIT Artificial Intelligence Laboratory}, + month = {16 } # feb, + year = 1998 +} + +@InBook{KLAG04, + Author = {{Kristina Lerman} and {Aram Galstyan}}, + Title = {Collectives and design of complex systems}, + Chapter = {Two Paradigms for the Design of Artificial Collectives}, + Publisher = {Springer Verlag, New York,}, + year = 2004 +} + +@Article{MMDG04, + Author = {Meinzen-Dick, Ruth and {Monica Di Gregorio} and {Nancy + McCarthy}}, + Title = {Methods for {S}tudying {C}ollective {A}ction in + {R}ural {D}evelopment}, + Journal = {CAPRi Working Paper, no. 33. International Food Policy + Research Institute, 2033 K Street, N.W., Washington, DC + 20006. http://www.capri.cgiar.org/pdf/capriwp33.pd}, + year = 2004 +} + +@Article{Ost00, + Author = {Ostrom, Elinor}, + Title = {Reformulating the {C}ommons}, + Journal = {Swiss Political Science Review, Volume 6, Number 1}, + year = 2000 +} + +@Article{SS06, + Author = {{S. Shah}}, + Title = {Motivation, {G}overnance, and the {V}iality of + {H}ybrid {F}orms in {O}pen {S}ource {S}oftware + {D}evelopment}, + Journal = {Management Science}, + month = jul, + year = 2006 +} + +@Article{CC08, + Author = {{C. Camargo}}, + Title = {E{CBOT} y {ECB}\_{A}{T}91 {P}lataformas {A}biertas + para el {D}ise\~no de {S}istemas {E}mbebidos y + {C}o-{D}ise\~no {HW}/{SW}}, + Journal = {VIII Jornadas de Computaci\'on Reconfigurable y + Aplicaciones}, + month = sep, + year = 2008 +} + +@Article{TT03, + Author = {T. TERADA, M. TSUKAMOTO, {* K. HAYAKAWA* and A. + KASHITANI}}, + Title = {Ubiquitous {C}omputing {U}sing {R}ule-{B}ased {I}/{O} + {C}ontrol {D}evices}, + Journal = {Proc. of 15th International Comference on Ubiquitous + Computing (UbiComp 2003)}, + month = oct, + year = 2003 +} + +@Article{AGH+00, + Author = {Alur, R. and Grosu, R. and Hur, Y. and Kumar, V. and + Lee, I.}, + Title = {Modular {S}pecification of {H}ybrid {S}ystems in + {CHARON}}, + Journal = {Proceedings of the 3rd International Workshop on + Hybrid Systems: Computation and Control. Pittsburgh, PA}, + year = 2000 +} + +@Article{CFK97b, + Author = {Cao, Y. and Fukunaga, A. and Kahng, A.}, + Title = {Cooperative {M}obile {R}obotics: {A}ntecedents and + {D}irections}, + Journal = {Autonomous Robots 4}, + year = 1997 +} + +@Article{Mat95b, + Author = {Mataric, M.}, + Title = {Issues and {A}pproaches in the {D}esign of + {C}ollective {A}utonomous {A}gents.}, + Journal = {Robotics and Autonomous Systems 16(2-4)}, + year = 1995 +} + +@Misc{entry-0b, + Author = {EPFL}, + Title = {{e}-puck {EPFL} education robot}, + HowPublished = {http://www.e-puck.org/} +} + +@Article{KPJZ, + Author = {{Kamal Premaratne} and {Jinsong Zhang}}, + Title = {Location {I}nformation-{A}ided {T}ask-{O}riented + {S}elf-{O}rganization of {A}d-{H}oc {S}ensor {S}ystems} +} + +@Article{SKAA02, + Author = {{Sanza Kazadi} and {A. Abdul-Khaliq} and {Ron + Goodman.}}, + Title = {On the convergence of puck clustering systems.}, + Journal = {Robotics and Autonomous Systems, 38(2):93-117}, + year = 2002 +} + +@Article{htt, + Author = {http://www.poetictissue.org}, + Title = {Proyecto {POE}tic {T}issue} +} + +@InBook{TB99, + Author = {{Tucker Balch.}}, + Editor = {{Oren Etzioni} and {Jorg P. Muller} and {Jeffrey M. + Bradshaw}}, + Title = {Proceedings of the {T}hird {I}nternational + {C}onference on {A}utonomous {A}gents}, + Chapter = {The impact of diversity on performance in multi-robot + foraging.}, + Publisher = {ACM Press}, + year = 1999 +} + +@Article{SKKT04, + Author = {{Sugawara K} and {Kazama T} and {Watanabe T}}, + Title = {Foraging behavior of interacting robots with virtual + pheromone}, + Journal = {Proceedings of the IEEE/RSJ International Conference + on Intelligent Robots and Systems}, + year = 2004 +} + +@PhdThesis{AB94, + Author = {{A. Berlin}}, + Title = {Towards {I}ntelligent {S}tructures: {A}ctive {C}ontrol + of {B}ucling}, + School = {MIT. Department of Electrical Engineering and Computer + Science}, + month = may, + year = 1994 +} + +@InBook{DGMJM02, + Author = {{Dani Goldberg} and {Maja J Mataric.}}, + Editor = {{Tucker Balch} and {Lynne E. Parker}}, + Title = {Robot {T}eams: {F}rom {D}iversity to {P}olymorphism}, + Chapter = {Design and evaluation of robust behavior-based + controllers for distributed multi-robot collection + tasks.}, + Publisher = {AK Peters}, + year = 2002 +} + +@Article{JL60, + Author = {{J. Licklider}}, + Title = {Man-{C}omputer {S}ymbiosis}, + Journal = {IRE Transactions on Human Factors in Electronics}, + year = 1960 +} + +@MastersThesis{MJF05, + Author = {{Mesa J. F.} and {Polo A. A.}}, + Title = {C{ONSTRUYENDO} {UN} {JINU} {DE} {LA} + {INFORMACI}\'{O}{N}}, + School = {PONTIFICIA UNIVERSIDAD JAVERIANA Facultad de + Ingenier\'{\i}a}, + month = feb, + year = 2005 +} + +@PhdThesis{GT98, + Author = {{G. Tempesti}}, + Title = {A {S}elf {R}eparing {M}ultiplexer-{B}ased {FPGA} + {I}nspired by {B}iological {P}rocesses}, + School = {\'Ecole Polytechnique F\'ed\'erale de Laussane}, + month = {8 } # jul, + year = 1998 +} + +@Article{CC, + Author = {{C. Camargo}}, + Title = {E{CB}\_{A}{T}91 y {ECBOT} {P}lataformas {A}biertas + para el desarrollo de {S}istemas {E}mbebidos}, + Journal = {URL: http://wiki.emqbit.com/free-ecb-at91} +} + +@Book{BETG94, + Author = {{Bonabeau E.} and {Theraulaz G}}, + Title = {Intelligence {C}ollective}, + Publisher = {Hermes, Paris, France}, + year = 1994 +} + +@Misc{And, + Author = {Google}, + Title = {Android {P}roject}, + HowPublished = {URL: http://www.android.com/} +} + +@Article{SS02, + Author = {S. Sathyanath, F. Sahin}, + Title = {A{ISIMAM} - {A}n {A}rtificial {I}mmune {S}ystem + {B}ased {I}ntelligent {M}ulti-{A}gent {M}odel and its + {A}pplication to a {M}ine {D}etection}, + Journal = {ICARIS 2002}, + month = sep, + year = 2002 +} + +@Book{entry-0, + Author = {{J. Holland}}, + Title = {Adaptation in {N}atural and {A}rtificial {S}ystems}, + Publisher = {MIT Press, Cambridge, MA}, + journal = {MIT Press}, + year = 1992 +} + +@Article{Bro86, + Author = {Brooks, R.}, + Title = {A {R}obust {L}ayered {C}ontrol {S}ystem for a {M}obile + {R}obot.}, + Journal = {IEEE Journal of Robotics and Automation}, + year = 1986 +} + +@Misc{IB98, + Author = {{I. Bowman}}, + Title = {Conceptual {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://docs.huihoo.com/linux/kernel/a1/}, + year = 1998 +} + +@Book{CJ97, + Author = {{C. Jacob}}, + Title = {Ilustrating {E}volutionary {C}omputation with + {M}athematica}, + Publisher = {Morgan Kaufmann}, + year = 1997 +} + +@Article{Kur99, + Author = {D. Kurabayashi}, + Title = { {T}oward {R}ealization of {C}ollective {I}ntelligence + and {E}mergent {R}obotics}, + Journal = {Proceedings of IEEE International Conference on + Systems, Man, and Cybernetics}, + year = 1999 +} + +@Article{BGRTV03, + Author = {{B.P. Gerkey} and {R. T. Vaughan} and {A. Howard}}, + Title = {The {P}layer/{S}tage project: {T}ools for + {M}ulti-robot and {D}istributed {S}ensor {S}ystems,}, + Journal = {Proceedings of the International Conference on + Advanced Robotics (ICAR)}, + Pages = {317-323}, + year = 2003 +} + +@Misc{RS07, + Author = {{R. Stallman}}, + Title = {Philosophy of the {GNU} project.}, + HowPublished = {URL: http://www.gnu.org/philosophy/}, + year = 2007 +} + +@Article{MMZF07, + Author = {{Mamei M.} and {Zambonelli F.}}, + Title = {Pervasive {P}heromone-{B}ased {I}nteraction with + {RFID} {T}ags}, + Journal = {ACM Transactions on Autonomous and Adaptive Systems}, + year = 2007 +} + +@InProceedings{DBAT02, + Author = {{D. Bradley} and {A. Tyrrell}}, + Title = {A {H}ardware {I}mmune {S}ystem for {B}enchmark {S}tate + {M}achine {E}rror {D}etection}, + BookTitle = {Congress on {E}volutionary {C}omputation}, + year = 2002 +} + +@Article{LG02, + Author = {Lerman, K. and Galstyan, A.}, + Title = {Mathematical {M}odel of {F}oraging in a {G}roup of + {R}obots: {E}ffects of {I}nterference}, + Journal = {Autonomous Robots 13}, + year = 2002 +} + +@InProceedings{FGPM02, + Author = {{F. Gruau} and {P. Malbos}}, + Title = {The {B}lob: {A} {B}asic {T}opological {C}oncept for + {H}ardware-free {D}istributed {C}omputation}, + BookTitle = {Unconventional {M}odels of {C}omputation, {T}hird + {I}nternational {C}onference, {UMC} 2002}, + Editor = {{C. Calude} and {M. Dinneen} and {F. Peper}}, + Volume = {2509}, + Series = {Lecture Notes in Computer Science}, + Pages = {151--163}, + Publisher = {Springer}, + chapter = {The Blob: A Basic Topological Concept for + Hardware-free Distributed Computation}, + year = 2002 +} + +@InBook{DJM+02, + Author = {Dudek, G. and Jenkin, M. and Milios, E. and (2002). A + Taxonomy of Multirobot Systems. In Balch, {T. and + Parker}, L.}, + Editor = {Balch, T. and Parker, L.}, + Title = {Robot {T}eams: {F}rom {D}iversity to {P}olymorphism}, + Chapter = {A Taxonomy of Multirobot Systems}, + Pages = {3-22}, + Publisher = {Natick, Massachusetts: A.K. Peters}, + year = 2002 +} + +@InProceedings{YTDR+04, + Author = {{Y. Thoma} and {D. Roggen} and {E. Sanchez} and + J.Moreno}, + Title = {Prototyping with a bio-inspired reconfigurable chip}, + BookTitle = {15th {IEEE} {I}nternational {W}orkshop on {R}apid + {S}ystem {P}rototyping ({RSP} 2004)}, + Organization = {IEEE Computer Society, Los Alamitos, California, 2004}, + year = 2004 +} + +@Misc{CL84, + Author = {{C. Langton}}, + Title = {Self-{R}eproduction in {C}ellular automata}, + HowPublished = {Physica D, 10:135-144}, + year = 1984 +} + +@MastersThesis{MTRR07, + Author = {{M. Tovar} and {R. Rodr\'{\i}guez}}, + Title = {P{ROSPECTIVA} {Y} {VIGILANCIA} {TECNOL}\'{O}{GICA} + {DE} {LA} {ELECTR}\'{O}{NICA} {EN} {COLOMBIA}.}, + School = {Universidad Nacional de Colombia}, + year = 2007 +} + +@InBook{Par97, + Author = {Parker, L.}, + Editor = {Bolles, R., Bunke}, + Title = {Intelligent robots: {S}ensing, modeling, and planning}, + Chapter = {Behavior-Based Cooperative Robotics Applied to + Multi-Target Observation}, + Publisher = {R. Bolles, H. Bunke, and H. Noltemeier. World + Scientific}, + year = 1997 +} + +@Book{Arr62, + Author = {Arrow, Kenneth}, + Title = {Economic {W}elfare and the {A}llocation of {R}esources + for {I}nvention}, + Publisher = {Princeton University Press}, + year = 1962 +} + +@MastersThesis{MB05, + Author = {{M. Broxton}}, + Title = {Localization and {S}ensing {A}pplications in the + {P}ushpin {C}omputing {N}etwork}, + School = {MIT Media Lab}, + month = jan, + year = 2005 +} + +@Article{ST01, + Author = {S. Singh, S. Thayer}, + Title = {Immunology {D}irected {M}ethods for {D}istributed + {R}obotics: {A} {N}ovel, {I}mmunity-{B}ased + {A}rchitecture for {R}obust {C}ontrol \& {C}oordination}, + Journal = {Proceedings of SPIE: Mobile Robots XVI}, + month = nov, + year = 2001 +} + +@Article{UNE, + Author = {UNESCO-Uruguay}, + Title = {Rasgos {P}rincipales de la {I}nstitucionalizaci\'on de + la {C}iencia, la {T}ecnolog\'{\i}a y la {I}nnovaci\'on + en {A}m\'erica {L}atina y el {C}aribe y {T}endencias de + la {C}ooperaci\'on {I}nternacional}, + Journal = {http://www.unesco.org.uy/} +} + +@Article{OBHM02, + Author = {{O. Babaoglu} and {H. Meling} and {A. Montresor}}, + Title = {A {F}ramework for the {D}evelopment of {A}gent-{B}ased + {P}eer-to-{P}eer {S}ystems}, + Journal = {IEEE ICDCS}, + year = 2002 +} + +@Article{JSCC04, + Author = {{J. Sep\'ulveda} and {C. Camargo} and {A. Delgado}}, + Title = {Implementaci\'on de {C}hip de {ADN} en {FPGA}}, + Journal = {Memorias del X Workshop de Iberchip ISBN 959-261-105-X}, + year = 2004 +} + +@Article{JEFS05, + Author = {{J. Espinosa} and {F. Segura} and {C. Camargo}}, + Title = {Evoluci\'on de un {A}rreglo de {C}\'elulas + {U}tilizando {A}lgoritmos {G}en\'eticos}, + Journal = {Memorias del XI Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@Article{Jol77, + Author = {Jolly, James A.}, + Title = {The {T}echnology {T}ransfer {P}rocess: {C}oncepts, + {F}ramework and {M}ethodology.}, + Journal = {The Journal of Technology Transfer. Springer}, + year = 1977 +} + +@Article{JM03, + Author = {Jones, C. and Mataric, M.}, + Title = {Adaptive {D}ivision of {L}abor in {L}arge-{S}cale + {M}inimalist {M}ulti-{R}obot {S}ystems}, + Journal = {Proceedings of the IEEE/RSJ International Conference + on Robotics and Intelligent Systems (IROS). Las Vegas, + Nevada}, + year = 2003 +} + +@Article{WM91, + Author = {{Mark Weiser}}, + Title = {The {C}omputer for the 21st {C}entury}, + Journal = {http://www.ubiq.com/hy\'ertext/weiser/SciAmDraft3.html} +} + +@InProceedings{KAK01, + Author = {{K. A. Kahng}}, + Title = {Design {T}echnology {P}roductivity in the {DSM} {E}ra.}, + BookTitle = {A{SP}-{DAC}}, + year = 2001 +} + +@Misc{QH, + Author = {{Qi Hardware}}, + Title = {Qi {H}ardware {C}opyleft {H}ardware {P}roject}, + HowPublished = {URL: http://en.qi-hardware.com/} +} + +@Article{GM(.I.W01, + Author = {Gerkey, B. and Mataric, M. and (2001). . In . Waikiki, + Hawaii, pp. 341-352.}, + Title = {Principled {C}ommunication for {D}ynamic {M}ulti- + {R}obot {T}ask {A}llocation}, + Journal = {Proceedings International Symposium on Experimental + Robotics 2000, Waikiki, Hawaii}, + year = 2001 +} + +@Article{FC92, + Author = {{Flaviu Cristian}}, + Title = {Understanding {F}ault-{T}olerant {D}istributed + {S}ystems}, + Journal = {Communications of the ACM}, + month = jan, + year = 1992 +} + +@Misc{FSF, + Author = {{Free Software Foundation}}, + Title = {G{NU} {G}eneral {P}ublic {L}icense}, + HowPublished = {URL: http://www.gnu.org/copyleft/gpl.html} +} + +@Article{AJI+01, + Author = {{A. J. Ijspeert} and {A. Martinoli} and {A. Billard} + and {L. M. Gambardella}}, + Title = {Collaboration through the exploitation of local + interactions in autonomous collective robotics: {T}he + stick pulling experiment.}, + Journal = {Autonomous Robots, 11}, + year = 2001 +} + +@PhdThesis{CVJ05, + Author = {{Chris V. Jones}}, + Title = {A {P}rincipled {D}esign {M}ethodology for {M}inimalist + {M}ulti-{R}obot {S}ystem {C}ontrollers}, + School = {FACULTY OF THE GRADUATE SCHOOL UNIVERSITY OF SOUTHERN + CALIFORNIA}, + month = aug, + year = 2005 +} + +@TechReport{DP93, + Author = {{David Powell}}, + Title = {Distributed {F}ault {T}olerance {L}essons {L}earnt + from {D}elta-4}, + Institution = {LAAS-CNRS\#93192}, + journal = {Workshop on Fault-Tolerant Architectures}, + year = 1993 +} + +@Article{CC05, + Author = {{C. Camargo}}, + Title = {Implementaci\'on de {S}istemas {D}igitales {C}omplejos + {U}tilizando {S}istemas {E}mbebidos}, + Journal = {Memorias del XI Workshop de Iberchip ISBN + 959-261-105-X}, + year = 2005 +} + +@InProceedings{JTMA02, + Author = {{J. Timmis} and {M. Ayara} and {R. Duncan}}, + Title = {Towards {I}mmune {I}nspired {F}ault {T}olerance {I}n + {E}mbedded {S}ystems}, + BookTitle = {Proceedings of 9th {I}nternational {C}onference on + {N}eural {I}nformation {P}rocessing}, + Publisher = {IEEE}, + year = 2002 +} + +@Misc{Wikb, + Author = {Wikipedia}, + Title = {Richard {S}tallman}, + HowPublished = {URL: http://es.wikipedia.org/wiki/Richard\_Stallman} +} + +@Article{RJSB+98, + Author = {{R. Jackman} and {S. Brittain} and {M. Prentiss} and + {G. Whitesides}}, + Title = {Design and {F}abrication of topologically {C}omplex, + {T}hree-{D}imensional {M}icrostructures}, + Journal = {Science}, + year = 1998 +} + +@Article{Mat97, + Author = {Mataric, M.}, + Title = {Behavior-{B}ased {C}ontrol: {E}xamples from + {N}avigation, {L}earning, and {G}roup {B}ehavior}, + Journal = {Journal of Experimental and Theoretical Artificial + Intelligence, special issue on Software Architectures + for Physical Agents Hexmoor, H., Horswill, I., and + Kortenkamp, D., eds}, + year = 1997 +} + +@Article{KBCR10, + Author = {{Kerstin Balka} and {Christina Raasch} and {Cornelius + Herstatt}}, + Title = {Open {S}ource {I}nnovation: {A} study of openness and + community expectations}, + Journal = {DIME Conference, Milano}, + year = 2010 +} + +@Article{KLCJ+0, + Author = {{Kristina Lerman} and {Chris Jones} and {Aram + Galstyan} and {Maja J Matar\'{\i}c}}, + Title = {Analysis of {D}ynamic {T}ask {A}llocation in + {M}ulti-{R}obot {S}ystems}, + Journal = {International Journal of Robotics Research}, + month = mar, + year = 200 +} + diff --git a/course/.docs/book/commons.tex b/course/.docs/book/commons.tex new file mode 100644 index 0000000..0a5a8f0 --- /dev/null +++ b/course/.docs/book/commons.tex @@ -0,0 +1,367 @@ +\chapter{Copyleft HW/SW y el Conocimiento Como Bien Común} +\label{ch:common} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% El conocimiento como bien común %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Introducción} + +Es indudable que el desarrollo tecnológico de un país se encuentra ligado al mejoramiento de la calidad de vida de sus habitantes, y que para que un país en vía de desarrollo se realice una transferencia tecnológica (y de conocimientos asociados a la tecnología que se transfiere) exitosa que permita desarrollar productos similares, pero ajustados al contexto socio-económico local, es necesario que el país cuente con la capacidad de absorber las habilidades, técnicas, información y organización asociadas a dicha tecnología. Esta absorción de conocimientos debe ser realizada por un gran número de personas para que la transferencia tenga un impacto significativo en la sociedad, este conocimiento debe ser considerado como un bien público, y como tal, el acceso a él, debe ser un derecho y por lo tanto, la sociedad debe garantizar los mecanismos de difusión para que llegue a los sectores de la sociedad interesados en él. De igual forma, es un deber, de los sectores que utilizan este bien común contribuir a su difusión, actualización, mejoramiento, y crecimiento. + +Un bien común es un recurso compartido que es vulnerable a dilemas sociales, es el resultado de interacciones entre personas y recursos, las cuales pueden ser positivas o negativas. El concepto de bien común esta asociado a la \textit{libertad de expresión}, \textit{libre acceso} y \textit{autogobierno} + +El conocimiento en este trabajo se refiere a las ideas intangibles, información y datos de todo tipo en que el conocimiento es expresado u obtenido, como todo tipo de entendimiento adquirido a través de la experiencia o estudio ya sea propio, científico, académico o no académico. El conocimiento puede ser visto como una mercancía y como una fuerza constitutiva de la sociedad lo que evidencia la naturaleza compleja de este recurso, adicionalmente, la adqusición y descubrimiento de conocimiento es un proceso social y personal. \textit{El descubrimiento de conocimiento es un bien común y un tesoro que dejamoa a futuras generaciones y el reto de nuestra generación es en mantener los caminos del descubrimiento abiertos}. + +El acceso al conocimiento debe garantizarse sin restricción alguna a las personas interesadas, al considerar el conocimiento como un producto comercial se limita su difusión favoreciendo a un grupo de la población, lo cual es inaceptable, ya que representa una forma de discriminación. En nuestro pais, el acceso a la información ha ido aumentando gracias a la aparición de Internet y a la gran cantidad de proyectos existentes que buscan difundir todo tipo de conocimientos. Sin embargo, para poder asimilar este conocimiento se requieren ciertas habilidades que se adquieren después de un procesos de enseñanza formal. En Colombia el acceso a la educación superior de calidad es limitado, la cobertura de las Universidades públicas está limitada por la inversión del estado, y como pudimos ver anteriormente, en nuestro país la preocupación actual es la seguridad y no la educación. Por lo tanto, hacer del conocimiento un bien común requiere la intervención de diferentes sectores que garanticen y regulen el acceso, generen, clasifiquen y administren la forma en la que se expresa el conocimiento. + +La diferencia entre esta propuesta y las existentes promovidas por los organismos gubernamentales, es el énfasis en la transferencia y difusión del conocimiento, del \textit{saber hacer}, muchas políticas existentes se enfocan en la compra de equipo, lo que, como se vió antes no es el canal más eficiente para la transferencia tecnológica. Nuestros esfuerzos están enfocados a crear un conocimiento básico en la Concepción, Diseño, Implementación y Diseño de Sistemas Embebidos. Este conocimiento es el resultado de años de experimentación e investigación en el área, al ser colocado a disposición de usuarios interesados, se aumentan las posibilidades de difusión, ya que ya se realizó un trabajo previo de "adaptación" a las condiciones de la plataforma tecnológica local y al contexto económico y social. En la actualidad existen instituciones educativas que proporcionan conocimientos similares pero no tienen la profundidad del presente estudio y limitan el acceso a esta información cobrando altos precios para acceder a ella. + +En este capítulo estudiaremos las licencias \textit{Creative Commons} una nueva forma de licenciamiento que permite asignar diferentes "permisos" de utilización a un determinado trabajo y puede ser utilizadas tanto en Software como en Hardware. Exploraremos el movimiento de Software Libre y Código Abierto (FOSS) y como este contribuye a la transferencia tecnológica y como millones de usuarios a lo largo y ancho del mundo trabajan de forma conjunta para difundir, actualizar, mejorar, y aumentar las aplicaciones disponibles. Adicionalmente se presenta una propuesta a la creación de un movimiento que funcione con políticas similares pero centrado en el Desarrollo Hardware. + + +\section{El Conocimiento Como Bien Común} +El análisis del conocimiento como bien común tiene sus bases en el estudio de recursos naturales compartidos (agua, bosques, fauna, flora). El recurso puede ser pequeño y ser utilizado por un grupo reducido (El televisor familiar), puede ser de nivel comunitario (campos de juego, bibliotecas, paruqes etc) o pueden tener naturaleza internacional y mundial (oceanos, atmósfera, internet, conocimiento científico, etc), puden ser delimitados (la librería comunitaria), transfronterizos (El rio Amazonas, Internet, vida salvaje migratoria, etc) o sin límites claros (el conocimiento, la capa de ozono, etc). Adicionalmnete, existe una diferencia entre el bien común como un recurso o sistema de recursos y el bien común como un régimen de derechos de propiedad\cite{EO90}. El conocimiento posee características que lo diferencian de los recursos naturales, mientras muchos bienes comunes ven comprometido su sostenimiento a medida que aumenta el número de usuarios, el objetivo de utilizar el conocimiento como bien común es lograr su máxima difusión. El beneficio asociado al acceso a la información depende de la calidad de esta, a mayor calidad mayor el beneficio. + +El conocimiento, al igual que otros bienes comunes es utilizado de forma conjunta y es manejado por grupos de diversos intereses y tamaños. Para que este recurso sea útil se requiere una infra-estructura que permita su difusión, actualización, mejoramiento, realimentación y crecimiento. Pero como administrar un recurso intangible y distribuido como el conocimiento? Como coordinar acciones de miembros que se encuentran localizados en diferentes puntos geográficos? +Como coordinar acciones de miles de usuarios para garantizar un recurso útil y sostenible? Como convertir este conocimiento en motor de Desarrollo y crecimiento empresarial? Estas preguntas serán respondidas a lo largo de este capítulo. + +\subsection{Auto-Gobierno} + +Ostrom \cite{Ost00} argumenta que la forma más eficiente de administrar un bien común es el auto-gobierno ejercido por beneficiarios de dicho recurso. Si estos beneficiarios son conscientes de la importancia de un uso eficiente y racionado que garantice la existencia de este bien y toda acción o decisión que se haga es formulada pensando en el beneficio común se crearán normas que garantizan el beneficio de todos los usuarios y la sostenibilidad del recurso. El auto-gobierno requiere acciones colectivas que "emergen cuando se requiere el esfuerzo de dos o más individuos para cumplir con una meta" \cite{ST92}. Otro aspecto importante de las acciones colectivas es que son voluntarias por parte de los individuos \cite{MMDG04}. El autogobierno requiere de la acción combinada de conociminto y voluntad unido a normas institucionales consistentes. + +Ostrom \cite{EO92} y Baland and Platteau \cite{J.B96}, consideran que los atributos necesarios para que un recurso tenga una probabilidad alta de crear asociaciones de autogobierno son: + +\begin{itemize} + \item Posibilidad de mejoramiento: El recurso no se encuentra en un punto tal que sea inútil crear una organización alrededor de él. + \item Indicadores: Disponibilidad de indicadores confiables y válidos sobre la condición del recurso. + \item Predictibilidad: El flujo de unidades de recurso es relativamente predecible. + \item El recurso es lo suficientemente pequeño, teniendo en cuenta las tecnologías de comunicación utilizadas, para que los usuarios pueden tener un conocimiento preciso de los límites externos y de los micro-ambientes internos. +\end{itemize} + +Y los atributos de los usuarios del recurso son: + +\begin{itemize} + \item Prominencia: Los usuarios dependen del recurso para una parte importante de su sostenimiento. + \item Entendimiento común: Conocimiento sobre el funcionamiento del sistema y como acciones individuales afectan a los demás y al sistema. + \item Baja Tasa de Descuento: Para obtener un mayor beneficio a futuro se deben mantener tasas bajas de descuento del recurso. + \item Confianza y Reciprocidad: Los usuarios del recurso confían en que los demás mantendrán las promesas y se relacionarán entre ellos con reciprocidad. + \item Autonomía: Los usuarios pueden determinar reglas sin la intervención de autoridades externas + \item Experiencia Previa en Organización y Liderazgo Local: Los usuarios poseen habilidades mínimas de organización y liderazgo a través de la participación en otras asociaciones locales o eprendiendo de organizaciones en grupos cercanos. +\end{itemize} + +De los anteriores atributos podemos deducir que para que pueda emerger un auto-gobierno asociado a un recurso debe existir un excelente canal de comunicación entre los usuarios de dicho recurso y que todos ellos deben conocer y aceptar una serie de normas (creadas por ellos mismos) que fueron formuladas pensando en el beneficio común, un grupo de estas normas debe establecer mecanismos de resolución de conflictos, esto es vital ya que toda la organización se basa en la confianza mutua y no puede permitirse que las relaciones entre los usuarios se deteriore. Adicionalmente se requiere de miembros que tengan claro que el éxito de sus acciones y el sostenimiento del recurso depende de sus acciones, las cuales deben realizarse teniendo en cuenta el beneficio común. El conocimiento no se ve afectado por la sustracción (uso) del mismo, todo lo contrario, el objetivo es obtener el máximo número de usuasrios, sin embargo, este conocimiento puede llegar a ser obsoleto rápidamente, (en especial en el área de la Electrónica digital) y por lo tanto inservible, para que esto no suceda se requiere de la actualización de este conocimiento para que refleje el estado actual en un área determinada. + +\subsubsection{Ecuación Costo Beneficio de Ostrom} + +La pregunta que trata de responder Ostrom en su estudio es como emerge el auto-gobierno? \cite{Ost00} Para contestar esto formula una ecuación que describe el análisis costo-beneficio que un individuo realiza para participar en un gobierno comunal: + +\begin{lstlisting}[] + D < C (C1 + C2 + C3) +\end{lstlisting} + +Donde ($D$) es el incentivo al cambio y compara los beneficios de utilizar las reglas tradicionales (BO) frente a los beneficios de utilizar un nuevo grupo de reglas basadas en un gobierno comunal (BN) + +\begin{lstlisting} + D = BN - BO +\end{lstlisting} + +C1 costo anticipado asociado a la transición. +C2 el costo de corto plazo para adoptar y apropiar las nuevas estrategias. +C3 Costos de largo plazo: mantenimiento, monitoreo y auto-gobierno. + +Para que se realice el cambio el incentivo al cambio debe ser mayor que los costos asociados a el. + +\begin{lstlisting} + BN - BO > C + BN > BO + C +\end{lstlisting} + +Complejidades adicionales resultan de la interacción entre sub-grupos de usuarios, esta ecuación puede ser diferente para cada participante, por lo que es normal encontrar coaliciones y acciones. + +En la actualidad obervamos que grandes multinacionales como Nokia, Motorola o Google, están participando y promoviendo el desarrollo de productos y aplicaciones \cite{Mot} \cite{And} \cite{Mae} con la participación de la comunidad, lo que representa un giro de 180 grados en la políticas lideradas por multinacionales como Microsoft y Aple en las que todas sus creaciones están protegidas por licencias, acuerdos comerciales y contratos de exclusividad que restringen la participación en su desarrollo y aseguran el monopolio de los resultados de sus investigaciones. El movimiento de Software Libre \cite{FSF} hizo posible este cambio, proporcionando herramientas de desarrollo y facilidades para que cualquier persona alrededor del mundo pudiera realizar sus propias aplicaciones, gracias a esto se han creado aplicaciones como el servidor Web Apache, el explorador Mozilla el sistema operativo Linux, aplicaciones como gimp, openoffice, librerías como ncurses, Qt y entornos de trabajo como xfce, gnome y KDE. El trabajo realizado por miles de programadores para llegar a este estado ha sido enorme, y por esta razón los grandes multinacionales están poniendo sus ojos en estas iniciativas ya que les representa un gran ahorro de dinero, es decir, el costo de participar en estas iniciativas es mucho menor que el beneficio obtenido por participar en ellas. + +\subsubsection{Principios de Diseño} + +El primer paso para gobernar un bien común es la identificación de los principios de diseño de un recurso común robusto de larga duración. Ostrom \cite{EO90} después de dirigir un gran número de estudios empíricos sobre gobernancia de recursos de bienes comúnes. Encontró una serir de principios de diseño que hacen que el recurso sea sostenible a lo largo del tiempo. Los principales son: + +\begin{itemize} + \item Fronteras claramente definidas + \item Las reglas deben reflajar necesidades y condiciones locales. + \item Los individuos sujetos a estas reglas pueden modificar y participar en la elaboración de estas reglas. + \item Las autoridades externas deben respetar el derecho de los miembros de la comunidad a cear sus propias reglas. + \item Debe establecerse un sistema de seguimiento propio. + \item Disponibilidad de un sistema gradual de sanciones. + \item Acceso por parte de miembros de la comunidad a mecanismos de resolución de conflictos de bajo costo. + \item Las actividades de apropiación, suministro, monitoreo y sanción deben ser organizadas en estructuras anidadas con múltiples capas de actividades +\end{itemize} + +Es importante mencionar que no existe una combinación de principios que garantice el éxito, es necesario probar con este set para identificar los principios generales que deben incluir los sistemas robustos. Estos ocho factores fueron encontrados en la mayoría de las instituciones analizadas en cientos de estudios y constituyen un buen punto de partida para comenzar esta investigación. Estos ocho puntos se encuentran fuertemente relacionados con los atributos que requiere un recurso y un usario de este recurso para que pueda emerger un auto-gobierno y buscan que todos los participantes tengan pleno conocimiento de las reglas que monitorean, regulan, fijan y controlan las actividades de los miembros. + +\subsubsection{Movimiento FOSS} + +Es interesante consoiderar como este pensamiento aplica a proyectos de Código Abierto. El Software no es un recurso típico, porque no es sustraible, no existe un costo si un usuario decide usarlo o no. Sin embargo, es un bien común, ya que es un recurso comunal que prospera o decae gracias a la contribución de sus miembros. Los participantes de este tipo de recurso es el grupo de contribuidores potenciales, en lugar del grupo de posibles propietarios. Un aporte de un usuario a mejorar el proyecto se traduce en un beneficio colectivo. Los contribuyentes pueden ser empresas que pagan a una persona para que adicione una nueva característica, sin embargo, ellos pueden decidir no compartir estos cambios para tener una ventaja competitiva. En la actualidad observamos las tendeencias de multinacionales como Nokia o Motorola a participar, crear y promover proyectos de Software Libre, desde el punto de vista comercial resulta mpas rentable utilizar harramientas que han sido desarrolladas, probadas, y depuradas por miles de usuarios calificados que pagar a un grupo de decenas de desarrolladores para trabajar en sistemos propietarios. + +En los proyectos de Código Abierto puede utilizarse una variación modificada de la ecuación de Ostrom \cite{AC09}: + +\begin{lstlisting} + BC > BN + C +\end{lstlisting} + +Donde $BC$ es el beneficio a contribuir, y debe superar el costo de contribuir $C$ más el beneficio de no contribuir $BN$. La comunidad del Software Libre ha creado un grupo de normas e instituciones muy sofisticadas alrededor de esta ecuación dando como resultado uno de los estructuras auto-gobernadas más exitosas. Los trabajos de la comunidad de Software Libre hacen que $C$ sea cada vez más pequeño, proporcionando: + + +\begin{itemize} + \item Herramientas de programación, depuración y librerías que facilitan el desarrollo de nuevas aplicaciones o mejoras a las ya existentes. + \item Listas de discusión en donde los creadores de estas herramientas responden preguntas, y buscan en conjunto soluciones a problemas específicos + \item Sistemas de control de versiones y protocolos de comunicación. + \item Bases de datos de solución de problemas asociadas a las listas de discusión. + \item Tutoriales, documentación, libros disponibles on-line. +\end{itemize} + +Para contribuyentes no comerciales el costo de no contribuir es cero, pero, para contribuyentes comerciales $BN$ puede resultar muy grande, ya que pagar una nómina de programadores para que diseñen un sistema propio desde cero es mucho más costoso (en tiempo y en dinero) que pagar a pocos programadores pra utilizar y modificar proyectos ya existentes. La licencia más utilizada en los proyectos de Software Libre es la GPL, la cual, aunque no cubre todos los posibles tipos de uso, impone fuertes sanciones (escarnio público y consecuencias legales) cuando se utiliza y mejora un proyecto, pero no se comparten estos cambios con la comunidad. Más adelante estudiaremos el movimiento FOSS del cual se puede aprender mucho para crear nuestra versión de \textit{Hadrware Copyleft} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% FOSS %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{FOSS} + +Como se mencionó anteriormente, el movimiento FOSS es la estructura auto-gobernada más exitosa y será tomada como referencia en el desarrollo de nuestra iniciativa de Hardware Copyleft. Su principal innovación radica en un nuevo esquema de licencias unido a herramientas de colaboración basadas en Internet, lo que se cnvirtió en una nueva forma de bien común, donde los miembros de forma colectiva generan un buen común el \textit{software}. El desafío de FOSS es realizar \textit{acciones colectivas para crear y mantener este bien público}. A diferencia de la creencia popular, en este movimiento existen derechos de autor (\textit{copyright}) y propiedad, sin embargo, algunos individuos involucrados en el proyecto, poseen derechos legales sobre el códico (recurso), tienen control sobre las nuevas versiones del software y pueden excluir a otros que aportan código a las nuevas distribuciones. + +Los miembros del movimiento FOSS usualmente son programadores (y usuarios finales de software) que contribuyen (ya sea voluntariamente, o que se les pague para hacerlo) para producir un software bajo la licencia FOSS. La "situación de acción" que estos programadores encaran es, si en algún momento, vale la pena contribuir al desarrollo de este software. La interación de programadores trabajando de forma conjunta en Internet puede ser visto como un resultado que puede cambiar en el tiempo. Schweik y Semenov \cite{SAS03} identificaron tres estados de este tipo de bien común, una fase inicial, seguida por un estado de apertura y un estado más maduro de gran crecimiento (en términos de usuarios y participación), estabilización donde el número de participantes (normalmente pequeño) no varía, o el protecto se estanca y muere (sin participantes). Para que un proyecto sea exitoso, no es necesaria la participación de un gran número de programadores, es frecuente encontrar grupos pequeños de programadores con un gran número de usuarios. La clave del éxito está en la disponibilidad de un programador para contribuir al esfuerzo colectivo de por lo menos un pequeño grupo de actores que producen y mantienen el software. + +En la Figura \ref{framework_foss} se ilustra el marco definido por Ostrom y Hess \cite{CHEO06} para analizar el conocimiento como bien común, aplicado al movimiento FOSS. Como se mencionó anteriormente, el razgo que diferencia este movimiento es la utilización de una forma de licenciamiento especial. Richard Stallman \cite{Wikb}, a mediados de los 80 inició un proyecto para desarrollar un sistema operativo abierto/libre basado en \textit{unix} llamado \textit{GNU} (GNU is Not unix). + +\subsubsection{Reglas En Uso} + +Stallman \cite{Sta99} sostiene que las propiedades digitales del software hacen posible considerarlo como un bien público, proporcionando a sus usuarios \textit{la libertad} de utilizarlo, distribuirlo y modificarlo. Esta filosfía se basa en cuatro libertades que encarnan el principio \textit{copyleft}: + +\begin{itemize} + \item Libertad de ejecutar el software para cualquier propósito. + \item Libertad de estudiar como funciona el programa, y cambiarlo para hacer lo que se desee. El acceso al código fuente es una condición para esto. + \item Libertad para re-distribuir copias. + \item Libertad para distribuir copias de versiones modificadas. Lo que permite que la comunidad se beneficie de estos cambios. El acceso al código fuente es una condición para esto. +\end{itemize} + +Esta filosofía permite que los conocimientos y habilidades que el programador posee puedan ser transferidas a programadores, empresas, instituciones académicas y sociedades, ya sea en forma de producto o como herramienta de enseñanza. Esta actividad representa un proceso de Transferencia Tecnológica, en la que el que suministra la tecnología proporciona todos los medios para que el receptor pueda abosrverla y transformarla para satisfacer necesidades en su entorno social. Adicionalmente, Stallman ideó una forma de trabajar con las leyes de derechos de autor que proporciona una alternativa al licenciamiento tradicional. Las grandes multinacionales como Microsoft o Apple limitan el número de usuarios por licencia y hacen distribuciones de archivos binarios compilados en forma de ejecutables. El software con licencia \textit{copyleft} estipula que cualquier modificación que se le realice adquiere los principios de licenciamiento del software original. La licencia \textit{GPL}\footnote{http://www.gnu.org/licenses/licenses.html} (GNU General Public License) fue creada para implementar estos principios. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/framework_foss.png} \end{center} + \caption{Marco para analizar el conocimiento como bien común aplicado al movimiento FOSS: Modificación de: \cite{CHEO06} pág 46} \label{framework_foss} +\end{figure} + + +El proyecto de \textit{código abierto} liderado por Bruce Perens y Eric Raymond, utiliza las propiedades de la licencia GPL adicionando un grupo de \textit{derechos morales} dirigidos a conservar el trabajo del autor en su forma original, con el fín de conservar su autoría. Existe un gran número de variaciones de licenciamiento \footnote{http://www.opensource.org/licenses/alphabetical} para proyectos de Software Libre, lo que indica que al momento de licenciar un software el autor debe determinar que derechos retener y cuales regalar \cite{CMS06}. Las innovaciones del licenciamiento \textit{copyleft} constituyen las \textit{reglas en uso} que motivan a los programadores a participar en el movimiento FOSS, y establecen las bases de un régimen de propiedad común. + +La clave para mantener un bien común es la estructura de gobernanza de dicho recurso, el movimiento FOSS es un experimento en marcha, en dondes se prueba una mezcla imperfecta de liderazgo, mecanismos informales de coordinación, normas implícitas y explícitas junto con estructuras de gobernanza formal que evolucionan de tal forma que han logrado mantener unido este sistema tan camplejo \cite{Web04}. Aunque no existe literatura que estudie las estructuras de gobernanza en el movimiento FOSS, algunas observaciones a los proyectos existentes en la actualidad indican que estas estructuras podrían incluir: + +\begin{itemize} + \item Priorización de características a incluir en nuevas versiones del software. + \item Definición de Reglas y procedimientos para evaluar y escoger nuevos aportes para que hagan parte de las nuevas versiones. + \item Definición de Reglas y procedimientos para detectar y corregir errores en el software. + \item Asignación y administración de tareas. + \item Asistencia en la resolución de disputas entre miembros del equipo. +\end{itemize} + +Estas reglas varían dependiendo del estado del proyecto, ya que, las actividades que se deben realizar en cada etapa son diferentes, en la etapa inicial, se establece la comunidad de programadores que definen las especificaciones del software, por lo que las tarea más importante son el reclutamiento de programadores y la definción de una estructura flexible para el software. Cuando el proyecto alcanza una determinada madurez, lo importante es añadir funcionalidades y corregir errores. + + + +\subsubsection{Atributos de la Comunidad} + +La comunidad FOSS esta compuesta por usuarios y programadores voluntarios motivados por intereses tecnológicos, sociopolíticos, económicos y académicos. Desde el punto de vista tecnológico, resulta más efectivo en tiempo y en dinero, participar en un proyecto conjunto para la realización de una aplicación que satisface una determinada necesidad. La principal motivación sociopolítica es la creencia por parte del programador en la filosofía del movimiento, en lalucha contra el monopolio del software, adicionalmente, para que el proyecto permenezca durante mucho tiempo, es necesario que sea atractivo para vincular el mayor número de participantes y de esta forma sobrevivir en el futuro. Las motivaciones económicas y académicas pueden ser consideradas en forma conjunta ya que al participar en estos proyectos, los miembros adquieren o mejoran sus habilidades de programación ya sea revisando, leyendo y entendiendo el código existente o sometiendo a la revisión de los demás miembros sus contribuciones. Por otro lado, esta participación puede verse como una vitrina en donde el programador muestra sus capacidades y puede ser contactado por empresas para establecer relaciones comerciales. En los dos casos la participación es una forma de inversión y una forma de ganar experiencia y reputación \cite{VWJ+03}. + +En proyectos con un gran número de personas asociadas, solo un pequeño porcentaje de ellos realizan la mayor parte del trabajo. En la actualidad muchas empresas están participando de forma activa en estos proyectos, aportando programadores pagados para que contribuyan con el desarrollo y mejoramiento del softeare. Un estudio realizado a 25 firmas participantes en el proyecto FOSS \textit{Linux Operating System} \cite{GGR02} indica que la tercera parte de los programadores encuestados son pagados por sus empleadores para participar, y que su motivación a participar es el interes propio en estandarización, disminución de costos, estrategias para debilitar a la competencia y esfuerzos para hacer sus productos compatibles con los productos derivados del movimiento FOSS. + + + +\subsubsection{Atributos Físicos} + +Existen tres categorías \cite{CMS06} en FOSS que pueden ser consideradas como atributos físicos: + +\begin{enumerate} + \item La utilidad del Software: Como vimos anteriormente, para que una persona participe en una actividad relacionada con el bien común, el costo por no hacerlo debe ser mayor que el beneficio por participar, es decir, el software debe representar una utilidad grande para que valga la pena participar en el proyecto. + \item El diseño o la estructura del software. Un código limpio (optimizado, documentado y óptimo) y modularizado permite el trabajo en paralelo, lo que reduce el tiempo de depuración y el requerido para implementar nuevas características. + \item La infraestructura que hace posible coordinar y administrar la colaboración y la producción: El uso de Internet para soportar herramientas de control de versiones (como \textit{svn}, \textit{cvs} y \textit{git}) y la comunicación vía listas de discusión hace posible coordinar de forma eficiente los esfuerzos de cooperación. Permitiendo: + \begin{itemize} + \item Almacenar versiones de software. + \item La descarga de módulos. + \item La adición de Nuevas contribuciones y la protección del código existente. + \item Generar un historial donde se documentan los cambios realizados a lo largo del tiempo. + \item Analizar funciones para identificar diferencias entre versiones. + \item Informar a los miembros del equipo cambios en los módulos del proyecto. + \end{itemize} +\end{enumerate} + +Esta infraestructura trabaja junto con las reglas-en-uso establecidas para proporcionar procesos que direccionen nuevos trabajos, un sistema para recibir y revisar contribuciones de nuevos módulos que pueden ser incluidos en futuras versiones. + +En conclusión, los proyectos FOSS evolucionan en el tiempo como resultado de la configuración de sus reglas-en-uso, atributos de la comunidad y atributos físicos relacionados con la estructura del software para hacer fácil la colaboración y herramientas efectivas para coordinación de equipos y manejo de contenido. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Copy Left %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Propiedad Intelectual y Licencias} + +Para utilizar el paradigma colaborativo del movimiento FOSS para adaptarlo a cualquier forma de propiedad intelectual (incluyendo la creación de hardware) es necesario ampliar el término \textit{copyleft} de Stallman. El primer en esta dirección fué dado por el mismo Stallman al desarrollar la licencia GFDL (GNU Free Documentation License) aplicable a todo tipo de documentación técnica, guias de usuario, tutoriales, etc. Esta licencia gobierna el uso, modificación y distribución de la documentación del software GNU, especificando las secciones del documento que no puden ser modificadas (tales como autor, aviso de derechos de autor), los términos de distribución. + + +\subsection{Licencias Creative Commons} + +Creative Commons \footnote{http://creativecommons.org/} organización no gubernamental sin ánimo de lucro ha desarrollado una serie de licencias basadas en principios similares a los de Stallman y que puden ser aplicadas a trabajos realizados en música, arte, video, texto y notas de clase. Estas licencias permiten que el autor de un trabajo conserve la propiedad intelectual (los derechos asociados a esta) pero posibilitando su copia y distribución, con la única condición de dar créditos al autor \cite{CCb}. Se puede elegir diferentes permisos dependiendo de los deseos del autor, para definir dichos permisos CreativeCommons proporciona una serie de preguntas que buscan determinar los derechos que se desean conservar y los que desean liberar. Las preguntas claves son: 1) Los lectores pueden copiar y distribuir su trabajo libremente? 2) Es permitido a los usuarios crear trabajos derivados del contenido digital? Si es permitido, estas modificaciones deben tener la misma licencia que el trabajo original (esquema de licencia viral), o deben ser distribuidos bajo un esquema de licencias diferente? 3) Es necesario atribuir el trabajo al autor original?. Estas preguntas son la base para definir un esquema de licencias modular. + +Existen cuatro bloques constructivos para las licencias Creative Commons estos son: + +\begin{itemize} + \item \textit{Atribución} (\textbf{BY}): Se permite la distribución pero se debe dar crédito al autor. + \item \textit{No comercial} (\textbf{NC}): Se permite la distribución del trabajo sin fines comerciales, si se desea utilizar este trabajo para obtener dinero es necesaria una autorización del autor + \item \textit{No a trabajos derivados} (\textbf{ND}): Permite la copia y la distribución del trabajo original sin modificaciones. + \item \textit{Compartir de la misma forma} (\textbf{SA}): Exige que todo trabajo derivado del uso de proyectos que con este esquema de licencias deben tener la misma licencia de los trabajos originales. +\end{itemize} + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% COPY LEFT HW %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Hardware Copyleft} + +En esta sección se relizará la definición del término \textit{hardware copyleft} como una extensión del proyecto \textit{FOSS}. Una de las hipótesis manejadas durante el desarrollo de este trabajo es que el conocimiento debe ser considerado como un bien común y que los usuarios de este recurso deben utilizarlo de tal forma que se beneficie la comunidad asociada a dicho recurso. Como estrategia para obtener una transferencia tecnológica y de conocimientos exitosa a la academia y a la industria electrónica nacional (en el área de sistemas digitales) se utilizará el principio del conocimiento como bien común para crear una comunidad que utilice como recurso inicial el trabajo generado en este proyecto. + +Los dispositivos digitales modernos poseen dos grandes componentes, el hardware que proporciona recursos como capacidad de cómputo, capacidad de almacenamiento, medios de comunicación e interfaz con otros dispositivos y con el mundo real; y el software implementa una determinada funcionalidad utilizando los recursos hardware. Normalmente estos dispositivos están diseñados para ejecutar una función única, por lo que el componente hardware se encuentra optimizado (funcionalidad, tamaño, consumo de potencia, costos) para la ejecución de dicha tarea. Como se mencionó anteriormente existe un movimiento muy fuerte (FOSS) que proporciona una gran variedad de herramientas para la implementación del componente software. Sin embargo, hasta el momento no existe un movimiento similar dirigido al desarrollo del componente hardware. Mi hipótesis es que un movimiento de hardware abierto permitirá el desarrollo de la industria electrónica local permitiendo la transferencia exitosa de tecnología y conocimientos en el área de diseño de sistemas embebidos. + +Haciendo una analogía con el movimiento FOSS, la iniciativa \textit{hardware copyleft} permitiría el uso, distribución, y modificación de proyectos hardware existentes. La acción de modificación se origina por una necesidad que se debe satisfacer, implica un entendimiento del principio de funcionamiento y del proceso de fabricación asociados al proyecto original. Lo anterior cumple con la definición de transferencia tecnológica exitosa: ``\cite{Mo94} El problema de transfencia de conocimiento (o know-how) sobre un número de aspectos (que incluyen el conocimiento) sobre como funciona un determinado sistema, como operarlo y desarrollar sus aplicaciones, como mantenerlo y si es necesario, como producir sus componentes y montar un sistema similar. La transferencia tecnológica se considera exitosa cuando los receptores de la tecnología asimilan los conceptos anteriores para suplir sus necesidades locales''. + +El reto en la definición del concepto de \textit{hardware copyleft} radica en la naturaleza del componente hardware, a diferencia del software donde solo es necesario descargar el código fuente y las herramientas de compilación para modificar un proyecto existente ; los proyectos hardware involucran procesos de fabricación, montaje y pruebas que tienen asociados unos costos que varían dependiendo de la tecnología utilizada (ASIC, PCB). Este costo representa un factor que afecta a los potenciales miembros de la comunidad, en el peor de los casos predefiniendo sus perfiles o limitando el acceso. Por este motivo, se debe considerar el impacto del factor económico en la formación de la comunidad, definiendo las características que deben poseer estos proyectos para minimizar el costo asociado. + + +\subsection{Atributos de la Comunidad} + +El éxito de la iniciativa \textit{FOSS} se debe en parte a la gran comunidad que comparte la ideología del software libre \cite{RS07},sus miembros buscan: satisfacer necesidades propias \cite{JK00}, aprendizaje \cite{HIH02}, reputación dentro y fuera de la comunidad, asociación e identidad \cite{GH03}, diversión y creatividad \cite{RAG+02}. Para que la propuesta \textit{hardware copyleft} sea una realidad, es importante identificar los motivos por los cuales estos individuos se unen a este tipo de comunidades y como las diferentes formas de gobierno afectan su participación, y como esta experiencia exitos puede ser utilizada en nuestro movimiento. + +Un estudio reciente, realizado sobre diferentes comunidades software \cite{SS06} \cite{KBCR10} revela que la razón inicial para la participación es la necesidad de cambios, alteraciones o asistencia a proyectos existentes, su resultado se resumen en la tabla \ref{participation}. A pesar de que los costos de contribución son relativamente altos en términos de tiempo y esfuerzo, muchos programadores se unen a esta comunidad buscando: + +\begin{itemize} + \item \textit{Reciprocidad.} Una gran cantidad de los participantes en los proyectos software que fueron consultados en este estudio expresaban la necesidad de que la reciprocidad sea parte de las normas de la comunidad. Una gran parte de proyectos son liberados con el propósito de suplir una necesidad, ya sea por la inexistencia de una herramienta que realice ciertas funciones o para reemplazar una comercial, sus autores buscan con esto que otras personas liberen sus trabajos para que puedan ser utilizados por la comunidad. + + \item \textit{Mejoras.} Someter el código a la inspección de miles de programadores ayuda a depurar y limpiar el código, adicionalmente se logra aumentar su funcionalidad y se aumenta el número de usuarios. Sin el apoyo de la comunidad estas mejoras tomarían mucho tiempo o en algunos casos nunca se realizarían. + + \item \textit{Contribución con la escritura de código fuente.} Algunos de los miembros de estas comunidades son empleados de compañías que utilizan resultados de estos proyectos en sus productos comerciales, y dentro de sus intereses está incluir en las distribuciones oficiales funcionalidades creadas por ellos. + + \item \textit{Motivos profesionales.} Razones como reputación, desarrollo de habilidades tienen una importancia relativamente baja en la creación y contribución de código. La mayoría expresa que su participación busca conocimiento específico del proyecto y no para adquirir habilidades específicas; al trabajar con programadores más experimentados se agudizan o expanden ciertas habilidades. + + \item \textit{Disfrute y Entretenimiento} Un gran porcentaje de los participantes con mayor tiempo de permanencia manifiestan que esta actividad les proporciona un pasatiempo desafiante; curiosamente este tipo de participantes superan en número a los que se participan para suplir necesidades. +\end{itemize} + +\begin{center} + \begin{table}[H] + \begin{tabular}{|m{1.8cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}|} \hline + \textbf{Motivo para crear} & \textbf{Motivo para contribuir} & \textbf{Nivel de participación} & \textbf{No. relativo de participantes} & \textbf{Conocimiento del código y estructura} \\ \hline + + \multirow{5}{*}[-2cm]{\textbf{\textit{Necesidad}}} + & Reciprocidad; normas & Bajo & Alto & Limitado al área del problema inicial \\\cline{2-5} + & Mejoras futuras & Variable, depende de la necesidad & Moderada & En el área del problema \\\cline{2-5} + & Deseo de integrar + código propio en el + código fuente & Moderado a alto & Bajo & Variable \\\cline{2-5} + & Motivos profesionales & Bajo & Muy bajo & variable \\\cline{2-5} + & No contribuye & Muy bajo & NA & Limitado al área del problema inicial \\ \hline + \textbf{\textit{Diversión y disfrute}} + & Realimentación & Alto & Bajo & Comienza en un área determinada, y se expande \\ \hline + \end{tabular} + \caption{Motivación de la participación de desarrolladores en proyectos de softawre libre. Fuente \cite{SS06} } \label{compet_4} + \end{table} +\end{center} + + + +Este estudio concluye que muchos miembros de estas comunidades ingresan para suplir necesidades, pero muchos de ellos continuan creando código porque disfrutan programar. Estos \textit{aficionados} realizan un papel muy importante dentro de la comunidad encargándose de tareas como mejora de la plataforma tecnológica, re-escribiendo secciones de código, documentandolo, respondiendo preguntas, preservar o mejorar la arquitectura. Otros consideran que la reciprocidad es vital para la contribución de código a la comunidad y que la forma de gobierno afecta dramáticamente la participación de programadores voluntarios. + + +\begin{center} + \begin{table}[H] + \begin{tabular}{|m{2.8cm}|c|} \hline + \textbf{Mecanismos de Gobierno} & \textbf{Motivo para contribuir} \\\hline + \multicolumn{2}{|c|} {Toma de decisiones} \\\hline + \multirow{3}{*}[-2cm]{\textit{Control del Código} + & Limita las \\\hline + \end{tabular} + \end{table} +\end{center} + + + +\subsection{Atributos Físicos} + + + + + + +\subsection{ECB\_AT91, ECBOT, ECB\_BFIN} Plataformas realizadas para adquirir experiencia en el diseño de sistemas embebidos +detectar las habilidades que se necesitan para realizar el proceso + +\subsection{Proyecto Qi-Hardware} + + + +% whatever form or technol- +% ogy the land-use model utilizes (e.g., a computer program, a statistical +% script, and so on), it should be placed under some license that allows the +% free copying of the model, requires the model ?source? to be readable, +% and permits the development of new derivative components of the model +% or other products related to the model. In some instances, the +% model developers might decide to make all related products (e.g., the +% model modules, their documentation, data, and even theoretical papers) +% fall under these conditions. However, there will be situations where more +% restrictive licensing is warranted. For instance, empirical papers describ- +% ing a particular application of a model would probably be licensed with +% a ?no derivative work? component, because these types of papers report +% findings from a particular study at a particular time. + + + +% +% INTERNET INTERNET +% Clearly, the Internet, as a technological advance, is as important a +% ?structural change? to the way scientific advances are communicated and +% collaborated on as was the printing press. Digital storage has become so +% cheap that many treat the saving of a file on a hard disk as nearly cost- +% less. Advances like the web and e-mail software have greatly reduced the +% costs or skills required to access information on the Internet. Over the +% last five to ten years, the Internet has moved from a domain utilized pri- +% marily by high-skilled computer scientists, engineers, or others in the +% high-tech industries, to a system utilized by scientists and scholars in all +% disciplines. We are now in a shake-up period where traditional organi- +% zations chartered with the management of scientific information (e.g., +% libraries, publishers) are developing new organizational models and mis- +% sions built around computer database and connectivity issues (see, for +% example, chapters 4 and 11 in this book). This environment, where +% digital files can be copied and transferred globally in an instant and at +% very little cost, makes it much easier to treat information or knowledge +% as a global public good. But as other contributors to this book describe, +% these advances in technology are directly at odds with other societal +% trends and developments in intellectual copyright law that are pushing +% to treat information and other digital products as private goods for mon- +% etary gain (see chapters 5 and 7). +% +% To promote the argument made in the opening paragraph of this +% chapter?that the collaborative ideals and principles applied in FOSS +% projects are potentially applicable to any collaboration built around +% intellectual property?I first provide an overview and summary of the +% FOSS software ?movement? and describe some critical project compo- +% nents. I use the Institutional Analysis and Development Framework +% described in chapter 3 to help guide the description of these projects. +% Next, I provide more detail on the argument that the FOSS collabora- +% tive principles and approaches can extend more broadly to scientific +% research in general. At this juncture, I introduce the more recent inno- +% vation of ?open-content? licensing. Using a short example in the scien- +% tific field of land-use change modeling, I then provide a discussion of +% some critical issues that will need to be addressed in order to transfer +% the collaborative principles of FOSS software commons to scientific- +% commons endeavors. + + + + + diff --git a/course/.docs/book/commons.tex.backup b/course/.docs/book/commons.tex.backup new file mode 100644 index 0000000..2b70f79 --- /dev/null +++ b/course/.docs/book/commons.tex.backup @@ -0,0 +1,367 @@ +\chapter{Copyleft HW/SW y el Conocimiento Como Bien Común} +\label{ch:common} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% El conocimiento como bien común %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Introducción} + +Es indudable que el desarrollo tecnológico de un país se encuentra ligado al mejoramiento de la calidad de vida de sus habitantes, y que para que un país en vía de desarrollo se realice una transferencia tecnológica (y de conocimientos asociados a la tecnología que se transfiere) exitosa que permita desarrollar productos similares, pero ajustados al contexto socio-económico local, es necesario que el país cuente con la capacidad de absorber las habilidades, técnicas, información y organización asociadas a dicha tecnología. Esta absorción de conocimientos debe ser realizada por un gran número de personas para que la transferencia tenga un impacto significativo en la sociedad, este conocimiento debe ser considerado como un bien público, y como tal, el acceso a él, debe ser un derecho y por lo tanto, la sociedad debe garantizar los mecanismos de difusión para que llegue a los sectores de la sociedad interesados en él. De igual forma, es un deber, de los sectores que utilizan este bien común contribuir a su difusión, actualización, mejoramiento, y crecimiento. + +Un bien común es un recurso compartido que es vulnerable a dilemas sociales, es el resultado de interacciones entre personas y recursos, las cuales pueden ser positivas o negativas. El concepto de bien común esta asociado a la \textit{libertad de expresión}, \textit{libre acceso} y \textit{autogobierno} + +El conocimiento en este trabajo se refiere a las ideas intangibles, información y datos de todo tipo en que el conocimiento es expresado u obtenido, como todo tipo de entendimiento adquirido a través de la experiencia o estudio ya sea propio, científico, académico o no académico. El conocimiento puede ser visto como una mercancía y como una fuerza constitutiva de la sociedad lo que evidencia la naturaleza compleja de este recurso, adicionalmente, la adqusición y descubrimiento de conocimiento es un proceso social y personal. \textit{El descubrimiento de conocimiento es un bien común y un tesoro que dejamoa a futuras generaciones y el reto de nuestra generación es en mantener los caminos del descubrimiento abiertos}. + +El acceso al conocimiento debe garantizarse sin restricción alguna a las personas interesadas, al considerar el conocimiento como un producto comercial se limita su difusión favoreciendo a un grupo de la población, lo cual es inaceptable, ya que representa una forma de discriminación. En nuestro pais, el acceso a la información ha ido aumentando gracias a la aparición de Internet y a la gran cantidad de proyectos existentes que buscan difundir todo tipo de conocimientos. Sin embargo, para poder asimilar este conocimiento se requieren ciertas habilidades que se adquieren después de un procesos de enseñanza formal. En Colombia el acceso a la educación superior de calidad es limitado, la cobertura de las Universidades públicas está limitada por la inversión del estado, y como pudimos ver anteriormente, en nuestro país la preocupación actual es la seguridad y no la educación. Por lo tanto, hacer del conocimiento un bien común requiere la intervención de diferentes sectores que garanticen y regulen el acceso, generen, clasifiquen y administren la forma en la que se expresa el conocimiento. + +La diferencia entre esta propuesta y las existentes promovidas por los organismos gubernamentales, es el énfasis en la transferencia y difusión del conocimiento, del \textit{saber hacer}, muchas políticas existentes se enfocan en la compra de equipo, lo que, como se vió antes no es el canal más eficiente para la transferencia tecnológica. Nuestros esfuerzos están enfocados a crear un conocimiento básico en la Concepción, Diseño, Implementación y Diseño de Sistemas Embebidos. Este conocimiento es el resultado de años de experimentación e investigación en el área, al ser colocado a disposición de usuarios interesados, se aumentan las posibilidades de difusión, ya que ya se realizó un trabajo previo de "adaptación" a las condiciones de la plataforma tecnológica local y al contexto económico y social. En la actualidad existen instituciones educativas que proporcionan conocimientos similares pero no tienen la profundidad del presente estudio y limitan el acceso a esta información cobrando altos precios para acceder a ella. + +En este capítulo estudiaremos las licencias \textit{Creative Commons} una nueva forma de licenciamiento que permite asignar diferentes "permisos" de utilización a un determinado trabajo y puede ser utilizadas tanto en Software como en Hardware. Exploraremos el movimiento de Software Libre y Código Abierto (FOSS) y como este contribuye a la transferencia tecnológica y como millones de usuarios a lo largo y ancho del mundo trabajan de forma conjunta para difundir, actualizar, mejorar, y aumentar las aplicaciones disponibles. Adicionalmente se presenta una propuesta a la creación de un movimiento que funcione con políticas similares pero centrado en el Desarrollo Hardware. + + +\section{El Conocimiento Como Bien Común} +El análisis del conocimiento como bien común tiene sus bases en el estudio de recursos naturales compartidos (agua, bosques, fauna, flora). El recurso puede ser pequeño y ser utilizado por un grupo reducido (El televisor familiar), puede ser de nivel comunitario (campos de juego, bibliotecas, paruqes etc) o pueden tener naturaleza internacional y mundial (oceanos, atmósfera, internet, conocimiento científico, etc), puden ser delimitados (la librería comunitaria), transfronterizos (El rio Amazonas, Internet, vida salvaje migratoria, etc) o sin límites claros (el conocimiento, la capa de ozono, etc). Adicionalmnete, existe una diferencia entre el bien común como un recurso o sistema de recursos y el bien común como un régimen de derechos de propiedad\cite{EO90}. El conocimiento posee características que lo diferencian de los recursos naturales, mientras muchos bienes comunes ven comprometido su sostenimiento a medida que aumenta el número de usuarios, el objetivo de utilizar el conocimiento como bien común es lograr su máxima difusión. El beneficio asociado al acceso a la información depende de la calidad de esta, a mayor calidad mayor el beneficio. + +El conocimiento, al igual que otros bienes comunes es utilizado de forma conjunta y es manejado por grupos de diversos intereses y tamaños. Para que este recurso sea útil se requiere una infra-estructura que permita su difusión, actualización, mejoramiento, realimentación y crecimiento. Pero como administrar un recurso intangible y distribuido como el conocimiento? Como coordinar acciones de miembros que se encuentran localizados en diferentes puntos geográficos? +Como coordinar acciones de miles de usuarios para garantizar un recurso útil y sostenible? Como convertir este conocimiento en motor de Desarrollo y crecimiento empresarial? Estas preguntas serán respondidas a lo largo de este capítulo. + +\subsection{Auto-Gobierno} + +Ostrom \cite{Ost00} argumenta que la forma más eficiente de administrar un bien común es el auto-gobierno ejercido por beneficiarios de dicho recurso. Si estos beneficiarios son conscientes de la importancia de un uso eficiente y racionado que garantice la existencia de este bien y toda acción o decisión que se haga es formulada pensando en el beneficio común se crearán normas que garantizan el beneficio de todos los usuarios y la sostenibilidad del recurso. El auto-gobierno requiere acciones colectivas que "emergen cuando se requiere el esfuerzo de dos o más individuos para cumplir con una meta" \cite{ST92}. Otro aspecto importante de las acciones colectivas es que son voluntarias por parte de los individuos \cite{MMDG04}. El autogobierno requiere de la acción combinada de conociminto y voluntad unido a normas institucionales consistentes. + +Ostrom \cite{EO92} y Baland and Platteau \cite{J.B96}, consideran que los atributos necesarios para que un recurso tenga una probabilidad alta de crear asociaciones de autogobierno son: + +\begin{itemize} + \item Posibilidad de mejoramiento: El recurso no se encuentra en un punto tal que sea inútil crear una organización alrededor de él. + \item Indicadores: Disponibilidad de indicadores confiables y válidos sobre la condición del recurso. + \item Predictibilidad: El flujo de unidades de recurso es relativamente predecible. + \item El recurso es lo suficientemente pequeño, teniendo en cuenta las tecnologías de comunicación utilizadas, para que los usuarios pueden tener un conocimiento preciso de los límites externos y de los micro-ambientes internos. +\end{itemize} + +Y los atributos de los usuarios del recurso son: + +\begin{itemize} + \item Prominencia: Los usuarios dependen del recurso para una parte importante de su sostenimiento. + \item Entendimiento común: Conocimiento sobre el funcionamiento del sistema y como acciones individuales afectan a los demás y al sistema. + \item Baja Tasa de Descuento: Para obtener un mayor beneficio a futuro se deben mantener tasas bajas de descuento del recurso. + \item Confianza y Reciprocidad: Los usuarios del recurso confían en que los demás mantendrán las promesas y se relacionarán entre ellos con reciprocidad. + \item Autonomía: Los usuarios pueden determinar reglas sin la intervención de autoridades externas + \item Experiencia Previa en Organización y Liderazgo Local: Los usuarios poseen habilidades mínimas de organización y liderazgo a través de la participación en otras asociaciones locales o eprendiendo de organizaciones en grupos cercanos. +\end{itemize} + +De los anteriores atributos podemos deducir que para que pueda emerger un auto-gobierno asociado a un recurso debe existir un excelente canal de comunicación entre los usuarios de dicho recurso y que todos ellos deben conocer y aceptar una serie de normas (creadas por ellos mismos) que fueron formuladas pensando en el beneficio común, un grupo de estas normas debe establecer mecanismos de resolución de conflictos, esto es vital ya que toda la organización se basa en la confianza mutua y no puede permitirse que las relaciones entre los usuarios se deteriore. Adicionalmente se requiere de miembros que tengan claro que el éxito de sus acciones y el sostenimiento del recurso depende de sus acciones, las cuales deben realizarse teniendo en cuenta el beneficio común. El conocimiento no se ve afectado por la sustracción (uso) del mismo, todo lo contrario, el objetivo es obtener el máximo número de usuasrios, sin embargo, este conocimiento puede llegar a ser obsoleto rápidamente, (en especial en el área de la Electrónica digital) y por lo tanto inservible, para que esto no suceda se requiere de la actualización de este conocimiento para que refleje el estado actual en un área determinada. + +\subsubsection{Ecuación Costo Beneficio de Ostrom} + +La pregunta que trata de responder Ostrom en su estudio es como emerge el auto-gobierno? \cite{Ost00} Para contestar esto formula una ecuación que describe el análisis costo-beneficio que un individuo realiza para participar en un gobierno comunal: + +\begin{lstlisting}[] + D < C (C1 + C2 + C3) +\end{lstlisting} + +Donde ($D$) es el incentivo al cambio y compara los beneficios de utilizar las reglas tradicionales (BO) frente a los beneficios de utilizar un nuevo grupo de reglas basadas en un gobierno comunal (BN) + +\begin{lstlisting} + D = BN - BO +\end{lstlisting} + +C1 costo anticipado asociado a la transición. +C2 el costo de corto plazo para adoptar y apropiar las nuevas estrategias. +C3 Costos de largo plazo: mantenimiento, monitoreo y auto-gobierno. + +Para que se realice el cambio el incentivo al cambio debe ser mayor que los costos asociados a el. + +\begin{lstlisting} + BN - BO > C + BN > BO + C +\end{lstlisting} + +Complejidades adicionales resultan de la interacción entre sub-grupos de usuarios, esta ecuación puede ser diferente para cada participante, por lo que es normal encontrar coaliciones y acciones. + +En la actualidad obervamos que grandes multinacionales como Nokia, Motorola o Google, están participando y promoviendo el desarrollo de productos y aplicaciones \cite{Mot} \cite{And} \cite{Mae} con la participación de la comunidad, lo que representa un giro de 180 grados en la políticas lideradas por multinacionales como Microsoft y Aple en las que todas sus creaciones están protegidas por licencias, acuerdos comerciales y contratos de exclusividad que restringen la participación en su desarrollo y aseguran el monopolio de los resultados de sus investigaciones. El movimiento de Software Libre \cite{FSF} hizo posible este cambio, proporcionando herramientas de desarrollo y facilidades para que cualquier persona alrededor del mundo pudiera realizar sus propias aplicaciones, gracias a esto se han creado aplicaciones como el servidor Web Apache, el explorador Mozilla el sistema operativo Linux, aplicaciones como gimp, openoffice, librerías como ncurses, Qt y entornos de trabajo como xfce, gnome y KDE. El trabajo realizado por miles de programadores para llegar a este estado ha sido enorme, y por esta razón los grandes multinacionales están poniendo sus ojos en estas iniciativas ya que les representa un gran ahorro de dinero, es decir, el costo de participar en estas iniciativas es mucho menor que el beneficio obtenido por participar en ellas. + +\subsubsection{Principios de Diseño} + +El primer paso para gobernar un bien común es la identificación de los principios de diseño de un recurso común robusto de larga duración. Ostrom \cite{EO90} después de dirigir un gran número de estudios empíricos sobre gobernancia de recursos de bienes comúnes. Encontró una serir de principios de diseño que hacen que el recurso sea sostenible a lo largo del tiempo. Los principales son: + +\begin{itemize} + \item Fronteras claramente definidas + \item Las reglas deben reflajar necesidades y condiciones locales. + \item Los individuos sujetos a estas reglas pueden modificar y participar en la elaboración de estas reglas. + \item Las autoridades externas deben respetar el derecho de los miembros de la comunidad a cear sus propias reglas. + \item Debe establecerse un sistema de seguimiento propio. + \item Disponibilidad de un sistema gradual de sanciones. + \item Acceso por parte de miembros de la comunidad a mecanismos de resolución de conflictos de bajo costo. + \item Las actividades de apropiación, suministro, monitoreo y sanción deben ser organizadas en estructuras anidadas con múltiples capas de actividades +\end{itemize} + +Es importante mencionar que no existe una combinación de principios que garantice el éxito, es necesario probar con este set para identificar los principios generales que deben incluir los sistemas robustos. Estos ocho factores fueron encontrados en la mayoría de las instituciones analizadas en cientos de estudios y constituyen un buen punto de partida para comenzar esta investigación. Estos ocho puntos se encuentran fuertemente relacionados con los atributos que requiere un recurso y un usario de este recurso para que pueda emerger un auto-gobierno y buscan que todos los participantes tengan pleno conocimiento de las reglas que monitorean, regulan, fijan y controlan las actividades de los miembros. + +\subsubsection{Movimiento FOSS} + +Es interesante consoiderar como este pensamiento aplica a proyectos de Código Abierto. El Software no es un recurso típico, porque no es sustraible, no existe un costo si un usuario decide usarlo o no. Sin embargo, es un bien común, ya que es un recurso comunal que prospera o decae gracias a la contribución de sus miembros. Los participantes de este tipo de recurso es el grupo de contribuidores potenciales, en lugar del grupo de posibles propietarios. Un aporte de un usuario a mejorar el proyecto se traduce en un beneficio colectivo. Los contribuyentes pueden ser empresas que pagan a una persona para que adicione una nueva característica, sin embargo, ellos pueden decidir no compartir estos cambios para tener una ventaja competitiva. En la actualidad observamos las tendeencias de multinacionales como Nokia o Motorola a participar, crear y promover proyectos de Software Libre, desde el punto de vista comercial resulta mpas rentable utilizar harramientas que han sido desarrolladas, probadas, y depuradas por miles de usuarios calificados que pagar a un grupo de decenas de desarrolladores para trabajar en sistemos propietarios. + +En los proyectos de Código Abierto puede utilizarse una variación modificada de la ecuación de Ostrom \cite{AC09}: + +\begin{lstlisting} + BC > BN + C +\end{lstlisting} + +Donde $BC$ es el beneficio a contribuir, y debe superar el costo de contribuir $C$ más el beneficio de no contribuir $BN$. La comunidad del Software Libre ha creado un grupo de normas e instituciones muy sofisticadas alrededor de esta ecuación dando como resultado uno de los estructuras auto-gobernadas más exitosas. Los trabajos de la comunidad de Software Libre hacen que $C$ sea cada vez más pequeño, proporcionando: + + +\begin{itemize} + \item Herramientas de programación, depuración y librerías que facilitan el desarrollo de nuevas aplicaciones o mejoras a las ya existentes. + \item Listas de discusión en donde los creadores de estas herramientas responden preguntas, y buscan en conjunto soluciones a problemas específicos + \item Sistemas de control de versiones y protocolos de comunicación. + \item Bases de datos de solución de problemas asociadas a las listas de discusión. + \item Tutoriales, documentación, libros disponibles on-line. +\end{itemize} + +Para contribuyentes no comerciales el costo de no contribuir es cero, pero, para contribuyentes comerciales $BN$ puede resultar muy grande, ya que pagar una nómina de programadores para que diseñen un sistema propio desde cero es mucho más costoso (en tiempo y en dinero) que pagar a pocos programadores pra utilizar y modificar proyectos ya existentes. La licencia más utilizada en los proyectos de Software Libre es la GPL, la cual, aunque no cubre todos los posibles tipos de uso, impone fuertes sanciones (escarnio público y consecuencias legales) cuando se utiliza y mejora un proyecto, pero no se comparten estos cambios con la comunidad. Más adelante estudiaremos el movimiento FOSS del cual se puede aprender mucho para crear nuestra versión de \textit{Hadrware Copyleft} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% FOSS %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{FOSS} + +Como se mencionó anteriormente, el movimiento FOSS es la estructura auto-gobernada más exitosa y será tomada como referencia en el desarrollo de nuestra iniciativa de Hardware Copyleft. Su principal innovación radica en un nuevo esquema de licencias unido a herramientas de colaboración basadas en Internet, lo que se cnvirtió en una nueva forma de bien común, donde los miembros de forma colectiva generan un buen común el \textit{software}. El desafío de FOSS es realizar \textit{acciones colectivas para crear y mantener este bien público}. A diferencia de la creencia popular, en este movimiento existen derechos de autor (\textit{copyright}) y propiedad, sin embargo, algunos individuos involucrados en el proyecto, poseen derechos legales sobre el códico (recurso), tienen control sobre las nuevas versiones del software y pueden excluir a otros que aportan código a las nuevas distribuciones. + +Los miembros del movimiento FOSS usualmente son programadores (y usuarios finales de software) que contribuyen (ya sea voluntariamente, o que se les pague para hacerlo) para producir un software bajo la licencia FOSS. La "situación de acción" que estos programadores encaran es, si en algún momento, vale la pena contribuir al desarrollo de este software. La interación de programadores trabajando de forma conjunta en Internet puede ser visto como un resultado que puede cambiar en el tiempo. Schweik y Semenov \cite{SAS03} identificaron tres estados de este tipo de bien común, una fase inicial, seguida por un estado de apertura y un estado más maduro de gran crecimiento (en términos de usuarios y participación), estabilización donde el número de participantes (normalmente pequeño) no varía, o el protecto se estanca y muere (sin participantes). Para que un proyecto sea exitoso, no es necesaria la participación de un gran número de programadores, es frecuente encontrar grupos pequeños de programadores con un gran número de usuarios. La clave del éxito está en la disponibilidad de un programador para contribuir al esfuerzo colectivo de por lo menos un pequeño grupo de actores que producen y mantienen el software. + +En la Figura \ref{framework_foss} se ilustra el marco definido por Ostrom y Hess \cite{CHEO06} para analizar el conocimiento como bien común, aplicado al movimiento FOSS. Como se mencionó anteriormente, el razgo que diferencia este movimiento es la utilización de una forma de licenciamiento especial. Richard Stallman \cite{Wikb}, a mediados de los 80 inició un proyecto para desarrollar un sistema operativo abierto/libre basado en \textit{unix} llamado \textit{GNU} (GNU is Not unix). + +\subsubsection{Reglas En Uso} + +Stallman \cite{Sta99} sostiene que las propiedades digitales del software hacen posible considerarlo como un bien público, proporcionando a sus usuarios \textit{la libertad} de utilizarlo, distribuirlo y modificarlo. Esta filosfía se basa en cuatro libertades que encarnan el principio \textit{copyleft}: + +\begin{itemize} + \item Libertad de ejecutar el software para cualquier propósito. + \item Libertad de estudiar como funciona el programa, y cambiarlo para hacer lo que se desee. El acceso al código fuente es una condición para esto. + \item Libertad para re-distribuir copias. + \item Libertad para distribuir copias de versiones modificadas. Lo que permite que la comunidad se beneficie de estos cambios. El acceso al código fuente es una condición para esto. +\end{itemize} + +Esta filosofía permite que los conocimientos y habilidades que el programador posee puedan ser transferidas a programadores, empresas, instituciones académicas y sociedades, ya sea en forma de producto o como herramienta de enseñanza. Esta actividad representa un proceso de Transferencia Tecnológica, en la que el que suministra la tecnología proporciona todos los medios para que el receptor pueda abosrverla y transformarla para satisfacer necesidades en su entorno social. Adicionalmente, Stallman ideó una forma de trabajar con las leyes de derechos de autor que proporciona una alternativa al licenciamiento tradicional. Las grandes multinacionales como Microsoft o Apple limitan el número de usuarios por licencia y hacen distribuciones de archivos binarios compilados en forma de ejecutables. El software con licencia \textit{copyleft} estipula que cualquier modificación que se le realice adquiere los principios de licenciamiento del software original. La licencia \textit{GPL}\footnote{http://www.gnu.org/licenses/licenses.html} (GNU General Public License) fue creada para implementar estos principios. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/framework_foss.png} \end{center} + \caption{Marco para analizar el conocimiento como bien común aplicado al movimiento FOSS: Modificación de: \cite{CHEO06} pág 46} \label{framework_foss} +\end{figure} + + +El proyecto de \textit{código abierto} liderado por Bruce Perens y Eric Raymond, utiliza las propiedades de la licencia GPL adicionando un grupo de \textit{derechos morales} dirigidos a conservar el trabajo del autor en su forma original, con el fín de conservar su autoría. Existe un gran número de variaciones de licenciamiento \footnote{http://www.opensource.org/licenses/alphabetical} para proyectos de Software Libre, lo que indica que al momento de licenciar un software el autor debe determinar que derechos retener y cuales regalar \cite{CMS06}. Las innovaciones del licenciamiento \textit{copyleft} constituyen las \textit{reglas en uso} que motivan a los programadores a participar en el movimiento FOSS, y establecen las bases de un régimen de propiedad común. + +La clave para mantener un bien común es la estructura de gobernanza de dicho recurso, el movimiento FOSS es un experimento en marcha, en dondes se prueba una mezcla imperfecta de liderazgo, mecanismos informales de coordinación, normas implícitas y explícitas junto con estructuras de gobernanza formal que evolucionan de tal forma que han logrado mantener unido este sistema tan camplejo \cite{Web04}. Aunque no existe literatura que estudie las estructuras de gobernanza en el movimiento FOSS, algunas observaciones a los proyectos existentes en la actualidad indican que estas estructuras podrían incluir: + +\begin{itemize} + \item Priorización de características a incluir en nuevas versiones del software. + \item Definición de Reglas y procedimientos para evaluar y escoger nuevos aportes para que hagan parte de las nuevas versiones. + \item Definición de Reglas y procedimientos para detectar y corregir errores en el software. + \item Asignación y administración de tareas. + \item Asistencia en la resolución de disputas entre miembros del equipo. +\end{itemize} + +Estas reglas varían dependiendo del estado del proyecto, ya que, las actividades que se deben realizar en cada etapa son diferentes, en la etapa inicial, se establece la comunidad de programadores que definen las especificaciones del software, por lo que las tarea más importante son el reclutamiento de programadores y la definción de una estructura flexible para el software. Cuando el proyecto alcanza una determinada madurez, lo importante es añadir funcionalidades y corregir errores. + + + +\subsubsection{Atributos de la Comunidad} + +La comunidad FOSS esta compuesta por usuarios y programadores voluntarios motivados por intereses tecnológicos, sociopolíticos, económicos y académicos. Desde el punto de vista tecnológico, resulta más efectivo en tiempo y en dinero, participar en un proyecto conjunto para la realización de una aplicación que satisface una determinada necesidad. La principal motivación sociopolítica es la creencia por parte del programador en la filosofía del movimiento, en lalucha contra el monopolio del software, adicionalmente, para que el proyecto permenezca durante mucho tiempo, es necesario que sea atractivo para vincular el mayor número de participantes y de esta forma sobrevivir en el futuro. Las motivaciones económicas y académicas pueden ser consideradas en forma conjunta ya que al participar en estos proyectos, los miembros adquieren o mejoran sus habilidades de programación ya sea revisando, leyendo y entendiendo el código existente o sometiendo a la revisión de los demás miembros sus contribuciones. Por otro lado, esta participación puede verse como una vitrina en donde el programador muestra sus capacidades y puede ser contactado por empresas para establecer relaciones comerciales. En los dos casos la participación es una forma de inversión y una forma de ganar experiencia y reputación \cite{VWJ+03}. + +En proyectos con un gran número de personas asociadas, solo un pequeño porcentaje de ellos realizan la mayor parte del trabajo. En la actualidad muchas empresas están participando de forma activa en estos proyectos, aportando programadores pagados para que contribuyan con el desarrollo y mejoramiento del softeare. Un estudio realizado a 25 firmas participantes en el proyecto FOSS \textit{Linux Operating System} \cite{GGR02} indica que la tercera parte de los programadores encuestados son pagados por sus empleadores para participar, y que su motivación a participar es el interes propio en estandarización, disminución de costos, estrategias para debilitar a la competencia y esfuerzos para hacer sus productos compatibles con los productos derivados del movimiento FOSS. + + + +\subsubsection{Atributos Físicos} + +Existen tres categorías \cite{CMS06} en FOSS que pueden ser consideradas como atributos físicos: + +\begin{enumerate} + \item La utilidad del Software: Como vimos anteriormente, para que una persona participe en una actividad relacionada con el bien común, el costo por no hacerlo debe ser mayor que el beneficio por participar, es decir, el software debe representar una utilidad grande para que valga la pena participar en el proyecto. + \item El diseño o la estructura del software. Un código limpio (optimizado, documentado y óptimo) y modularizado permite el trabajo en paralelo, lo que reduce el tiempo de depuración y el requerido para implementar nuevas características. + \item La infraestructura que hace posible coordinar y administrar la colaboración y la producción: El uso de Internet para soportar herramientas de control de versiones (como \textit{svn}, \textit{cvs} y \textit{git}) y la comunicación vía listas de discusión hace posible coordinar de forma eficiente los esfuerzos de cooperación. Permitiendo: + \begin{itemize} + \item Almacenar versiones de software. + \item La descarga de módulos. + \item La adición de Nuevas contribuciones y la protección del código existente. + \item Generar un historial donde se documentan los cambios realizados a lo largo del tiempo. + \item Analizar funciones para identificar diferencias entre versiones. + \item Informar a los miembros del equipo cambios en los módulos del proyecto. + \end{itemize} +\end{enumerate} + +Esta infraestructura trabaja junto con las reglas-en-uso establecidas para proporcionar procesos que direccionen nuevos trabajos, un sistema para recibir y revisar contribuciones de nuevos módulos que pueden ser incluidos en futuras versiones. + +En conclusión, los proyectos FOSS evolucionan en el tiempo como resultado de la configuración de sus reglas-en-uso, atributos de la comunidad y atributos físicos relacionados con la estructura del software para hacer fácil la colaboración y herramientas efectivas para coordinación de equipos y manejo de contenido. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Copy Left %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Propiedad Intelectual y Licencias} + +Para utilizar el paradigma colaborativo del movimiento FOSS para adaptarlo a cualquier forma de propiedad intelectual (incluyendo la creación de hardware) es necesario ampliar el término \textit{copyleft} de Stallman. El primer en esta dirección fué dado por el mismo Stallman al desarrollar la licencia GFDL (GNU Free Documentation License) aplicable a todo tipo de documentación técnica, guias de usuario, tutoriales, etc. Esta licencia gobierna el uso, modificación y distribución de la documentación del software GNU, especificando las secciones del documento que no puden ser modificadas (tales como autor, aviso de derechos de autor), los términos de distribución. + + +\subsection{Licencias Creative Commons} + +Creative Commons \footnote{http://creativecommons.org/} organización no gubernamental sin ánimo de lucro ha desarrollado una serie de licencias basadas en principios similares a los de Stallman y que puden ser aplicadas a trabajos realizados en música, arte, video, texto y notas de clase. Estas licencias permiten que el autor de un trabajo conserve la propiedad intelectual (los derechos asociados a esta) pero posibilitando su copia y distribución, con la única condición de dar créditos al autor \cite{CCb}. Se puede elegir diferentes permisos dependiendo de los deseos del autor, para definir dichos permisos CreativeCommons proporciona una serie de preguntas que buscan determinar los derechos que se desean conservar y los que desean liberar. Las preguntas claves son: 1) Los lectores pueden copiar y distribuir su trabajo libremente? 2) Es permitido a los usuarios crear trabajos derivados del contenido digital? Si es permitido, estas modificaciones deben tener la misma licencia que el trabajo original (esquema de licencia viral), o deben ser distribuidos bajo un esquema de licencias diferente? 3) Es necesario atribuir el trabajo al autor original?. Estas preguntas son la base para definir un esquema de licencias modular. + +Existen cuatro bloques constructivos para las licencias Creative Commons estos son: + +\begin{itemize} + \item \textit{Atribución} (\textbf{BY}): Se permite la distribución pero se debe dar crédito al autor. + \item \textit{No comercial} (\textbf{NC}): Se permite la distribución del trabajo sin fines comerciales, si se desea utilizar este trabajo para obtener dinero es necesaria una autorización del autor + \item \textit{No a trabajos derivados} (\textbf{ND}): Permite la copia y la distribución del trabajo original sin modificaciones. + \item \textit{Compartir de la misma forma} (\textbf{SA}): Exige que todo trabajo derivado del uso de proyectos que con este esquema de licencias deben tener la misma licencia de los trabajos originales. +\end{itemize} + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% COPY LEFT HW %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Hardware Copyleft} + +En esta sección se relizará la definición del término \textit{hardware copyleft} como una extensión del proyecto \textit{FOSS}. Una de las hipótesis manejadas durante el desarrollo de este trabajo es que el conocimiento debe ser considerado como un bien común y que los usuarios de este recurso deben utilizarlo de tal forma que se beneficie la comunidad asociada a dicho recurso. Como estrategia para obtener una transferencia tecnológica y de conocimientos exitosa a la academia y a la industria electrónica nacional (en el área de sistemas digitales) se utilizará el principio del conocimiento como bien común para crear una comunidad que utilice como recurso inicial el trabajo generado en este proyecto. + +Los dispositivos digitales modernos poseen dos grandes componentes, el hardware que proporciona recursos como capacidad de cómputo, capacidad de almacenamiento, medios de comunicación e interfaz con otros dispositivos y con el mundo real; y el software implementa una determinada funcionalidad utilizando los recursos hardware. Normalmente estos dispositivos están diseñados para ejecutar una función única, por lo que el componente hardware se encuentra optimizado (funcionalidad, tamaño, consumo de potencia, costos) para la ejecución de dicha tarea. Como se mencionó anteriormente existe un movimiento muy fuerte (FOSS) que proporciona una gran variedad de herramientas para la implementación del componente software. Sin embargo, hasta el momento no existe un movimiento similar dirigido al desarrollo del componente hardware. Mi hipótesis es que un movimiento de hardware abierto permitirá el desarrollo de la industria electrónica local permitiendo la transferencia exitosa de tecnología y conocimientos en el área de diseño de sistemas embebidos. + +Haciendo una analogía con el movimiento FOSS, la iniciativa \textit{hardware copyleft} permitiría el uso, distribución, y modificación de proyectos hardware existentes. La acción de modificación se origina por una necesidad que se debe satisfacer, implica un entendimiento del principio de funcionamiento y del proceso de fabricación asociados al proyecto original. Lo anterior cumple con la definición de transferencia tecnológica exitosa: ``\cite{Mo94} El problema de transfencia de conocimiento (o know-how) sobre un número de aspectos (que incluyen el conocimiento) sobre como funciona un determinado sistema, como operarlo y desarrollar sus aplicaciones, como mantenerlo y si es necesario, como producir sus componentes y montar un sistema similar. La transferencia tecnológica se considera exitosa cuando los receptores de la tecnología asimilan los conceptos anteriores para suplir sus necesidades locales''. + +El reto en la definición del concepto de \textit{hardware copyleft} radica en la naturaleza del componente hardware, a diferencia del software donde solo es necesario descargar el código fuente y las herramientas de compilación para modificar un proyecto existente ; los proyectos hardware involucran procesos de fabricación, montaje y pruebas que tienen asociados unos costos que varían dependiendo de la tecnología utilizada (ASIC, PCB). Este costo representa un factor que afecta a los potenciales miembros de la comunidad, en el peor de los casos predefiniendo sus perfiles o limitando el acceso. Por este motivo, se debe considerar el impacto del factor económico en la formación de la comunidad, definiendo las características que deben poseer estos proyectos para minimizar el costo asociado. + + +\subsection{Atributos de la Comunidad} + +El éxito de la iniciativa \textit{FOSS} se debe en parte a la gran comunidad que comparte la ideología del software libre \cite{RS07},sus miembros buscan: satisfacer necesidades propias \cite{JK00}, aprendizaje \cite{HIH02}, reputación dentro y fuera de la comunidad, asociación e identidad \cite{GH03}, diversión y creatividad \cite{RAG+02}. Para que la propuesta \textit{hardware copyleft} sea una realidad, es importante identificar los motivos por los cuales estos individuos se unen a este tipo de comunidades y como las diferentes formas de gobierno afectan su participación, y como esta experiencia exitos puede ser utilizada en nuestro movimiento. + +Un estudio reciente, realizado sobre diferentes comunidades software \cite{SS06} \cite{KBCR10} revela que la razón inicial para la participación es la necesidad de cambios, alteraciones o asistencia a proyectos existentes, su resultado se resumen en la tabla \ref{participation}. A pesar de que los costos de contribución son relativamente altos en términos de tiempo y esfuerzo, muchos programadores se unen a esta comunidad buscando: + +\begin{itemize} + \item \textit{Reciprocidad.} Una gran cantidad de los participantes en los proyectos software que fueron consultados en este estudio expresaban la necesidad de que la reciprocidad sea parte de las normas de la comunidad. Una gran parte de proyectos son liberados con el propósito de suplir una necesidad, ya sea por la inexistencia de una herramienta que realice ciertas funciones o para reemplazar una comercial, sus autores buscan con esto que otras personas liberen sus trabajos para que puedan ser utilizados por la comunidad. + + \item \textit{Mejoras.} Someter el código a la inspección de miles de programadores ayuda a depurar y limpiar el código, adicionalmente se logra aumentar su funcionalidad y se aumenta el número de usuarios. Sin el apoyo de la comunidad estas mejoras tomarían mucho tiempo o en algunos casos nunca se realizarían. + + \item \textit{Contribución con la escritura de código fuente.} Algunos de los miembros de estas comunidades son empleados de compañías que utilizan resultados de estos proyectos en sus productos comerciales, y dentro de sus intereses está incluir en las distribuciones oficiales funcionalidades creadas por ellos. + + \item \textit{Motivos profesionales.} Razones como reputación, desarrollo de habilidades tienen una importancia relativamente baja en la creación y contribución de código. La mayoría expresa que su participación busca conocimiento específico del proyecto y no para adquirir habilidades específicas; al trabajar con programadores más experimentados se agudizan o expanden ciertas habilidades. + + \item \textit{Disfrute y Entretenimiento} Un gran porcentaje de los participantes con mayor tiempo de permanencia manifiestan que esta actividad les proporciona un pasatiempo desafiante; curiosamente este tipo de participantes superan en número a los que se participan para suplir necesidades. +\end{itemize} + +\begin{center} + \begin{table}[H] + \begin{tabular}{|m{1.8cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}|} \hline + \textbf{Motivo para crear} & \textbf{Motivo para contribuir} & \textbf{Nivel de participación} & \textbf{No. relativo de participantes} & \textbf{Conocimiento del código y estructura} \\ \hline + + \multirow{5}{*}[-2cm]{\textbf{\textit{Necesidad}}} + & Reciprocidad; normas & Bajo & Alto & Limitado al área del problema inicial \\\cline{2-5} + & Mejoras futuras & Variable, depende de la necesidad & Moderada & En el área del problema \\\cline{2-5} + & Deseo de integrar + código propio en el + código fuente & Moderado a alto & Bajo & Variable \\\cline{2-5} + & Motivos profesionales & Bajo & Muy bajo & variable \\\cline{2-5} + & No contribuye & Muy bajo & NA & Limitado al área del problema inicial \\ \hline + \textbf{\textit{Diversión y disfrute}} + & Realimentación & Alto & Bajo & Comienza en un área determinada, y se expande \\ \hline + \end{tabular} + \caption{Motivación de la participación de desarrolladores en proyectos de softawre libre. Fuente \cite{SS06} } \label{compet_4} + \end{table} +\end{center} + + + +Este estudio concluye que muchos miembros de estas comunidades ingresan para suplir necesidades, pero muchos de ellos continuan creando código porque disfrutan programar. Estos \textit{aficionados} realizan un papel muy importante dentro de la comunidad encargándose de tareas como mejora de la plataforma tecnológica, re-escribiendo secciones de código, documentandolo, respondiendo preguntas, preservar o mejorar la arquitectura. Otros consideran que la reciprocidad es vital para la contribución de código a la comunidad y que la forma de gobierno afecta dramáticamente la participación de programadores voluntarios. + + +\begin{center} + \begin{table}[H] + \begin{tabular}{|m{2.8cm}|c|} \hline + \textbf{Mecanismos de Gobierno} & \textbf{Motivo para contribuir} \\\hline + \multicolumn{2}{|c|} {Toma de decisiones} \\\hline + \multirow{3}{*}[-2cm]{\textit{Control del Código} + & Disminuye la \\\hline + \end{tabular} + \end{table} +\end{center} + + + +\subsection{Atributos Físicos} + + + + + + +\subsection{ECB\_AT91, ECBOT, ECB\_BFIN} Plataformas realizadas para adquirir experiencia en el diseño de sistemas embebidos +detectar las habilidades que se necesitan para realizar el proceso + +\subsection{Proyecto Qi-Hardware} + + + +% whatever form or technol- +% ogy the land-use model utilizes (e.g., a computer program, a statistical +% script, and so on), it should be placed under some license that allows the +% free copying of the model, requires the model ?source? to be readable, +% and permits the development of new derivative components of the model +% or other products related to the model. In some instances, the +% model developers might decide to make all related products (e.g., the +% model modules, their documentation, data, and even theoretical papers) +% fall under these conditions. However, there will be situations where more +% restrictive licensing is warranted. For instance, empirical papers describ- +% ing a particular application of a model would probably be licensed with +% a ?no derivative work? component, because these types of papers report +% findings from a particular study at a particular time. + + + +% +% INTERNET INTERNET +% Clearly, the Internet, as a technological advance, is as important a +% ?structural change? to the way scientific advances are communicated and +% collaborated on as was the printing press. Digital storage has become so +% cheap that many treat the saving of a file on a hard disk as nearly cost- +% less. Advances like the web and e-mail software have greatly reduced the +% costs or skills required to access information on the Internet. Over the +% last five to ten years, the Internet has moved from a domain utilized pri- +% marily by high-skilled computer scientists, engineers, or others in the +% high-tech industries, to a system utilized by scientists and scholars in all +% disciplines. We are now in a shake-up period where traditional organi- +% zations chartered with the management of scientific information (e.g., +% libraries, publishers) are developing new organizational models and mis- +% sions built around computer database and connectivity issues (see, for +% example, chapters 4 and 11 in this book). This environment, where +% digital files can be copied and transferred globally in an instant and at +% very little cost, makes it much easier to treat information or knowledge +% as a global public good. But as other contributors to this book describe, +% these advances in technology are directly at odds with other societal +% trends and developments in intellectual copyright law that are pushing +% to treat information and other digital products as private goods for mon- +% etary gain (see chapters 5 and 7). +% +% To promote the argument made in the opening paragraph of this +% chapter?that the collaborative ideals and principles applied in FOSS +% projects are potentially applicable to any collaboration built around +% intellectual property?I first provide an overview and summary of the +% FOSS software ?movement? and describe some critical project compo- +% nents. I use the Institutional Analysis and Development Framework +% described in chapter 3 to help guide the description of these projects. +% Next, I provide more detail on the argument that the FOSS collabora- +% tive principles and approaches can extend more broadly to scientific +% research in general. At this juncture, I introduce the more recent inno- +% vation of ?open-content? licensing. Using a short example in the scien- +% tific field of land-use change modeling, I then provide a discussion of +% some critical issues that will need to be addressed in order to transfer +% the collaborative principles of FOSS software commons to scientific- +% commons endeavors. + + + + + diff --git a/course/.docs/book/education.tex b/course/.docs/book/education.tex new file mode 100644 index 0000000..c80d29a --- /dev/null +++ b/course/.docs/book/education.tex @@ -0,0 +1,809 @@ +\chapter{Habilidades CDIO} +\label{ch:education} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% INTRODUCCION %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Introducción} + +La iniciativa CDIO \footnote{http://www.cdio.org} ha sido desarrollada con ayuda de academicos, industriales, ingenieros y estudiantes\cite {WCI}. Es posible adaptar esta iniciativa a cualquier centro educativo en Ingeniería, y ha sido adoptada por un creciente número de instiruciones académicas a lo largo del mundo. + +La educación de la ingeniería y las demandas del mundo real están tomando caminos separados, la Iniciativa CDIO es un proyecto mundial que busca desarrollar una nueva visión de la educación en ingeniería. Hacer parte de este esfuerzo mundial nos ayuda a mantener nuestros planes académicos actualizados con los cambios que se realizan en países más industrializados. En este capítulo mostraremos como esta iniciativa se adapta perfectamemente a los cambios que se han inroducido en el área de la electrónica digital en la universidad Nacional de Colombia. + +La Iniciativa CDIO se basa en la suposición que los egresados de los centros de formación en ingeniería deben ser capaces de: Concebir, Diseñar, Implementar y Operar sistemas complejos en un entorno basado en equipos para crear sistemas y productos. En Colombia, la mayoría de los centros de formación solo tienen en cuenta la Concepción y el Diseño, descuidando por completo la Implementación y la Operación de sistemas, esto, impide que se tenga una estrecha relación con la industria, la cual, requiere productos que pueda comercializar o soluciones a sus necesidades. + +\subsection{Objetivos de la Iniciativa CDIO} + +La Iniciativa CDIO se enfoca en preparar a los estudiantes con los conocimientos habilidades y aptitudes para ser ingenieros líder. Y sus principales objetivos son: \cite {WCI}: + +\begin{itemize} + \item Educar a los estudiantes para dominar un conocimiento más profundo de los fundamentos técnicos. + \item Educar a los ingenieros para liderar la creación y operación de nuevos productos y sistemas. + \item Educar futuros investigadores para entender la importancia estratégica y el valor de su trabajo. +\end{itemize} + +El Departamento de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia está realizando el trabajo de adaptar la Iniciativa CDIO a su programa académico, esta iniciativa coincidió con el desarrollo de esta investigación. Los objetivos de esta iniciativa se adaptan a los requerimientos que se exige a la plataforma tecnológica de un país para que pueda realizar una adecuada absorción del conocimiento transferido y posteriormente transformar ese conocimiento en nuevos productos adaptados a las necesidades del país. + +Las premisas que capturan la visión, objetivos y fundamentos pedagógicos de la Iniciativa CDIO son: + +\begin{itemize} + \item Es posible cumplir las necesidades propias de la profesión mientras al mismo tiempo se realiza el proceso de Concebir, diseñar, implementar y operar sistemas en el contexto de los sistemas de Ingeniería. + \item Los resultados de la formación deben ser fijados por los sectores interesados (Academia, Industria, Gobierno) y deben formar una secuencia de experiencias de aprendizaje, algunas de las cuales son experimentales, es decir, deben enfrentar a los estudiantes a situaciones que encontrarán en el ejercicio de su profesión. + \item La adecuada construcción de esta cadena de actividades tendrán un doble impacto en la formación de los estudiantes, por un lado facilitará el aprendizaje de habilidades críticas e inter-personales y fortalecerá las habilidades de construcción de sistemas, productos y procesos, mientras se mejora el aprendizaje de los conceptos fundamentales. +\end{itemize} + +\subsubsection{liderazgo} + +La situación actual por la que atraviesa la Industria electrónica nacional, requiere que los profesionales en el área tengan las capacidades de emprendimiento y liderazgo necesarias para la creación de nuevas empresas o para la creación de nuevos productos, la Figura \ref{cdio_emp_lid} muestra la relación entre emprendimiento, liderazgo y las habilidades CDIO. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/CDIO_emp_lid.png} \end{center} + \caption{} fuente:\cite{ECJM+09} \label{cdio_emp_lid} +\end{figure} + + +Las habilidades principales que deben poseer un lider según la \textit{Sloan School of Management at MIT} son \cite{AD}: +\begin{itemize} + \item \textit{Interpretar} Interpretar el contexto de los cambios mundiales incluyendo el uso de pequeños experimentos para obtener información. + \item \textit{Relacionarse} Desrrollar relaciones confiables con diferentes tipos de personas, utilizando las preguntas para saber como comunicarse de forma efectiva. + \item \textit{Visión} Crear una visión para uno mismo y transmitir esta visión a los demás. + \item \textit{Realización de la Visión} +\end{itemize} + +\subsubsection{Emprendimiento} +El concepto clásico de emprendimiento involucra el re-direccionamiento y movilización de capital y recursos humanos para crear una nueva actividad económica. Actualmente, el emprendimiento esta asociado a la creación de une nueva empresa con una nueva línea de negocios. En algunas ocasiones las innovaciones tecnológicas no requieren cambios en el mercado. Cuando la ingeniería es el componente principal del producto, se debe enfatizar en el proceso de diseño y los ingenieros deben entender la relación entre la primicia y el tiempo de salida al mercado, márgenes de producto, la tasa de rendimiento mínima para justificar la inversión en la compañia y otras consideraciones de negocios que influyen en el diseño y las estrategias de implementación. + +\subsection{Estructura del Plan de Estudios CDIO} +La figura \ref{cdio_blocks} muestra los bloques constructores del plan de estudios CDIO, en el primer nivel podemos observar que todo individuo interesado en obtener habilidades técnicas posee \textit{Habilidades Personales y Profesionales}, las cuales son fundamentales para la práctica. Con el fín de desarrollar sistemas de ingeniería complejos, los estudiantes deben dominar los fundamentos del \textit{Razonamiento y Conocimiento Técnico}. Para trabajar en un entorno moderno basado en equipos los estudiantes deben desarrollar \textit{Habilidades Interpersonales} de comunicación y trabajo en equipo. Finalmente con el fin de ser capaz de crear y operar productos y sistemas un estudiante debe entender el concepto de \textit{Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial}\cite{EFC01} + + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.8]{./images/CDIO.png} \end{center} + \caption{Bloques Constructores de conocimiento, habilidades y actitudes necesarias para Concebir, Diseñar, Implementar y Operar sistemas en el contexto social y empresarial} fuente:\cite{EFC01} \label{cdio_blocks} +\end{figure} + + + +\subsubsection{Nivel 1: Razonamiento y Conocimiento Técnico} +Los componentes del primer nivel \textit{Razonamiento y Conocimiento Técnico} son comúnes a los planes de estudio de las ingenierías modernas y son: + +\begin{enumerate} + \item Fundamentos Avanzados de Igeniería. + \item Fundamentos del núcleo de Ingeniería. + \item Conocimiento científico. +\end{enumerate} + +La razón de colocar este bloque constructor en el primer nivel es solo para recordar que el objetivo primordial de cualquier programa de pregrado es el desarrollo de un profundo conocimiento de fundamentos técnicos. En este trabajo no se cambiará este componente ya que para hacerlo es necesario un consenso con las demás carreras de la facultad de Ingeniería, labor que puede tomar varios años. + +\subsubsection{Habilidades Personales, Profesionales e Interpersonales} + +Los niveles 2 y 3 se centran en las habilidades personales que debe poseer un individo para que pueda cumplir con el objetivo de la Iniciativa CDIO. El nivel 2 esta compuesto por: +\begin{enumerate} + \item Las habilidades profesionales que representan las tres formas de pensar más practicadas por los ingenieros: Resolución de problemas, Descubrimiento de conocimiento y Pensamiento sistémico. + \item Actitudes que incluyen integridad y comportamiento profesional así como las necesarias para planear la profesión. +\end{enumerate} + +Las habilidades que no hacen parte del contexto profesional ni del inter-personal son llamadas \textit{Habilidades y Actitudes Personales}, incluyen el carácter, iniciativa, perseverancia, formas de pensar más genéricas como pensamiento crítico, creativo y habilidades propias como curiosidad, aprendizaje continuo y manejo del tiempo. + +Las habilidades inter-personales, son un subconjunto de las habilidades personales y se dividen en dos grupos que se traslapan llamados: Equipo de Trabajo y Comunicaciones. El grupo de trabajo se refiere a las habilidades necesarias para formar, operar, fortalecer y liderar un equipo con habilidades específicas de un equipo de trabajo técnico. La comunicación se compone de habilidades para idear estrategias de comunicación y aquellas para utilizar los medios orales, escritos, electrónicos y gráficos y en el caso Colombiano el uso del idioma Inglés. La Figura \ref{cdio_2_3} muestra la relación entre las habilidades de nivel 2 (Personales y Profesionales) y nivel 3 (Interpersonales). + +\begin{figure} + \begin{center} \includegraphics[scale=.8]{./images/CDIO_2_3.png} \end{center} + \caption{Relación entre las Habilidades Personales, Profesionales e Interpersonales} fuente:\cite{EFC01} \label{cdio_2_3} +\end{figure} + + +\subsubsection{Habiidades CDIO} +Habilidades necesarias parea Concebir, Diseñar, Implementar y Operar Systemas en el Contexto Social y empresarial. Estos cuatro componentes son necesarios para que los egresados de las carreras de Ingniería Eléctrica y Electrónica sean capaces de absorver los conocimientos que las nuevas tecnologías proporcionan, adaptarlos a la situación tecnológica y al contexto social del país para generar productos que resuelvan necesidades locales. Para satisfacer una necesidad de la sociedad es necesario conocer la dinámica empresarial, los principios que la rigen y como se debe actuar en una empresa de cualquier tipo y tamaño. + +\subsection{Implementación del Plan de Estudios CDIO} +La Figura \ref{impl_CDIO} muestra los componentes que deben ser especificados para implementar el plan de estudios CDIO al currículo de las asignaturas del área de electrónica digital. En primer lugar se encuentran los resultados esperados del proceso de aprendizaje, esto es, Qué deben saber y que deben ser capaces de hacer los estudiantes al final del curso? Para contestar a esta pregunta es necesario definir las \textbf{habilidades} que serán reforzadas o desarrolladas y los \textit{objetivos} de cada asignatura. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/CDIO_metodologia.png} \end{center} + \caption{Objetivos, Actividades, y Evaluación: } \label{impl_CDIO} +\end{figure} + + +Para alcanzar los objetivos definidos en el primer paso, es necesario generar una serie de \textbf{actividades} que le permitan al estudiante: retener nuevos conocimientos y habilidades y desarrollar las competencias deseadas, el número de actividades debe ser tal que cubran todas las habilidades que se quieran desarrollar o reforzar. + +Finalmente, se deben desarrollar métodos de evaluación que permitan conocer el nivel de competencia de los estudiantes, y de esta forma ajustar las actividades para obtener los resultados esperados. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% IDENTIFICACION DE HABILIDADES CDIO %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Definición e Identificación de las Habilidades CDIO} + +El primer paso en la implementación del plan de estudios CDIO es definir e identificar las habilidades requeridas en una determinada área del plan de estudios, este estudio se centrará en las asignaturas del área de electrónica digital. En la Universidad Nacional de Colombia el área de Electrónica Digital esta compuesta por tres asignaturas para la carrera de Ingeniería Electrónica: Electrónica Digital 1, Electrónica Digital 2 y Sistemas Embebidos. Para la carrera de Ingeniería Eléctrica está compuesta por Electrónica Digital 1 (la misma en las dos carreras) únicamente. + + +\subsection{Introducir, Enseñar y Usar} +Para transladar esta lista de habilidades a objetivos de aprendizaje es necesario determinar el grado de competencia que se espera que el profesional adquiera en cada una de las asignaturas. Por supuesto, algunas de estas habilidades no pueden obtenerse en una asignatura, es necesario que todo el plan académico contribuya a generar una determinada habilidad, lo que requiere un consenso del personal académico. En el Departamento de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia se está realizando esta tarea y los resultados presentados en este estudio hacen parte de esta iniciativa. + +Los niveles de competencia seleccionados para indicar el nivel en que debe ser apropiada una determinada habilidad son: + +\begin{enumerate} + \item Introducir: Introduce pero no evalúa. + \item Enseñar: Enseña y evalúa. + \item Utilizar: Utiliza, puede ser evaluado o no. +\end{enumerate} + + +\subsection{Habilidades CDIO} +A continuación se listan las habilidades CDIO que deben desarrollarse o reforzarse en el área de Electrónica Digital, algunas de las habilidades como la comunicación oral y escrita en Inglés es común a la mayoría de las asignaturas, mientras que otras como la Integración Software - Hardware es exclusiva, + +%Redefine the first level +\renewcommand{\theenumi}{\arabic{enumi}} +\renewcommand{\labelenumi}{\theenumi} + +%Redefine the second level +\renewcommand{\theenumii}{\arabic{enumii}} +\renewcommand{\labelenumii}{\theenumii} + +\begin{enumerate} + \setcounter{enumi}{1} +% CDIO NIVEL 2 + \item \textbf{Aptitudes personales y profesionales} + \begin{enumerate} + \item Razonamiento ana;ítico y Resolución de problemas + \begin{enumerate} + \item Identificación y Formulación del problema + \item Modelamiento + \item Solución y recomendación + \end{enumerate} + \item Experimentación Investigación y Descubrimiento de Conocimiento + \begin{enumerate} + \item Formulación de hipótesis + \item Investigación experimental + \end{enumerate} + \item Pensamiento Sistemático + \begin{enumerate} + \item Pensamiento Global + \item Surgimiento e interacciones + \end{enumerate} + \item Pensamiento Crítico y Creativo y Habilidades y actitudes personales + \begin{enumerate} + \item Pensamiento creativo + \item Pensamiento crítico + \item Toma de conciencia de conocimientos propios y metaconocimiento. + \item Aprendizaje permanente y Educar a otros. + \end{enumerate} + \item Ética, Responsabilidad Profesional, Equidad y Otros Valores Personales. + \begin{enumerate} + \item Ética, integridad y responsabilidad social + \item Comportamiento profesional y responsabilidad + \item Confianza y lealtad + \end{enumerate} + \end{enumerate} +% CDIO NIVEL 3 + \item \textbf{Habilidades interpersonales, trabajo en equipo y comunicación} + + \begin{enumerate} + \item Equipo de Trabajo + \begin{enumerate} + \item Formar grupos efectivos + \item Equipo de liderazgo + \item Equipo Técnico y multi-disciplinario. + \end{enumerate} + \item Comunicaciones estructuradas + \begin{enumerate} + \item Estrategia de comunicación + \item Estructura de la comunicación + \item Comunicación Escrita + \item Comunicación Electrónica + \item Presentación Oral + \end{enumerate} + \item Comunicación en Idioma Extranjero + \begin{enumerate} + \item Inglés + \end{enumerate} + \item Comunicaciones Informales: Relacionarse con los demás + \begin{enumerate} + \item Preguntar, Escuchar y Dialogar + \item Negociación, compromiso y resolución de conflictos. + \item Establecimiento de conexiones + \end{enumerate} + \end{enumerate} + +% CDIO NIVEL 4 + \item \textbf{Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial} + \begin{enumerate} + \item Contexto Externo, Social, Económico y Ambiental + \begin{enumerate} + \item Rol y responsabilidad de los Ingenieros + \item Impacto sobre la sociedad y el medio ambiente + \item Cuestiones y valores actuales + \item Sostenibilidad y necesidad de un desarrollo sostenible. + \end{enumerate} + \item Empresa y contexto empresarial + \begin{enumerate} + \item Interesados en la empresa, metas y objetivos + \item Espíritu Empresarial Técnico + \item Trabajo en organizaciones + \item Finanzas y Economís de los Proyectos de Ingeniería + \end{enumerate} + \item Concepción y Administración de Sistemas en Ingeniería. + \begin{enumerate} + \item Entender las necesidades y establecer las metas + \item Definir la función, concepto y arquitectura + \end{enumerate} + \item Diseño + \begin{enumerate} + \item Proceso de Diseño + \item Fases del proceso de Diseño y enfoques + \item Utilización de conocimiento científico en el diseño + \item Diseño específico + \item Diseño multi-disciplinario + \end{enumerate} + \item Implementación + \begin{enumerate} + \item Proceso de fabricación Hardware + \item Proceso de Implementación de Software + \item Integración Software - Hardware + \item Pruebas, verificación, validación y certificación + \end{enumerate} + \item Liderar Esfuerzos en ingeniería + \begin{enumerate} + \item Pensar creativamente e Imaginar posibilidades + \item Definir la solución + \item Crear nuevas formas de solución + \item Construir y liderar una organización y una organización extendida. + \item Planear y administrar un prpyecto hasta su finalización. + \item Innovar - la concepción, diseño e introducción de nuevos bienes y servicios. + \item Innovar - el desarrollo de nuevos dispositivos, materiales o procesos que permitan nuevos bienes y servicios. + \end{enumerate} + \item Emprendimiento en ingeniería + \begin{enumerate} + \item Creación, Formulación y organización de una empresa. + \item Desarrollo del plan de negocios. + \item Finanzas y capitalización. + \item Mercadeo de productos innovadores + \item Cencepción de productos y servicios alrededor de nuevas tecnologías. + \item Sistema de innovación, redes, infraestructura y servicios. + \item Construyendo el equipo e iniciando el proceso de ingeniería. + \item Manejo de la propiedad intelectual. + \end{enumerate} + \end{enumerate} +\end{enumerate} + + +\subsection{Competencias de las Habilidades CDIO 2 y 3} +La tabla \ref{compet_2_3} muestra las competencias IEU para las \textit{Aptitudes Personales y Profesionales} de las tres asignaturas del área de Electrónica Digital. + +\begin{center} + \begin{table}[H] + \begin{tabular}{|l|c|c|c|} \hline + \multicolumn{4}{|c|}{\textbf{Competencias de las Habilidades CDIO Nivel 2 y 3}} \\ \hline + \multirow{2}{*}{\textbf{APTITUDES PERSONALES Y PROFESIONALES}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Planteamiento y Resolución de problemas de Ingeniería}} & \multicolumn{3}{c|} {EU} \\ \hline + 1 Identificación y Formulación del problema & \multicolumn{3}{c|} {EU} \\ \hline + 2 Modelamiento & \multicolumn{3}{c|} {EU} \\ \hline + 3 Solución y recomendación & \multicolumn{3}{c|} {EU} \\ \hline + \textbf{\textit{Experimentación y Descubrimiento de Conocimiento}} & \multicolumn{3}{c|} {U} \\ \hline + 4 Formulación de hipótesis & \multicolumn{3}{c|} {U} \\ \hline + 5 Investigación experimental & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Pensamiento Sistemático}} & \multicolumn{3}{c|} {EU} \\ \hline + 6 Pensamiento Global & \multicolumn{3}{c|} {U} \\ \hline + 7 Surgimiento e interacciones & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Habilidades y actitudes personales}} & \multicolumn{3}{c|} {U} \\ \hline + 8 Pensamiento creativo & \multicolumn{3}{c|} {IEU} \\ \hline + 9 Pensamiento crítico & \multicolumn{3}{c|} {IEU} \\ \hline + 10 Toma de conciencia de conocimientos propios & \multicolumn{3}{c|} {IEU} \\ \hline + 11 Curiosidad y aprendizaje permanente + \textbf{\textit{Habilidades y actitudes profesionales}} & \multicolumn{3}{c|} {U} \\ \hline% \begin{enumerate} + 12 Ética profesional, integridad, responsabilidad & \multicolumn{3}{c|} {U} \\ \hline + 13 Comportamiento profesional & \multicolumn{3}{c|} {U} \\ \hline + 39 Confianza y Lealtad & \multicolumn{3}{c|} {IEU} \\ \hline + \multirow{2}{*}{\textbf{HABILIDADES INTERPERSONALES}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Equipo de Trabajo}} & \multicolumn{3}{c|} {EU} \\ \hline + 14 Formar grupos efectivos & EU & U & U \\ \hline + 15 Equipo de Liderazgo & EU & U & U \\ \hline + 40 Equipo Técnico y Multi-disciplinario & EU & U & U \\ \hline + \textbf{\textit{Comunicaciones estructuradas}} & \multicolumn{3}{c|} {EU} \\ \hline + 16 Estrategia de comunicación & EU & U & U \\ \hline + 17 Estructura de la comunicación & EU & U & U \\ \hline + 18 Comunicación Escrita & EU & U & U \\ \hline + 19 Comunicación Electrónica & EU & U & U \\ \hline + 20 Presentación Oral & EU & U & U \\ \hline + \textbf{\textit{Comunicación en Idioma Extranjero}} & \multicolumn{3}{c|} {U} \\ \hline + 21 Inglés & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Comunicaciones Informales: Relacionarse con los demás}} & \multicolumn{3}{c|} {U} \\ \hline + 41 Preguntar, Escuchar y Dialogar & EU & U & U \\ \hline + 42 Negociación, compromiso y resolución de conflictos & EU & U & U \\ \hline + 43 Establecimiento de conexiones & IEU& U & U \\ \hline + \end{tabular} + \caption{Competencias para los niveles 2 y 3 CDIO} \label{compet_2_3} + \end{table} +\end{center} + +\subsection{Competencias de las Habilidades C.D.I.O. Sistemas en el contexto Empresarial, Social y Ambiental - Innovación} +La tabla \ref{compet_4} muestra las competencias IEU para las \textit{C.D.I.O. Sistemas en el contexto Empresarial, Social y Ambiental - Innovación} de las tres asignaturas del área de Electrónica Digital. + + +\begin{center} + \begin{table}[H] + \begin{tabular}{|l|c|c|c|} \hline + \multirow{2}{*}{\textbf{HABILIDADES CDIO}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Contexto Externo, Social, Económico y Ambiental}} & \multicolumn{3}{c|} {IEU} \\ \hline + 22 Rol y responsabilidad de los Ingenieros & \multicolumn{3}{c|} {IEU} \\ \hline + 23 Impacto sobre la sociedad y el medio ambiente & \multicolumn{3}{c|} {IEU} \\ \hline + 24 Cuestiones y valores actuales & \multicolumn{3}{c|} {IEU} \\ \hline + 44 Sostenibilidad y necesidad de un desarrollo sostenible& IE & IE & IE \\ \hline + \textbf{\textit{Empresa y contexto empresarial}} & \multicolumn{3}{c|} {EU} \\ \hline + 25 Interesados en la empresa, metas y objetivos & \multicolumn{3}{c|} {I} \\ \hline + 26 Espíritu Empresarial Técnico & \multicolumn{3}{c|} {I} \\ \hline + 27 Trabajo exitoso en organizaciones & \multicolumn{3}{c|} {I} \\ \hline + 45 Finanzas y Economía de los Proyectos de Ingeniería & IE & IE & IE \\ \hline + \textbf{\textit{Concepción y Administración de Sistemas en Ingeniería.}} & \multicolumn{3}{c|} {IEU} \\ \hline + 28 Entender las necesidades y establecer las metas & IEU & EU & U \\ \hline + 29 Definir la función, concepto y arquitectura & IEU & EU & U \\ \hline + \textbf{\textit{Diseño}} & \multicolumn{3}{c|} {IEU} \\ \hline + 30 Proceso de Diseño & IEU & EU & U \\ \hline + 31 Fases del proceso de Diseño y enfoques & IEU & EU & U \\ \hline + 32 Utilización de conocimiento científico en el diseño & IEU & EU & U \\ \hline + 33 Diseño específico & IEU & EU & U \\ \hline + 34 Diseño multi-disciplinario & I & E & U \\ \hline + \textbf{\textit{Implementación}} & \multicolumn{3}{c|} {EU} \\ \hline + 35 Proceso de fabricación Hardware & IE & EU & U \\ \hline + 36 Proceso de Implementación de Software & I & EU & U \\ \hline + 37 Integración Software - Hardware & I & EU & U \\ \hline + 38 Pruebas, verificación, validación y certificación & IE & EU & U \\ \hline + \end{tabular} + \caption{Competencias para CDIO} \label{compet_4} + \end{table} +\end{center} + + +\section{Integración de las Habilidades CDIO al Plan de Estudios} + +\subsection{Objetivo General} +Generar en el estudiante las habilidades necesarias para Concebir, Diseñar, Implementar y Operar Sistemas Digitales complejos que satisfagan necesidades de la sociedad y proporcionar un canal para la transferencia de Tecnología y conocimiento a la Industria Colombiana. La Figura \ref{design_method} muestra la metodología de diseño para las diferentes asignaturas del área. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.8]{./images/habilidades_digitales.png} \end{center} + \caption{Metodología de Diseño para el área de Sistemas Digitales} \label{design_method} +\end{figure} + +\subsubsection{Electrónica Digital 1} +Concebir y definir las especificaciones y requerimientos de un Sistema Digital, modelar su funcionamiento, y realizar la implementación siguiendo la metodología de diseño de Sistemas Embebidos utilizando únicamente tareas Hardware. + +\subsubsection{Electrónica Digital 2} +Concebir, definir las especificaciones, modelar, diseñar un Sistema Digital siguiendo la metodología de diseño de Sistemas Embebidos y realizar su implementación óptima utilizando tareas Hardware (que se ejecutan en un PLD) y tareas Software (que se ejecutan en un procesador). + +\subsubsection{Sistemas Embebidos} +Concebir, diseñar, e Implementar un sistema digital complejo utilizando la metodología de diseño de sistemas Embebidos y un Sistema Operativo para su Implementación. + + +\subsection{Objetivos Específicos} + +\subsection {Ojbetivos comúnes} +\begin{itemize} + \item Identificar las especificaciones funcionales del sistema, su arquitectura de alto nivel y definir su descomposición en elementos + \item Explicar las actividades en las etapas del proceso de diseño, + \item Desarrollar el pensamiento sistémico. + \item Modelar funcionalmente Sistemas Digitales. + \item Diseñar pruebas para comprobar el correcto funcionamiento de los sistemas implementados. + \item Leer y entender material técnico escrito en inglés. + \item Implementar un Sistemas Embebido (Hardware o Hardware/Software) para cumplir una tarea determinada que cumpla con una necesidad real (Obtener e interpretar las necesidades del consumidor) utilizando técnicas, herramientas y procesos adecuados. + \item Estudiar y aplicar el concepto de la re-utilización de código. + \item Desarrollar trabajo en equipo incluyendo presentaciones, describiendo los diversos roles y responsabilidades. + \item Documentar los diseños realizados para crear una base de datos que contribuya a la difusión del conocimiento adquirido. +\end{itemize} + +\subsubsection{Electrónica Digital 1} +\begin{itemize} + \item Estudiar las fases de la metodología de diseño para Sistemas Embebidos. + \item Estudiar los dominios de diseño Estructural, Funcional y Físico. + \item Estudiar los Lenguajes de Descripción de Hardware. + \item Estudiar los componentes básicos de la lógica combinatoria y secuencial. +\end{itemize} + +\subsubsection{Electrónica Digital 2} +\begin{itemize} + \item Estudiar los requisitos para un particionamiento Hardware / Software óptimo. + \item Estudiar la arquitectura de un procesador, micro-arquitectura, set de instrucciones, interrupciones, direccionamiento. + \item Estudiar el proceso de implementación de tareas software. + \item Estudiar la integración Software-Hardware. + \item Diseñar pruebas para comprobar el correcto funcionamiento de los sistemas implementados. +\end{itemize} + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item Realizar aplicaciones que requieran diseño multi-disciplinario. + \item Estudiar y realizar el proceso de Fabricación Hardware. + \item Estudiar el principio básico de los sistemas operativos. + \item Describir la integración de software en hardware electrónico + \item Entender diagramas de circuitos electrónicos de sistemas digitales, identifcar sus componentes y su función. + \item Estudiar diseños software y hardware existentes para entender su funcionamiento, arquitectura y adquirir experiencia en el diseño. + \item Hacer parte de listas de discusión de temas técnicos que usen el inglés como lenguaje. +\end{itemize} + +\subsection{Contenido} + +\subsubsection{Electrónica Digital 1} +\begin{itemize} + \item \textbf{Flujo de Diseño de Sistemas Embebidos} + \begin{itemize} + \item Sistemas Digitales: Panorama Y Perspectiva + \item Metodología de Diseño + \item Representaciones de Diseño y Niveles de Abstracción + \end{itemize} + \item \textbf{Sistemas Numéricos y Operaciones Aritméticas} + \begin{itemize} + \item Representación de Datos + \item Sistemas numéricos: Binario, Octal Hexadecimal + \item Representación de números negativos + \item Algoritmos para la implementación de operaciones aritméticas + \begin{itemize} + \item Camino de Datos + \item Control + \end{itemize} + \end{itemize} + \item \textbf{Lógica Combinatoria} + \begin{itemize} + \item Definición. + \item Ecuaciones Booleanas, Formas canónicas. + \item Módulos Básicos: Multiplexores, codificadores, sumadores, restadores comparadores. + \end{itemize} + \item \textbf{Lógica Secuencial} + \begin{itemize} + \item Definición + \item Elementos de memoria: + \begin{itemize} + \item Latch + \item Flip-Flop + \end{itemize} + \item Bloques básicos + \begin{itemize} + \item Registros + \item Acumuladores + \item Contadores + \end{itemize} + \item Máquina de Estados Finitos (FSM) + \begin{itemize} + \item Arquitectura + \item Tipos: Mealy, Moore + \item Diagramas de Estado + \item Síntesis de Máquinas de Estado + \end{itemize} + \item Máquinas de Estado Algorítmicas (ASM) + \begin{itemize} + \item Tareas Hardware + \item Componentes: Camino de Datos y Máquina de Control + \item Implementación de operaciones aritméticas utilizando ASM + \item Identificación, funcionamiento e interfaz de bloques constructores. + \item Interacción entre el Camino de Datos y la Máquina de Control + \item Lenguajes de Descripción de Hardware + \end{itemize} + \end{itemize} + \item \textbf{Tecnologías de Implementación} + \begin{itemize} + \item Familia Lógica CMOS + \begin{itemize} + \item Principio de funcionamiento, consumo de potencia + \item Niveles Lógicos y márgenes de ruido + \item Retardos, Manejo de Corriente + \item Compuertas tri-estado y Open-Drain + \end{itemize} + \item Dispositivos Lógicos Programables + \begin{itemize} + \item Arreglos Lógicos Programables (PALs) + \item Dispositivos Lógicos Programables (PLDs, CPLDs) + \item Arreglo de Compuertas Programable en Campo (FPGA) + \item Flujo de Diseño - Programación en Sistema + \end{itemize} + \end{itemize} + \item \textbf{Introducción a los procesadores} + \begin{itemize} + \item Máquina de Estados Algorítmica Programable + \end{itemize} +\end{itemize} + + +\subsubsection{Electrónica Digital 2} + +\begin{itemize} + \item \textbf{Codiseño Hardware-Software} + \begin{itemize} + \item Flujo de Diseño y Particionamiento HW/SW. + \item Comunicación SW -> HW (Direccionamiento) + \item Comunicación HW -> SW (Interrupciones) + \item Componentes de un Sistema etherogéneo. + \begin{itemize} + \item Procesador + \item Buses + \item Periféricos + \item Memorias + \end{itemize} + \end{itemize} + \item \textbf{Arquitectura de Procesadores} + \begin{itemize} + \item Micro-Arquitectura + \item Set de Instrucciones + \item Modos de direccionamiento + \item Interrupciones + \item Pipeline + \end{itemize} + + \item \textbf{Implementacion de Tareas Hardware} + \begin{itemize} + \item Arquitectura de computadores + \begin{itemize} + \item CPU + \item Memorias + \item Periféricos + \item Mapa de Memoria + \item Controlador de Interrupciones Programable + \end{itemize} + \item Definición de la Interfaz HS <-> SW + \item Implementación de Tareas Hardware en Periféricos. + \end{itemize} + + \item \textbf{Flujo de Diseño Software} + \begin{itemize} + \item Cadena de Herramientas: + \begin{itemize} + \item Compilador + \item Librerías standard + \item Depurador + \item Utilidades binarias + \item Código de Inicio C RunTime crt0 + \item Herramienta \textit{make} + \end{itemize} + \item Integración del Software sobre hardware Electrónico. + \begin{itemize} + \item Ejecución en Memoria Interna + \item Ejecución en Memoria Externa: Bootloaders + \end{itemize} + \item Implementación de tareas software y comunicación con tareas Hardware. + \end{itemize} + \item \textbf{Sistemas Sobre Silicio} + \begin{itemize} + \item Arquitectura + \end{itemize} +\end{itemize} + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item \textbf{Sistemas Embebidos} + \begin{itemize} + \item Definición,aplicaciones + \item Metodología de Diseño + \item Arquitectura + \begin{itemize} + \item Sistema Sobre Silicio + \item Circuitos de Referencia + \end{itemize} + \end{itemize} + \item Iniclialización + \begin{itemize} + \item Métodos de arranque + \item Bootloaders + \end{itemize} + \item \textbf{Sistema Operativo Linux} + \begin{itemize} + \item Arquitectura + \item Sincronización entre procesos + \item Estructura del Kernel y Organización del código fuente + \item Drivers de Dispositivos y módulos del kernel + \item Imágen del kernel + \item Inicialización del Kernel + \end{itemize} + \item \textbf{Sistema de Archivos del root} + \begin{itemize} + \item Tipos de Sistema de Archivos + \item Estructura del Sistema de Archivos del root + \item Archivos de configuración y niveles de ejecución. + \item Montaje del sistema de archvios del root + \end{itemize} + \item \textbf{Interfaz con dispositivos externos al SoC} + \begin{itemize} + \item Control utilizando señales de Entrada/Salida de propósito general (GPIOs) + \item Utilizando puertos de comunicaciones UART, I2C, SPI, USB. + \item Utilizando el controlador de memorias externas del SoC + \end{itemize} + \item \textbf{Interfaz con Periféricos Dedicados Implementados en PLDs} + \begin{itemize} + \item Configuración del PLD utilizando GPIOs del SoC + \item Definición de la Interfaz HW y SW + \item Comunicación con periféricos dedicados + \end{itemize} +\end{itemize} + +\subsection{Metodología} +Todas las actividades que se realizarán en estos cursos están encamindas a generar habilidades necesarias para Concebir, Diseñar, e Implementar Sistemas Digitales Complejos, y están articuladas alrededor de una única metodología de diseño (la aceptada internacionalmente para el diseño de sistemas embebidos). Los tres cursos se diferencian en el medio donde se realiza la implementación de las tareas y el tipo de las mismas, en el primer curso todas las tareas son Hardware y se implementarán en un PLD, en el segundo las tareas son de tipo hardware y software y serán implementadas en un PLD. El tercer curso también implementa tareas hardware y software pero utiliza componentes utilizados en dispositivos comerciales, esto es, SoCs para implementar las tareas Software y PLDs para las tareas hardware. El conocimiento adquirido en cada asignatura será la base del siguiente curso. + +Los tres cursos tienen un carácter teórico-práctico, el componente teórico tratará los diferentes temas de forma general, con el fín de no crear dependencia con las herramientas utilizadas (lo que permitirá realizar actualizaciónes de forma fácil). En el componente práctico se tratarán temas específicos de manejo de las herramientas (Lenguajes de Descripción de Hardware, lenguajes de programación, manejo de plataformas de desarrollo) y como estas se relacionan con la metodología de diseño utilizada. + +El estudiante debe estudiar, profundizar y comprobar algunos temas tratados en clase y debe leer previamente la documentación que se encuentra disponible en el sitio web de los cursos. Adicionalmente, debe formar grupos de trabajo para realizar actividades a lo largo del semestre. + +Durante el semestre se trabajará para definir las especificaciones, diseñar e implementar un dispositivo que resuelva una determinada necesidad (con la complejidad adecuada para cada curso), en la sesión teórica se tratarán aspectos relacionados con la concepción, diseño, Identificación y definición de las funciones de los componentes del sistma, mientras que en los relacionados con la implementación de dichos componentes sobre PLDs o SoC. Se deben realizar presentaciones del avance, indicando las razones que se tuvieron en cuenta en cada decisión y somo se resolvieron los problemas encontrados, todo este proceso debe documentarse en el sitio web del curso. + +El laboratorio está relacionado con la práctica y proporciona el conocimiento y habilidades para manejar y entender las herramientas Hardware y Software utilizadas en la implementación. Las actividades programadas, deben ser entregadas con un informe donde se evidencie el uso de la metodología de diseño utilizada, adicionalmente el estudiante debe defender y explicar su diseño. + +Se utilizarán los siguientes métodos de calificación: +\begin{itemize} + \item Pruebas escritas donde se verificará la asimiliación de conocimiento. + \item Sustentación oral de procesos de diseño e Implementación. + \item Evaluación del avance del proceso de Concepción, Diseño e Implementación del Proyecto Final. +\end{itemize} + +\subsection{Actividades} + +\subsubsection{Lectura de material del curso 10, 11} +Con la lectura previa de los temas, el estudiante adquiere la capacidad de absorver conocimiento (11), identificar sus preferenicas, deficiencias y buscar ayuda para suplirlas (10), lo cual ayuda al mejoramiento de las habilidades para el auto-aprendizaje, uno de los problemas detectados en los estudiantes es la necesidad de una autoridad que le proporcione la información que necesita para resolver un problema o tomar una decisión. + +\subsubsection{Lectura de material Técnico en Inglés 10, 11, 6, 30, 33, 21} +La mayor parte de la documentación de los componentes electrónicos esta escrita en inglés técnico, es necesario que el estudiante aprenda a entender este tipo de escritura y se familiarice con su estructura. Esto le permite identificar el funcionamiento de un componente del sistema (6,30), determinar que componente se adapta mejor a sus necesidades (33) y mejorar sus habilidades para comunicarse en inglés 21. + +\subsubsection{Utilización de Metodologías de Diseño 1, 2, 3, 6, 7, 9, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38} + +La metodología de diseño(30,31,) de sistemas embebidos requiere identificar un problema(1, 28), plantear una solución(3,29,32) lógica (9) de alto nivel (9), modelarla (2) a nivel de sistema(6), verificar el cumplimiento de los requerimientos(33,38). Proporciona métodos para determinar su arquitectura óptima (particionamiento HW/SW) y definir la función e interacción(37,7) de sus componentes software (36) y hardware (35). + +\subsubsection{Implementación de Sistemas Digitales Sencillos 3, 14, 29, 30, 35, 36, 17, 18, 19} + + La realización de prácticas de laboratorio en las que grupos de trabajo (14) implementan diseños de baja o media complejidad le permite al estudiante: Formular recomendaciones (3) para que no se repitan errores en experiencias futuras. Utilizar sistemas de desarrollo (30) para la implementación de tareas HW y SW a bajo nivel (36). Con el fin de mejorar la capacidad de comunicación escrita (18, 19) se deben presentar informes que refuercen las habilidades generadas en la utilización de la metodología de diseño, por lo que se deben tener la siguiente estructura(17): +\begin{itemize} + \item Un diagrama de caja negra que indique las entradas y salidas del sistema. + \item Una descripción de alto nivel del algoritmo que implementa la solución (29). + \item Un diagrama de bloques que indique el particionamiento y la interconexión entre sus componentes (30). + \item Descripciones de alto nivel de cada uno de los componentes (31). + \item La implementación y simulación de cada componente y del sistema completo (35), donde se muestre que el sistema cumple con las especificaciones funcionales(38) +\end{itemize} + +\subsubsection{Proyecto Final 1,2,3, 14, 15, 30, 31, 32, 33, 34, 35, 22, 23, 24, 25, 27} +Durante el semestre se trabajará para definir las especificaciones(1,2,3), diseñar(30,31,32,33,34) e implementar un dispositivo que resuelva una hipotética necesidad de la sociedad (22) (con la complejidad adecuada para cada curso), en la sesión teórica se tratarán aspectos relacionados con la concepción, diseño, Identificación y definición de las funciones de los componentes del sistema, mientras que en el componente práctico, los relacionados con la implementación de dichos componentes sobre PLDs o SoC. + +A los estudiantes se les hace una descripción funcional de alto nivel del sistema, ellos deben organizarse en grupos de trabajo (14,15), definir la función de cada uno de estos grupos (27,14,31), establecer estrategias de comunicación (16,31), realizar y/o cumplir un cronograma de actividades (25,31) que permitan resolver la necesidad en el tiempo especificado (22). Una de las estrategias de comunicación es la realización de presentaciones orales (20), en las que cada equipo de trabajo expondrá el estado de su sub-proyecto, indicando las razones que se tuvieron en cuenta en cada decisión y como se resolvieron los problemas encontrados (24). Adicionalmente todo este proceso debe documentarse en el sitio web del curso (wiki) con el objetivo de crear una base de proyectos que permitan a futuros estudiantes utilizar la experiencia obtenida (23) y en un determinado caso dar continuidad al proyecto. + +El estudiante debe diseñar y construir placas de circuito impreso con los circuitos necesarios para su aplicación (35) siguiendo las normas de diseño establecidas por el fabricante (resolución, número de capas, costo) y las restricciones del circuito (Capacidad de corriente, niveles de ruido, compatibilidad electromagnética, etc). + +Vale la pena aclarar que durante el primer curso los estudiantes no poseen la experiencia necesaria para realizar (sin asistencia) labores como la división de tareas, generación de un cronograma de actividades y fijar la estrategia de comunicación, razón por la cual el docente debe acompañar este proceso. + +\subsubsection{Participación en listas de discución 21} +Con el objeto de aumentar las capacidades en la comunicación en idioma extranjero, se alentará a los estudiantes a que hagan parte de listas de discusión en diferentes temas técnicos, algunos problemas que encontrarán en la realización de las diferentes prácticas deben ser consultados en estas listas para encontrar una forma de solución + + +\subsection{Plataforma de Desarrollo SAKC} + +La plataforma SAKC fué diseñada para ser utilizada como herramienta de implementación para los tres cursos de esta área. Está compuesta (ver Figura \ref{sakc_block}) por una FPGA y un Procesador, lo que permite la implementación de tareas Hardware y Software utilizando únicamente la FPGA o el procesador y la FPGA. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/SAKC_block_diagram.png} \end{center} + \caption{Diagrama de Bloques de la Plataforma de Desarrollo SAKC}\label{sakc_block} +\end{figure} + +Durante el primer curso, el procesador de la plataforma se utilizará para configurar a la FPGA con las tareas hardware sitetizadas por los estudiantes. esta plataforma carece (intencionalmente) de elementos comunmente utilizados en las plataformas de desarrollo para PLDs como Pulsadores, Leds, Displays o conectores espaciales, lo que obliga a los estudiantes a investigar la forma de conexión de estos y a construir circuitos que permitan la conexión de la plataforma con estos elementos de interfaz con el usuario o con otros sistemas. + +\begin{figure}[h] + \centering + \mbox{ + \subfigure[Big]{\includegraphics[scale=.5]{./images/SAKC.png}} + \subfigure[Small]{\includegraphics[scale=.5]{./images/SAKC_LCD.png}} + } + \caption{Plataforma de Desarrollo SAKC} + \label{sakc} +\end{figure} + +La capacidad de la FPGA de SAKC permite la implementación de procesadores soft-core (como plasma y microblaze), posibilitando la implementación de tareas Hadware y software en ella. El procesador será utilizado al finalizar el curso para comparar el desempeño (velocidad, consumo de potencia, costo) entre un procesador soft-core y un procesador comercial. + +El ultimo curso utilizará el procesador para la ejecución de tareas software y la FPGA para ejecutar las tareas Software, se hará uso de herramientas utilizadas actualmente en el diseño de Aplicaciones comerciales de multinacionales como Nokia (QT), Motorola (Linux). + + +\subsubsection{Hardware y Software Copy-Left} +El conocimiento debe ser considerado un bien común y se debe garantizar el acceso a todo el mundo. Por esta razón SAKC proporciona la documentación necesaria para: + +\begin{itemize} + \item Estudiar. entender, y reproducir o modificar su Arquitectura. + \item Conocer su proceso de fabricación. + \item Entender su funcionamiento global y la interacción de sus componentes. + \item Estudiar tutoriales que explican su programación. + \item Descargar, estudiar y modificar el código fuente de todas las aplicaciones existentes actualmente. + \item Realizar consultas con los creadores de las aplicaciones y de las plataforma de desarrollo. + \item Contribuir a mejorar la calidad de la documentación y crear nueva información. +\end{itemize} + +SAKC esta distribuido bajo la licencia Creative Commons \textit{(CC) BY - SA}, la que permite la distribución y modificación del diseño (incluso para aplicaciones comerciales), con el único requisito de que los productos derivadas deben tener la misma licencia. + + +\section{Desarrollo de Métodos de Evaluación} + + + + +% 6. Evaluation is the making of judgments about the value, for some purpose, of ideas, works, solutions, +% methods, material, etc. It involves the use of criteria and standards for appraising the extent to which +% particulars are accurate, effective, or satisfying. It may be quantitative or qualitative. +% Verb examples that represent intellectual activity on this level include: assess, defend, evaluate. +% Examples from the Syllabus: +% Assess one?s skills, interests, strengths and weaknesses +% Evaluate supporting evidence +% A way in which to view the structure of the Bloom verbs is shown in Table B1, which gives the six +% levels, and identifies three to five key verbs within each level. Some common synonyms for those key +% verbs are also listed. Verbs in Italics of Table B1 are commonly used Bloom verbs, and those in regular +% font were added to better fit with technically oriented topics of the Syllabus. The verbs in the column +% to the far right of Table B1 are commonly used Bloom verbs that we recommend not be used with the +% Syllabus. This is because the verbs either appear at two levels, and therefore are ambiguous, or +% because they have a technical connotation apart from their common meaning, which causes them to be +% misplaced in terms of level. Entries in bold will be used in the Bloom verb patterns discussed below. +% B-3 +% B.2 The Affective Domain +% The affective domain relates to the emotional component of learning. It emphasizes a feeling, tone, an +% emotion, or a degree of acceptance or rejection. Affect encompasses a range from simple attention to +% organization and characterization of complex, but internally consistent, qualities of character and +% conscience. Krathwohl, Bloom and Masia (1964) developed five levels in the affective domain. +% 1. Receiving (attending): Receiving speaks to an awareness that a learner is conscious of something, +% that he/she take into account a situation, phenomenon or state of affairs. It also addresses the +% learner's willingness to receive information. In other words the climate must be set so that students +% attention is grabbed and directed in a particular manner. +% Verb examples which represent intellectual activity on this level include: a s k , accept, hold. +% Examples from the Syllabus: +% Accepts the need for a commitment to service +% Accepts the goals and roles of the engineering profession +% 2. Responding: At the responding level, students are sufficiently motivated that they are not just +% willing to attend, but are actively attending. It involves a continuum from acquiescence in responding, +% to willingness to respond, to satisfaction in response. In other words, it is active participation by the +% students in their own learning. +% Verb examples that represent intellectual activity on this level include: answer, assist, discuss. +% Examples from the Syllabus: +% Discuss the motivation for continued self-education +% Discuss the importance of both a depth and breadth of knowledge +% 3. Valuing: Simply put, something has value or worth. At this level, behavior is sufficiently +% consistent and stable as to be characterized as a belief or attitude. The student is perceived as holding +% a value. This level ranges from acceptance of a value, to preference, to commitment to a value. +% Verb examples that represent intellectual activity on this level include: demonstrate a belief in, +% embrace, follow, join, share, value. +% Examples from the Syllabus: +% Embrace one?s responsibility for self improvement +% Value a willingness to work independently +% 4. Organization refers to the process learners go through after they internalize values and are faced +% with situations for which more than one value is relevant. This necessitates the organization of values +% into a system, determining the relationship among them, and establishing dominant and pervasive +% values. The emphasis is on comparing, relating, and synthesizing values. +% Verb examples that represent intellectual activity on this level include: alter, combine, complete, +% integrate, order, organize, relate, synthesize . +% B-4 +% Example from the Syllabus: +% Integrate the potential benefits and risks of an action +% 5. Characterization by a value or value complex: At this level the individual acts consistently in +% accordance with the values he/she has internalized. A behavior is pervasive, consistent, predictable, +% and characteristic of the student. Student beliefs, ideas, and attitudes are integrated into a total +% philosophy or view of the world. +% Verb examples that represent intellectual activity on this level include: discriminate, display, +% influence, presuppose, qualify, resolve, solve, verify. +% Example from the Syllabus: +% Resolves conflicting issues in the balance between personal and professional life +% B.3 The Psychomotor Domain +% The psychomotor domain emphasizes physical skills. It involves muscular or motor skill, some +% manipulation of materials and objects, or some act which requires a neuromuscular coordination. It +% captures the complexity of grace, strength, and speed that is often involved in physical activity or +% skill acquisition. +% While there are a few examples in the CDIO Syllabus that touch on the psychomotor domain, these +% topics all have an important cognitive component as well. Therefore the cognitive verbs are +% consistently used for these topics, and the psychomotor categories are not used in the Syllabus. +% For completeness, it is worth outlining the breakdown of this domain by Simpson (1972) into seven +% levels. +% 1. Perception is defined as the ability to use sensory cues to guide motor activity. +% 2. Set refers to the readiness to take a particular course of action. This includes physical and +% emotional set as well as mental. +% 3. Guided Response: refers to imitation and trial and error in which the adequacy of the performance +% is judged by the instructor or by a defined set of criteria. +% 4. Mechanism: describe learned responses that have become habitual, movements can be performed +% with some confidence and proficiency. +% 5. Complex Overt Responses: is the skillful performance of motor acts that involve complex movement +% patterns. Proficiency is indicated by a quick, accurate, and highly coordinated performance, requiring +% a minimum of energy. In this category, responses are automatic. +% 6. Adaptation: is the level at which skills are so well developed that the individual can modify +% movement patterns to fit special requirements or to meet a problem situation. +% 7. Origination is the creation of new movement patterns to fit a particular situation or specific +% problem. Outcomes at this level emphasize creativity based upon highly developed skills. + + + + + + + diff --git a/course/.docs/book/education.tex.backup b/course/.docs/book/education.tex.backup new file mode 100644 index 0000000..18f88e8 --- /dev/null +++ b/course/.docs/book/education.tex.backup @@ -0,0 +1,815 @@ +\chapter{Habilidades CDIO} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% INTRODUCCION %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Introducción} + +La iniciativa CDIO \footnote{http://www.cdio.org} ha sido desarrollada con ayuda de academicos, industriales, ingenieros y estudiantes\cite {WCI}. Es posible adaptar esta iniciativa a cualquier centro educativo en Ingeniería, y ha sido adoptada por un creciente número de instiruciones académicas a lo largo del mundo. + +La educación de la ingeniería y las demandas del mundo real están tomando caminos separados, la Iniciativa CDIO es un proyecto mundial que busca desarrollar una nueva visión de la educación en ingeniería. Hacer parte de este esfuerzo mundial nos ayuda a mantener nuestros planes académicos actualizados con los cambios que se realizan en países más industrializados. En este capítulo mostraremos como esta iniciativa se adapta perfectamemente a los cambios que se han inroducido en el área de la electrónica digital en la universidad Nacional de Colombia. + +La Iniciativa CDIO se basa en la suposición que los egresados de los centros de formación en ingeniería deben ser capaces de: Concebir, Diseñar, Implementar y Operar sistemas complejos en un entorno basado en equipos para crear sistemas y productos. En Colombia, la mayoría de los centros de formación solo tienen en cuenta la Concepción y el Diseño, descuidando por completo la Implementación y la Operación de sistemas, esto, impide que se tenga una estrecha relación con la industria, la cual, requiere productos que pueda comercializar o soluciones a sus necesidades. + +\subsection{Objetivos de la Iniciativa CDIO} + +La Iniciativa CDIO se enfoca en preparar a los estudiantes con los conocimientos habilidades y aptitudes para ser ingenieros líder. Y sus principales objetivos son: \cite {WCI}: + +\begin{itemize} + \item Educar a los estudiantes para dominar un conocimiento más profundo de los fundamentos técnicos. + \item Educar a los ingenieros para liderar la creación y operación de nuevos productos y sistemas. + \item Educar futuros investigadores para entender la importancia estratégica y el valor de su trabajo. +\end{itemize} + +El Departamento de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia está realizando el trabajo de adaptar la Iniciativa CDIO a su programa académico, esta iniciativa coincidió con el desarrollo de esta investigación. Los objetivos de esta iniciativa se adaptan a los requerimientos que se exige a la plataforma tecnológica de un país para que pueda realizar una adecuada absorción del conocimiento transferido y posteriormente transformar ese conocimiento en nuevos productos adaptados a las necesidades del país. + +Las premisas que capturan la visión, objetivos y fundamentos pedagógicos de la Iniciativa CDIO son: + +\begin{itemize} + \item Es posible cumplir las necesidades propias de la profesión mientras al mismo tiempo se realiza el proceso de Concebir, diseñar, implementar y operar sistemas en el contexto de los sistemas de Ingeniería. + \item Los resultados de la formación deben ser fijados por los sectores interesados (Academia, Industria, Gobierno) y deben formar una secuencia de experiencias de aprendizaje, algunas de las cuales son experimentales, es decir, deben enfrentar a los estudiantes a situaciones que encontrarán en el ejercicio de su profesión. + \item La adecuada construcción de esta cadena de actividades tendrán un doble impacto en la formación de los estudiantes, por un lado facilitará el aprendizaje de habilidades críticas e inter-personales y fortalecerá las habilidades de construcción de sistemas, productos y procesos, mientras se mejora el aprendizaje de los conceptos fundamentales. +\end{itemize} + +\subsubsection{liderazgo} + +La situación actual por la que atraviesa la Industria electrónica nacional, requiere que los profesionales en el área tengan las capacidades de emprendimiento y liderazgo necesarias para la creación de nuevas empresas o para la creación de nuevos productos, la Figura \ref{cdio_emp_lid} muestra la relación entre emprendimiento, liderazgo y las habilidades CDIO. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/CDIO_emp_lid.png} \end{center} + \caption{} fuente:\cite{ECJM+09} \label{cdio_emp_lid} +\end{figure} + + +Las habilidades principales que deben poseer un lider según la \textit{Sloan School of Management at MIT} son \cite{AD}: +\begin{itemize} + \item \textit{Interpretar} Interpretar el contexto de los cambios mundiales incluyendo el uso de pequeños experimentos para obtener información. + \item \textit{Relacionarse} Desrrollar relaciones confiables con diferentes tipos de personas, utilizando las preguntas para saber como comunicarse de forma efectiva. + \item \textit{Visión} Crear una visión para uno mismo y transmitir esta visión a los demás. + \item \textit{Realización de la Visión} +\end{itemize} + +\subsubsection{Emprendimiento} +El concepto clásico de emprendimiento involucra el re-direccionamiento y movilización de capital y recursos humanos para crear una nueva actividad económica. Actualmente, el emprendimiento esta asociado a la creación de une nueva empresa con una nueva línea de negocios. En algunas ocasiones las innovaciones tecnológicas no requieren cambios en el mercado. Cuando la ingeniería es el componente principal del producto, se debe enfatizar en el proceso de diseño y los ingenieros deben entender la relación entre la primicia y el tiempo de salida al mercado, márgenes de producto, la tasa de rendimiento mínima para justificar la inversión en la compañia y otras consideraciones de negocios que influyen en el diseño y las estrategias de implementación. + +\subsection{Estructura del Plan de Estudios CDIO} +La figura \ref{cdio_blocks} muestra los bloques constructores del plan de estudios CDIO, en el primer nivel podemos observar que todo individuo interesado en obtener habilidades técnicas posee \textit{Habilidades Personales y Profesionales}, las cuales son fundamentales para la práctica. Con el fín de desarrollar sistemas de ingeniería complejos, los estudiantes deben dominar los fundamentos del \textit{Razonamiento y Conocimiento Técnico}. Para trabajar en un entorno moderno basado en equipos los estudiantes deben desarrollar \textit{Habilidades Interpersonales} de comunicación y trabajo en equipo. Finalmente con el fin de ser capaz de crear y operar productos y sistemas un estudiante debe entender el concepto de \textit{Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial}\cite{EFC01} + + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.8]{./images/CDIO.png} \end{center} + \caption{Bloques Constructores de conocimiento, habilidades y actitudes necesarias para Concebir, Diseñar, Implementar y Operar sistemas en el contexto social y empresarial} fuente:\cite{EFC01} \label{cdio_blocks} +\end{figure} + + + +\subsubsection{Nivel 1: Razonamiento y Conocimiento Técnico} +Los componentes del primer nivel \textit{Razonamiento y Conocimiento Técnico} son comúnes a los planes de estudio de las ingenierías modernas y son: + +\begin{enumerate} + \item Fundamentos Avanzados de Igeniería. + \item Fundamentos del núcleo de Ingeniería. + \item Conocimiento científico. +\end{enumerate} + +La razón de colocar este bloque constructor en el primer nivel es solo para recordar que el objetivo primordial de cualquier programa de pregrado es el desarrollo de un profundo conocimiento de fundamentos técnicos. En este trabajo no se cambiará este componente ya que para hacerlo es necesario un consenso con las demás carreras de la facultad de Ingeniería, labor que puede tomar varios años. + +\subsubsection{Habilidades Personales, Profesionales e Interpersonales} + +Los niveles 2 y 3 se centran en las habilidades personales que debe poseer un individo para que pueda cumplir con el objetivo de la Iniciativa CDIO. El nivel 2 esta compuesto por: +\begin{enumerate} + \item Las habilidades profesionales que representan las tres formas de pensar más practicadas por los ingenieros: Resolución de problemas, Descubrimiento de conocimiento y Pensamiento sistémico. + \item Actitudes que incluyen integridad y comportamiento profesional así como las necesarias para planear la profesión. +\end{enumerate} + +Las habilidades que no hacen parte del contexto profesional ni del inter-personal son llamadas \textit{Habilidades y Actitudes Personales}, incluyen el carácter, iniciativa, perseverancia, formas de pensar más genéricas como pensamiento crítico, creativo y habilidades propias como curiosidad, aprendizaje continuo y manejo del tiempo. + +Las habilidades inter-personales, son un subconjunto de las habilidades personales y se dividen en dos grupos que se traslapan llamados: Equipo de Trabajo y Comunicaciones. El grupo de trabajo se refiere a las habilidades necesarias para formar, operar, fortalecer y liderar un equipo con habilidades específicas de un equipo de trabajo técnico. La comunicación se compone de habilidades para idear estrategias de comunicación y aquellas para utilizar los medios orales, escritos, electrónicos y gráficos y en el caso Colombiano el uso del idioma Inglés. La Figura \ref{cdio_2_3} muestra la relación entre las habilidades de nivel 2 (Personales y Profesionales) y nivel 3 (Interpersonales). + +\begin{figure} + \begin{center} \includegraphics[scale=.8]{./images/CDIO_2_3.png} \end{center} + \caption{Relación entre las Habilidades Personales, Profesionales e Interpersonales} fuente:\cite{EFC01} \label{cdio_2_3} +\end{figure} + + +\subsubsection{Habiidades CDIO} +Habilidades necesarias parea Concebir, Diseñar, Implementar y Operar Systemas en el Contexto Social y empresarial. Estos cuatro componentes son necesarios para que los egresados de las carreras de Ingniería Eléctrica y Electrónica sean capaces de absorver los conocimientos que las nuevas tecnologías proporcionan, adaptarlos a la situación tecnológica y al contexto social del país para generar productos que resuelvan necesidades locales. Para satisfacer una necesidad de la sociedad es necesario conocer la dinámica empresarial, los principios que la rigen y como se debe actuar en una empresa de cualquier tipo y tamaño. + +\subsection{Implementación del Plan de Estudios CDIO} +La Figura \ref{impl_CDIO} muestra los componentes que deben ser especificados para implementar el plan de estudios CDIO al currículo de las asignaturas del área de electrónica digital. En primer lugar se encuentran los resultados esperados del proceso de aprendizaje, esto es, Qué deben saber y que deben ser capaces de hacer los estudiantes al final del curso? Para contestar a esta pregunta es necesario definir las \textbf{habilidades} que serán reforzadas o desarrolladas y los \textit{objetivos} de cada asignatura. + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.8]{./images/habilidades_digitales.png} \end{center} + \caption{Objetivos, Actividades, y Evaluación: } \label{impl_CDIO} +\end{figure} + + +Para alcanzar los objetivos definidos en el primer paso, es necesario generar una serie de \textbf{actividades} que le permitan al estudiante: retener nuevos conocimientos y habilidades y desarrollar las competencias deseadas, el número de actividades debe ser tal que cubran todas las habilidades que se quieran desarrollar o reforzar. + +Finalmente, se deben desarrollar métodos de evaluación que permitan conocer el nivel de competencia de los estudiantes, y de esta forma ajustar las actividades para obtener los resultados esperados. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% IDENTIFICACION DE HABILIDADES CDIO %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Definición e Identificación de las Habilidades CDIO} + +El primer paso en la implementación del plan de estudios CDIO es definir e identificar las habilidades requeridas en una determinada área del plan de estudios, este estudio se centrará en las asignaturas del área de electrónica digital. En la Universidad Nacional de Colombia el área de Electrónica Digital esta compuesta por tres asignaturas para la carrera de Ingeniería Electrónica: Electrónica Digital 1, Electrónica Digital 2 y Sistemas Embebidos. Para la carrera de Ingeniería Eléctrica está compuesta por Electrónica Digital 1 (la misma en las dos carreras) únicamente. + + +\subsection{Introducir, Enseñar y Usar} +Para transladar esta lista de habilidades a objetivos de aprendizaje es necesario determinar el grado de competencia que se espera que el profesional adquiera en cada una de las asignaturas. Por supuesto, algunas de estas habilidades no pueden obtenerse en una asignatura, es necesario que todo el plan académico contribuya a generar una determinada habilidad, lo que requiere un consenso del personal académico. En el Departamento de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia se está realizando esta tarea y los resultados presentados en este estudio hacen parte de esta iniciativa. + +Los niveles de competencia seleccionados para indicar el nivel en que debe ser apropiada una determinada habilidad son: + +\begin{enumerate} + \item Introducir: Introduce pero no evalúa. + \item Enseñar: Enseña y evalúa. + \item Utilizar: Utiliza, puede ser evaluado o no. +\end{enumerate} + + +\subsection{Habilidades CDIO} +A continuación se listan las habilidades CDIO que deben desarrollarse o reforzarse en el área de Electrónica Digital, algunas de las habilidades como la comunicación oral y escrita en Inglés es común a la mayoría de las asignaturas, mientras que otras como la Integración Software - Hardware es exclusiva, + +%Redefine the first level +\renewcommand{\theenumi}{\arabic{enumi}} +\renewcommand{\labelenumi}{\theenumi} + +%Redefine the second level +\renewcommand{\theenumii}{\arabic{enumii}} +\renewcommand{\labelenumii}{\theenumii} + +\begin{enumerate} + \setcounter{enumi}{1} +% CDIO NIVEL 2 + \item \textbf{Aptitudes personales y profesionales} + \begin{enumerate} + \item Razonamiento ana;ítico y Resolución de problemas + \begin{enumerate} + \item Identificación y Formulación del problema + \item Modelamiento + \item Solución y recomendación + \end{enumerate} + \item Experimentación Investigación y Descubrimiento de Conocimiento + \begin{enumerate} + \item Formulación de hipótesis + \item Investigación experimental + \end{enumerate} + \item Pensamiento Sistemático + \begin{enumerate} + \item Pensamiento Global + \item Surgimiento e interacciones + \end{enumerate} + \item Pensamiento Crítico y Creativo y Habilidades y actitudes personales + \begin{enumerate} + \item Pensamiento creativo + \item Pensamiento crítico + \item Toma de conciencia de conocimientos propios y metaconocimiento. + \item Aprendizaje permanente y Educar a otros. + \end{enumerate} + \item Ética, Responsabilidad Profesional, Equidad y Otros Valores Personales. + \begin{enumerate} + \item Ética, integridad y responsabilidad social + \item Comportamiento profesional y responsabilidad + \item Confianza y lealtad + \end{enumerate} + \end{enumerate} +% CDIO NIVEL 3 + \item \textbf{Habilidades interpersonales, trabajo en equipo y comunicación} + + \begin{enumerate} + \item Equipo de Trabajo + \begin{enumerate} + \item Formar grupos efectivos + \item Equipo de liderazgo + \item Equipo Técnico y multi-disciplinario. + \end{enumerate} + \item Comunicaciones estructuradas + \begin{enumerate} + \item Estrategia de comunicación + \item Estructura de la comunicación + \item Comunicación Escrita + \item Comunicación Electrónica + \item Presentación Oral + \end{enumerate} + \item Comunicación en Idioma Extranjero + \begin{enumerate} + \item Inglés + \end{enumerate} + \item Comunicaciones Informales: Relacionarse con los demás + \begin{enumerate} + \item Preguntar, Escuchar y Dialogar + \item Negociación, compromiso y resolución de conflictos. + \item Establecimiento de conexiones + \end{enumerate} + \end{enumerate} + +% CDIO NIVEL 4 + \item \textbf{Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial} + \begin{enumerate} + \item Contexto Externo, Social, Económico y Ambiental + \begin{enumerate} + \item Rol y responsabilidad de los Ingenieros + \item Impacto sobre la sociedad y el medio ambiente + \item Cuestiones y valores actuales + \item Sostenibilidad y necesidad de un desarrollo sostenible. + \end{enumerate} + \item Empresa y contexto empresarial + \begin{enumerate} + \item Interesados en la empresa, metas y objetivos + \item Espíritu Empresarial Técnico + \item Trabajo en organizaciones + \item Finanzas y Economís de los Proyectos de Ingeniería + \end{enumerate} + \item Concepción y Administración de Sistemas en Ingeniería. + \begin{enumerate} + \item Entender las necesidades y establecer las metas + \item Definir la función, concepto y arquitectura + \end{enumerate} + \item Diseño + \begin{enumerate} + \item Proceso de Diseño + \item Fases del proceso de Diseño y enfoques + \item Utilización de conocimiento científico en el diseño + \item Diseño específico + \item Diseño multi-disciplinario + \end{enumerate} + \item Implementación + \begin{enumerate} + \item Proceso de fabricación Hardware + \item Proceso de Implementación de Software + \item Integración Software - Hardware + \item Pruebas, verificación, validación y certificación + \end{enumerate} + \item Liderar Esfuerzos en ingeniería + \begin{enumerate} + \item Pensar creativamente e Imaginar posibilidades + \item Definir la solución + \item Crear nuevas formas de solución + \item Construir y liderar una organización y una organización extendida. + \item Planear y administrar un prpyecto hasta su finalización. + \item Innovar - la concepción, diseño e introducción de nuevos bienes y servicios. + \item Innovar - el desarrollo de nuevos dispositivos, materiales o procesos que permitan nuevos bienes y servicios. + \end{enumerate} + \item Emprendimiento en ingeniería + \begin{enumerate} + \item Creación, Formulación y organización de una empresa. + \item Desarrollo del plan de negocios. + \item Finanzas y capitalización. + \item Mercadeo de productos innovadores + \item Cencepción de productos y servicios alrededor de nuevas tecnologías. + \item Sistema de innovación, redes, infraestructura y servicios. + \item Construyendo el equipo e iniciando el proceso de ingeniería. + \item Manejo de la propiedad intelectual. + \end{enumerate} + \end{enumerate} +\end{enumerate} + + +\subsection{Competencias de las Habilidades CDIO 2 y 3} +La tabla \ref{compet_2_3} muestra las competencias IEU para los niveles CDIO 2 y 3 para las asignaturas Electrónica Digital 1, Electrónica Digital 2 y Sistemas Embebidos. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} \hline + \multicolumn{4}{|c|}{\textbf{Competencias de las Habilidades CDIO Nivel 2 y 3}} \\ \hline + \multirow{2}{*}{\textbf{APTITUDES PERSONALES Y PROFESIONALES}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Planteamiento y Resolución de problemas de Ingeniería}} & \multicolumn{3}{c|} {EU} \\ \hline + 1 Identificación y Formulación del problema & \multicolumn{3}{c|} {EU} \\ \hline + 2 Modelamiento & \multicolumn{3}{c|} {EU} \\ \hline + 3 Solución y recomendación & \multicolumn{3}{c|} {EU} \\ \hline + \textbf{\textit{Experimentación y Descubrimiento de Conocimiento}} & \multicolumn{3}{c|} {U} \\ \hline + 4 Formulación de hipótesis & \multicolumn{3}{c|} {U} \\ \hline + 5 Investigación experimental & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Pensamiento Sistemático}} & \multicolumn{3}{c|} {EU} \\ \hline + 6 Pensamiento Global & \multicolumn{3}{c|} {U} \\ \hline + 7 Surgimiento e interacciones & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Habilidades y actitudes personales}} & \multicolumn{3}{c|} {U} \\ \hline + 8 Pensamiento creativo & \multicolumn{3}{c|} {IEU} \\ \hline + 9 Pensamiento crítico & \multicolumn{3}{c|} {IEU} \\ \hline + 10 Toma de conciencia de conocimientos propios & \multicolumn{3}{c|} {IEU} \\ \hline + 11 Curiosidad y aprendizaje permanente + \textbf{\textit{Habilidades y actitudes profesionales}} & \multicolumn{3}{c|} {U} \\ \hline% \begin{enumerate} + 12 Ética profesional, integridad, responsabilidad & \multicolumn{3}{c|} {U} \\ \hline + 13 Comportamiento profesional & \multicolumn{3}{c|} {U} \\ \hline + 39 Confianza y Lealtad & \multicolumn{3}{c|} {IEU} \\ \hline + \multirow{2}{*}{\textbf{HABILIDADES INTERPERSONALES}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Equipo de Trabajo}} & \multicolumn{3}{c|} {EU} \\ \hline + 14 Formar grupos efectivos & EU & U & U \\ \hline + 15 Equipo de Liderazgo & EU & U & U \\ \hline + 40 Equipo Técnico y Multi-disciplinario & EU & U & U \\ \hline + \textbf{\textit{Comunicaciones estructuradas}} & \multicolumn{3}{c|} {EU} \\ \hline + 16 Estrategia de comunicación & EU & U & U \\ \hline + 17 Estructura de la comunicación & EU & U & U \\ \hline + 18 Comunicación Escrita & EU & U & U \\ \hline + 19 Comunicación Electrónica & EU & U & U \\ \hline + 20 Presentación Oral & EU & U & U \\ \hline + \textbf{\textit{Comunicación en Idioma Extranjero}} & \multicolumn{3}{c|} {U} \\ \hline + 21 Inglés & \multicolumn{3}{c|} {U} \\ \hline + \textbf{\textit{Comunicaciones Informales: Relacionarse con los demás}} & \multicolumn{3}{c|} {U} \\ \hline + 41 Preguntar, Escuchar y Dialogar & EU & U & U \\ \hline + 42 Negociación, compromiso y resolución de conflictos & EU & U & U \\ \hline + 43 Establecimiento de conexiones & IEU& U & U \\ \hline + \end{tabular} + \caption{Competencias para los niveles 2 y 3 CDIO} \label{compet_2_3} + \end{table} +\end{center} + +\subsection{Competencias de las Habilidades C.D.I.O. Sistemas en el contexto Empresarial, Social y Ambiental - Innovación} + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} \hline + \multirow{2}{*}{\textbf{HABILIDADES CDIO}} & \multicolumn{3}{c|} {Nivel 1} \\ + & E. Digital1 & E. Digital1 & Sist. Emb. \\ \hline + \textbf{\textit{Contexto Externo, Social, Económico y Ambiental}} & \multicolumn{3}{c|} {IEU} \\ \hline + 22 Rol y responsabilidad de los Ingenieros & \multicolumn{3}{c|} {IEU} \\ \hline + 23 Impacto sobre la sociedad y el medio ambiente & \multicolumn{3}{c|} {IEU} \\ \hline + 24 Cuestiones y valores actuales & \multicolumn{3}{c|} {IEU} \\ \hline + 44 Sostenibilidad y necesidad de un desarrollo sostenible& IE & IE & IE \\ \hline + \textbf{\textit{Empresa y contexto empresarial}} & \multicolumn{3}{c|} {EU} \\ \hline + 25 Interesados en la empresa, metas y objetivos & \multicolumn{3}{c|} {I} \\ \hline + 26 Espíritu Empresarial Técnico & \multicolumn{3}{c|} {I} \\ \hline + 27 Trabajo exitoso en organizaciones & \multicolumn{3}{c|} {I} \\ \hline + 45 Finanzas y Economía de los Proyectos de Ingeniería & IE & IE & IE \\ \hline + \textbf{\textit{Concepción y Administración de Sistemas en Ingeniería.}} & \multicolumn{3}{c|} {IEU} \\ \hline + 28 Entender las necesidades y establecer las metas & IEU & EU & U \\ \hline + 29 Definir la función, concepto y arquitectura & IEU & EU & U \\ \hline + \textbf{\textit{Diseño}} & \multicolumn{3}{c|} {IEU} \\ \hline + 30 Proceso de Diseño & IEU & EU & U \\ \hline + 31 Fases del proceso de Diseño y enfoques & IEU & EU & U \\ \hline + 32 Utilización de conocimiento científico en el diseño & IEU & EU & U \\ \hline + 33 Diseño específico & IEU & EU & U \\ \hline + 34 Diseño multi-disciplinario & I & E & U \\ \hline + \textbf{\textit{Implementación}} & \multicolumn{3}{c|} {EU} \\ \hline + 35 Proceso de fabricación Hardware & IE & EU & U \\ \hline + 36 Proceso de Implementación de Software & I & EU & U \\ \hline + 37 Integración Software - Hardware & I & EU & U \\ \hline + 38 Pruebas, verificación, validación y certificación & IE & EU & U \\ \hline + \end{tabular} + \caption{Competencias para el niveles 4 CDIO} \label{compet_2_3} + \end{table} +\end{center} + + +\section{Integración de las Habilidades CDIO al Plan de Estudios} + +\subsection{Objetivo General} +Generar en el estudiante las habilidades necesarias para Concebir, Diseñar, Implementar y Operar Sistemas Digitales complejos que satisfagan necesidades de la sociedad y proporcionar un canal para la transferencia de Tecnología y conocimiento a la Industria Colombiana. La Figura \ref{design_method} muestra la metodología de diseño para las diferentes asignaturas del área. + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.8]{./images/habilidades_digitales.png} \end{center} + \caption{Metodología de Diseño para el área de Sistemas Digitales} \label{design_method} +\end{figure} + +\subsubsection{Electrónica Digital 1} +Concebir y definir las especificaciones y requerimientos de un Sistema Digital, modelar su funcionamiento, y realizar la implementación siguiendo la metodología de diseño de Sistemas Embebidos utilizando únicamente tareas Hardware. + +\subsubsection{Electrónica Digital 2} +Concebir, definir las especificaciones, modelar, diseñar un Sistema Digital siguiendo la metodología de diseño de Sistemas Embebidos y realizar su implementación óptima utilizando tareas Hardware (que se ejecutan en un PLD) y tareas Software (que se ejecutan en un procesador). + +\subsubsection{Sistemas Embebidos} +Concebir, diseñar, e Implementar un sistema digital complejo utilizando la metodología de diseño de sistemas Embebidos y un Sistema Operativo para su Implementación. + + +\subsection{Objetivos Específicos} + +\subsection {Ojbetivos comúnes} +\begin{itemize} + \item Identificar las especificaciones funcionales del sistema, su arquitectura de alto nivel y definir su descomposición en elementos + \item Explicar las actividades en las etapas del proceso de diseño, + \item Desarrollar el pensamiento sistémico. + \item Modelar funcionalmente Sistemas Digitales. + \item Diseñar pruebas para comprobar el correcto funcionamiento de los sistemas implementados. + \item Leer y entender material técnico escrito en inglés. + \item Implementar un Sistemas Embebido (Hardware o Hardware/Software) para cumplir una tarea determinada que cumpla con una necesidad real (Obtener e interpretar las necesidades del consumidor) utilizando técnicas, herramientas y procesos adecuados. + \item Estudiar y aplicar el concepto de la re-utilización de código. + \item Desarrollar trabajo en equipo incluyendo presentaciones, describiendo los diversos roles y responsabilidades. + \item Documentar los diseños realizados para crear una base de datos que contribuya a la difusión del conocimiento adquirido. +\end{itemize} + +\subsubsection{Electrónica Digital 1} +\begin{itemize} + \item Estudiar las fases de la metodología de diseño para Sistemas Embebidos. + \item Estudiar los dominios de diseño Estructural, Funcional y Físico. + \item Estudiar los Lenguajes de Descripción de Hardware. + \item Estudiar los componentes básicos de la lógica combinatoria y secuencial. +\end{itemize} + +\subsubsection{Electrónica Digital 2} +\begin{itemize} + \item Estudiar los requisitos para un particionamiento Hardware / Software óptimo. + \item Estudiar la arquitectura de un procesador, micro-arquitectura, set de instrucciones, interrupciones, direccionamiento. + \item Estudiar el proceso de implementación de tareas software. + \item Estudiar la integración Software-Hardware. + \item Diseñar pruebas para comprobar el correcto funcionamiento de los sistemas implementados. +\end{itemize} + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item Realizar aplicaciones que requieran diseño multi-disciplinario. + \item Estudiar y realizar el proceso de Fabricación Hardware. + \item Estudiar el principio básico de los sistemas operativos. + \item Describir la integración de software en hardware electrónico + \item Entender diagramas de circuitos electrónicos de sistemas digitales, identifcar sus componentes y su función. + \item Estudiar diseños software y hardware existentes para entender su funcionamiento, arquitectura y adquirir experiencia en el diseño. + \item Hacer parte de listas de discusión de temas técnicos que usen el inglés como lenguaje. +\end{itemize} + +\subsection{Contenido} + +\subsubsection{Electrónica Digital 1} +\begin{itemize} + \item \textbf{Flujo de Diseño de Sistemas Embebidos} + \begin{itemize} + \item Sistemas Digitales: Panorama Y Perspectiva + \item Metodología de Diseño + \item Representaciones de Diseño y Niveles de Abstracción + \end{itemize} + \item \textbf{Sistemas Numéricos y Operaciones Aritméticas} + \begin{itemize} + \item Representación de Datos + \item Sistemas numéricos: Binario, Octal Hexadecimal + \item Representación de números negativos + \item Algoritmos para la implementación de operaciones aritméticas + \begin{itemize} + \item Camino de Datos + \item Control + \end{itemize} + \end{itemize} + \item \textbf{Lógica Combinatoria} + \begin{itemize} + \item Definición. + \item Ecuaciones Booleanas, Formas canónicas. + \item Módulos Básicos: Multiplexores, codificadores, sumadores, restadores comparadores. + \end{itemize} + \item \textbf{Lógica Secuencial} + \begin{itemize} + \item Definición + \item Elementos de memoria: + \begin{itemize} + \item Latch + \item Flip-Flop + \end{itemize} + \item Bloques básicos + \begin{itemize} + \item Registros + \item Acumuladores + \item Contadores + \end{itemize} + \item Máquina de Estados Finitos (FSM) + \begin{itemize} + \item Arquitectura + \item Tipos: Mealy, Moore + \item Diagramas de Estado + \item Síntesis de Máquinas de Estado + \end{itemize} + \item Máquinas de Estado Algorítmicas (ASM) + \begin{itemize} + \item Tareas Hardware + \item Componentes: Camino de Datos y Máquina de Control + \item Implementación de operaciones aritméticas utilizando ASM + \item Identificación, funcionamiento e interfaz de bloques constructores. + \item Interacción entre el Camino de Datos y la Máquina de Control + \item Lenguajes de Descripción de Hardware + \end{itemize} + \end{itemize} + \item \textbf{Tecnologías de Implementación} + \begin{itemize} + \item Familia Lógica CMOS + \begin{itemize} + \item Principio de funcionamiento, consumo de potencia + \item Niveles Lógicos y márgenes de ruido + \item Retardos, Manejo de Corriente + \item Compuertas tri-estado y Open-Drain + \end{itemize} + \item Dispositivos Lógicos Programables + \begin{itemize} + \item Arreglos Lógicos Programables (PALs) + \item Dispositivos Lógicos Programables (PLDs, CPLDs) + \item Arreglo de Compuertas Programable en Campo (FPGA) + \item Flujo de Diseño - Programación en Sistema + \end{itemize} + \end{itemize} + \item \textbf{Introducción a los procesadores} + \begin{itemize} + \item Máquina de Estados Algorítmica Programable + \end{itemize} +\end{itemize} + + +\subsubsection{Electrónica Digital 2} + +\begin{itemize} + \item \textbf{Codiseño Hardware-Software} + \begin{itemize} + \item Flujo de Diseño y Particionamiento HW/SW. + \item Comunicación SW -> HW (Direccionamiento) + \item Comunicación HW -> SW (Interrupciones) + \item Componentes de un Sistema etherogéneo. + \begin{itemize} + \item Procesador + \item Buses + \item Periféricos + \item Memorias + \end{itemize} + \end{itemize} + \item \textbf{Arquitectura de Procesadores} + \begin{itemize} + \item Micro-Arquitectura + \item Set de Instrucciones + \item Modos de direccionamiento + \item Interrupciones + \item Pipeline + \end{itemize} + + \item \textbf{Implementacion de Tareas Hardware} + \begin{itemize} + \item Arquitectura de computadores + \begin{itemize} + \item CPU + \item Memorias + \item Periféricos + \item Mapa de Memoria + \item Controlador de Interrupciones Programable + \end{itemize} + \item Definición de la Interfaz HS <-> SW + \item Implementación de Tareas Hardware en Periféricos. + \end{itemize} + + \item \textbf{Flujo de Diseño Software} + \begin{itemize} + \item Cadena de Herramientas: + \begin{itemize} + \item Compilador + \item Librerías standard + \item Depurador + \item Utilidades binarias + \item Código de Inicio C RunTime crt0 + \item Herramienta \textit{make} + \end{itemize} + \item Integración del Software sobre hardware Electrónico. + \begin{itemize} + \item Ejecución en Memoria Interna + \item Ejecución en Memoria Externa: Bootloaders + \end{itemize} + \item Implementación de tareas software y comunicación con tareas Hardware. + \end{itemize} + \item \textbf{Sistemas Sobre Silicio} + \begin{itemize} + \item Arquitectura + \end{itemize} +\end{itemize} + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item \textbf{Sistemas Embebidos} + \begin{itemize} + \item Definición,aplicaciones + \item Metodología de Diseño + \item Arquitectura + \begin{itemize} + \item Sistema Sobre Silicio + \item Circuitos de Referencia + \end{itemize} + \end{itemize} + \item Iniclialización + \begin{itemize} + \item Métodos de arranque + \item Bootloaders + \end{itemize} + \item \textbf{Sistema Operativo Linux} + \begin{itemize} + \item Arquitectura + \item Sincronización entre procesos + \item Estructura del Kernel y Organización del código fuente + \item Drivers de Dispositivos y módulos del kernel + \item Imágen del kernel + \item Inicialización del Kernel + \end{itemize} + \item \textbf{Sistema de Archivos del root} + \begin{itemize} + \item Tipos de Sistema de Archivos + \item Estructura del Sistema de Archivos del root + \item Archivos de configuración y niveles de ejecución. + \item Montaje del sistema de archvios del root + \end{itemize} + \item \textbf{Interfaz con dispositivos externos al SoC} + \begin{itemize} + \item Control utilizando señales de Entrada/Salida de propósito general (GPIOs) + \item Utilizando puertos de comunicaciones UART, I2C, SPI, USB. + \item Utilizando el controlador de memorias externas del SoC + \end{itemize} + \item \textbf{Interfaz con Periféricos Dedicados Implementados en PLDs} + \begin{itemize} + \item Configuración del PLD utilizando GPIOs del SoC + \item Definición de la Interfaz HW y SW + \item Comunicación con periféricos dedicados + \end{itemize} +\end{itemize} + +\subsection{Metodología} +Todas las actividades que se realizarán en estos cursos están encamindas a generar habilidades necesarias para Concebir, Diseñar, e Implementar Sistemas Digitales Complejos, y están articuladas alrededor de una única metodología de diseño (la aceptada internacionalmente para el diseño de sistemas embebidos). Los tres cursos se diferencian en el medio donde se realiza la implementación de las tareas y el tipo de las mismas, en el primer curso todas las tareas son Hardware y se implementarán en un PLD, en el segundo las tareas son de tipo hardware y software y serán implementadas en un PLD. El tercer curso también implementa tareas hardware y software pero utiliza componentes utilizados en dispositivos comerciales, esto es, SoCs para implementar las tareas Software y PLDs para las tareas hardware. El conocimiento adquirido en cada asignatura será la base del siguiente curso. + +Los tres cursos tienen un carácter teórico-práctico, el componente teórico tratará los diferentes temas de forma general, con el fín de no crear dependencia con las herramientas utilizadas (lo que permitirá realizar actualizaciónes de forma fácil). En el componente práctico se tratarán temas específicos de manejo de las herramientas (Lenguajes de Descripción de Hardware, lenguajes de programación, manejo de plataformas de desarrollo) y como estas se relacionan con la metodología de diseño utilizada. + +El estudiante debe estudiar, profundizar y comprobar algunos temas tratados en clase y debe leer previamente la documentación que se encuentra disponible en el sitio web de los cursos. Adicionalmente, debe formar grupos de trabajo para realizar actividades a lo largo del semestre. + +Durante el semestre se trabajará para definir las especificaciones, diseñar e implementar un dispositivo que resuelva una determinada necesidad (con la complejidad adecuada para cada curso), en la sesión teórica se tratarán aspectos relacionados con la concepción, diseño, Identificación y definición de las funciones de los componentes del sistma, mientras que en los relacionados con la implementación de dichos componentes sobre PLDs o SoC. Se deben realizar presentaciones del avance, indicando las razones que se tuvieron en cuenta en cada decisión y somo se resolvieron los problemas encontrados, todo este proceso debe documentarse en el sitio web del curso. + +El laboratorio está relacionado con la práctica y proporciona el conocimiento y habilidades para manejar y entender las herramientas Hardware y Software utilizadas en la implementación. Las actividades programadas, deben ser entregadas con un informe donde se evidencie el uso de la metodología de diseño utilizada, adicionalmente el estudiante debe defender y explicar su diseño. + +Se utilizarán los siguientes métodos de calificación: +\begin{itemize} + \item Pruebas escritas donde se verificará la asimiliación de conocimiento. + \item Sustentación oral de procesos de diseño e Implementación. + \item Evaluación del avance del proceso de Concepción, Diseño e Implementación del Proyecto Final. +\end{itemize} + +\subsection{Actividades} + +\subsubsection{Lectura de material del curso 10, 11} +Con la lectura previa de los temas, el estudiante adquiere la capacidad de absorver conocimiento (11), identificar sus preferenicas, deficiencias y buscar ayuda para suplirlas (10), lo cual ayuda al mejoramiento de las habilidades para el auto-aprendizaje, uno de los problemas detectados en los estudiantes es la necesidad de una autoridad que le proporcione la información que necesita para resolver un problema o tomar una decisión. + +\subsubsection{Lectura de material Técnico en Inglés 10, 11, 6, 30, 33, 21} +La mayor parte de la documentación de los componentes electrónicos esta escrita en inglés técnico, es necesario que el estudiante aprenda a entender este tipo de escritura y se familiarice con su estructura. Esto le permite identificar el funcionamiento de un componente del sistema (6,30), determinar que componente se adapta mejor a sus necesidades (33) y mejorar sus habilidades para comunicarse en inglés 21. + +\subsubsection{Utilización de Metodologías de Diseño 1, 2, 3, 6, 7, 9, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38} + +La metodología de diseño(30,31,) de sistemas embebidos requiere identificar un problema(1, 28), plantear una solución(3,29,32) lógica (9) de alto nivel (9), modelarla (2) a nivel de sistema(6), verificar el cumplimiento de los requerimientos(33,38). Proporciona métodos para determinar su arquitectura óptima (particionamiento HW/SW) y definir la función e interacción(37,7) de sus componentes software (36) y hardware (35). + +\subsubsection{Implementación de Sistemas Digitales Sencillos 3, 14, 29, 30, 35, 36, 17, 18, 19} + + La realización de prácticas de laboratorio en las que grupos de trabajo (14) implementan diseños de baja o media complejidad le permite al estudiante: Formular recomendaciones (3) para que no se repitan errores en experiencias futuras. Utilizar sistemas de desarrollo (30) para la implementación de tareas HW y SW a bajo nivel (36). Con el fin de mejorar la capacidad de comunicación escrita (18, 19) se deben presentar informes que refuercen las habilidades generadas en la utilización de la metodología de diseño, por lo que se deben tener la siguiente estructura(17): +\begin{itemize} + \item Un diagrama de caja negra que indique las entradas y salidas del sistema. + \item Una descripción de alto nivel del algoritmo que implementa la solución (29). + \item Un diagrama de bloques que indique el particionamiento y la interconexión entre sus componentes (30). + \item Descripciones de alto nivel de cada uno de los componentes (31). + \item La implementación y simulación de cada componente y del sistema completo (35), donde se muestre que el sistema cumple con las especificaciones funcionales(38) +\end{itemize} + +\subsubsection{Proyecto Final 1,2,3, 14, 15, 30, 31, 32, 33, 34, 35, 22, 23, 24, 25, 27} +Durante el semestre se trabajará para definir las especificaciones(1,2,3), diseñar(30,31,32,33,34) e implementar un dispositivo que resuelva una hipotética necesidad de la sociedad (22) (con la complejidad adecuada para cada curso), en la sesión teórica se tratarán aspectos relacionados con la concepción, diseño, Identificación y definición de las funciones de los componentes del sistema, mientras que en el componente práctico, los relacionados con la implementación de dichos componentes sobre PLDs o SoC. + +A los estudiantes se les hace una descripción funcional de alto nivel del sistema, ellos deben organizarse en grupos de trabajo (14,15), definir la función de cada uno de estos grupos (27,14,31), establecer estrategias de comunicación (16,31), realizar y/o cumplir un cronograma de actividades (25,31) que permitan resolver la necesidad en el tiempo especificado (22). Una de las estrategias de comunicación es la realización de presentaciones orales (20), en las que cada equipo de trabajo expondrá el estado de su sub-proyecto, indicando las razones que se tuvieron en cuenta en cada decisión y como se resolvieron los problemas encontrados (24). Adicionalmente todo este proceso debe documentarse en el sitio web del curso (wiki) con el objetivo de crear una base de proyectos que permitan a futuros estudiantes utilizar la experiencia obtenida (23) y en un determinado caso dar continuidad al proyecto. + +El estudiante debe diseñar y construir placas de circuito impreso con los circuitos necesarios para su aplicación (35) siguiendo las normas de diseño establecidas por el fabricante (resolución, número de capas, costo) y las restricciones del circuito (Capacidad de corriente, niveles de ruido, compatibilidad electromagnética, etc). + +Vale la pena aclarar que durante el primer curso los estudiantes no poseen la experiencia necesaria para realizar (sin asistencia) labores como la división de tareas, generación de un cronograma de actividades y fijar la estrategia de comunicación, razón por la cual el docente debe acompañar este proceso. + +\subsubsection{Participación en listas de discución 21} +Con el objeto de aumentar las capacidades en la comunicación en idioma extranjero, se alentará a los estudiantes a que hagan parte de listas de discusión en diferentes temas técnicos, algunos problemas que encontrarán en la realización de las diferentes prácticas deben ser consultados en estas listas para encontrar una forma de solución + + +\subsection{Plataforma de Desarrollo SAKC} + +La plataforma SAKC fué diseñada para ser utilizada como herramienta de implementación para los tres cursos de esta área. Está compuesta (ver Figura \ref{sakc_block}) por una FPGA y un Procesador, lo que permite la implementación de tareas Hardware y Software utilizando únicamente la FPGA o el procesador y la FPGA. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/SAKC_block_diagram.png} \end{center} + \caption{Diagrama de Bloques de la Plataforma de Desarrollo SAKC}\label{sakc_block} +\end{figure} + +Durante el primer curso, el procesador de la plataforma se utilizará para configurar a la FPGA con las tareas hardware sitetizadas por los estudiantes. esta plataforma carece (intencionalmente) de elementos comunmente utilizados en las plataformas de desarrollo para PLDs como Pulsadores, Leds, Displays o conectores espaciales, lo que obliga a los estudiantes a investigar la forma de conexión de estos y a construir circuitos que permitan la conexión de la plataforma con estos elementos de interfaz con el usuario o con otros sistemas. + + +\begin{figure}[h] +\centering +\mbox{\subfigure[Big]{\epsfig{figure=matlab.eps,width=3in}}\quad +\subfigure[Small]{\epsfig{figure=matlab.eps,width=2in}}} +\caption{Fuel Metabolism} +\label{fig:SubF} +\end{figure} + + +\begin{figure}[h] + \begin{center} + \mbox{ + } + \includegraphics[scale=.6]{./images/SAKC.png} \includegraphics[scale=.6]{./images/SAKC_LCD.png} + \end{center} + \caption{Plataforma de Desarrollo SAKC} \label{sakc} +\end{figure} + +La capacidad de la FPGA de SAKC permite la implementación de procesadores soft-core (como plasma y microblaze), posibilitando la implementación de tareas Hadware y software en ella. El procesador será utilizado al finalizar el curso para comparar el desempeño (velocidad, consumo de potencia, costo) entre un procesador soft-core y un procesador comercial. + +El ultimo curso utilizará el procesador para la ejecución de tareas software y la FPGA para ejecutar las tareas Software, se hará uso de herramientas utilizadas actualmente en el diseño de Aplicaciones comerciales de multinacionales como Nokia (QT), Motorola (Linux). + + +\subsubsection{Hardware y Software Copy-Left} +El conocimiento debe ser considerado un bien común y se debe garantizar el acceso a todo el mundo. Por esta razón SAKC proporciona la documentación necesaria para: + +\begin{itemize} + \item Estudiar. entender, y reproducir o modificar su Arquitectura. + \item Conocer su proceso de fabricación. + \item Entender su funcionamiento global y la interacción de sus componentes. + \item Estudiar tutoriales que explican su programación. + \item Descargar, estudiar y modificar el código fuente de todas las aplicaciones existentes actualmente. + \item Realizar consultas con los creadores de las aplicaciones y de las plataforma de desarrollo. + \item Contribuir a mejorar la calidad de la documentación y crear nueva información. +\end{itemize} + +SAKC esta distribuido bajo la licencia Creative Commons \textit{(CC) BY - SA}, la que permite la distribución y modificación del diseño (incluso para aplicaciones comerciales), con el único requisito de que los productos derivadas deben tener la misma licencia. + + +\section{Desarrollo de Métodos de Evaluación} + + + + +% 6. Evaluation is the making of judgments about the value, for some purpose, of ideas, works, solutions, +% methods, material, etc. It involves the use of criteria and standards for appraising the extent to which +% particulars are accurate, effective, or satisfying. It may be quantitative or qualitative. +% Verb examples that represent intellectual activity on this level include: assess, defend, evaluate. +% Examples from the Syllabus: +% Assess one?s skills, interests, strengths and weaknesses +% Evaluate supporting evidence +% A way in which to view the structure of the Bloom verbs is shown in Table B1, which gives the six +% levels, and identifies three to five key verbs within each level. Some common synonyms for those key +% verbs are also listed. Verbs in Italics of Table B1 are commonly used Bloom verbs, and those in regular +% font were added to better fit with technically oriented topics of the Syllabus. The verbs in the column +% to the far right of Table B1 are commonly used Bloom verbs that we recommend not be used with the +% Syllabus. This is because the verbs either appear at two levels, and therefore are ambiguous, or +% because they have a technical connotation apart from their common meaning, which causes them to be +% misplaced in terms of level. Entries in bold will be used in the Bloom verb patterns discussed below. +% B-3 +% B.2 The Affective Domain +% The affective domain relates to the emotional component of learning. It emphasizes a feeling, tone, an +% emotion, or a degree of acceptance or rejection. Affect encompasses a range from simple attention to +% organization and characterization of complex, but internally consistent, qualities of character and +% conscience. Krathwohl, Bloom and Masia (1964) developed five levels in the affective domain. +% 1. Receiving (attending): Receiving speaks to an awareness that a learner is conscious of something, +% that he/she take into account a situation, phenomenon or state of affairs. It also addresses the +% learner's willingness to receive information. In other words the climate must be set so that students +% attention is grabbed and directed in a particular manner. +% Verb examples which represent intellectual activity on this level include: a s k , accept, hold. +% Examples from the Syllabus: +% Accepts the need for a commitment to service +% Accepts the goals and roles of the engineering profession +% 2. Responding: At the responding level, students are sufficiently motivated that they are not just +% willing to attend, but are actively attending. It involves a continuum from acquiescence in responding, +% to willingness to respond, to satisfaction in response. In other words, it is active participation by the +% students in their own learning. +% Verb examples that represent intellectual activity on this level include: answer, assist, discuss. +% Examples from the Syllabus: +% Discuss the motivation for continued self-education +% Discuss the importance of both a depth and breadth of knowledge +% 3. Valuing: Simply put, something has value or worth. At this level, behavior is sufficiently +% consistent and stable as to be characterized as a belief or attitude. The student is perceived as holding +% a value. This level ranges from acceptance of a value, to preference, to commitment to a value. +% Verb examples that represent intellectual activity on this level include: demonstrate a belief in, +% embrace, follow, join, share, value. +% Examples from the Syllabus: +% Embrace one?s responsibility for self improvement +% Value a willingness to work independently +% 4. Organization refers to the process learners go through after they internalize values and are faced +% with situations for which more than one value is relevant. This necessitates the organization of values +% into a system, determining the relationship among them, and establishing dominant and pervasive +% values. The emphasis is on comparing, relating, and synthesizing values. +% Verb examples that represent intellectual activity on this level include: alter, combine, complete, +% integrate, order, organize, relate, synthesize . +% B-4 +% Example from the Syllabus: +% Integrate the potential benefits and risks of an action +% 5. Characterization by a value or value complex: At this level the individual acts consistently in +% accordance with the values he/she has internalized. A behavior is pervasive, consistent, predictable, +% and characteristic of the student. Student beliefs, ideas, and attitudes are integrated into a total +% philosophy or view of the world. +% Verb examples that represent intellectual activity on this level include: discriminate, display, +% influence, presuppose, qualify, resolve, solve, verify. +% Example from the Syllabus: +% Resolves conflicting issues in the balance between personal and professional life +% B.3 The Psychomotor Domain +% The psychomotor domain emphasizes physical skills. It involves muscular or motor skill, some +% manipulation of materials and objects, or some act which requires a neuromuscular coordination. It +% captures the complexity of grace, strength, and speed that is often involved in physical activity or +% skill acquisition. +% While there are a few examples in the CDIO Syllabus that touch on the psychomotor domain, these +% topics all have an important cognitive component as well. Therefore the cognitive verbs are +% consistently used for these topics, and the psychomotor categories are not used in the Syllabus. +% For completeness, it is worth outlining the breakdown of this domain by Simpson (1972) into seven +% levels. +% 1. Perception is defined as the ability to use sensory cues to guide motor activity. +% 2. Set refers to the readiness to take a particular course of action. This includes physical and +% emotional set as well as mental. +% 3. Guided Response: refers to imitation and trial and error in which the adequacy of the performance +% is judged by the instructor or by a defined set of criteria. +% 4. Mechanism: describe learned responses that have become habitual, movements can be performed +% with some confidence and proficiency. +% 5. Complex Overt Responses: is the skillful performance of motor acts that involve complex movement +% patterns. Proficiency is indicated by a quick, accurate, and highly coordinated performance, requiring +% a minimum of energy. In this category, responses are automatic. +% 6. Adaptation: is the level at which skills are so well developed that the individual can modify +% movement patterns to fit special requirements or to meet a problem situation. +% 7. Origination is the creation of new movement patterns to fit a particular situation or specific +% problem. Outcomes at this level emphasize creativity based upon highly developed skills. + + + + + + + diff --git a/course/.docs/book/embedded.tex b/course/.docs/book/embedded.tex new file mode 100644 index 0000000..2365900 --- /dev/null +++ b/course/.docs/book/embedded.tex @@ -0,0 +1,647 @@ +\chapter{Sistemas Embebidos} +\label{ch:embedded} + +\section{Introducción} +Uno de los objetivos de este trabajo, es la creación de una plataforma Embebida que permita la apropiación de nuevas herramientas y metodologías de diseño. +El mercado de los sistemas embebidos continúa en aumento y su campo de acción se ha extendido en casi todas las actividades humanas. +Según BBC, inc. \footnote{http://www.bccresearch.com/} el mercado para el software embebido puede crecer de \$1.6 billones a \$3.5 billones en 2009, +con una tasa de crecimiemto anual (AAGR) del 16\%, mientras la tasa de crecimiento para las tarjetas embebidas es del 10\%. (Favor ver Figura \ref{GESM}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_system_market} \end{center} +% \includegraphics[scale=.6]{./images/glob-emb-software-rev-regio} \end{center} + \caption{Mercado Global de Sistemas Embebidos 2003-2009. Fuente: BCC Inc.} \label{GESM} +\end{figure} + +Esto unido a: el gran nivel de integración obtenido por la industria de los semiconductores en los \textit{SOC}, la disponibilidad de herramientas software +de desarrollo gratuitas (compiladores, simuladores, librerías, Sistemas Operativos) abre grandes posibilidades comerciales para paises en vía de +desarrollo ya que no son necesarias grandes inversiones de capital para la implementación de estos sistemas. + +Más de un billón de dispositivos embebidos fueron vendidos en el 2004, según \textit{Venture Development Corporation (VDC)}. De acuerdo con VDC +el porcentaje de dispositivos basados en Sistemas Operativos comerciales tiende a disminuir callendo del 43.1\% en 2001 a 37.1\% en 2004, esta tendencia +se debe al aumento de complejidad de los dispositivos y a las necesidades de conexión (tales como Ethernet, bluetooth, WiFi, etc); además, la +caida de precios del hardware, elimina la necesidad de eficiencia en el manejo de recursos proporcionada por muchos productos comerciales. Otro factor +es el deseo de utilizar el mismo Sistema Operativo para varios proyectos. + +Recientes investigaciones de VDC sugieren que entre el 13 y el 15\% de los desarrolladores utilizan linux como su sistema operativo principal, y se espera +que esta cifra aumente al madurar la tecnología y el soporte de los recursos de la comunidad aumenten. La figura \ref{os_trends} muestra una encuenta +realizada a 932 desarrolladores de todo el mundo por \textit{linuxdevices} \footnote{http://www.linuxdevices.com} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_OS_sourcing_trends} \end{center} + \caption{Preferencia de Sistema Operativo para Sistemas Embebidos 2003-2007. Fuente: linuxdevices.} \label{os_trends} +\end{figure} + +La elección de Linux como herramienta de desarrollo esta fuertemente influenciada por su caracter libre, la gran disponibilidad de herramientas de +desarrollo, aplicaciones, librerías y la posibilidad de modificar o adaptar código ya existente. + +El corazón de todo sistema embebido es su procesador, en la actualidad existen diversos fabricantes que ponen a disposición de los desarrolladores +\textit{System On Chip} (SOC) que incluyen una gran variedad de periféricos que incluyen dispositivos de comunicación (UARTs, USB, Ethernet), +interface con el humano (Controladores de: LCD, tarjetas de sonido, dispositivos touch screen), almacenamiento (memorias: RAM, SDRAM, SD, MMC). +Al incluir la mayoría de los periféricos en el mismo Chip se reduce el espacio de la placa de circuito impreso (PCB) y se reduce la posibilidad de +errores debido a interconexión y contrario a lo que se podría esperar, el costo de este SOC es muy bajo (en comparación con el costo de cada periférico +por separado). La figura \ref{cpu_trends} muestra la preferencia de los desarrolladores encuestados por \textit{linuxdevices}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_processor_preference_history} \end{center} + \caption{Preferencia de CPU para Sistemas Embebidos 2004-2007. Fuente: linuxdevices.} \label{cpu_trends} +\end{figure} + +Como puede verse en la Figura \ref{cpu_trends} existe una clara preferencia entre los procesadores x86 y los procesadores ARM, siendo estos últimos +los más populares en dispositivos de consumo como PDAs, Routers, teléfonos celulares, consolas de juego portátiles.\ref{cpu_trends} + +\section{Definición} +Un Sistema Embebido es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. +A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo +el tamaño y costo del producto \cite{Wik} + +\subsection{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\subsection{Arquitectura} + +En la Figura \ref{es_arch} se muestra la arquitectura típica de un Sistema Embebido. La cual integra un componente hardware, implementado ya sea +en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, +la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits +integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos. \footnote{http://www.sharpsma.com, http://www.atmel.com, +http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. Este tipo de implementación es muy popular en los dispositivos de consumo +masivo (Reproductores de MP3, consolas de juego, etc), debido a los grandes niveles de producción (del orden de millones de unidades) resulta más económico +contar con un dispositivo que integre el mayor número de funcionalidades, esto disminuye el costo de componentes y reduce el área de circuito impreso. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado un SoC con la cantidad de periféricos requerida para una +determinada aplicación, o con una funcionalidad específica, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha +operación, en algunas ocaciones el periférico puede relizar funciones poco comúnes y no se proporciona comercialmente, la solución es entonces, implementar estas funcionalidades en una FPGA; también se recomienda la utilización de FPGAs en sistemas que requieren la utilización de la misma funcionalidad un gran número de veces (Puertos seriales, Pines de Entrada/Salida). Esta decisión esta atada al nivel de producción, ya que al incluir una FPGA aumenta el costo global del proyecto. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la longitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales, lo cual disminuye la máxima velocidad de funcionamiento. Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze y Picoblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + +\section{Metodología de Diseño} + +El proceso de diseño de un Sistema Embebido comienza con la {\textit{especificaci\'on del sistema}}, (ver Figura \ref{des_flow}), en este +punto se describe la funcionalidad y se definen las restricciones +f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy +general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de +ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La +especificaci\'on puede ser verificada a trav\'es de una serie de pasos de +an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos +seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los +resultados satisfacen las especificaciones. Desde el punto de vista de la +re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de +una librer\'{\i}a de algor\'{\i}tmos existentes. + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido \cite{Cor05}}\label{des_flow} +\end{figure} + + +Una vez definidas las especificaciones del sistema se debe realizar un +modelamiento que permita extraer de estas la funcionalidad. El modelamiento es +crucial en el diseño ya que de \'el depende el paso existoso de la +especificaci\'on a la implementaci\'on. Es importante definir que modelo +matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados +son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de +Eventos Discretos y Redes de Petri. Cada modelo posee propiedades +matem\'aticas que pueden explotarse de forma eficiente para responder +preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas +tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para +comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su +{\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su +inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de +diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una +funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, +confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas +del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos +opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un sistema + digital dedicado. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser +implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en +tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la +generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan +en SW y que tareas se implementan en HW recibe el nombre de +{\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de +restricciones econ\'omicas y temporales. + + +Las tareas Software deben compartir los recursos que existan en el sistema +(procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden +de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de +{\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir +informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del +sistema. + + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto +las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso +recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del +sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para +verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas +realimentaciones permiten depurar el resultado de pasos anteriores en el caso +de no cumplirse con las especificaciones iniciales. + + +\section{Herramientas Software de libre distribución \textit{GNU toolchain}} +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, +sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; +esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. Soporta los siguientes lenguajes: ADA, C, C++, Fortran, Java, Objective-C, Objective-C++ para las arquitecturas: Alpha, ARM, Atmel AVR, Blackfin, H8/300, System/370, System/390, IA-32 (x86) and x86-64, IA-64 i.e. the "Itanium", Motorola 68000, Motorola 88000, MIPS, PA-RISC, PDP-11, PowerPC, SuperH, SPARC, VAX, Renesas R8C/M16C/M32C, MorphoSys. + +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. + +\subsubsection{Librerías C} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +\subsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente de una aplicación hasta su implementación en la tarjeta de desarrollo. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Flujo de diseño SW utilizando la cadena de herramientas GNU}\label{toolchain_flow} +\end{figure} + +A continuación se realiza una breve descripción de los pasos necesarios para generar un ejecutable para un sistema embebido: + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de archivos de texto. + \item \textbf{Compilación:} Utilizando el compilador gcc se compila el código fuente; vala la pena mencionar que en este punto el compilador solo busca en los encabezados (\textit{headers}) de las librerías la definición de una determinada función, como por ejemplo el \textit{printf} en el archivo \textit{stdio.h}. Como resultado de este paso se obtiene un archivo tipo objeto. + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con las librerías, si una determinada función no es edfinida por ninguna de las librerías pasadas como parámetro al linker, este generará un error y no se generará el ejecutable. + \item Se define la posiciónes físicas de las secciones del ejecutable tipo ELF, esto se realiza a través de un link de enlazado el cual define de forma explícita su localización. + \end{enumerate} + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones es necesario extraer únicamente las secciones que residen en los medios de almacenamiento no volátil y eliminar las demás secciones del ejecutable. Esto se realiza con la herramiento \textit{objcopy}, la cual, permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como por ejemplo S19 e Intel Hex. + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma de desarrollo: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie o un adaptador de red. + +\end{enumerate} + + +\subsubsection{Make} +Como vimoas anteriormente es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola de comandos, es necesario escribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico durante la etapa de desarrollo. Para realizar este proceso de forma automática, se creó la herramienta make, la cual recibe como entrada un archivo que normalmente recibe el nombre de \textit{Makefile} o \textit{makefile}. La herramienta make ejecuta los comandos necesarios para realizar la compilación, depuración, o programación, indicados en el archivo \textit{Makefile} o \textit{makefile}. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente los compiladores de C (CC), de assembler (AS), el linker (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este caso \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador de C (CFLAGS) y al liniker (LDFLAGS) + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} esta es la forma de definir reglas y permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta el comando: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}}, estos reciben el nombre de dependencias y le indican a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}}, esto es: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o + at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{linker} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utilice 0 como símbolo para el inicio de ejecución. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. Esto se explicará con mayor detalle más adelante. + +\subsubsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + +se ve la asignación de esta variable. + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas: +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + +En Linux todas las variables no inicializadas, se inicializadan en cero. + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +Observamos que en el archivo se almacena la cadena de caracteres \textit{Printing \%d\\n} la cual no se modifica durante la ejecución del programa. + +\subsubsection{Linker Script} +Como vimos anteriormente, el \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, este \textit{linker} permite definir donde serán ubicados los diferentes segmentos del archivo ELF, por medio de un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria.Esto brinda un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga de guardar las secciones en el lugar indicado, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +En algunos SoCs no se dispone de una memoria no volátil, por lo que es necesario que la aplicación sea cargada por completo en la RAM. Algunos desarrolladores prefieren almacenar y ejecutar sus aplicaciones en las memorias volátiles durante la etapa de desarrollo, debido a que la programación de las memorias no volátiles toman mucho más tiempo. Obviamente una vez finalizada la etapa de desarrollo las aplicaciones deben ser almacenadas en memorias no volátiles. + +\section{Herramientas hardware} +En esta subsección se realizará una breve descripción de los dispositivos semiconductores más utilizados para la implementación de dispositivos digitales. + +\subsubsection{SoC} +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. Dentro de los periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, SD/MMC + \item Puerto USB 2.0 host. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item 4 Puertos SPI. + \item 2 puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. A continuación se realizará una descripción de los diferentes periféricos que se encuentran disponibles en este SoC, indicando los que fueron utilizados en la plataforma de desarrollo. + +\subsubsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones del ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. + +\subsubsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido; existen dos tipos de memoria las memorias NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y puedens er modificadas una vez instaladas en el circuito integrado. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los requeridos por las memorias RAM. + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits datos pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que permite reducir el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes se utilizan como memorias ROM. Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +Adicionalmente, se encuentran dispoibles las memorias DATAFLASH, estos dispositivos son básicamente una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. + diff --git a/course/.docs/book/embedded.tex.backup b/course/.docs/book/embedded.tex.backup new file mode 100644 index 0000000..692137b --- /dev/null +++ b/course/.docs/book/embedded.tex.backup @@ -0,0 +1,645 @@ +\chapter{Sistemas Embebidos} + +\section{Introducción} +Uno de los objetivos de este trabajo, es la creación de una plataforma Embebida que permita la apropiación de nuevas herramientas y metodologías de diseño. +El mercado de los sistemas embebidos continúa en aumento y su campo de acción se ha extendido en casi todas las actividades humanas. +Según BBC, inc. \footnote{http://www.bccresearch.com/} el mercado para el software embebido puede crecer de \$1.6 billones a \$3.5 billones en 2009, +con una tasa de crecimiemto anual (AAGR) del 16\%, mientras la tasa de crecimiento para las tarjetas embebidas es del 10\%. (Favor ver Figura \ref{GESM}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_system_market} \end{center} +% \includegraphics[scale=.6]{./images/glob-emb-software-rev-regio} \end{center} + \caption{Mercado Global de Sistemas Embebidos 2003-2009. Fuente: BCC Inc.} \label{GESM} +\end{figure} + +Esto unido a: el gran nivel de integración obtenido por la industria de los semiconductores en los \textit{SOC}, la disponibilidad de herramientas software +de desarrollo gratuitas (compiladores, simuladores, librerías, Sistemas Operativos) abre grandes posibilidades comerciales para paises en vía de +desarrollo ya que no son necesarias grandes inversiones de capital para la implementación de estos sistemas. + +Más de un billón de dispositivos embebidos fueron vendidos en el 2004, según \textit{Venture Development Corporation (VDC)}. De acuerdo con VDC +el porcentaje de dispositivos basados en Sistemas Operativos comerciales tiende a disminuir callendo del 43.1\% en 2001 a 37.1\% en 2004, esta tendencia +se debe al aumento de complejidad de los dispositivos y a las necesidades de conexión (tales como Ethernet, bluetooth, WiFi, etc); además, la +caida de precios del hardware, elimina la necesidad de eficiencia en el manejo de recursos proporcionada por muchos productos comerciales. Otro factor +es el deseo de utilizar el mismo Sistema Operativo para varios proyectos. + +Recientes investigaciones de VDC sugieren que entre el 13 y el 15\% de los desarrolladores utilizan linux como su sistema operativo principal, y se espera +que esta cifra aumente al madurar la tecnología y el soporte de los recursos de la comunidad aumenten. La figura \ref{os_trends} muestra una encuenta +realizada a 932 desarrolladores de todo el mundo por \textit{linuxdevices} \footnote{http://www.linuxdevices.com} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_OS_sourcing_trends} \end{center} + \caption{Preferencia de Sistema Operativo para Sistemas Embebidos 2003-2007. Fuente: linuxdevices.} \label{os_trends} +\end{figure} + +La elección de Linux como herramienta de desarrollo esta fuertemente influenciada por su caracter libre, la gran disponibilidad de herramientas de +desarrollo, aplicaciones, librerías y la posibilidad de modificar o adaptar código ya existente. + +El corazón de todo sistema embebido es su procesador, en la actualidad existen diversos fabricantes que ponen a disposición de los desarrolladores +\textit{System On Chip} (SOC) que incluyen una gran variedad de periféricos que incluyen dispositivos de comunicación (UARTs, USB, Ethernet), +interface con el humano (Controladores de: LCD, tarjetas de sonido, dispositivos touch screen), almacenamiento (memorias: RAM, SDRAM, SD, MMC). +Al incluir la mayoría de los periféricos en el mismo Chip se reduce el espacio de la placa de circuito impreso (PCB) y se reduce la posibilidad de +errores debido a interconexión y contrario a lo que se podría esperar, el costo de este SOC es muy bajo (en comparación con el costo de cada periférico +por separado). La figura \ref{cpu_trends} muestra la preferencia de los desarrolladores encuestados por \textit{linuxdevices}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_processor_preference_history} \end{center} + \caption{Preferencia de CPU para Sistemas Embebidos 2004-2007. Fuente: linuxdevices.} \label{cpu_trends} +\end{figure} + +Como puede verse en la Figura \ref{cpu_trends} existe una clara preferencia entre los procesadores x86 y los procesadores ARM, siendo estos últimos +los más populares en dispositivos de consumo como PDAs, Routers, teléfonos celulares, consolas de juego portátiles.\ref{cpu_trends} + +\section{Definición} +Un Sistema Embebido es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. +A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo +el tamaño y costo del producto \cite{Wik} + +\subsection{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\subsection{Arquitectura} + +En la Figura \ref{es_arch} se muestra la arquitectura típica de un Sistema Embebido. La cual integra un componente hardware, implementado ya sea +en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, +la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits +integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos. \footnote{http://www.sharpsma.com, http://www.atmel.com, +http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. Este tipo de implementación es muy popular en los dispositivos de consumo +masivo (Reproductores de MP3, consolas de juego, etc), debido a los grandes niveles de producción (del orden de millones de unidades) resulta más económico +contar con un dispositivo que integre el mayor número de funcionalidades, esto disminuye el costo de componentes y reduce el área de circuito impreso. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado un SoC con la cantidad de periféricos requerida para una +determinada aplicación, o con una funcionalidad específica, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha +operación, en algunas ocaciones el periférico puede relizar funciones poco comúnes y no se proporciona comercialmente, la solución es entonces, implementar estas funcionalidades en una FPGA; también se recomienda la utilización de FPGAs en sistemas que requieren la utilización de la misma funcionalidad un gran número de veces (Puertos seriales, Pines de Entrada/Salida). Esta decisión esta atada al nivel de producción, ya que al incluir una FPGA aumenta el costo global del proyecto. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la longitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales, lo cual disminuye la máxima velocidad de funcionamiento. Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze y Picoblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + +\subsection{Metodología de Diseño} + +El proceso de diseño de un Sistema Embebido comienza con la {\textit{especificaci\'on del sistema}}, (ver Figura \ref{des_flow}), en este +punto se describe la funcionalidad y se definen las restricciones +f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy +general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de +ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La +especificaci\'on puede ser verificada a trav\'es de una serie de pasos de +an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos +seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los +resultados satisfacen las especificaciones. Desde el punto de vista de la +re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de +una librer\'{\i}a de algor\'{\i}tmos existentes. + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido \cite{Cor05}}\label{des_flow} +\end{figure} + + +Una vez definidas las especificaciones del sistema se debe realizar un +modelamiento que permita extraer de estas la funcionalidad. El modelamiento es +crucial en el diseño ya que de \'el depende el paso existoso de la +especificaci\'on a la implementaci\'on. Es importante definir que modelo +matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados +son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de +Eventos Discretos y Redes de Petri. Cada modelo posee propiedades +matem\'aticas que pueden explotarse de forma eficiente para responder +preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas +tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para +comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su +{\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su +inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de +diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una +funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, +confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas +del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos +opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un sistema + digital dedicado. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser +implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en +tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la +generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan +en SW y que tareas se implementan en HW recibe el nombre de +{\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de +restricciones econ\'omicas y temporales. + + +Las tareas Software deben compartir los recursos que existan en el sistema +(procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden +de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de +{\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir +informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del +sistema. + + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto +las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso +recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del +sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para +verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas +realimentaciones permiten depurar el resultado de pasos anteriores en el caso +de no cumplirse con las especificaciones iniciales. + + +\subsection{Herramientas Software de libre distribución \textit{GNU toolchain}} +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, +sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; +esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. Soporta los siguientes lenguajes: ADA, C, C++, Fortran, Java, Objective-C, Objective-C++ para las arquitecturas: Alpha, ARM, Atmel AVR, Blackfin, H8/300, System/370, System/390, IA-32 (x86) and x86-64, IA-64 i.e. the "Itanium", Motorola 68000, Motorola 88000, MIPS, PA-RISC, PDP-11, PowerPC, SuperH, SPARC, VAX, Renesas R8C/M16C/M32C, MorphoSys. + +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. + +\subsubsection{Librerías C} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +\subsubsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente de una aplicación hasta su implementación en la tarjeta de desarrollo. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Flujo de diseño SW utilizando la cadena de herramientas GNU}\label{toolchain_flow} +\end{figure} + +A continuación se realiza una breve descripción de los pasos necesarios para generar un ejecutable para un sistema embebido: + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de archivos de texto. + \item \textbf{Compilación:} Utilizando el compilador gcc se compila el código fuente; vala la pena mencionar que en este punto el compilador solo busca en los encabezados (\textit{headers}) de las librerías la definición de una determinada función, como por ejemplo el \textit{printf} en el archivo \textit{stdio.h}. Como resultado de este paso se obtiene un archivo tipo objeto. + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con las librerías, si una determinada función no es edfinida por ninguna de las librerías pasadas como parámetro al linker, este generará un error y no se generará el ejecutable. + \item Se define la posiciónes físicas de las secciones del ejecutable tipo ELF, esto se realiza a través de un link de enlazado el cual define de forma explícita su localización. + \end{enumerate} + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones es necesario extraer únicamente las secciones que residen en los medios de almacenamiento no volátil y eliminar las demás secciones del ejecutable. Esto se realiza con la herramiento \textit{objcopy}, la cual, permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como por ejemplo S19 e Intel Hex. + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma de desarrollo: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie o un adaptador de red. + +\end{enumerate} + + +\subsubsection{Make} +Como vimoas anteriormente es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola de comandos, es necesario escribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico durante la etapa de desarrollo. Para realizar este proceso de forma automática, se creó la herramienta make, la cual recibe como entrada un archivo que normalmente recibe el nombre de \textit{Makefile} o \textit{makefile}. La herramienta make ejecuta los comandos necesarios para realizar la compilación, depuración, o programación, indicados en el archivo \textit{Makefile} o \textit{makefile}. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente los compiladores de C (CC), de assembler (AS), el linker (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este caso \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador de C (CFLAGS) y al liniker (LDFLAGS) + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} esta es la forma de definir reglas y permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta el comando: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}}, estos reciben el nombre de dependencias y le indican a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}}, esto es: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o + at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{linker} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utilice 0 como símbolo para el inicio de ejecución. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. Esto se explicará con mayor detalle más adelante. + +\subsubsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + +se ve la asignación de esta variable. + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas: +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + +En Linux todas las variables no inicializadas, se inicializadan en cero. + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +Observamos que en el archivo se almacena la cadena de caracteres \textit{Printing \%d\\n} la cual no se modifica durante la ejecución del programa. + +\subsubsection{Linker Script} +Como vimos anteriormente, el \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, este \textit{linker} permite definir donde serán ubicados los diferentes segmentos del archivo ELF, por medio de un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria.Esto brinda un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga de guardar las secciones en el lugar indicado, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +En algunos SoCs no se dispone de una memoria no volátil, por lo que es necesario que la aplicación sea cargada por completo en la RAM. Algunos desarrolladores prefieren almacenar y ejecutar sus aplicaciones en las memorias volátiles durante la etapa de desarrollo, debido a que la programación de las memorias no volátiles toman mucho más tiempo. Obviamente una vez finalizada la etapa de desarrollo las aplicaciones deben ser almacenadas en memorias no volátiles. + +\subsection{Herramientas hardware} +Como se mencionó anteriormente existen varias alternativas al momento de implementar un Sistema Embebido (ver Figura \ref{es_arch}). En este trabajo se utiliza una arquitectura compuesta por el SoC de Atmel el AT91RM9200 y una FPGA, teniendo en cuenta que esta pataforma tiene fines académicos es muy importante tener la posibilidad de crear tareas HW en un Dispositivo Lógico Programable (PLD). + +\subsubsection{SoC} +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. Dentro de los periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, SD/MMC + \item Puerto USB 2.0 host. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item 4 Puertos SPI. + \item 2 puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. A continuación se realizará una descripción de los diferentes periféricos que se encuentran disponibles en este SoC, indicando los que fueron utilizados en la plataforma de desarrollo. + +\subsubsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones del ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. + +\subsubsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido; existen dos tipos de memoria las memorias NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y puedens er modificadas una vez instaladas en el circuito integrado. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los requeridos por las memorias RAM. + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits datos pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que permite reducir el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes se utilizan como memorias ROM. Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +Adicionalmente, se encuentran dispoibles las memorias DATAFLASH, estos dispositivos son básicamente una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. \ No newline at end of file diff --git a/course/.docs/book/intro.tex b/course/.docs/book/intro.tex new file mode 100644 index 0000000..0e7c243 --- /dev/null +++ b/course/.docs/book/intro.tex @@ -0,0 +1,471 @@ +\chapter{Introdución} + +\section{Visión, Paradigmas, y Dificultades} +El gran avance de las técnicas de fabricación de Circuitos Integrados ha +permitido que los sistemas digitales sean partes fundamentales de nuestra +vida, aún sin darnos cuenta, diariamente interactuamos con ellos, +facilitando las tareas cotidianas. Los niveles de integración actuales +permiten construir sistemas cada vez más pequeños, veloces y de menor +consumo de potencia, lo cual ha favorecido su difusión. El uso de los sistemas +digitales en \'áreas como la aviación, la industria automovil\'{\i}stica, la +bioingenier\'{\i}a, etc. demanda de estos un alto desempeño y un +funcionamiento continuo, el no cumplimiento de estas exigencias traer\'{\i}a +consecuencias desastrosas. + +Una de las t\'ecnicas utilizadas actualmente para aumentar la confiabilidad +de un sistema es la redundancia hardware, esta redundancia se logra +adicionando unidades funcionales de reserva, que entrar\'an en operaci\'on +cuando la unidad operativa en un determinado momento falle. Otra t\'ecnica +utilizada es la distribuci\'on de tareas en varias unidades de procesamiento. +Con esto no se depende de la confiabilidad de un sistema complejo y costoso +sino que se dispone de muchas unidades de c\'omputo simples y econ\'omicas; +pero que en conjunto son m\'as robustas que el sistema centralizado. Sin +embargo, contar con varias unidades de procesamiento genera nuevos retos como +la divisi\'on y coordinaci\'on de tareas; la forma de realizar estas funciones +de forma \'optima ha sido el objetivo de muchos estudios, los cuales +contin\'uan hasta hoy. + +La tecnolog\'{\i}a de los semiconductores adelanta a la capacidad de +utilizaci\'on por parte de los diseñadores, lo cual crea una brecha en la +productividad: cada año, el n\'umero de transistores disponibles aumenta en un +58\% mientras las utilizaci\'on por parte de los diseñadores lo hace en un +21\% {\cite{KAK01}}. A medida que aumenta el campo de aplicaci\'on de los +sistemas digitales, lo hacen las exigencias de funcionamiento a ellos +impuestas, nuevos retos en el diseño se presentan a medida que los sistemas +embebidos se integran a nuestra vida diaria, se hace necesario diseñar nuevas +t\'ecnicas que permitan eliminar la brecha en la productividad. + + +\subsection{Futuro de los Sistemas Computacionales} + +\begin{quote} + "The best way to predict the future is to invent it." + + Alan Kay +\end{quote} + +\subsubsection{Computador Ubicuo} + +Observando la tendencia actual de los sistemas electr\'onicos, se puede +especular que el computador tal como lo conocemos actualmente desaparecer\'a +{\cite{WM91}}, ya que estar\'a en todas partes, ubicuo, interactuando con los +seres humanos para realzar el mundo que ellos viven. Se pasar\'a de un esquema +en el que existe un computador para uno o varios usuarios (PC, mainframe) a +uno en el que existan muchos computadores para un usuario. Estos computadores +disponen de grandes capacidades de c\'alculo y de comunicaci\'on, pero a la +vez, poseen un grado de integraci\'on tal que ser\'an invisibles; para aclarar +como se puede lograr esta invisibilidad, imag\'{\i}nense que existen sistemas +embebidos construidos con t\'ecnicas de microfabricaci\'on y que son capaces +de tomar su energ\'{\i}a de fuentes alternas como la temperatura, la +radiaci\'on solar, o a partir de fen\'omenos qu\'{\i}micos, debido a su +reducido tamaño, estos sistemas pueden integrarse a objetos o pintarse sobre +ellos, de tal forma que no sean visibles ante los ojos humanos. Esta +desaparici\'on no solo ser\'a una consecuencia de la tecnolog\'{\i}a, sino de +la sicolog\'{\i}a humana; cuando las personas asimilan perfectamente algo y se +convierte en parte de la vida diaria no se es consciente de su utilizaci\'on. +Por ejemplo, cuando observamos una señal de tr\'ansito capturamos la +informaci\'on sin ser conscientes de la realizaci\'on del acto de la lectura. + +\begin{figure}[h] +\begin{center} \includegraphics[scale=.6]{./images/Ubiquitous.jpg} \end{center} +\caption{Concepto de Computador Ubiquo.} +\end{figure} + + +Hasta el momento el diseño de sistemas tanto software como hardware se ha +centrado en las m\'aquinas, las personas se encargan de crear condiciones +adecuadas de trabajo para ellas. Nos vemos obligados a interactuar con estas +utilizando su propio lenguaje, lo cual dificulta su manejo. En el futuro la +computaci\'on tendr\'a como centro al ser humano, estar\'a en todas partes +dispuesta a ayudarle en sus tareas diarias. No tendr\'an que llevar +computadoras con ellos, se podr\'a interactuar con ellas en cualquier parte a +trav\'es de dispositivos como HandHelds, tel\'efonos celulares, etc no tendremos que +preocuparnos por nuestra privacidad ya que ellas se encargar\'an de eso {\cite{Oxygen}}. + + + +Un nuevo t\'ermino aparece en el escenario del diseño de Sistemas Digitales: +Los \textit{ambientes Inteligentes}, este t\'ermino se utiliza para describir +entornos electr\'onicos sensibles a la presencia de personas, en estos +entornos los usuarios interact\'uan de forma natural con recursos +computacionales que les ayudan a la realizaci\'on de tareas. Es una nueva +\'area de desarrollo que involucra a profesionales en las \'areas de: +Ingenier\'{\i}a Electr\'onica, Ingenier\'{\i}a Mec\'anica, Ciencias de la +computaci\'on, redes y comunicaciones, ciencias sociales y humanistas. + + + +En las siguientes secciones se estudiar\'a el impacto de la computaci\'on +ubicua en el diseño de los sistemas digitales siguiendo los lineamientos de +Marc Weiss {\cite{WM91}} y David Servat {\cite{DS02}}. + +\subsubsection{Ambientes Inteligentes.} + +En la actualidad, cada vez con m\'as frecuencia, se notan signos de la +invasi\'on digital, por ejemplo, en el aumento de chips embebidos en los +dispositivos que utilizamos a diario. Se ha demostrado {\cite{MW93}} que una +persona que vive en un pa\'{\i}s industrializado se ve confrontada con un +promedio de 40 chips al d\'{\i}a, de los cuales 5 son capaces de comunicarse +en redes. Se estima que dentro de 10 años estaremos en contacto con cientos de +estos chips, la mayor\'{\i}a de los cuales acceden a densas redes de +informaci\'on {\cite{DS02}}, muchos de estos artefactos toman la apariencia de +objetos que utilizamos en nuestra vida diaria (herramientas, vestuario, +electrodom\'esticos, etc) pero son mejorados con sensores, actuadores, +procesadores y software embebido. Una de las razones de la aparici\'on de +estos sistemas es econ\'omica. Las industrias han visto como se muestran +signos de recesi\'on en los mercados tradicionales. Por lo tanto, buscan +nuevos productos en los que pueden ser embebidos chips y software. El +an\'alisis de los procesos de adopci\'on de los dispositivos tecnol\'ogicos de +hoy muestra que la introducci\'on en el mercado de nuevos dispositivos genera +la alteraci\'on o la creaci\'on de nuevos h\'abitos {\cite{DS02}}. Esta +invasi\'on electr\'onica trae consigo una serie de efectos que resultan poco +pr\'acticos e inc\'omodos para sus usuarios humanos: +\begin{itemize} + \item La interacci\'on se realiza utilizando el lenguaje del dispositivo, + este lenguaje no es \'unico, por lo tanto debemos aprender un tipo de + lenguaje para un tipo de aplicaci\'on determinda. + + \item Estos dispositivos no pueden comunicarse entre s\'{\i}, por lo que nos + vemos obligados a buscar \textit{traductores} que sirvan de puente + entre ellos. + + \item Est\'an construidos para operar en un ambiente determinado, lo cual + nos obliga a movilizarnos con el f\'{\i}n de utilizarlos. + + \item No realizan distinci\'on entre usuarios, cada vez que un usuario + diferente los use debe configurar sus preferencias. +\end{itemize} + + +Los ambientes inteligentes son entornos electr\'onicos que son sensibles y +responden a la presencia de personas {\cite{EA01}}. Est\'an compuestos por +muchos dispositivos distribuidos que interact\'uan con el usuario de forma +natural. El concepto fue construido con base en las ideas de Marc Weiser +{\cite{WM91}}, en {\cite{NRC01}} se puede encontrar un resumen de los +desarrollos y retos recientes en este campo de investigaci\'on. En un ambiente +inteligente, las personas est\'an rodeadas por redes de dispositivos +inteligentes embebidos que proporcionan informaci\'on ubicua, comunicaci\'on, +servicios y entretenimiento {\cite{APaET03}}. Adem\'as, estos dispositivos se +adaptan por si mismos a los usuarios, y anticipan sus necesidades. La +electr\'onica puede integrarse en el vestuario, los muebles, autom\'oviles, +casas, oficinas y sitios p\'ublicos, introduciendo el problema del desarrollo +de nuevos conceptos de interfaz de usuario que permitan la interacci\'on +natural con estos entornos. Las funciones b\'asicas que deben realizar los +ambientes inteligentes son: +\begin{itemize} + \item Conocimiento del entorno. + + \item Sistemas inal\'ambricos Distribuidos. + + \item Interacci\'on natural con los usuarios. +\end{itemize} + + +La visi\'on de los ambientes inteligentes es que las aplicaciones ser\'an cada +vez m\'as y m\'as distribuidas y ser\'an ejecutadas en plataformas que +proporcionan recursos de forma din\'amica. Estas aplicaciones deben cumplir +con las funciones mencionadas anteriormente. Los nuevos retos que generan los +ambientes inteligentes al diseño de Sistemas embebidos se pueden dividir en +interacci\'on y adaptaci\'on: + + +\begin{itemize} + \item Interacci\'on con: + \begin{itemize} + \item las aplicaciones, + + \item la plataforma Hardware, + + \item otros dispositivos, + + \item el usuario. + \end{itemize} + + + \item Adaptaci\'on: + \begin{itemize} + \item al cambio de aplicaciones y necesidades del usuario, + + \item a la cantidad de recursos Hardware, + + \item a cambios en el entorno. + \end{itemize} +\end{itemize} + + +\subsubsection{Consecuencias de la aparici\'on de los sistemas de computaci\'on +ubicua.} + +La aparici\'on de la computaci\'on ubicua no es una revoluci\'on, por el +contrario es una consecuencia l\'ogica de la evoluci\'on de las relaciones +entre los usuarios y los sistemas de computadores, los cuales se han +caracterizado por una democratizaci\'on de acceso a los equipos y una +descentralizaci\'on de la infraestructura subyacente. En el primer +per\'{\i}odo (1950-1970) se compart\'{\i}an recursos a trav\'es de terminales, +es decir, se contaba con un computador para muchos usuarios. En los 80s, la +aparici\'on de los computadores personales impulsa la relaci\'on personal +entre los computadores y usuarios. El los 90s la aparici\'on de Internet +permiti\'o compartir recursos a trav\'es de un computador personal. Internet +no es m\'as que un paso adelante hacia la llegada de los sistemas de +computaci\'on ubicua. La misma filosof\'{\i}a de simplificaci\'on y +descentralizaci\'on prevalece hasta hoy y nos conducir\'a a una situaci\'on +donde miles de dispositivos computacionales estar\'an disponibles para +realizar nuestras tareas y se compartir\'an recursos a trav\'es de redes m\'as +intrincadas que Internet. En conclusi\'on se pasar\'a de un esquema en el que +se ten\'{\i}a un computador para muchos usuarios a uno en el que se tienen +muchos (tal vez miles o millares) elementos computacionales para servir a un +usuario. + +Estos sistemas ser\'an componentes de una infraestructura computacional que +difiere radicalmente de las que conocemos hoy, y deben poseer las siguientes +caracter\'{\i}sticas: +\begin{itemize} + \item Descentralizados: la centralizaci\'on adem\'as de impr\'actica no + permite que diferentes usuarios puedan controlar sus componentes. + + \item Manejar la variaci\'on de su configuraci\'on: debido a la adici\'on o + substracci\'on de sus componentes, o por la forma en que los usuarios los + usan. + + \item Estar inmersos en las comunidades humanas con varios tamaños y + necesidades, y operar con informaci\'on incompleta sobre su entorno. + + \item Unir combinaciones altamente heterog\'eneas de software y hardware, + las cuales pueden diferir por su funci\'on o por su procesamiento, + comunicaci\'on o capacidades de acci\'on. + + \item Ser el resultado de combinaciones de componentes, que pudieron no ser + vistos en tiempo de diseño, sin embargo, producen comportamientos emergentes + interesantes. + + \item Adaptarse de forma cont\'{\i}nua a su entorno con el f\'{\i}n de + mejorar su desempeño. +\end{itemize} + +El diseño de estos sistemas requiere nuevas fuentes de inspiraci\'on; una +direcci\'on promisoria es verlos y diseñarlos como \textit{ecosistemas de agentes físicos} organizados seg\'un principios +biol\'ogicos, qu\'{\i}micos o f\'{\i}sicos {\cite{DS02}}. + +\section{Estado del Diseño Electrónico en Colombia} + +En la actualidad Colombia atraviesa por una $''$\textit{\textit{crisis}}$''$ a +nivel de diseño de sistemas digitales, existe un atraso muy grande en esta +\'area; a nuestro modo de ver existen dos grandes responsables de esta situaci\'on. +Por un lado, las pol\'{\i}ticas de la mayor\'{\i}a de las industrias al no +realizar inversi\'on de capital en sus departamentos de I+D; algunas de ellas +ni siquiera cuentan con este departamento. Por otro lado, las Universidades no +cuentan con programas actualizados que permitan explotar los avances +realizados en las industrias electr\'onica y de semiconductores; en un gran +n\'umero de Universidades Colombianas a\'un se trabaja con dispositivos de +funci\'on fija como las familias 74 y 40. Los lenguajes de descripci\'on de +hardware han sido adoptados recientemente en la mayor\'{\i}a de programas de +ingenier\'{\i}a electr\'onica, pero en algunos casos no existe una base +metodol\'ogica que soporte su adecuada utilizaci\'on. La disponibilidad de +dispositivos l\'ogicos programables (FPGAs, CPLDs) es limitada debido a la +inexistencia de un proveedor local. Se dedican cursos completos para +$''$enseñar$''$ a programar microprocesadores de 8 bits en lenguaje +ensamblador y muchos educadores a\'un miran con desconfianza a los lenguajes +de alto nivel como el C, C++. En muy pocos programas de Ingenier\'{\i}a +Electr\'onica no se cuenta con una asignatura dedicada a sistemas operativos y +en muchos de ellos no se le da la importancia que tiene la enseñanza de +lenguajes estructurados. + +La situaci\'on se agrava a\'un m\'as al ver el estado de la relaci\'on entre +la universidad y la industria, la cual no existe en algunos casos. Desde el +punto de vista industrial los resultados obtenidos en la academia parten de +entornos ideales y no se tienen en cuenta las caracter\'{\i}sticas de los +entornos industriales, lo cual da como resultado sistemas poco robustos y con +problemas funcionales. Por otro lado, los tiempos de desarrollos son muy +largos ya que la mayor\'{\i}a de las universidades Colombianas no cuenta +con grupos de investigaci\'on que tengan miembros dedicados de forma +exclusiva al desarrollo de este tipo de proyectos, la mayor\'{\i}a \ de los +miembros de estos grupos son temporales (estudiantes de pregrado) y sin paga, +lo cual no garantiza el cumplimiento ni la continuidad de las investigaciones. + +\subsection{Apropiación de Conocimiento} + +Para que Colombia deje de ser un país que consume tecnología y llegue en algún momento a ser generador de productos tecnológicos, es necesario que se genere un conocimiento que permita esta transición. ``Para que el conocimiento sea motor de desarrollo es necesario el traspaso desde sus creadores a la sociedad, mediante la conversión a tecnologías que produzcan cambios radicales que incrementen la producción. Esa transmisión de tecnología generadora de crecimiento económico esta influenciada por diversos factores: medio geográfico, leyes de propiedad industrial, costos laborales, nivel de ciencia y tecnología, religión, tipos de instituciones, resistencia a innovar, políticas de estado, guerras, factores demográficos, entre otros'' \cite{Mok90} + +Pero como apropiar este conocimiento? Arrow \cite{Arr62} afirma que la apropicación de conocimiento puede efectuarse de varias formas: ``aprender haciendo'', ``aprender usando'', ``aprender leyendo''. Cuando una empresa decide transmitir su conocimiento disponible, lo hace en procesos de investigaciones conjuntas, en actividades de producción, y distribución, mercadeo, servicio y soporte operativo o riesgo compartido. También se presentan alianzas entre firmas como: contratos de I+D, acuerdos de licencias, licencias cruzadas. La conformación de estas asociaciones permite crear redes tecnológicas dominadas por países industrializados con sus respectivas empresas multinacionales monopolizando conocimiento \cite{Mar04} + +Para Colombia, el problema radica en que las empresas de capital nacional no están adquiriendo el conocimiento necesario para lograr innovaciones al interior de las mismas. De forma que puedan ser competitivas y logren acceder a mercados internacionales ofreciendo productos innovadores, de calidad y a precios competitivos. Con efectos directos como: generación de empleos especializados, desarrollo tecnológico e industrial sostenido, ampliación del acervo de conocimiento nacional y disminución de la salida de divisas (al mejorar los procesos de negociación) y creación de externalidades positivas \cite{Mar04}. + +Ligado al problema de la senda tecnológica está el del grado de lo tácito del conocimiento científico. Teece \cite{Tee81} señala que al existir conocimiento tácito toda la tecnología disponible no se transfiere de los productores a los receptores o compradores de la misma. Por tanto, los países seguidores siempre van a estar a la zaga tecnológica. Forbes y Wield \cite{FW00} señalan que los esfuerzos adaptativos son mayores porque deben acomodar las ``innovaciones'' a los materiales locales, fuerza laboral nativa, mercados internos y medio ambiente local. Entonces, el problema no se limita a cómo transferir conocimiento, cómo develar su parte tácita y cómo extraerlo de las multinacionales, sino que radica en el bajo poder de negociación y adquisición de tecnología por firmas pequeñas y medianas, las cuales carecen de recursos y tienen procesos deficientes de contratación. + +En este orden de ideas, si el país no es un innovador neto ¿no debería más bien mostrar una tendencia a importar conocimiento? Y las firmas nacionales ¿no deberían ser las que más efectuaran este tipo de contratos, para así acceder al conocimiento de la tecnología adquirida? En resumen, conociendo mejor qué tecnología se importa y qué tipos de contratos se utilizan, es posible crear marcos de referencia para empresas nacionales que estén interesadas en adquirir tecnología. Esto produciría externalidades positivas en empresas importadoras de conocimiento y, a su vez, en la economía del país. Con una adecuada importación de conocimientos tecnológicos se crearía una ventaja competitiva de carácter estructural, basada en un acervo de conocimiento tecnológico que permita incrementar la productividad en todos los sectores económicos de manera permanente \cite{Mar04}. + +Según los estudios realizados por Martínez, con base en registros del Decreto 259/92, del Incomex. La importación de conocimiento no está siendo empleada con el propósito de utilizar tecnologías de punta que permitan efectuar innovaciones al interior de las empresas y de los sectores. Las empresas nacionales se limitan a comprar un determinado dispositivo, sin tener el conocimiento para operarlo, hacerle mantenimiento ni mucho menos mejorarlo, por lo que se ven obligadas a contratar con el vendedor contratos para dicho fín. Esto indica que la adquisición de tecnología no se realiza con base en programa desarrollado de antemano, sino son una respuesta a cambios en el mercado, lo cual evidencia la inexistencia de programas de innovación encaminados a la disminución de la brecha tecnológica. + + +\subsection{Situación de la Industria Electrónica en Colombia} + +La industria electrónica nacional no es ajena a las políticas que siguen las empresas nacionales en cuanto a la apropiación de tecnología; Colombia depende totalmente de economías más desarrolladas para el suministro de dispositivos electrónicos en diversas areas (comunicaciones, entretenimiento, industria, medicina, etc). Mientras en otros sectores de la economía han pasado de ser consumidores a exportadores, y adquieren nuevas tecnologías para ser más competitivos, el sector electrónico del país ha reducido sus actividades de Investigación y Desarrollo hasta el punto de depender totalmente de productos externos, de los cuales, algunos son de baja calidad y no suplen los requerimientos del mercado local, pero son utilizados porque son muy económicos. + +En la actualidad la industria electrónica presenta una gran dinámica a nivel mundial, el uso de los sistemas electrónicos se extiende a todas las actividades humanas; La demanda mundial de este tipo de sistemas aumentará de forma dramática en los próximos años, especialmente en los sectores de tecnología médica, movilidad, seguridad, comunicaciones y consumo \cite{ETPoSSI(09}. El mercado de los sistemas embebidos es una industria que movió alrededor de 25 billones de dólares en el 2008 según Venture Development Corporation \cite{Vc08}. Por otro lado, la inversión de capital necesaria para el diseño de Sistemas Embebidos es relativamente baja, gracias a la gran demanda originada, los insumos y los servicios de fabricación son muy económicos, las herramientas de desarrollo necesarias para la programación y depuración de este tipo de sistemas son de libre distribución. + +Desafortunadamente en Colombia la industria electrónica se encuentra muy rezagada en relación a las de los países industrializados, y las ventajas y oportunidades de negocios mencionadas anteriormente no son aprovechadas en la actualidad. + +Según ASESEL \footnote{Asociación de entidades del Sector Electrónico} en el 2001 existían 154 empresas productoras de componentes y equipos de la cadena electrónica. Dentro de los productos que la industria electrónica exporta se encuentran registrados: Circuitos integrados, circuitos impresos, microestructuras, instrumentos para medida y control, Instrumentos y aparatos eléctricos o electrónicos. Es importante decir que la industria colombiana, en la actualidad no fabrica circuitos integrados, ni microestructuras, por lo que estas son ventas de productos comprados en países desarrollados. Según Proexport el 91\% de las exportaciones son realizadas por Bogotá y los destinos se encuentran en países cercanos como Venezuela, Perú, Ecuador y USA. + +La electrónica en Colombia y en el mundo hace parte de esas industrias que se mueven velozmente en un +camino desconocido, como consecuencia se hace necesario tener una actualización constante de los +avances tecnológicos y las proyecciones futuras del sector. Debido a la importancia del sector tecnológico es primordial que en Colombia se esté consciente del estado actual y que se puede hacer en términos de +Investigación Científica y Desarrollo Tecnológico (I+D) en Ingeniería Electrónica. + +Un estudio realizado en la Universidad Nacional de Colombia \cite{MTRR07} identificó los siguientes obstáculos para el desarrollo de la industria electrónica en Colombia: Deficientes relaciones Universidad Empresa, Pobre enfoque académico hacia la industria, baja calidad de los productos nacionales, políticas gubernamentales, falta de cultura de Investigación y Reducida apropiación tecnológica, competencia de países asiáticos, atraso tecnológico, limitado recurso humano con formación avanzada. + +De los problemas expuestos anteriormente podemos identificar cuales son los que más afectan el desarrollo de la industria electrónica en Colombia, el que más perjudica sin lugar a dudas es el atraso tecnológico, no es posible ser competitivo en el mercado electrónico mundial con tecnologías y metodologías de diseño obsoletas. \footnote{En Colombia trabajamos aún con circuitos integrados que se crearon en la decada de los 80 del siglo pasado y utilizamos lenguajes de programación como el \textit{assembler}, para el cual el tiempo de aprendizaje, desarrollo y de depuración es muy largo} La culpa de este atraso tecnológico no es exclusiva de la industria, aunque, como vimos anteriormente muchas industrial Colombianas se resisten al cambio y prefieren comprar equipos en el exterior a buscarlos localmente, la falta de confiabilidad en los productos Colombianos agrava este problema, esta falta de confianza en la industria local no es infundada, la mayoría de los productos Colombianos no cumplen con las normas mínimas de calidad y utilizan productos de bajo costo obtenidos en remates de componetes. + +Otro actor que contribuye al retraso tecnológico es el sector académico; Según el Sistema Nacional de Información Superior, durante los últimos 10 años se han abierto 230 programas relacionados con la industria electrónica, estos programas están repartidos entre programas de formación Universitaria, tecnológica terminal y de técnica profesional, la mayoría de estos centros de formación se encuentran ubicados en 3 Departamentos: Bogotá, Antioquia y Valle \cite{DZSC+07}. El número de Ingenieros graduados en un año es entre 2 y 8 veces mayor que en los países en vía de desarrollo y doce veces mayor que los que se gradúan en los países desarrollados. En Colombia, este aumento es aportado por instituciones de poca consolidación; además, las preferencias en la educación superior son Formación técnica / form. tecnológica / form. profesional que es justamente lo opuesto a la de los países desarrollados \cite{MDAG99}. + +Por otro lado, el contenido de las asignaturas relacionadas directamente con la industria electrónica se encuentran muy desactualizados, y fuera del contexto mundial, se utilizan metodologías de diseño antiguas en las que primaba la experiencia del diseñador, se realizan tareas manuales, repetitivas que pueden ser realizadas por herramientas de diseño moderno, los currículos son conservadores hay poca experimentación y su estructuración y metodologías son muy clásicas. Adicionalmente, muchos investigadores dedican sus estudios en proyectos que no aportan al desarrollo del país únicamente porque están de moda. Otro problema adicional radica en la falta de experiencia en el sector productivo por parte del personal académico, un componente importante de los profesores nunca han sido parte de un proceso productivo o de un proceso de desarrollo que tenga como fín la creación de un producto comercial, razón por la cual se evita la experimentación y se da más énfasis al análisis y solo se llega a una simulación. + +De lo anterior podemos concluir que en Colombia se presenta una sobre-oferta de profesionales en el área electrónica, muchos de los cuales provienen de instituciones educativas con poca consolidación, y que han sido formados con programas desactualizados que no tienen en cuenta los avances tecnológicos y metodológicos, lo cual explica la pobreza de ingenieros con altos niveles de formación. Por esta razón no es de extrañar la poca confianza que tienen los industriales en los productos nacionales. + +Lo anterior unido a la falta de políticas de estado que: tracen normas encaminadas a incentivar la inversión en investigación y desarrollo, defina líneas y campos de investigación, regule la oferta laboral y los programas académicos, generan el clima perfecto para que el atraso tecnológico se mantenga durante mucho tiempo y Colombia no deje de ser un consumidor de tecnología. Según John Kao, uno de los grandes expertos del mundo en innovación, los países desarrollados no invierten en Ciencia Tecnología e Innovación (CTI) porque son ricos, sino que son ricos porque invierten en CTI. + + +\subsubsection{Tecnologías de Información y Comunicación} +En la actualidad existe un especial interés por parte del gobierno \footnote{ La Agenda de Conectividad es el programa del Ministerio de Comunicaciones, encargado de impulsar el uso y masificación de las Tecnologías de Información y Comunicación -TIC- como herramienta dinamizadora del desarrollo social y económico del país ()} en impulsar las Tecnologías de la Información y la Comunicación (TIC). Este programa no debe centrarse en solo difundir el uso de internet y aumentar el número de personas que tienen acceso a un computador. ``La tecnología es simplemente la infraestructura, si la infraestructura no está acompañada por la creación de habilidades y conocimiento la adopción de TICs no ayudará a obtener los beneficios que esperamos, sin embargo, ayudarán con los intereses de los más poderosos y de las naciones más ricas.'' \footnote{Brito Lidia, ``Enabling Environment, ICT for Development and the Millennium Development Goals'',página 20, 2005}. Las TICs deben utilizar la educación como pricipal herramienta para reducir la \textit{brecha tecnológica} que existe entre las diferentes regiones de nuestro país y de nuestro país con los paises desarrollados. + +Hearn, Simpson, Lennie y Kimber \cite{HSL+04} \cite{MJF05} nombran las siguientes características para que las TICs contribuyan con el desarrollo regional. +\begin{enumerate} + \item Conseguir claridad en especificar objetivos sostenibles, las regiones no se + pueden dar el lujo de esperar a que todo les sea entregado y listo, ponerlo a + funcionar, debe existir un plan para evitar que la tecnología se vuelva + obsoleta y se acabe el proyecto por esta causa. + \item Apalancar el desarrollo de la empresa pequeña ayudado por personal y + financiación del gobierno y utilizando las fortalezas de las industrias locales. + \item Construir basado en las industrias fuertes locales; Aprender de las + experiencias globales mientras que se construye en acciones locales + \item Encontrar innovadores modelos de negocios para aprovecharlos en nuevas + oportunidades de contenidos y aplicaciones. + \item Asegurar el envolvimiento de la comunidad en la decisión, planeación y + evaluación de proyectos. Hemos visto que para que un proyecto de + tecnología tenga éxito se debe involucrar a la sociedad civil, a ellos deben ir + dirigidos los principales beneficios, deben ser ellos quienes se capaciten y + de esta forma el proyecto va a funcionar. + \item Adoptar una metodología de aprendizaje a través de ciclos de evaluación + basados en una acción investigativa. + +\end{enumerate} + +Adicionalmente es necesario buscar el bien común por encima del individual, razón por la cual debemos preguntarnos quienes son los favorecidos por la difusión de estas tecnologías, no tiene sentido invertir grandes sumas de dinero para llevar estas tecnología a lugares donde no saben como utilizarlas y más aún, en lugares donde las necesidades básicas no han sido resueltas. Es importante pensar en las personas a las que se va a beneficiar y preparar el camino para que el impacto sea mayor, sin educación y sin entrenamiento no se le puede sacar provecho a estas tecnologías. Debemos crear herramientas que integren a nuestros pueblos y que permitan colaborar entre ellas. + +En la actualidad esta política gubernamental se limita a comprar software propietario normalmente el sistema operativo MicroSoft Windows y aplicaciones del mismo fabricante como su suite Office y MSN. Esto no aporta absolutamente nada al desarrollo tecnológico del país ya que al ser un sistema operativo cerrado no es posible modificarlo o aprender sobre su funcionamiento, el usuario debe limitarse a aceptar lo que el fabricante le entrega y si quiere desarrollar apliaciones propias debe pagar por las herramientas de desarrollo y por la documentación. Microsoft utiliza una política de reducción de precios para los centros educativos y algunos centros gubernamentales, esta ``donación'' solo crea dependencia tecnológica y en la mayoría de los casos promueve acciones ilegales ya que (el costo de estos productos son los mismos en todo el mundo y en muchas ocasiones cuestan más que el computador sobre el que se ejecuta) los usuarios obtienen software ilegal, práctica que se generaliza a todo el software no solo al de Microsoft lo que hace que las empresas medianas y pequeñas locales sean forzadas a cerrar sus negocios. Por otro lado, al permitir que solo una empresa extranjera sea la que decide sobre el futuro del software utilizado en la mayoría de los computadores de una nación se está cediendo la soberanía para el beneficio de un particular foráneo. + +Lo mismo sucede con los equipos que se utilizan para acceder a estas tecnologías, en la mayoría de los casos son fabricados en paises con diferentes culturas y diferentes necesidades. Es obvio que el país no puede fabricar ciertos equipos que se requieren para poder llevar estas tecnologías a las diferentes regiones, sin embargo, este trabajo proporciona una base sólida sobre la cual se puede desarrollar un producto similar al propuesto por el proyecto del MIT OLPC (One Laptop For Child), el cual busca construir un dispositivo de muy bajo costo (200 USD) que permita a los estudiantes y a la comunidad en general, aprender los conceptos básicos para poder utilizar estas tecnologías. De esta forma impulsamos la industra electrónica produciendo de forma masiva un dispositivo electrónico en el pais, diseñado para suplir necesidades de la región. Esta plataforma no solo poroporcionará la base para el desarrollo de las TICs, sino la base tecnológica sobre la cual se pueden desarrollar muchas soluciones a problemas de la industria local. + + +Es posible incluir el presente estudio en dicho programa de tal forma que el objetivo final de este programa no sea aumentar la venta de licencias de un determinado sistema Operativo o el número de computadores con acceso a internet, sino desarrollar en el pais la tecnología necesaria para que las universidades y empresas locales sean capaces de desarrollar dispositivos que permitan el acceso a estas tecnologías. + + +\subsection{Estado de la Electrónica Digital en la Universidad Nacional de Colombia} + +Hasta hace un año en las asignaturas del área de electrónica digital de la Universidad Nacional de Colombia (La Universidad pública más grande e importante del pais), se trabajaba con dispositivos que fueron sacados al mercado en 1966 y 1968, las familia lógica TTL 7400 y CMOS 4000. El problema principal al utilizar esta tecnología no es su año de creación, ni siquiera que en la actualidad se consideren obsoletas para el diseño de un sistema digital completo. \footnote{En la actualidad estas compuertas se utilizan para la implementación de pequeñas operaciones lógicas} El problema detrás del uso de esta tecnología se encuentra en la ausencia total de metodologías de diseño (en el caso Colombiano). Y el desconocimiento en herramientas tipo CAD. El proceso de diseño que realizaban los estudiantes era: + +\begin{enumerate} + \item Especificaciones del sistema. + \item Generación manual de ecuaciones boolenas. + \item Minimización manual utilizando mapas de Karnaugh. + \item Implementación de las ecuaciones minimizadas utilizando las familias lógicas 7400 y 4000, sobre placas de pruebas (protoboards, breadboards) + \item Pruebas del sistema. +\end{enumerate} + +A manera de ejercicio académico se justifica el uso de las familias 7400 y 4000, sin embargo, el quedarse ahi no es bueno para una industria electrónica desactualizada, debido a que este tipo de implementaciones no pueden generar productos competitivos a nivel mundial. La razón de esto es que existen muchas fuentes de error en el proceso, generados por la ausencia de herramientas CAD que realicen las operaciones tediosas como las minimización de ecuaciones booleanas, las cuales están sujetas a errores humanos originados por cansancio, falta de concentración, etc. Otro aspecto que vale la pena resaltar es la falta de una simulación funcional, la mayoría de los estudiantes consultados no realizaban simulaciones funcionales y preferían probar el diseño una vez implementado físicamente, esto unido a la dificultad de depuración innata a este tipo de implementaciones, aumentaba considerablemente el tiempo requerido para realizar la implementación y pruebas del sistema. + +En el segundo curso del área de electrónica digital, se introduce al estudiante al uso de los dispositivos lógicos programables (PLD) y los lenguajes de descripción de hardware (HDL) como herramientas para el diseño de sistemas digitales, al comienzo, el contenido de estos cursos se limitaba al uso de una herramienta de diseño y la enseñanza de nociones básicas del lenguaje VHDL, se daba más importancia al uso de la herramienta y no a la metodología de diseño, de nuevo el estudiante ataca los problemas sin una metodología de diseño clara. Vale la pena indicar que este curso fue dictado por profesores ocasionales durante los últimos cuatro años, cada profesor utilizaba contenidos y niveles de exigencia diferentes. + +En la tercera parte del curso se trabaja con sistemas microcontrolados, se utilizan microcontroladores de 8 bits de diferentes familias y se utiliza el lenguaje ensamblador como herramienta de desarrollo. Una de las principales desventajas que presenta este curso (y de la línea en general) es la falta de continuidad en los contenidos y en la metodología utilizada, ya que el contenido de este curso se encuentra totalmente desligado al de los dos anteriores. Sin embargo, durante este curso se proporciona una metodología de diseño en la que los estudiantes emulan el comportamiento del microcontrolador antes de ser programado, sin embargo, esta práctica no es seguida por la mayoría de los estudiantes, una posible causa de este comportamiento puede ser la falta de metodologías de diseño en los cursos anteriores. + +La sensación que queda al terminar el área de electrónica digital es que lo único que importa son los microcontroladores y que lo visto en los primeros cursos no es muy útil. La siguiente tabla muestra los problemas encontrados en el área de electrónica digital de las carreras de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia: + +\begin{enumerate} + \item Falta de una metodología de diseño. + \item Utilización de herramientas obsoletas: Familias Lógicas, lenguajes de programación. + \item Poco uso de las herramientas CAD. + \item Falta de continuidad en las asignaturas. + \item Falta de docentes. + \item No se suministra una formación adecuada que ayude a la industria electronica a salir del retraso tecnológico. +\end{enumerate} + + +\section{Descripción de la Tésis} + +\subsection{Objetivos e Hipótesis} + +\subsubsection{Ojetivo Principal} + +Desarrollar una metodología para la transferencia tecnológica y de conocimientos en el área de Sistemas Embebidos. +El objetivo de este trabajo es contribuir a dar solución al problema del atraso tecnológico en Colombia, puntualmente en los siguientes puntos: + +\subsubsection{Objetivos Secundarios} + +\begin{itemize} + \item Formulación de una metodología para la transferencia tecnológica y de conocimientos en el área de Sistemas Embebidos en Colombia. + \item Formulación de una metodología de Diseño y producción para Sistemas Embebidos aplicable en el entorno local. + \item Identificación de las habilidades requeridas para los profesionales y técnicos en la Industria Electrónica para estar acorde con la tendencia de la industria electrónica mundial y formulación de recomenadaciones para la industria y los organismos gubernamentales encaminadas a mejora la productividad de la industria electrónica del país. + \item Desarrollo de Plataformas Hardware que utilicen tecnología de punta. + \item Diseño de los programas de las asignaturas del área de electrónica digital en programas de pregrado para incorporar las nuevas metodologías modernas de diseño y producción. +\end{itemize} + + + +\subsubsection{Hipótesis} +Las recomendaciones dadas por los estudios sobre como solucionar el problema del desarrollo tecnológico, hablan de como se debe trabajar de forma local, teniendo en cuenta la experiencia generada globalmente, Por lo que partiemos de la hipótesis que es posible utilizar técnicas de auto-organización para que diferentes centros de formación y producción distribuidos a lo largo del país encuentren la forma de distribuir de forma eficiente los recursos (Información, conocimiento, recursos económicos) comunes para alcanzar en forma conjunta el objetivo principal: Encontrar políticas de auto-gobierno que permitan el beneficio de la comunidad. + + +\subsection{Aproximaciones} + +El problema del atraso tecnológico en Colombia debe ser atacado desde varios flancos para que pueda ser resuelto de forma efectiva. Como se indicó anteriormente solo con el trabajo conjunto de la industria, la academia y las politicas gubernamentales podremos avanzar en la solución del problema. El trabajo realizado acá solo puede contribuir a la solución del problema con soluciones encaminadas a la industria y la academia. + +Porqué se eligió el área de diseño de sistemas digitales para atacar el problema del atraso tecnológico? Básicamente porque este sector es el que presenta un mayor retraso en el pais, adicionalmente, muchas áreas del conocimiento (como control, instrumentación, medición, comunicaciones, robótica, etc) se apoyan en dispositivos digitales como herramientas para implementar aplicaciones. Por otro lado, existe una gran demanda de productos especializados con capacidades de comunicación especiales y de procesamiento, tanto en el mercado de productos de consumo (Entretenimiento, electrodimésticos, etc), como en el mercado de productos espscializados (Sistemas de control, sistemas de medición, etc). + +Para que el estudio realizado tenga un mayor impacto se deben evitar temas en los que se requieran grandes inversiones en infra-estructuras como por ejemplo diseño y fabricación de Circuitos Integrados o aplicaciones en nanotecnología, ya que los laboratorios necesarios son muy costosos y en el país no existe aún la demanda suficiente que sostenga los costos de funcionamiento de este tipo de procesos. Teniendo en cuenta esto, existen varias alternativas en las que el país podría llegar a ser competitivo a corto plazo y generar productos que compitan con los ofrecidos por industrias de países desarrollados, estas son: + +\begin{itemize} + \item Desarrollo de núcleos de Propiedad Intelectual (IPs) + \item Desarrollo de dispositivos dedicados a resolver problemas específicos utilizando dispositivos semiconductores ya existentes. + \begin{itemize} + \item Diseño de plataformas de Desarrollo Hardware robustas. + \item Creación de plataformas de desarrollo software estables. + \item Desarrollo de aplicaciones basadas en las plataformas de desarrollo ya creadas. + \end{itemize} + \item Desarrollo de aplicaciones HW/SW para que sean fabricadas en otros países con mayor oferta en servicios de manufactura. +\end{itemize} + +Los sistemas embebidos proporcionan una visión completa del proceso de producción de nuevos dispositivos: Concepción, Diseño, Implementación y Operación, adicionalmente es un mercado que mueve miles de millones de Dólares al año y su campo de acción abarca casi todas las actividades humanas (Educación, entrtenimiento, transporte, salud, productividad), existe una infinidad de herramientas Hardware (Procesadores, SoCs, FPGAs, diseños de referencia, herramientas CAD) y Software (Compiladores, depuradores, librerías, Sistemas Operativos, Aplicaciones) y una gran dinámica en la industria que proporciona servicios de manufactura (suministro de componentes, fabricación, pruebas, distribución). Lo que permite ingresar a este mercado con bajas inversiones de dinero, lo que es ideal para la situación actual del país (baja inversión en I+D), y es perfecta para que recién egresados puedan crear nuevos productos y servicios utilizando sistemas embebidos. + +Para asegurar que existan profesionales capaces de utilizar los nuevos conocimientos es necesario crear cursos de actualización a diferentes niveles: Cursos de capacitación, Diplomados, Líneas de profundización en pregrado y posgrado; Modificar el contenido de las asignaturas de las materias relacionadas con la electrónica digital para actualizar sus contenidos y las metodologías de diseño adecuadas, tambien es necesario un cambio en el enfoque, debemos pasar de un perfil analítico a un perfil de diseñador-investigador, en el que todo diseño debe culminar en un producto funcional, y no quedarse solo en las simulaciones. Adicionalmente, es necesario contar con una buena documentación que facilite el proceso de adopción de estos nuevos conocimientos. + +Las actividades anteriores pueden garantizar que a corto plazo el pais forme profesionales capaces de realizar diseño de sistemas digitales utilizando metodologías de diseño adecuadas y herramientas de diseño moderno, pero para que estos cambios sean adoptados por las industrias debe crearse un vínculo con las Universidades para que estas últimas proporcionen profesionales con las competencias requeridas en el medio. También es necesario que existan políticas gubernamentales que estimulen el consumo de los productos locales y protejan las industrias que realicen actividades encaminadas al desarrollo tecnológico del pais. Adicionalmente es necesario capacitar a las empresas en el uso de nuevas tecnologías y en el proceso de producción masivo, si se desea competir con los productos provenientes del exterior es prioritario que nuestras industrias conozcan estos procesos y donde pueden realizarse. + +Como parte del trabajo de esta investigación se tomó una empresa recién formada, con poco capital de inversión, dedicada al diseño de sistemas digitales y se trabajó con ella en la realización de productos con tecnología de punta, + +Por otro lado, aprovechando que la realización de este trabajo coincidió con la re-estructuración de todos los programas académicos de la Universidad Nacional de Colombia, se pudo realizar un cambio total en el contenido de las asignaturas pertenecientes al área de la electrónica digital, estos cambios están encaminados a suplir las necesidades de la industria local y los habilidades necesarias para que nuestros profesionales pasen de ser empleados que comercializan productos foráneos a creadores de empresas que desarrollan sus propios productos. + +Por último y no menos importante, todo este proceso se realizó utilizando herramientas de libre distribución y utilizando una filosofía adoptada de los movimientos de Software Libre \footnote{http://www.fsf.org/} y hardware abierto\footnote{http://en.wikipedia.org/wiki/Open\_source\_hardware}, en las cuales, en palabras de sus fundadores ``el usuario tiene libertad de ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software''. En el caso del hardware se suministra información sobre los archivos de diseño: Esquemáticos, lista de materiales, archivos gerber para la fabricación de los PCBs y software de configuración utilizando herramientas libres. Si queremos que nuestro pais salga del atraso tecnológico en el que se encuentra no podemos trabajar en comunidades aisladas dentro de nuestro pais, ni aislados del entorno mundial, es necesario crear una comunidad que aporte conocimientos que sean utilizados por todos. De aquí la importancia de los conceptos de los movimientos de HW y SW libre. + +El movimiento de SW libre demostró que es posible generar una cultura en la que los aportes de la comunidadad pueden generar productos de gran calidad, y el secreto de su rápido crecimiento es justamente lo que lo diferencia de productos similares: La apertura del código fuente y la posibilidad de hacer modificaciones. Esta idea revolucionaria, permite que miles de personas alrededor del mundo utilicen el conocimiento requerido para escribir esta aplicación de forma directa, y adicionalmente, permite que este conocimiento sea transmitido ya que es posible realizar preguntas a las personas que desarrollaron el producto. Este modelo puede ser utilizado como política del entorno académico e industrial Colombiano para aprovechar de una forma más eficiente, los pocos recursos que suministra el estado para el desarrollo tecnológico. + +Aprovechando lo posición provilegiada que tiene la Universidad Nacional de Colombia como el centro de formación superior más importante de Colombia, así como el respeto y la credibilidad que tiene el entorno productivo nacional, es posible hacer cambios que tengan un impacto profundo sobre la industria electrónica a corto plazo. Para avanzar en este sentido, el presente trabajo suminstrará la base para generar los cambios en el área de electrónica digital, estas modificaciones están encaminadas a crear en nuestros profesionales las habilidades necesarias para la creación de empresas con productos que suplen las demandas de la industria local. Adicionalmente, se pone a disposición de la comunidad interesada, la información necesaria para construir, programar y modificar una plataforma de desarrollo que puede ser utilizada como base para la solución de problemas locales, siguiendo la filosofía del Software y Hardware libre, esta información se encuentra disponible para todo el mundo, y es el punto de partida para la formación de una comunidad que coopera para avanzar en el cumplimiento de un objetivo común. Sin embargo, estos pasos no son suficientes para que un producto pueda ser comercializado en cantidades relativamente grandes, por lo que es necesario mostrar los pasos que se deben seguir para esto y donde se puede realizar el montaje, en este punto se debe crear una base de datos de fabricantes y de distribuidores de componentes y se deben definir las normas nacionales e internacionales que deben cumplirse para que el producto sea distribuido. + +% \subsection{Contribuciones} +% Las contribuciones de este trabajo se resumen a continuación: +% +% \begin{itemize} +% +% \item Adopción y transferencia tecnologica: Con el fín de lograr un estado en el que el país sea soberano en cuanto a la tecnología que utiliza se estudió profundamente el diseño de Sistemas Embebidos, se implementaron plataformas de desarrollo para las arquitecturas más utilizadas en esta área, utilizando el sistema operativo GNU-Linux como herramienta de desarrollo. +% +% \item Las plataformas de desarrollo ECB\_AT91 y ECBOT, primeras computadoras en una sola placa (SBC -Single Board Computer) abiertas diseñadas en Colombia. La información necesaria para su fabricación y utilización hacen parte de este documento. Estas plataformas pueden ser utilizadas como base de aplicaciones comerciales, o como plataforma educativa para la enseñanza de Sistemas Embebidos. +% +% \item Una metodología de trabajo que permite compartir el trabajo realizado por diferentes grupos de investigación o departamentos de I+D para generar conocimiento que permita que Colombia desarrolle tecnología propia, específicamente en el área de los Sistemas Embebidos. Esta información es el recurso común con el que cuentan los miembros de esta ``red'' \footnote{En los movimientos de Hardware y Software libre estas asociaciones reciben el nombre de \textit{comunidades}} y los trabajos de la misma deben estar encaminados a aumentar dichos recursos, por lo que las actividades relizadas deben buscar el bien común y no el individual. +% +% \item Se realizó un cambio total en las asignaturas que hacen parte del área de Electrónica Digital en la universidad más importante del país, los contenidos fueron actualizados para que reflejaran el estado de la industria a nivel mundial; Adicionalmente, se cambió el enfoque para que los ingenieros adquieran capacidades que les permitan dar soluciones a problemas reales. +% +% \end{itemize} + + +% \subsection{Organización} + + diff --git a/course/.docs/book/intro.tex.backup b/course/.docs/book/intro.tex.backup new file mode 100644 index 0000000..33dd1fe --- /dev/null +++ b/course/.docs/book/intro.tex.backup @@ -0,0 +1,472 @@ +\chapter{Introdución} + +\section{Visión, Paradigmas, y Dificultades} +El gran avance de las técnicas de fabricación de Circuitos Integrados ha +permitido que los sistemas digitales sean partes fundamentales de nuestra +vida, aún sin darnos cuenta, diariamente interactuamos con ellos, +facilitando las tareas cotidianas. Los niveles de integración actuales +permiten construir sistemas cada vez más pequeños, veloces y de menor +consumo de potencia, lo cual ha favorecido su difusión. El uso de los sistemas +digitales en \'áreas como la aviación, la industria automovil\'{\i}stica, la +bioingenier\'{\i}a, etc. demanda de estos un alto desempeño y un +funcionamiento continuo, el no cumplimiento de estas exigencias traer\'{\i}a +consecuencias desastrosas. + +Una de las t\'ecnicas utilizadas actualmente para aumentar la confiabilidad +de un sistema es la redundancia hardware, esta redundancia se logra +adicionando unidades funcionales de reserva, que entrar\'an en operaci\'on +cuando la unidad operativa en un determinado momento falle. Otra t\'ecnica +utilizada es la distribuci\'on de tareas en varias unidades de procesamiento. +Con esto no se depende de la confiabilidad de un sistema complejo y costoso +sino que se dispone de muchas unidades de c\'omputo simples y econ\'omicas; +pero que en conjunto son m\'as robustas que el sistema centralizado. Sin +embargo, contar con varias unidades de procesamiento genera nuevos retos como +la divisi\'on y coordinaci\'on de tareas; la forma de realizar estas funciones +de forma \'optima ha sido el objetivo de muchos estudios, los cuales +contin\'uan hasta hoy. + +La tecnolog\'{\i}a de los semiconductores adelanta a la capacidad de +utilizaci\'on por parte de los diseñadores, lo cual crea una brecha en la +productividad: cada año, el n\'umero de transistores disponibles aumenta en un +58\% mientras las utilizaci\'on por parte de los diseñadores lo hace en un +21\% {\cite{KAK01}}. A medida que aumenta el campo de aplicaci\'on de los +sistemas digitales, lo hacen las exigencias de funcionamiento a ellos +impuestas, nuevos retos en el diseño se presentan a medida que los sistemas +embebidos se integran a nuestra vida diaria, se hace necesario diseñar nuevas +t\'ecnicas que permitan eliminar la brecha en la productividad. + + +\subsection{Futuro de los Sistemas Computacionales} + +\begin{quote} + "The best way to predict the future is to invent it." + + Alan Kay +\end{quote} + +\subsubsection{Computador Ubicuo} + +Observando la tendencia actual de los sistemas electr\'onicos, se puede +especular que el computador tal como lo conocemos actualmente desaparecer\'a +{\cite{WM91}}, ya que estar\'a en todas partes, ubicuo, interactuando con los +seres humanos para realzar el mundo que ellos viven. Se pasar\'a de un esquema +en el que existe un computador para uno o varios usuarios (PC, mainframe) a +uno en el que existan muchos computadores para un usuario. Estos computadores +disponen de grandes capacidades de c\'alculo y de comunicaci\'on, pero a la +vez, poseen un grado de integraci\'on tal que ser\'an invisibles; para aclarar +como se puede lograr esta invisibilidad, imag\'{\i}nense que existen sistemas +embebidos construidos con t\'ecnicas de microfabricaci\'on y que son capaces +de tomar su energ\'{\i}a de fuentes alternas como la temperatura, la +radiaci\'on solar, o a partir de fen\'omenos qu\'{\i}micos, debido a su +reducido tamaño, estos sistemas pueden integrarse a objetos o pintarse sobre +ellos, de tal forma que no sean visibles ante los ojos humanos. Esta +desaparici\'on no solo ser\'a una consecuencia de la tecnolog\'{\i}a, sino de +la sicolog\'{\i}a humana; cuando las personas asimilan perfectamente algo y se +convierte en parte de la vida diaria no se es consciente de su utilizaci\'on. +Por ejemplo, cuando observamos una señal de tr\'ansito capturamos la +informaci\'on sin ser conscientes de la realizaci\'on del acto de la lectura. + +\begin{figure}[h] +\begin{center} \includegraphics[scale=.6]{./images/Ubiquitous.jpg} \end{center} +\caption{Concepto de Computador Ubiquo.} +\end{figure} + + +Hasta el momento el diseño de sistemas tanto software como hardware se ha +centrado en las m\'aquinas, las personas se encargan de crear condiciones +adecuadas de trabajo para ellas. Nos vemos obligados a interactuar con estas +utilizando su propio lenguaje, lo cual dificulta su manejo. En el futuro la +computaci\'on tendr\'a como centro al ser humano, estar\'a en todas partes +dispuesta a ayudarle en sus tareas diarias. No tendr\'an que llevar +computadoras con ellos, se podr\'a interactuar con ellas en cualquier parte a +trav\'es de dispositivos como HandHelds, tel\'efonos celulares, etc no tendremos que +preocuparnos por nuestra privacidad ya que ellas se encargar\'an de eso {\cite{Oxygen}}. + + + +Un nuevo t\'ermino aparece en el escenario del diseño de Sistemas Digitales: +Los \textit{ambientes Inteligentes}, este t\'ermino se utiliza para describir +entornos electr\'onicos sensibles a la presencia de personas, en estos +entornos los usuarios interact\'uan de forma natural con recursos +computacionales que les ayudan a la realizaci\'on de tareas. Es una nueva +\'area de desarrollo que involucra a profesionales en las \'areas de: +Ingenier\'{\i}a Electr\'onica, Ingenier\'{\i}a Mec\'anica, Ciencias de la +computaci\'on, redes y comunicaciones, ciencias sociales y humanistas. + + + +En las siguientes secciones se estudiar\'a el impacto de la computaci\'on +ubicua en el diseño de los sistemas digitales siguiendo los lineamientos de +Marc Weiss {\cite{WM91}} y David Servat {\cite{DS02}}. + +\subsubsection{Ambientes Inteligentes.} + +En la actualidad, cada vez con m\'as frecuencia, se notan signos de la +invasi\'on digital, por ejemplo, en el aumento de chips embebidos en los +dispositivos que utilizamos a diario. Se ha demostrado {\cite{MW93}} que una +persona que vive en un pa\'{\i}s industrializado se ve confrontada con un +promedio de 40 chips al d\'{\i}a, de los cuales 5 son capaces de comunicarse +en redes. Se estima que dentro de 10 años estaremos en contacto con cientos de +estos chips, la mayor\'{\i}a de los cuales acceden a densas redes de +informaci\'on {\cite{DS02}}, muchos de estos artefactos toman la apariencia de +objetos que utilizamos en nuestra vida diaria (herramientas, vestuario, +electrodom\'esticos, etc) pero son mejorados con sensores, actuadores, +procesadores y software embebido. Una de las razones de la aparici\'on de +estos sistemas es econ\'omica. Las industrias han visto como se muestran +signos de recesi\'on en los mercados tradicionales. Por lo tanto, buscan +nuevos productos en los que pueden ser embebidos chips y software. El +an\'alisis de los procesos de adopci\'on de los dispositivos tecnol\'ogicos de +hoy muestra que la introducci\'on en el mercado de nuevos dispositivos genera +la alteraci\'on o la creaci\'on de nuevos h\'abitos {\cite{DS02}}. Esta +invasi\'on electr\'onica trae consigo una serie de efectos que resultan poco +pr\'acticos e inc\'omodos para sus usuarios humanos: +\begin{itemize} + \item La interacci\'on se realiza utilizando el lenguaje del dispositivo, + este lenguaje no es \'unico, por lo tanto debemos aprender un tipo de + lenguaje para un tipo de aplicaci\'on determinda. + + \item Estos dispositivos no pueden comunicarse entre s\'{\i}, por lo que nos + vemos obligados a buscar \textit{traductores} que sirvan de puente + entre ellos. + + \item Est\'an construidos para operar en un ambiente determinado, lo cual + nos obliga a movilizarnos con el f\'{\i}n de utilizarlos. + + \item No realizan distinci\'on entre usuarios, cada vez que un usuario + diferente los use debe configurar sus preferencias. +\end{itemize} + + +Los ambientes inteligentes son entornos electr\'onicos que son sensibles y +responden a la presencia de personas {\cite{EA01}}. Est\'an compuestos por +muchos dispositivos distribuidos que interact\'uan con el usuario de forma +natural. El concepto fue construido con base en las ideas de Marc Weiser +{\cite{WM91}}, en {\cite{NRC01}} se puede encontrar un resumen de los +desarrollos y retos recientes en este campo de investigaci\'on. En un ambiente +inteligente, las personas est\'an rodeadas por redes de dispositivos +inteligentes embebidos que proporcionan informaci\'on ubicua, comunicaci\'on, +servicios y entretenimiento {\cite{APaET03}}. Adem\'as, estos dispositivos se +adaptan por si mismos a los usuarios, y anticipan sus necesidades. La +electr\'onica puede integrarse en el vestuario, los muebles, autom\'oviles, +casas, oficinas y sitios p\'ublicos, introduciendo el problema del desarrollo +de nuevos conceptos de interfaz de usuario que permitan la interacci\'on +natural con estos entornos. Las funciones b\'asicas que deben realizar los +ambientes inteligentes son: +\begin{itemize} + \item Conocimiento del entorno. + + \item Sistemas inal\'ambricos Distribuidos. + + \item Interacci\'on natural con los usuarios. +\end{itemize} + + +La visi\'on de los ambientes inteligentes es que las aplicaciones ser\'an cada +vez m\'as y m\'as distribuidas y ser\'an ejecutadas en plataformas que +proporcionan recursos de forma din\'amica. Estas aplicaciones deben cumplir +con las funciones mencionadas anteriormente. Los nuevos retos que generan los +ambientes inteligentes al diseño de Sistemas embebidos se pueden dividir en +interacci\'on y adaptaci\'on: + + +\begin{itemize} + \item Interacci\'on con: + \begin{itemize} + \item las aplicaciones, + + \item la plataforma Hardware, + + \item otros dispositivos, + + \item el usuario. + \end{itemize} + + + \item Adaptaci\'on: + \begin{itemize} + \item al cambio de aplicaciones y necesidades del usuario, + + \item a la cantidad de recursos Hardware, + + \item a cambios en el entorno. + \end{itemize} +\end{itemize} + + +\subsubsection{Consecuencias de la aparici\'on de los sistemas de computaci\'on +ubicua.} + +La aparici\'on de la computaci\'on ubicua no es una revoluci\'on, por el +contrario es una consecuencia l\'ogica de la evoluci\'on de las relaciones +entre los usuarios y los sistemas de computadores, los cuales se han +caracterizado por una democratizaci\'on de acceso a los equipos y una +descentralizaci\'on de la infraestructura subyacente. En el primer +per\'{\i}odo (1950-1970) se compart\'{\i}an recursos a trav\'es de terminales, +es decir, se contaba con un computador para muchos usuarios. En los 80s, la +aparici\'on de los computadores personales impulsa la relaci\'on personal +entre los computadores y usuarios. El los 90s la aparici\'on de Internet +permiti\'o compartir recursos a trav\'es de un computador personal. Internet +no es m\'as que un paso adelante hacia la llegada de los sistemas de +computaci\'on ubicua. La misma filosof\'{\i}a de simplificaci\'on y +descentralizaci\'on prevalece hasta hoy y nos conducir\'a a una situaci\'on +donde miles de dispositivos computacionales estar\'an disponibles para +realizar nuestras tareas y se compartir\'an recursos a trav\'es de redes m\'as +intrincadas que Internet. En conclusi\'on se pasar\'a de un esquema en el que +se ten\'{\i}a un computador para muchos usuarios a uno en el que se tienen +muchos (tal vez miles o millares) elementos computacionales para servir a un +usuario. + +Estos sistemas ser\'an componentes de una infraestructura computacional que +difiere radicalmente de las que conocemos hoy, y deben poseer las siguientes +caracter\'{\i}sticas: +\begin{itemize} + \item Descentralizados: la centralizaci\'on adem\'as de impr\'actica no + permite que diferentes usuarios puedan controlar sus componentes. + + \item Manejar la variaci\'on de su configuraci\'on: debido a la adici\'on o + substracci\'on de sus componentes, o por la forma en que los usuarios los + usan. + + \item Estar inmersos en las comunidades humanas con varios tamaños y + necesidades, y operar con informaci\'on incompleta sobre su entorno. + + \item Unir combinaciones altamente heterog\'eneas de software y hardware, + las cuales pueden diferir por su funci\'on o por su procesamiento, + comunicaci\'on o capacidades de acci\'on. + + \item Ser el resultado de combinaciones de componentes, que pudieron no ser + vistos en tiempo de diseño, sin embargo, producen comportamientos emergentes + interesantes. + + \item Adaptarse de forma cont\'{\i}nua a su entorno con el f\'{\i}n de + mejorar su desempeño. +\end{itemize} + +El diseño de estos sistemas requiere nuevas fuentes de inspiraci\'on; una +direcci\'on promisoria es verlos y diseñarlos como \textit{ecosistemas de agentes físicos} organizados seg\'un principios +biol\'ogicos, qu\'{\i}micos o f\'{\i}sicos {\cite{DS02}}. + +\section{Estado del Diseño Electrónico en Colombia} + +En la actualidad Colombia atraviesa por una $''$\textit{\textit{crisis}}$''$ a +nivel de diseño de sistemas digitales, existe un atraso muy grande en esta +\'area; a nuestro modo de ver existen dos grandes responsables de esta situaci\'on. +Por un lado, las pol\'{\i}ticas de la mayor\'{\i}a de las industrias al no +realizar inversi\'on de capital en sus departamentos de I+D; algunas de ellas +ni siquiera cuentan con este departamento. Por otro lado, las Universidades no +cuentan con programas actualizados que permitan explotar los avances +realizados en las industrias electr\'onica y de semiconductores; en un gran +n\'umero de Universidades Colombianas a\'un se trabaja con dispositivos de +funci\'on fija como las familias 74 y 40. Los lenguajes de descripci\'on de +hardware han sido adoptados recientemente en la mayor\'{\i}a de programas de +ingenier\'{\i}a electr\'onica, pero en algunos casos no existe una base +metodol\'ogica que soporte su adecuada utilizaci\'on. La disponibilidad de +dispositivos l\'ogicos programables (FPGAs, CPLDs) es limitada debido a la +inexistencia de un proveedor local. Se dedican cursos completos para +$''$enseñar$''$ a programar microprocesadores de 8 bits en lenguaje +ensamblador y muchos educadores a\'un miran con desconfianza a los lenguajes +de alto nivel como el C, C++. En muy pocos programas de Ingenier\'{\i}a +Electr\'onica no se cuenta con una asignatura dedicada a sistemas operativos y +en muchos de ellos no se le da la importancia que tiene la enseñanza de +lenguajes estructurados. + +La situaci\'on se agrava a\'un m\'as al ver el estado de la relaci\'on entre +la universidad y la industria, la cual no existe en algunos casos. Desde el +punto de vista industrial los resultados obtenidos en la academia parten de +entornos ideales y no se tienen en cuenta las caracter\'{\i}sticas de los +entornos industriales, lo cual da como resultado sistemas poco robustos y con +problemas funcionales. Por otro lado, los tiempos de desarrollos son muy +largos ya que la mayor\'{\i}a de las universidades Colombianas no cuenta +con grupos de investigaci\'on que tengan miembros dedicados de forma +exclusiva al desarrollo de este tipo de proyectos, la mayor\'{\i}a \ de los +miembros de estos grupos son temporales (estudiantes de pregrado) y sin paga, +lo cual no garantiza el cumplimiento ni la continuidad de las investigaciones. + +\subsection{Apropiación de Conocimiento} + +Para que Colombia deje de ser un país que consume tecnología y llegue en algún momento a ser generador de productos tecnológicos, es necesario que se genere un conocimiento que permita esta transición. ``Para que el conocimiento sea motor de desarrollo es necesario el traspaso desde sus creadores a la sociedad, mediante la conversión a tecnologías que produzcan cambios radicales que incrementen la producción. Esa transmisión de tecnología generadora de crecimiento económico esta influenciada por diversos factores: medio geográfico, leyes de propiedad industrial, costos laborales, nivel de ciencia y tecnología, religión, tipos de instituciones, resistencia a innovar, políticas de estado, guerras, factores demográficos, entre otros'' \cite{Mok90} + +Pero como apropiar este conocimiento? Arrow \cite{Arr62} afirma que la apropicación de conocimiento puede efectuarse de varias formas: ``aprender haciendo'', ``aprender usando'', ``aprender leyendo''. Cuando una empresa decide transmitir su conocimiento disponible, lo hace en procesos de investigaciones conjuntas, en actividades de producción, y distribución, mercadeo, servicio y soporte operativo o riesgo compartido. También se presentan alianzas entre firmas como: contratos de I+D, acuerdos de licencias, licencias cruzadas. La conformación de estas asociaciones permite crear redes tecnológicas dominadas por países industrializados con sus respectivas empresas multinacionales monopolizando conocimiento \cite{Mar04} + +Para Colombia, el problema radica en que las empresas de capital nacional no están adquiriendo el conocimiento necesario para lograr innovaciones al interior de las mismas. De forma que puedan ser competitivas y logren acceder a mercados internacionales ofreciendo productos innovadores, de calidad y a precios competitivos. Con efectos directos como: generación de empleos especializados, desarrollo tecnológico e industrial sostenido, ampliación del acervo de conocimiento nacional y disminución de la salida de divisas (al mejorar los procesos de negociación) y creación de externalidades positivas \cite{Mar04}. + +Ligado al problema de la senda tecnológica está el del grado de lo tácito del conocimiento científico. Teece \cite{Tee81} señala que al existir conocimiento tácito toda la tecnología disponible no se transfiere de los productores a los receptores o compradores de la misma. Por tanto, los países seguidores siempre van a estar a la zaga tecnológica. Forbes y Wield \cite{FW00} señalan que los esfuerzos adaptativos son mayores porque deben acomodar las ``innovaciones'' a los materiales locales, fuerza laboral nativa, mercados internos y medio ambiente local. Entonces, el problema no se limita a cómo transferir conocimiento, cómo develar su parte tácita y cómo extraerlo de las multinacionales, sino que radica en el bajo poder de negociación y adquisición de tecnología por firmas pequeñas y medianas, las cuales carecen de recursos y tienen procesos deficientes de contratación. + +En este orden de ideas, si el país no es un innovador neto ¿no debería más bien mostrar una tendencia a importar conocimiento? Y las firmas nacionales ¿no deberían ser las que más efectuaran este tipo de contratos, para así acceder al conocimiento de la tecnología adquirida? En resumen, conociendo mejor qué tecnología se importa y qué tipos de contratos se utilizan, es posible crear marcos de referencia para empresas nacionales que estén interesadas en adquirir tecnología. Esto produciría externalidades positivas en empresas importadoras de conocimiento y, a su vez, en la economía del país. Con una adecuada importación de conocimientos tecnológicos se crearía una ventaja competitiva de carácter estructural, basada en un acervo de conocimiento tecnológico que permita incrementar la productividad en todos los sectores económicos de manera permanente \cite{Mar04}. + +Según los estudios realizados por Martínez, con base en registros del Decreto 259/92, del Incomex. La importación de conocimiento no está siendo empleada con el propósito de utilizar tecnologías de punta que permitan efectuar innovaciones al interior de las empresas y de los sectores. Las empresas nacionales se limitan a comprar un determinado dispositivo, sin tener el conocimiento para operarlo, hacerle mantenimiento ni mucho menos mejorarlo, por lo que se ven obligadas a contratar con el vendedor contratos para dicho fín. Esto indica que la adquisición de tecnología no se realiza con base en programa desarrollado de antemano, sino son una respuesta a cambios en el mercado, lo cual evidencia la inexistencia de programas de innovación encaminados a la disminución de la brecha tecnológica. + + +\subsection{Situación de la Industria Electrónica en Colombia} + +La industria electrónica nacional no es ajena a las políticas que siguen las empresas nacionales en cuanto a la apropiación de tecnología; Colombia depende totalmente de economías más desarrolladas para el suministro de dispositivos electrónicos en diversas areas (comunicaciones, entretenimiento, industria, medicina, etc). Mientras en otros sectores de la economía han pasado de ser consumidores a exportadores, y adquieren nuevas tecnologías para ser más competitivos, el sector electrónico del país ha reducido sus actividades de Investigación y Desarrollo hasta el punto de depender totalmente de productos externos, de los cuales, algunos son de baja calidad y no suplen los requerimientos del mercado local, pero son utilizados porque son muy económicos. + +En la actualidad la industria electrónica presenta una gran dinámica a nivel mundial, el uso de los sistemas electrónicos se extiende a todas las actividades humanas; La demanda mundial de este tipo de sistemas aumentará de forma dramática en los próximos años, especialmente en los sectores de tecnología médica, movilidad, seguridad, comunicaciones y consumo \cite{ETPoSSI(09}. El mercado de los sistemas embebidos es una industria que movió alrededor de 25 billones de dólares en el 2008 según Venture Development Corporation \cite{Vc08}. Por otro lado, la inversión de capital necesaria para el diseño de Sistemas Embebidos es relativamente baja, gracias a la gran demanda originada, los insumos y los servicios de fabricación son muy económicos, las herramientas de desarrollo necesarias para la programación y depuración de este tipo de sistemas son de libre distribución. + +Desafortunadamente en Colombia la industria electrónica se encuentra muy rezagada en relación a las de los países industrializados, y las ventajas y oportunidades de negocios mencionadas anteriormente no son aprovechadas en la actualidad. + +Según ASESEL \footnote{Asociación de entidades del Sector Electrónico} en el 2001 existían 154 empresas productoras de componentes y equipos de la cadena electrónica. Dentro de los productos que la industria electrónica exporta se encuentran registrados: Circuitos integrados, circuitos impresos, microestructuras, instrumentos para medida y control, Instrumentos y aparatos eléctricos o electrónicos. Es importante decir que la industria colombiana, en la actualidad no fabrica circuitos integrados, ni microestructuras, por lo que estas son ventas de productos comprados en países desarrollados. Según Proexport el 91\% de las exportaciones son realizadas por Bogotá y los destinos se encuentran en países cercanos como Venezuela, Perú, Ecuador y USA. + +La electrónica en Colombia y en el mundo hace parte de esas industrias que se mueven velozmente en un +camino desconocido, como consecuencia se hace necesario tener una actualización constante de los +avances tecnológicos y las proyecciones futuras del sector. Debido a la importancia del sector tecnológico es primordial que en Colombia se esté consciente del estado actual y que se puede hacer en términos de +Investigación Científica y Desarrollo Tecnológico (I+D) en Ingeniería Electrónica. + +Un estudio realizado en la Universidad Nacional de Colombia \cite{MTRR07} identificó los siguientes obstáculos para el desarrollo de la industria electrónica en Colombia: Deficientes relaciones Universidad Empresa, Pobre enfoque académico hacia la industria, baja calidad de los productos nacionales, políticas gubernamentales, falta de cultura de Investigación y Reducida apropiación tecnológica, competencia de países asiáticos, atraso tecnológico, limitado recurso humano con formación avanzada. + +De los problemas expuestos anteriormente podemos identificar cuales son los que más afectan el desarrollo de la industria electrónica en Colombia, el que más perjudica sin lugar a dudas es el atraso tecnológico, no es posible ser competitivo en el mercado electrónico mundial con tecnologías y metodologías de diseño obsoletas. \footnote{En Colombia trabajamos aún con circuitos integrados que se crearon en la decada de los 80 del siglo pasado y utilizamos lenguajes de programación como el \textit{assembler}, para el cual el tiempo de aprendizaje, desarrollo y de depuración es muy largo} La culpa de este atraso tecnológico no es exclusiva de la industria, aunque, como vimos anteriormente muchas industrial Colombianas se resisten al cambio y prefieren comprar equipos en el exterior a buscarlos localmente, la falta de confiabilidad en los productos Colombianos agrava este problema, esta falta de confianza en la industria local no es infundada, la mayoría de los productos Colombianos no cumplen con las normas mínimas de calidad y utilizan productos de bajo costo obtenidos en remates de componetes. + +Otro actor que contribuye al retraso tecnológico es el sector académico; Según el Sistema Nacional de Información Superior, durante los últimos 10 años se han abierto 230 programas relacionados con la industria electrónica, estos programas están repartidos entre programas de formación Universitaria, tecnológica terminal y de técnica profesional, la mayoría de estos centros de formación se encuentran ubicados en 3 Departamentos: Bogotá, Antioquia y Valle \cite{DZSC+07}. El número de Ingenieros graduados en un año es entre 2 y 8 veces mayor que en los países en vía de desarrollo y doce veces mayor que los que se gradúan en los países desarrollados. En Colombia, este aumento es aportado por instituciones de poca consolidación; además, las preferencias en la educación superior son Formación técnica / form. tecnológica / form. profesional que es justamente lo opuesto a la de los países desarrollados \cite{MDAG99}. + +Por otro lado, el contenido de las asignaturas relacionadas directamente con la industria electrónica se encuentran muy desactualizados, y fuera del contexto mundial, se utilizan metodologías de diseño antiguas en las que primaba la experiencia del diseñador, se realizan tareas manuales, repetitivas que pueden ser realizadas por herramientas de diseño moderno, los currículos son conservadores hay poca experimentación y su estructuración y metodologías son muy clásicas. Adicionalmente, muchos investigadores dedican sus estudios en proyectos que no aportan al desarrollo del país únicamente porque están de moda. Otro problema adicional radica en la falta de experiencia en el sector productivo por parte del personal académico, un componente importante de los profesores nunca han sido parte de un proceso productivo o de un proceso de desarrollo que tenga como fín la creación de un producto comercial, razón por la cual se evita la experimentación y se da más énfasis al análisis y solo se llega a una simulación. + +De lo anterior podemos concluir que en Colombia se presenta una sobre-oferta de profesionales en el área electrónica, muchos de los cuales provienen de instituciones educativas con poca consolidación, y que han sido formados con programas desactualizados que no tienen en cuenta los avances tecnológicos y metodológicos, lo cual explica la pobreza de ingenieros con altos niveles de formación. Por esta razón no es de extrañar la poca confianza que tienen los industriales en los productos nacionales. + +Lo anterior unido a la falta de políticas de estado que: tracen normas encaminadas a incentivar la inversión en investigación y desarrollo, defina líneas y campos de investigación, regule la oferta laboral y los programas académicos, generan el clima perfecto para que el atraso tecnológico se mantenga durante mucho tiempo y Colombia no deje de ser un consumidor de tecnología. Según John Kao, uno de los grandes expertos del mundo en innovación, los países desarrollados no invierten en Ciencia Tecnología e Innovación (CTI) porque son ricos, sino que son ricos porque invierten en CTI. + + +\subsubsection{Tecnologías de Información y Comunicación} +En la actualidad existe un especial interés por parte del gobierno \footnote{ La Agenda de Conectividad es el programa del Ministerio de Comunicaciones, encargado de impulsar el uso y masificación de las Tecnologías de Información y Comunicación -TIC- como herramienta dinamizadora del desarrollo social y económico del país ()} en impulsar las Tecnologías de la Información y la Comunicación (TIC). Este programa no debe centrarse en solo difundir el uso de internet y aumentar el número de personas que tienen acceso a un computador. ``La tecnología es simplemente la infraestructura, si la infraestructura no está acompañada por la creación de habilidades y conocimiento la adopción de TICs no ayudará a obtener los beneficios que esperamos, sin embargo, ayudarán con los intereses de los más poderosos y de las naciones más ricas.'' \footnote{Brito Lidia, ``Enabling Environment, ICT for Development and the Millennium Development Goals'',página 20, 2005}. Las TICs deben utilizar la educación como pricipal herramienta para reducir la \textit{brecha tecnológica} que existe entre las diferentes regiones de nuestro país y de nuestro país con los paises desarrollados. + +Hearn, Simpson, Lennie y Kimber \cite{HSL+04} \cite{MJF05} nombran las siguientes características para que las TICs contribuyan con el desarrollo regional. +\begin{enumerate} + \item Conseguir claridad en especificar objetivos sostenibles, las regiones no se + pueden dar el lujo de esperar a que todo les sea entregado y listo, ponerlo a + funcionar, debe existir un plan para evitar que la tecnología se vuelva + obsoleta y se acabe el proyecto por esta causa. + \item Apalancar el desarrollo de la empresa pequeña ayudado por personal y + financiación del gobierno y utilizando las fortalezas de las industrias locales. + \item Construir basado en las industrias fuertes locales; Aprender de las + experiencias globales mientras que se construye en acciones locales + \item Encontrar innovadores modelos de negocios para aprovecharlos en nuevas + oportunidades de contenidos y aplicaciones. + \item Asegurar el envolvimiento de la comunidad en la decisión, planeación y + evaluación de proyectos. Hemos visto que para que un proyecto de + tecnología tenga éxito se debe involucrar a la sociedad civil, a ellos deben ir + dirigidos los principales beneficios, deben ser ellos quienes se capaciten y + de esta forma el proyecto va a funcionar. + \item Adoptar una metodología de aprendizaje a través de ciclos de evaluación + basados en una acción investigativa. + +\end{enumerate} + +Adicionalmente es necesario buscar el bien común por encima del individual, razón por la cual debemos preguntarnos quienes son los favorecidos por la difusión de estas tecnologías, no tiene sentido invertir grandes sumas de dinero para llevar estas tecnología a lugares donde no saben como utilizarlas y más aún, en lugares donde las necesidades básicas no han sido resueltas. Es importante pensar en las personas a las que se va a beneficiar y preparar el camino para que el impacto sea mayor, sin educación y sin entrenamiento no se le puede sacar provecho a estas tecnologías. Debemos crear herramientas que integren a nuestros pueblos y que permitan colaborar entre ellas. + +En la actualidad esta política gubernamental se limita a comprar software propietario normalmente el sistema operativo MicroSoft Windows y aplicaciones del mismo fabricante como su suite Office y MSN. Esto no aporta absolutamente nada al desarrollo tecnológico del país ya que al ser un sistema operativo cerrado no es posible modificarlo o aprender sobre su funcionamiento, el usuario debe limitarse a aceptar lo que el fabricante le entrega y si quiere desarrollar apliaciones propias debe pagar por las herramientas de desarrollo y por la documentación. Microsoft utiliza una política de reducción de precios para los centros educativos y algunos centros gubernamentales, esta ``donación'' solo crea dependencia tecnológica y en la mayoría de los casos promueve acciones ilegales ya que (el costo de estos productos son los mismos en todo el mundo y en muchas ocasiones cuestan más que el computador sobre el que se ejecuta) los usuarios obtienen software ilegal, práctica que se generaliza a todo el software no solo al de Microsoft lo que hace que las empresas medianas y pequeñas locales sean forzadas a cerrar sus negocios. Por otro lado, al permitir que solo una empresa extranjera sea la que decide sobre el futuro del software utilizado en la mayoría de los computadores de una nación se está cediendo la soberanía para el beneficio de un particular foráneo. + +Lo mismo sucede con los equipos que se utilizan para acceder a estas tecnologías, en la mayoría de los casos son fabricados en paises con diferentes culturas y diferentes necesidades. Es obvio que el país no puede fabricar ciertos equipos que se requieren para poder llevar estas tecnologías a las diferentes regiones, sin embargo, este trabajo proporciona una base sólida sobre la cual se puede desarrollar un producto similar al propuesto por el proyecto del MIT OLPC (One Laptop For Child), el cual busca construir un dispositivo de muy bajo costo (200 USD) que permita a los estudiantes y a la comunidad en general, aprender los conceptos básicos para poder utilizar estas tecnologías. De esta forma impulsamos la industra electrónica produciendo de forma masiva un dispositivo electrónico en el pais, diseñado para suplir necesidades de la región. Esta plataforma no solo poroporcionará la base para el desarrollo de las TICs, sino la base tecnológica sobre la cual se pueden desarrollar muchas soluciones a problemas de la industria local. + + +Es posible incluir el presente estudio en dicho programa de tal forma que el objetivo final de este programa no sea aumentar la venta de licencias de un determinado sistema Operativo o el número de computadores con acceso a internet, sino desarrollar en el pais la tecnología necesaria para que las universidades y empresas locales sean capaces de desarrollar dispositivos que permitan el acceso a estas tecnologías. + + +\subsection{Estado de la Electrónica Digital en la Universidad Nacional de Colombia} + +Hasta hace un año en las asignaturas del área de electrónica digital de la Universidad Nacional de Colombia (La Universidad pública más grande e importante del pais), se trabajaba con dispositivos que fueron sacados al mercado en 1966 y 1968, las familia lógica TTL 7400 y CMOS 4000. El problema principal al utilizar esta tecnología no es su año de creación, ni siquiera que en la actualidad se consideren obsoletas para el diseño de un sistema digital completo. \footnote{En la actualidad estas compuertas se utilizan para la implementación de pequeñas operaciones lógicas} El problema detrás del uso de esta tecnología se encuentra en la ausencia total de metodologías de diseño (en el caso Colombiano). Y el desconocimiento en herramientas tipo CAD. El proceso de diseño que realizaban los estudiantes era: + +\begin{enumerate} + \item Especificaciones del sistema. + \item Generación manual de ecuaciones boolenas. + \item Minimización manual utilizando mapas de Karnaugh. + \item Implementación de las ecuaciones minimizadas utilizando las familias lógicas 7400 y 4000, sobre placas de pruebas (protoboards, breadboards) + \item Pruebas del sistema. +\end{enumerate} + +A manera de ejercicio académico se justifica el uso de las familias 7400 y 4000, sin embargo, el quedarse ahi no es bueno para una industria electrónica desactualizada, debido a que este tipo de implementaciones no pueden generar productos competitivos a nivel mundial. La razón de esto es que existen muchas fuentes de error en el proceso, generados por la ausencia de herramientas CAD que realicen las operaciones tediosas como las minimización de ecuaciones booleanas, las cuales están sujetas a errores humanos originados por cansancio, falta de concentración, etc. Otro aspecto que vale la pena resaltar es la falta de una simulación funcional, la mayoría de los estudiantes consultados no realizaban simulaciones funcionales y preferían probar el diseño una vez implementado físicamente, esto unido a la dificultad de depuración innata a este tipo de implementaciones, aumentaba considerablemente el tiempo requerido para realizar la implementación y pruebas del sistema. + +En el segundo curso del área de electrónica digital, se introduce al estudiante al uso de los dispositivos lógicos programables (PLD) y los lenguajes de descripción de hardware (HDL) como herramientas para el diseño de sistemas digitales, al comienzo, el contenido de estos cursos se limitaba al uso de una herramienta de diseño y la enseñanza de nociones básicas del lenguaje VHDL, se daba más importancia al uso de la herramienta y no a la metodología de diseño, de nuevo el estudiante ataca los problemas sin una metodología de diseño clara. Vale la pena indicar que este curso fue dictado por profesores ocasionales durante los últimos cuatro años, cada profesor utilizaba contenidos y niveles de exigencia diferentes. + +En la tercera parte del curso se trabaja con sistemas microcontrolados, se utilizan microcontroladores de 8 bits de diferentes familias y se utiliza el lenguaje ensamblador como herramienta de desarrollo. Una de las principales desventajas que presenta este curso (y de la línea en general) es la falta de continuidad en los contenidos y en la metodología utilizada, ya que el contenido de este curso se encuentra totalmente desligado al de los dos anteriores. Sin embargo, durante este curso se proporciona una metodología de diseño en la que los estudiantes emulan el comportamiento del microcontrolador antes de ser programado, sin embargo, esta práctica no es seguida por la mayoría de los estudiantes, una posible causa de este comportamiento puede ser la falta de metodologías de diseño en los cursos anteriores. + +La sensación que queda al terminar el área de electrónica digital es que lo único que importa son los microcontroladores y que lo visto en los primeros cursos no es muy útil. La siguiente tabla muestra los problemas encontrados en el área de electrónica digital de las carreras de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia: + +\begin{enumerate} + \item Falta de una metodología de diseño. + \item Utilización de herramientas obsoletas: Familias Lógicas, lenguajes de programación. + \item Poco uso de las herramientas CAD. + \item Falta de continuidad en las asignaturas. + \item Falta de docentes. + \item No se suministra una formación adecuada que ayude a la industria electronica a salir del retraso tecnológico. +\end{enumerate} + + +\section{Descripción de la Tésis} + +\subsection{Objetivos e Hipótesis} + +\subsubsection{Ojetivo Principal} + +Desarrollar una metodología para la transferencia tecnológica y de conocimientos en el área de Sistemas Embebidos. +El objetivo de este trabajo es contribuir a dar solución al problema del atraso tecnológico en Colombia, puntualmente en los siguientes puntos: + +\subsubsection{Objetivos Secundarios} + +\begin{itemize} + \item Formulación de una metodología para la transferencia tecnológica y de conocimientos en el área de Sistemas Embebidos en Colombia. + \item Formulación de una metodología de Diseño y producción para Sistemas Embebidos aplicable en el entorno local. + \item Identificación de las habilidades requeridas para los profesionales y técnicos en la Industria Electrónica para estar acorde con la tendencia de la industria electrónica mundial y formulación de recomenadaciones para la industria y los organismos gubernamentales encaminadas a mejora la productividad de la industria electrónica del país. + \item Desarrollo de Plataformas Hardware que utilicen tecnología de punta. + \item Diseño de los programas de las asignaturas del área de electrónica digital en programas de pregrado para incorporar las nuevas metodologías modernas de diseño y producción. +\end{itemize} + + + +\subsubsection{Hipótesis} +Las recomendaciones dadas por los estudios sobre como solucionar el problema del desarrollo tecnológico, hablan de como se debe trabajar de forma local, teniendo en cuenta la experiencia generada globalmente, Por lo que partiemos de la hipótesis que es posible utilizar técnicas de auto-organización para que diferentes centros de formación y producción distribuidos a lo largo del país encuentren la forma de distribuir de forma eficiente los recursos (Información, conocimiento, recursos económicos) comunes para alcanzar en forma conjunta el objetivo principal: Encontrar políticas de auto-gobierno que permitan el beneficio de la comunidad. + + +\subsection{Aproximaciones} + +El problema del atraso tecnológico en Colombia debe ser atacado desde varios flancos para que pueda ser resuelto de forma efectiva. Como se indicó anteriormente solo con el trabajo conjunto de la industria, la academia y las politicas gubernamentales podremos avanzar en la solución del problema. El trabajo realizado acá solo puede contribuir a la solución del problema con soluciones encaminadas a la industria y la academia. + +Porqué se eligió el área de diseño de sistemas digitales para atacar el problema del atraso tecnológico? Básicamente porque este sector es el que presenta un mayor retraso en el pais, adicionalmente, muchas áreas del conocimiento (como control, instrumentación, medición, comunicaciones, robótica, etc) se apoyan en dispositivos digitales como herramientas para implementar aplicaciones. Por otro lado, existe una gran demanda de productos especializados con capacidades de comunicación especiales y de procesamiento, tanto en el mercado de productos de consumo (Entretenimiento, electrodimésticos, etc), como en el mercado de productos espscializados (Sistemas de control, sistemas de medición, etc). + +Para que el estudio realizado tenga un mayor impacto se deben evitar temas en los que se requieran grandes inversiones en infra-estructuras como por ejemplo diseño y fabricación de Circuitos Integrados o aplicaciones en nanotecnología, ya que los laboratorios necesarios son muy costosos y en el país no existe aún la demanda suficiente que sostenga los costos de funcionamiento de este tipo de procesos. Teniendo en cuenta esto, existen varias alternativas en las que el país podría llegar a ser competitivo a corto plazo y generar productos que compitan con los ofrecidos por industrias de países desarrollados, estas son: + +\begin{itemize} + \item Desarrollo de núcleos de Propiedad Intelectual (IPs) + \item Desarrollo de dispositivos dedicados a resolver problemas específicos utilizando dispositivos semiconductores ya existentes. + \begin{itemize} + \item Diseño de plataformas de Desarrollo Hardware robustas. + \item Creación de plataformas de desarrollo software estables. + \item Desarrollo de aplicaciones basadas en las plataformas de desarrollo ya creadas. + \end{itemize} + \item Desarrollo de aplicaciones HW/SW para que sean fabricadas en otros países con mayor oferta en servicios de manufactura. +\end{itemize} + +Los sistemas embebidos proporcionan una visión completa del proceso de producción de nuevos dispositivos: Concepción, Diseño, Implementación y Operación, adicionalmente es un mercado que mueve miles de millones de Dólares al año y su campo de acción abarca casi todas las actividades humanas (Educación, entrtenimiento, transporte, salud, productividad), existe una infinidad de herramientas Hardware (Procesadores, SoCs, FPGAs, diseños de referencia, herramientas CAD) y Software (Compiladores, depuradores, librerías, Sistemas Operativos, Aplicaciones) y una gran dinámica en la industria que proporciona servicios de manufactura (suministro de componentes, fabricación, pruebas, distribución). Lo que permite ingresar a este mercado con bajas inversiones de dinero, lo que es ideal para la situación actual del país (baja inversión en I+D), y es perfecta para que recién egresados puedan crear nuevos productos y servicios utilizando sistemas embebidos. + + +Para asegurar que existan profesionales capaces de utilizar los nuevos conocimientos es necesario crear cursos de actualización a diferentes niveles: Cursos de capacitación, Diplomados, Líneas de profundización en pregrado y posgrado; Modificar el contenido de las asignaturas de las materias relacionadas con la electrónica digital para actualizar sus contenidos y las metodologías de diseño adecuadas, tambien es necesario un cambio en el enfoque, debemos pasar de un perfil analítico a un perfil de diseñador-investigador, en el que todo diseño debe culminar en un producto funcional, y no quedarse solo en las simulaciones. Adicionalmente, es necesario contar con una buena documentación que facilite el proceso de adopción de estos nuevos conocimientos. + +Las actividades anteriores pueden garantizar que a corto plazo el pais forme profesionales capaces de realizar diseño de sistemas digitales utilizando metodologías de diseño adecuadas y herramientas de diseño moderno, pero para que estos cambios sean adoptados por las industrias debe crearse un vínculo con las Universidades para que estas últimas proporcionen profesionales con las competencias requeridas en el medio. También es necesario que existan políticas gubernamentales que estimulen el consumo de los productos locales y protejan las industrias que realicen actividades encaminadas al desarrollo tecnológico del pais. Adicionalmente es necesario capacitar a las empresas en el uso de nuevas tecnologías y en el proceso de producción masivo, si se desea competir con los productos provenientes del exterior es prioritario que nuestras industrias conozcan estos procesos y donde pueden realizarse. + +Como parte del trabajo de esta investigación se tomó una empresa recién formada, con poco capital de inversión, dedicada al diseño de sistemas digitales y se trabajó con ella en la realización de productos con tecnología de punta, + +Por otro lado, aprovechando que la realización de este trabajo coincidió con la re-estructuración de todos los programas académicos de la Universidad Nacional de Colombia, se pudo realizar un cambio total en el contenido de las asignaturas pertenecientes al área de la electrónica digital, estos cambios están encaminados a suplir las necesidades de la industria local y los habilidades necesarias para que nuestros profesionales pasen de ser empleados que comercializan productos foráneos a creadores de empresas que desarrollan sus propios productos. + +Por último y no menos importante, todo este proceso se realizó utilizando herramientas de libre distribución y utilizando una filosofía adoptada de los movimientos de Software Libre \footnote{http://www.fsf.org/} y hardware abierto\footnote{http://en.wikipedia.org/wiki/Open\_source\_hardware}, en las cuales, en palabras de sus fundadores ``el usuario tiene libertad de ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software''. En el caso del hardware se suministra información sobre los archivos de diseño: Esquemáticos, lista de materiales, archivos gerber para la fabricación de los PCBs y software de configuración utilizando herramientas libres. Si queremos que nuestro pais salga del atraso tecnológico en el que se encuentra no podemos trabajar en comunidades aisladas dentro de nuestro pais, ni aislados del entorno mundial, es necesario crear una comunidad que aporte conocimientos que sean utilizados por todos. De aquí la importancia de los conceptos de los movimientos de HW y SW libre. + +El movimiento de SW libre demostró que es posible generar una cultura en la que los aportes de la comunidadad pueden generar productos de gran calidad, y el secreto de su rápido crecimiento es justamente lo que lo diferencia de productos similares: La apertura del código fuente y la posibilidad de hacer modificaciones. Esta idea revolucionaria, permite que miles de personas alrededor del mundo utilicen el conocimiento requerido para escribir esta aplicación de forma directa, y adicionalmente, permite que este conocimiento sea transmitido ya que es posible realizar preguntas a las personas que desarrollaron el producto. Este modelo puede ser utilizado como política del entorno académico e industrial Colombiano para aprovechar de una forma más eficiente, los pocos recursos que suministra el estado para el desarrollo tecnológico. + +Aprovechando lo posición provilegiada que tiene la Universidad Nacional de Colombia como el centro de formación superior más importante de Colombia, así como el respeto y la credibilidad que tiene el entorno productivo nacional, es posible hacer cambios que tengan un impacto profundo sobre la industria electrónica a corto plazo. Para avanzar en este sentido, el presente trabajo suminstrará la base para generar los cambios en el área de electrónica digital, estas modificaciones están encaminadas a crear en nuestros profesionales las habilidades necesarias para la creación de empresas con productos que suplen las demandas de la industria local. Adicionalmente, se pone a disposición de la comunidad interesada, la información necesaria para construir, programar y modificar una plataforma de desarrollo que puede ser utilizada como base para la solución de problemas locales, siguiendo la filosofía del Software y Hardware libre, esta información se encuentra disponible para todo el mundo, y es el punto de partida para la formación de una comunidad que coopera para avanzar en el cumplimiento de un objetivo común. Sin embargo, estos pasos no son suficientes para que un producto pueda ser comercializado en cantidades relativamente grandes, por lo que es necesario mostrar los pasos que se deben seguir para esto y donde se puede realizar el montaje, en este punto se debe crear una base de datos de fabricantes y de distribuidores de componentes y se deben definir las normas nacionales e internacionales que deben cumplirse para que el producto sea distribuido. + +% \subsection{Contribuciones} +% Las contribuciones de este trabajo se resumen a continuación: +% +% \begin{itemize} +% +% \item Adopción y transferencia tecnologica: Con el fín de lograr un estado en el que el país sea soberano en cuanto a la tecnología que utiliza se estudió profundamente el diseño de Sistemas Embebidos, se implementaron plataformas de desarrollo para las arquitecturas más utilizadas en esta área, utilizando el sistema operativo GNU-Linux como herramienta de desarrollo. +% +% \item Las plataformas de desarrollo ECB\_AT91 y ECBOT, primeras computadoras en una sola placa (SBC -Single Board Computer) abiertas diseñadas en Colombia. La información necesaria para su fabricación y utilización hacen parte de este documento. Estas plataformas pueden ser utilizadas como base de aplicaciones comerciales, o como plataforma educativa para la enseñanza de Sistemas Embebidos. +% +% \item Una metodología de trabajo que permite compartir el trabajo realizado por diferentes grupos de investigación o departamentos de I+D para generar conocimiento que permita que Colombia desarrolle tecnología propia, específicamente en el área de los Sistemas Embebidos. Esta información es el recurso común con el que cuentan los miembros de esta ``red'' \footnote{En los movimientos de Hardware y Software libre estas asociaciones reciben el nombre de \textit{comunidades}} y los trabajos de la misma deben estar encaminados a aumentar dichos recursos, por lo que las actividades relizadas deben buscar el bien común y no el individual. +% +% \item Se realizó un cambio total en las asignaturas que hacen parte del área de Electrónica Digital en la universidad más importante del país, los contenidos fueron actualizados para que reflejaran el estado de la industria a nivel mundial; Adicionalmente, se cambió el enfoque para que los ingenieros adquieran capacidades que les permitan dar soluciones a problemas reales. +% +% \end{itemize} + + +% \subsection{Organización} + + diff --git a/course/.docs/book/note_tmp.tex b/course/.docs/book/note_tmp.tex new file mode 100644 index 0000000..47db9f5 --- /dev/null +++ b/course/.docs/book/note_tmp.tex @@ -0,0 +1,349 @@ +Es necesario transferir todos los componentes de la tecnología para una efectiva transferenica. + + + +En conclusión con la venta de equipos se transmite únicamente el conocimiento para operar, programar o mantener, sin embargo, +este conocimiento sobre el sistema puede ayudar a concientizarse sobre la tecnología e impulsar la formación de capital humano. +La transferencia tecnológica incluye la difusión de conocimiento científico y la preocupación por la transformación del conocimiento en +innovaciones útiles + + + +La transferencia tecnológica no ocurre cuando estudiantes formados en el exterior no pueden aplicar sus conocimientos en su país de origen, +por lo que es necesario crear políticas que definan que áreas de estudio son prioritarias para el país. Adicionalmente, existen centros privados +de capacitación que ofrecen cursos para el manejo de paquetes y lenguajes de +programación, estos centros aprovechan la falta de centros de enseñanza tecnológica y personal calificado para cobrar altas sumas de dinero, +lo cual limita el acceso + + + +no es bueno confiar a consultores externos la responsabilidad +de construir habilidades locales, ya que reduce el desarrollo de estas habilidades, especialmente, la del personal encargado de manejar proyectos + +El licenciamiento es un canal que se utiliza para transferencia de know-how sobre productos o procesos, es aplicado de forma individual o en +combinación con otros instrumentos como investigación extranjera, importación de maquinaria o de técnicos. Sin embargo, no es efectivo si no +se acompaña de habilidades administrativas y de producción. Adicionalmente, es necesario contar con una infraestructura tecnológica adecuada, +capacidades locales de fabricación de hardware y software y políticas de gobierno adecuadas. + + + +Toda política debe contar con formas de medir la transferencia exitosa. Uno de los indicadores de éxito es la transferencia de habilidades. + + +Muchos países en vía de desarrollo tienen dificultades al momento de diseñar estrategias efectivas para su transformación tecnológica y para una rápida +industrialización y desarrollo tecnológico. + +Problemas: +Identificar que tecnología es adecuada, como adoptarla y adaptarla +Como se escoge la tecnología a importar y como se definen los canales de transferencia +Como utilizar los escasos recursos de forma eficiente con el fin de promover sus capacidades tecnológicas + + +Los PVD prefieren adoptar y asimilar nuevas tecnologías en lugar de tratar de crear y generarlas, ya que se requiere un nivel menor de R\&D pero se sigue necesitando un nivel alto de habilidades técnicas. +Las políticas de transferencia tecnológica deben ser parte de las metas generales de la nación para sus planes de desarrollo económico, industrial y social. Las políticas de transferencia de tecnología deben centrarse en encontrar los métodos apropiados para utilizar la tecnología con el fin de lograr un rápido progreso económico e industrial. De esta forma los PVD reducen su dependencia de los países desarrollados. + + + + + + +La transferencia vertical establece varios pasos en la transferencia, que pueden ser aplicados en diferentes niveles: Entre centros académicos, transferencia entre la academia y la empresa para generar aplicaciones, prototipos y producción en masa. La desconcexión entre la Universidad y la empresa en Colombia y en la mayoría de los países en desarrollo hace que los objetivos que persigue la Academia no están sintonizados con las necesidades de la industria y en muchas ocasiones los productos generados en la Academia nunca llegan a las industrias locales, ya sea porque no tienen la infraestructura tecnológica para hacerlo o porque la Universidad no proporciona el soporte necesario para que ese producto pueda ser utilizado en la práctica. + + + +Las actividades realizadas durante este estudio están enmarcadas dentro del concepto: \textit{El conocimiento es un Bien Común}, toda la documentación necesaria para reproducir, entrenar, entender y modificar los productos generados se encuentran disponibles en servidores públicos \cite{WSCC} \cite{CC} y se proporciona soporte a través de listas de discusión, adicionalmente se proporciona soporte comercial para permitir la producción de estas modificaciones. + + +la investigación científica se origina y justifica cada vez más en el contexto de aplicación del conocimiento, +es decir, en la posibilidad de su utilización. Por lo que los temas de investigación no son fijados por los científicos sino por redes formadas +por empresarios, ingenieros de planta e inversionistas + + +el esfuerzo de los países de la región en ciencia y tecnología es inferior al que les correspondería realizar tomando en cuenta el valor del producto regional en Colombia el gasto es del 0.18\% lo que contrasta fuertemente con el gasto militar de 3.4\%. + + + + +Como se relacionan las habilidades CDIO con la transferencia tecnológica? + + + + + + + + + +2. Aptitudes personales y profesionales + +2.1 Planteamiento y resolución de problemas de Ing. + +2.1.1 Identificación y Formulación del problema: + Evaluar síntomas y datos. + Formular un plan de ataque. +2.1.2 Modelamiento + Aplicar modelos y simulaciones + +2.1.3 Solución y recomendación + Analizar resultados de simulaciones y de soluciones + Analizar las diferencias en los resultados. + Formular recomendaciones. + +2.2 Experimentación y Descubrimiento de Conocimiento + +2.2.1 Formulación de hipótesis + Formular hipótesis para ser probadas +2.2.2 Investigación experimental + Formular el concepto y la estrategia del experimento + Comparar datos experimentales y simulaciones + + +2.3 Pensamiento Sistemático + +2.3.1 Pensamiento Global: + Identificar y definir un sistema, su funcionamiento y sus elementos + Utilizar un enfoque multi-disciplinario para el entendimiento global del sistema. + Identificar el contexto social y técnico del sistema. + +2.3.2 Surgimiento e interacciones + + Identificar y definir un sistema, su funcionamiento y sus elementos + Utilizar un enfoque multi-disciplinario para el entendimiento global del sistema. + Identificar el contexto social y técnico del sistema. + + + Discutir las abstracciones necesarias para definir y modelar un sistema + Identificar el comportamiento y las propiedades funcionales que emergen del sistema + Identificar las interfaces entre los elementos. + +2.4 Habilidades y actitudes personales + +2.4.1 Pensamiento creativo + Demostrar conceptualización y abstracción + Ejecutar el proceso de invención. +2.4.2 Pensamiento crítico: + Analizar el planteamiento del problema. + Elegir soluciones lógicas. +2.4.3 Toma de conciencia de conocimientos propios + Identificar los intereses debilidades y fortalezas. +2.4.4 Curiosidad y aprendizaje permanente + Adquirir habilidades para auto-aprendizaje + +2.5 Habilidades y actitudes profesionales + +2.5.1 Ética profesional, integridad, responsabilidad. + Manifestar normas y principios éticos. + Dar crédito a los colaboradores. +2.5.2 Comportamiento profesional. + Identificar normas internacionales de contacto inter-personal + +3. Habilidades interpersonales, trabajo en equipo y comunicación. + +3.1 Equipo de Trabajo + +3.1.1 Formar grupos efectivos + Identificar las etapas de la formación del grupo y el ciclo de vida. + Identificar roles y responsabilidades +3.1.2 Liderazgo + Entrenamiento en procesos de administración del equipo + Representación del equipo ante otros. + +3.2 Comunicaciones + +3.2.1 Estrategia de comunicación + Analizar la situación + Elegir una estrategia de comunicación +3.2.2 Estructura de la comunicación + Construir una estructura apropiada y relación entre las ideas. +3.2.3 Comunicación Escrita + Escritura de documentos técnicos. +3.2.4 Comunicación Electrónica + Utilizar varios estilos electrónicos () +3.2.5 Presentación Oral y Comunicación Inter-Personal + Preparación de presentaciones + +3.3 Comunicación en Idioma Extranjero + +3.3.1 Inglés + Leer y entender información técnica. + Participar en listas de discusión. + + + +4. Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial + +4.1 Contexto externo y Social + +4.1.1 Rol y responsabilidad de los Ingenieros + Aceptar las metas y funciones de la profesión + Aceptar las responsabilidades ante la sociedad +4.1.2 Impacto sobre la sociedad. + Impacto sobre el entorno sistemas sociales, conocimiento y económico en la cultura moderna. +4.1.3 Cuestiones y valores actuales + Define el proceso por el que se fijan los valores en la actualidad, y su rol en estos procesos. + Determina los mecanismos para expansión y difusión de conocimiento. + +4.2 Empresa y contexto empresarial + +4.2.1 Estrategias de empresa, metas y planificación + Reconocer los procesos de investigación y tecnología + Reconocer las alianzas estratégicas y las relaciones con los proveedores. +4.3.2 Espíritu Empresarial Técnico + Reconocer nuevas tecnologías que puedan generar nuevos productos y sistemas +4.3.3 Trabajo exitoso en organizaciones + Describir los diversos roles y responsabilidades en una organización + +4.3 Concepción de Sistemas + +4.3.1 Establecer los objetivos del sistema y requerimientos + Identificar las necesidades y oportunidades del mercado + Obtener e interpretar las necesidades del consumidor + Identificar oportunidades que se derivan de las nuevas tecnologías o necesidades +4.3.2 Definir la función, concepto y arquitectura + Identificar las especificaciones funcionales del sistema + Identificar la arquitectura de alto nivel. + Definir la descomposición en elementos, su función y su interfaz. + + +4.4 Diseño + +4.4.1 Proceso de Diseño + Definir las especificaciones de cada componente derivado del sistema global + Analizar alternativas de diseño + Utilizar prototipos en el proceso de desarrollo + Sintetizar el proyecto final + Demostrar capacidad de adaptación ante cambio en las especificaciones. +4.4.2 Fases del proceso de Diseño y enfoques + Explicar las actividades en las etapas del proceso de diseño + Discutir modelos de proceso apropiados para el desarrollo de un proyecto en particular + Discutir el proceso para una plataforma sencilla y productos derivados. +4.4.3 Utilización de conocimiento científico en el diseño + Utilizar conocimiento técnico y científico + Practicar pensamiento crítico y creativo y solución de problemas +4.4.4 Diseño específico + Elección de técnicas herramientas y procesos adecuados + Práctica de modelamiento, simulación y pruebas + Discutir el refinamiento analítico del diseño +4.4.5 Diseño multi-disciplinario + Identificar las interacciones entre disciplinas + + +4.5 Implementación + +4.5.2 Proceso de fabricación Hardware + Describir la fabricación de partes. + Describir el ensamble de partes a gran escala +4.5.3 Proceso de Implementación de Software + Explicar el proceso de descomposición de componentes de alto nivel en módulos (incluyendo algoritmos y estructuras de datos) + Realizar diseño de bajo nivel + Describir el sistema de desarrollo +4.5.4 Integración Software - Hardware + Describir la integración de software en hardware electrónico (Tamaño del procesador, comunicaciones, memorias, períféricos) + Describir la función y la seguridad del HW/SW +4.5.5 Pruebas, verificación, validación y certificación + Discutir procedimientos de análisis y pruebas + Discutir la verificación de desempeño de los requerimientos del sistema. + Discutir la validación del desempeño que el usuario necesita + Explicar la certificación de normas. + + +4.6 OPERATING (2.2) [c] + 4.6.1 Designing and Optimizing Operations (2.6/3) + Interpret the goals and metrics for operational performance, cost, and value {b-S2} + Explain operations process architecture and development {a-S2} + Explain operations (and mission) analysis and modeling {CP} + 4.6.2 Training and Operations (2.2/2) + Describe training for professional operations: {CP} + Simulation + Instruction and programs + Procedures + Recognize education for consumer operation {a-S3} + Describe operations processes {a-S3} + Recognize operations process interactions {c-E1} + 4.6.3 Supporting the System Lifecycle (2.4/2) + Explain maintenance and logistics {a-S5} + Describe lifecycle performance and reliability {a-E1} + Describe lifecycle value and costs {a-E1} + Explain feedback to facilitate system improvement {CP} + 4.6.4 System Improvement and Evolution (2.4/2) + Define pre-planned product improvement {a-S5} + Recognize improvements based on needs observed in operation {c-S5} + Recognize evolutionary system upgrades {c-S5} + Recognize contingency improvements/solutions resulting from operational necessity {c-S4} + 4.6.5 Disposal and Life-End Issues (1.5/2) + Define the end of life issues {b-E1} + List disposal options {c-S5} + Define residual value at life-end {b-E1} + List environmental considerations for disposal {c-E2} + 4.6.6 Operations Management (2.3/2) + Describe the organization and structure for operations {a-S2} + Recognize partnerships and alliances {c-S2} + Recognize control of operations cost, performance and scheduling {c-S3} + Describe quality and safety assurance {b-S4} + Define life cycle management {a-S3} + Recognize possible operations process improvements {a-S2} + + + + + + + + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item Realizar aplicaciones que requieran diseño multi-disciplinario. + \item Estudiar y realizar el proceso de Fabricación Hardware. + \item Estudiar el principio básico de los sistemas operativos. + \item Describir la integración de software en hardware electrónico + \item Entender diagramas de circuitos electrónicos de sistemas digitales, identifcar sus componentes y su función. + \item Estudiar diseños software y hardware existentes para entender su funcionamiento, arquitectura y adquirir experiencia en el diseño. + \item Hacer parte de listas de discusión de temas técnicos que usen el inglés como lenguaje. +\end{itemize} + + + + +\subsection{Recomendaciones para los generadores de políticas} +\begin{itemize} + + \item{Fomentar la Generación de Empresas Locales de Base Tecnológica} + \item{Promover la Importancia de la Transferencia Tecnológica como Motor de Desarrollo Económico} + \item{Promover el Mejoramiento de la Plataforma Tecnológica} + +\end{itemize} + +\subsection{Recomendaciones para la academia} + +\begin{itemize} + \item{Alianza con la industria} + \item{Actualización Curricular} + \item{Promover y Soportar la Transferencia Tecnológica} + \item{Búsqueda de financiación para I+D} + +\end{itemize} + + +\subsection{Recomendaciones para el Gobierno} +\begin{itemize} + \item{Promover la Relación Universidad-Empresa} + \item{Promover la Excelencia Académica y la Investigación} + \item{Formular políticas Para Incentivar Actividades de Transferencia Tecnológica} +\end{itemize} + + + +I believe in free knowledge, that means everybody should have the CHANCE to grow +but but no means do I think that will mean everybody will actually use that chance + + +n hardware in particular, it's all about capital invested, effective managment, standardization, drive prices down +so I think that needs to go along with free knowledge, but I don't think free knowledge means that we will all bake our phones in our ovens + + + + +El auto-gobierno esta basado en al confianza que existe entre sus miembros y el conocimiento que todos tienen del funcionamiento del sistema. + + +El beneficio asociado al acceso a la información depende de la calidad de esta, a mayor calidad de información, mayor el beneficio. \ No newline at end of file diff --git a/course/.docs/book/note_tmp.tex.backup b/course/.docs/book/note_tmp.tex.backup new file mode 100644 index 0000000..c1c1b63 --- /dev/null +++ b/course/.docs/book/note_tmp.tex.backup @@ -0,0 +1,351 @@ +Es necesario transferir todos los componentes de la tecnología para una efectiva transferenica. + + + +En conclusión con la venta de equipos se transmite únicamente el conocimiento para operar, programar o mantener, sin embargo, +este conocimiento sobre el sistema puede ayudar a concientizarse sobre la tecnología e impulsar la formación de capital humano. +La transferencia tecnológica incluye la difusión de conocimiento científico y la preocupación por la transformación del conocimiento en +innovaciones útiles + + + +La transferencia tecnológica no ocurre cuando estudiantes formados en el exterior no pueden aplicar sus conocimientos en su país de origen, +por lo que es necesario crear políticas que definan que áreas de estudio son prioritarias para el país. Adicionalmente, existen centros privados +de capacitación que ofrecen cursos para el manejo de paquetes y lenguajes de +programación, estos centros aprovechan la falta de centros de enseñanza tecnológica y personal calificado para cobrar altas sumas de dinero, +lo cual limita el acceso + + + +no es bueno confiar a consultores externos la responsabilidad +de construir habilidades locales, ya que reduce el desarrollo de estas habilidades, especialmente, la del personal encargado de manejar proyectos + +El licenciamiento es un canal que se utiliza para transferencia de know-how sobre productos o procesos, es aplicado de forma individual o en +combinación con otros instrumentos como investigación extranjera, importación de maquinaria o de técnicos. Sin embargo, no es efectivo si no +se acompaña de habilidades administrativas y de producción. Adicionalmente, es necesario contar con una infraestructura tecnológica adecuada, +capacidades locales de fabricación de hardware y software y políticas de gobierno adecuadas. + + + +Toda política debe contar con formas de medir la transferencia exitosa. Uno de los indicadores de éxito es la transferencia de habilidades. + + +Muchos países en vía de desarrollo tienen dificultades al momento de diseñar estrategias efectivas para su transformación tecnológica y para una rápida +industrialización y desarrollo tecnológico. + +Problemas: +Identificar que tecnología es adecuada, como adoptarla y adaptarla +Como se escoge la tecnología a importar y como se definen los canales de transferencia +Como utilizar los escasos recursos de forma eficiente con el fin de promover sus capacidades tecnológicas + + +Los PVD prefieren adoptar y asimilar nuevas tecnologías en lugar de tratar de crear y generarlas, ya que se requiere un nivel menor de R\&D pero se sigue necesitando un nivel alto de habilidades técnicas. +Las políticas de transferencia tecnológica deben ser parte de las metas generales de la nación para sus planes de desarrollo económico, industrial y social. Las políticas de transferencia de tecnología deben centrarse en encontrar los métodos apropiados para utilizar la tecnología con el fin de lograr un rápido progreso económico e industrial. De esta forma los PVD reducen su dependencia de los países desarrollados. + + + + + + +La transferencia vertical establece varios pasos en la transferencia, que pueden ser aplicados en diferentes niveles: Entre centros académicos, transferencia entre la academia y la empresa para generar aplicaciones, prototipos y producción en masa. La desconcexión entre la Universidad y la empresa en Colombia y en la mayoría de los países en desarrollo hace que los objetivos que persigue la Academia no están sintonizados con las necesidades de la industria y en muchas ocasiones los productos generados en la Academia nunca llegan a las industrias locales, ya sea porque no tienen la infraestructura tecnológica para hacerlo o porque la Universidad no proporciona el soporte necesario para que ese producto pueda ser utilizado en la práctica. + + + +Las actividades realizadas durante este estudio están enmarcadas dentro del concepto: \textit{El conocimiento es un Bien Común}, toda la documentación necesaria para reproducir, entrenar, entender y modificar los productos generados se encuentran disponibles en servidores públicos \cite{WSCC} \cite{CC} y se proporciona soporte a través de listas de discusión, adicionalmente se proporciona soporte comercial para permitir la producción de estas modificaciones. + + +la investigación científica se origina y justifica cada vez más en el contexto de aplicación del conocimiento, +es decir, en la posibilidad de su utilización. Por lo que los temas de investigación no son fijados por los científicos sino por redes formadas +por empresarios, ingenieros de planta e inversionistas + + +el esfuerzo de los países de la región en ciencia y tecnología es inferior al que les correspondería realizar tomando en cuenta el valor del producto regional en Colombia el gasto es del 0.18\% lo que contrasta fuertemente con el gasto militar de 3.4\%. + + + + +Como se relacionan las habilidades CDIO con la transferencia tecnológica? + + + + + + + + + +2. Aptitudes personales y profesionales + +2.1 Planteamiento y resolución de problemas de Ing. + +2.1.1 Identificación y Formulación del problema: + Evaluar síntomas y datos. + Formular un plan de ataque. +2.1.2 Modelamiento + Aplicar modelos y simulaciones + +2.1.3 Solución y recomendación + Analizar resultados de simulaciones y de soluciones + Analizar las diferencias en los resultados. + Formular recomendaciones. + +2.2 Experimentación y Descubrimiento de Conocimiento + +2.2.1 Formulación de hipótesis + Formular hipótesis para ser probadas +2.2.2 Investigación experimental + Formular el concepto y la estrategia del experimento + Comparar datos experimentales y simulaciones + + +2.3 Pensamiento Sistemático + +2.3.1 Pensamiento Global: + Identificar y definir un sistema, su funcionamiento y sus elementos + Utilizar un enfoque multi-disciplinario para el entendimiento global del sistema. + Identificar el contexto social y técnico del sistema. + +2.3.2 Surgimiento e interacciones + + Identificar y definir un sistema, su funcionamiento y sus elementos + Utilizar un enfoque multi-disciplinario para el entendimiento global del sistema. + Identificar el contexto social y técnico del sistema. + + + Discutir las abstracciones necesarias para definir y modelar un sistema + Identificar el comportamiento y las propiedades funcionales que emergen del sistema + Identificar las interfaces entre los elementos. + +2.4 Habilidades y actitudes personales + +2.4.1 Pensamiento creativo + Demostrar conceptualización y abstracción + Ejecutar el proceso de invención. +2.4.2 Pensamiento crítico: + Analizar el planteamiento del problema. + Elegir soluciones lógicas. +2.4.3 Toma de conciencia de conocimientos propios + Identificar los intereses debilidades y fortalezas. +2.4.4 Curiosidad y aprendizaje permanente + Adquirir habilidades para auto-aprendizaje + +2.5 Habilidades y actitudes profesionales + +2.5.1 Ética profesional, integridad, responsabilidad. + Manifestar normas y principios éticos. + Dar crédito a los colaboradores. +2.5.2 Comportamiento profesional. + Identificar normas internacionales de contacto inter-personal + +3. Habilidades interpersonales, trabajo en equipo y comunicación. + +3.1 Equipo de Trabajo + +3.1.1 Formar grupos efectivos + Identificar las etapas de la formación del grupo y el ciclo de vida. + Identificar roles y responsabilidades +3.1.2 Liderazgo + Entrenamiento en procesos de administración del equipo + Representación del equipo ante otros. + +3.2 Comunicaciones + +3.2.1 Estrategia de comunicación + Analizar la situación + Elegir una estrategia de comunicación +3.2.2 Estructura de la comunicación + Construir una estructura apropiada y relación entre las ideas. +3.2.3 Comunicación Escrita + Escritura de documentos técnicos. +3.2.4 Comunicación Electrónica + Utilizar varios estilos electrónicos () +3.2.5 Presentación Oral y Comunicación Inter-Personal + Preparación de presentaciones + +3.3 Comunicación en Idioma Extranjero + +3.3.1 Inglés + Leer y entender información técnica. + Participar en listas de discusión. + + + +4. Concebir, Diseñar, Implementar y Operar Sistemas en el Contexto Social y Empresarial + +4.1 Contexto externo y Social + +4.1.1 Rol y responsabilidad de los Ingenieros + Aceptar las metas y funciones de la profesión + Aceptar las responsabilidades ante la sociedad +4.1.2 Impacto sobre la sociedad. + Impacto sobre el entorno sistemas sociales, conocimiento y económico en la cultura moderna. +4.1.3 Cuestiones y valores actuales + Define el proceso por el que se fijan los valores en la actualidad, y su rol en estos procesos. + Determina los mecanismos para expansión y difusión de conocimiento. + +4.2 Empresa y contexto empresarial + +4.2.1 Estrategias de empresa, metas y planificación + Reconocer los procesos de investigación y tecnología + Reconocer las alianzas estratégicas y las relaciones con los proveedores. +4.3.2 Espíritu Empresarial Técnico + Reconocer nuevas tecnologías que puedan generar nuevos productos y sistemas +4.3.3 Trabajo exitoso en organizaciones + Describir los diversos roles y responsabilidades en una organización + +4.3 Concepción de Sistemas + +4.3.1 Establecer los objetivos del sistema y requerimientos + Identificar las necesidades y oportunidades del mercado + Obtener e interpretar las necesidades del consumidor + Identificar oportunidades que se derivan de las nuevas tecnologías o necesidades +4.3.2 Definir la función, concepto y arquitectura + Identificar las especificaciones funcionales del sistema + Identificar la arquitectura de alto nivel. + Definir la descomposición en elementos, su función y su interfaz. + + +4.4 Diseño + +4.4.1 Proceso de Diseño + Definir las especificaciones de cada componente derivado del sistema global + Analizar alternativas de diseño + Utilizar prototipos en el proceso de desarrollo + Sintetizar el proyecto final + Demostrar capacidad de adaptación ante cambio en las especificaciones. +4.4.2 Fases del proceso de Diseño y enfoques + Explicar las actividades en las etapas del proceso de diseño + Discutir modelos de proceso apropiados para el desarrollo de un proyecto en particular + Discutir el proceso para una plataforma sencilla y productos derivados. +4.4.3 Utilización de conocimiento científico en el diseño + Utilizar conocimiento técnico y científico + Practicar pensamiento crítico y creativo y solución de problemas +4.4.4 Diseño específico + Elección de técnicas herramientas y procesos adecuados + Práctica de modelamiento, simulación y pruebas + Discutir el refinamiento analítico del diseño +4.4.5 Diseño multi-disciplinario + Identificar las interacciones entre disciplinas + + +4.5 Implementación + +4.5.2 Proceso de fabricación Hardware + Describir la fabricación de partes. + Describir el ensamble de partes a gran escala +4.5.3 Proceso de Implementación de Software + Explicar el proceso de descomposición de componentes de alto nivel en módulos (incluyendo algoritmos y estructuras de datos) + Realizar diseño de bajo nivel + Describir el sistema de desarrollo +4.5.4 Integración Software - Hardware + Describir la integración de software en hardware electrónico (Tamaño del procesador, comunicaciones, memorias, períféricos) + Describir la función y la seguridad del HW/SW +4.5.5 Pruebas, verificación, validación y certificación + Discutir procedimientos de análisis y pruebas + Discutir la verificación de desempeño de los requerimientos del sistema. + Discutir la validación del desempeño que el usuario necesita + Explicar la certificación de normas. + + +4.6 OPERATING (2.2) [c] + 4.6.1 Designing and Optimizing Operations (2.6/3) + Interpret the goals and metrics for operational performance, cost, and value {b-S2} + Explain operations process architecture and development {a-S2} + Explain operations (and mission) analysis and modeling {CP} + 4.6.2 Training and Operations (2.2/2) + Describe training for professional operations: {CP} + Simulation + Instruction and programs + Procedures + Recognize education for consumer operation {a-S3} + Describe operations processes {a-S3} + Recognize operations process interactions {c-E1} + 4.6.3 Supporting the System Lifecycle (2.4/2) + Explain maintenance and logistics {a-S5} + Describe lifecycle performance and reliability {a-E1} + Describe lifecycle value and costs {a-E1} + Explain feedback to facilitate system improvement {CP} + 4.6.4 System Improvement and Evolution (2.4/2) + Define pre-planned product improvement {a-S5} + Recognize improvements based on needs observed in operation {c-S5} + Recognize evolutionary system upgrades {c-S5} + Recognize contingency improvements/solutions resulting from operational necessity {c-S4} + 4.6.5 Disposal and Life-End Issues (1.5/2) + Define the end of life issues {b-E1} + List disposal options {c-S5} + Define residual value at life-end {b-E1} + List environmental considerations for disposal {c-E2} + 4.6.6 Operations Management (2.3/2) + Describe the organization and structure for operations {a-S2} + Recognize partnerships and alliances {c-S2} + Recognize control of operations cost, performance and scheduling {c-S3} + Describe quality and safety assurance {b-S4} + Define life cycle management {a-S3} + Recognize possible operations process improvements {a-S2} + + + + + + + + +\subsubsection{Sistemas Embebidos} +\begin{itemize} + \item Realizar aplicaciones que requieran diseño multi-disciplinario. + \item Estudiar y realizar el proceso de Fabricación Hardware. + \item Estudiar el principio básico de los sistemas operativos. + \item Describir la integración de software en hardware electrónico + \item Entender diagramas de circuitos electrónicos de sistemas digitales, identifcar sus componentes y su función. + \item Estudiar diseños software y hardware existentes para entender su funcionamiento, arquitectura y adquirir experiencia en el diseño. + \item Hacer parte de listas de discusión de temas técnicos que usen el inglés como lenguaje. +\end{itemize} + + + + +\subsection{Recomendaciones para los generadores de políticas} +\begin{itemize} + + \item{Fomentar la Generación de Empresas Locales de Base Tecnológica} + \item{Promover la Importancia de la Transferencia Tecnológica como Motor de Desarrollo Económico} + \item{Promover el Mejoramiento de la Plataforma Tecnológica} + +\end{itemize} + +\subsection{Recomendaciones para la academia} + +\begin{itemize} + \item{Alianza con la industria} + \item{Actualización Curricular} + \item{Promover y Soportar la Transferencia Tecnológica} + \item{Búsqueda de financiación para I+D} + +\end{itemize} + + +\subsection{Recomendaciones para el Gobierno} +\begin{itemize} + \item{Promover la Relación Universidad-Empresa} + \item{Promover la Excelencia Académica y la Investigación} + \item{Formular políticas Para Incentivar Actividades de Transferencia Tecnológica} +\end{itemize} + + + +I believe in free knowledge, that means everybody should have the CHANCE to grow +but but no means do I think that will mean everybody will actually use that chance + + +n hardware in particular, it's all about capital invested, effective managment, standardization, drive prices down +so I think that needs to go along with free knowledge, but I don't think free knowledge means that we will all bake our phones in our ovens + + + + +El auto-gobierno esta basado en al confianza que existe entre sus miembros y el conocimiento que todos tienen del funcionamiento del sistema. + + +El beneficio asociado al acceso a la información depende de la calidad de esta, a mayor calidad de información, mayor el beneficio. + + diff --git a/course/.docs/book/platform.tex b/course/.docs/book/platform.tex new file mode 100644 index 0000000..c5395ef --- /dev/null +++ b/course/.docs/book/platform.tex @@ -0,0 +1,2245 @@ +\chapter{PLATAFORMA DE DESARROLLO ECBOT} + + +\section{Introducción} +En esta sección se realizará una explicación detallada del proceso de adaptación de Linux a la familia de plataformas ECB\_AT91, este proceso es aplicable a otros dispositivos que trabajen con procesadores soportados por la distribución de Linux. Adicionalmente, se explicará de forma detallada el funcionamiento de este sistema operativo, el proceso de arranque y su puesta en marcha, así como las principales distribuciones, aplicaciones y librerías disponibles para el desarrollo de aplicaciones. Esta y otra información recolectada durante más de tres años permite que la industria y la academia desarrollen aplicaciones comerciales utilizando herramientas de diseño modernas. + +\subsection{Contribuciones al desarrollo tecnológico en Colombia} + +Durante la realización de esta investigación se llevaron a cabo varias actividades, cuyo objetivo principal es contribuir al desarrollo tecnológico en Colombia, como se expuso anteriormente el país presenta serias dificultades en este campo y es deber de la comunidad académica nacional atacar los problemas locales. Por esta razón unoa de las matas del presente trabajo fué la creación de una plataforma hardware que permita implementar las diferentes modelos bio-inspirados. En la mayoría de estudios similares no se contempla la creación de estas plataformas ya que en los países donde se desarrollan la investigación existe una industria electrónica competitiva y que esta al tanto de los desarrollos tecnológicos a nivel mundial. Como se mencionó anteriormente este no es el caso de nuestro pais, en la mayoría de las industrias nacionales y en las facultades relacionadas con la electrónica se trabaja con tecnologías de hace 30 años (Familias 74 TTL y 40 CMOS) y se utilizan herramientas de programación de bajo nivel como el lenguaje ensamblador. + + A continuación se mestran una lista del trabajo realizado sobre algunas de las recomendaciones dadas por los estudios acerca del desarrollo tecnológico en Colombia; vale la pena anotar que no todas están dentro del alcance de este trabajo, se eligieron en las que se podía hacer un aporte significativo. + +\begin{enumerate} + + \item Realización de proyectos de aplicación: La primera decisión que se tomó en cuanto a la naturaleza de esta investigación fué la de generar una aplicación física real que validara los modelos propuestos, este trabajo no se limitará a realizar simulaciones, sino que se construirá una plataforma que sea tecnológicamente ``moderna'' y que esté al nivel de las plataformas utilizadas en estudios similares. Para esto se diseñó la primer \textit{Computadora en una sola placa} (SBC \footnote{Single Board Computer}) que utiliza un procesador de 32 Bits y utiliza Linux como sistema operativo. Adicionalmente, se crearon plataformas de desa + + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología: En las condiciones actuales no es posible que la industria electrónica del país se modernice por sí sola, es necesario que las Universidades doten al sistema productivo con profesionales que tengan habilidades especiales, siendo la más importante la capacidad de diseñar y construir dispositivos que puedan ser explotados comercialmente. En la actualidad, nuestros estudiantes se limitan a analizar y a simular la mayoría de los procesos, lo que es necesario pero no suficiente, el nivel de las implementaciones físicas que realizan en los últimos semestres de sus carreras es muy baja y un mínimo porcentaje llegan a un diseño de circuito Impreso. En la Sección \ref{academic} mostraremos los cambios introducidos en las asignaturas de la línea de Electrónica Digital y como estos generan las habilidades mencionadas anteriormente. + + \item El contacto con las empresas no debe ser encargada únicamente a los estudiantes, la Universidad debe desarrollar las competencias que la empresa requiere: Se realizó una investigación del estado actual de las empresas involucradas en el proceso de manufactura de dispositivos relacionados con la electrónica digital, se identificaron las empresas proveedoras de servicios con el fín de determinar que procesos se pueden realizar en el país, así mismo se identificaron algunas de las necesidades del sector productivo. En la sección \ref{industry} se muestra un ejemplo de creación de empresa con soporte de la Universidad, específicamente del presente trabajo. + + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial: Es importante el dialogo continuo entre todas las Universidades del país y la divulgación de sus investigaciones, en muchas ocasiones los escasos recursos económicos son utilizados para repetir temas de investigación, o sus resultados no son dados a conocer. Adicionalmente, los programas académicos de programas curriculares equivalentes presentan diferentes enfoques y diferentes niveles de excelencia, lo que impide el conocimiento de los trabajos realizados. + + \item Innovación curricular, actualización continua de profesionales: Durante el último año se introdujeron cambios en los contenidos de las asignaturas del área de sistemas digitales, estos cambios tienen como objetivo crear una metodología de diseño unificada que pueda ser utilizada en los tres cursos, del mismo modo se realizó una actualización tecnológica en cuanto al software y al hardware utilizado en estos cursos, se eliminó el uso de tecnologías viejas y se abrió el paso a tecnologías y metodología de diseño que se utilizan en cursos similares en Universidades de paises desarrollados. + + + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología: Se crearon alianzas con diferentes profesiones con el fín de crear condiciones de trabajo cercanas a las que se puedan encontrar en la industria, es importante para la situación del país que nuestros egresados sean capáces de crear nuevos productos que puedan satisfacer las necesidades de la industria local. Por esta razón durante este trabajo se dió un especial énfasis en el proceso de fabricación de dispositivos electrónicos. + +\end{enumerate} + + +\subsubsection{Contribuciones a Nivel Tecnológico y Académico} + + +\subsubsection{Métodos de arranque} + +Como es obvio todo SoC debe ser programado para que pueda ejecutar una determinada tarea; este programa debe estar almacenado en una memoria no volátil y debe estar en el formato requerido por el procesador. Normalmente los SoCs proporcionan varios caminos (habilitando diferentes periféricos) para hacer esto. Un programa de inicialización \textit{(boot program)} contenido en una pequeña ROM del SoC se encarga de configurar, y revisar ciertos periféricos en búsqueda de un ejecutable, una vez lo encuentra, lo copia a la memoria RAM interna y lo ejecuta desde allí. No sobra mencionar que este ejecutable debe estar enlazado de tal forma que todas las secciones se encuentren en el espacio de la memoria RAM interna (0x0 después del REMAP \footnote{Los procesadores ARM pueden intercambiar el sitio de la memoria RAM interna y la memoria no volátil}). El AT91RM9200 posee una memoria interna SRAM de 16 kbytes. Después del reset esta memoria esta disponible en la posición 0x200000, después del remap esta memoria se puede acceder en la posición 0x0. Algunos fabricantes, en la etapa de producción graban en las memorias no volátiles las apliacaciones definitivas, y soldan en la placa de circuito impreso los dispoditivos programados, esto es muy conveniente cuando se trabaja con grandes cantidades ya que ahorra tiempo en el montaje de los dispositivos. + +El programa de inicialización del AT91RM9200 (se ejecuta si el pin BMS se encuentra en un valor lógico alto) busca una secuencia de 8 vectores de excepción ARM válidos en la DataFlash conectada al puerto SPI, en una EEPROM conectada a la interfaz I2C o en una memoria de 8 bits conectada a la interfaz de bus externo (EBI), estos vectores deben ser instrucciones LDR o Bbranch, menos la sexta instrucción (posición 14 a 17) que contiene información sobre el tamaño de la imágen (en bytes) a descargar y el tipo de dispositivo DataFlash. Si la secuencia es encontrada, el código es almacenado en la memoria SRAM interna y se realiza un remap (con lo que la memoria interna SRAM es accesible en la posición 0x0 ver Figura \ref{soc_boot_remap}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_remap} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_remap} +\end{figure} + +Si no se encuentra la secuencia de vectores ARM, se inicializa un programa que configura el puerto serial de depuración (DBGU) y el puerto USB Device. Quedando en espera de la descarga de una aplicación a través del protocolo DFU (Digital Firmware Upgrade) por el puerto USB o con el protocolo XMODEM en el puerto DBGU. La figura \ref{soc_boot_proc} muestra el diagrama de flujo del programa de inicialización del SoC AT91RM9200 + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_proc} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_proc} +\end{figure} + +El programa descargado a la memoria SRAM interna debe ser capaz de programar una memoria no volátil (La Flash DataFlash SPI para el ECBOT), debe proporcionar un canal de comunicación que permita descargar ejecutables más grandes, y debe inicializar el controlador de memoria SDRAM para que almacene temporalmente el ejecutable a grabar, esto es necesario ya que la memoria interna del AT91RM9200 solo es de 16kBytes. Más adelante hablaremos detalladamente de la aplicación que realiza estas funciones. + + +\subsection{Interfaz JTAG} +A mediados de los 1970s, la estructura de pruebas para tarjetas de circuito impreso (PCB, Printed Circuit Boards) se basaba en el uso de la técnica ``bed-of-nails''. Este método hacia uso de un dispositivo que contenía una serie de puntos de prueba, que permitían el acceso a dispositivos en la tarjeta a través de puntos de prueba colocados en la capa de cobre, o en otros puntos de contacto convenientes. Las pruebas se realizaban en dos fases: La prueba del circuito apagado y la prueba del circuito funcionando. Con la aparición de los dispositivos de montaje superficial se empezó a colocar dispositivos en las dos caras de la tarjeta, debido a que las dimensiones de los dispositivos de montaje superficial son muy pequeñas, se disminuyó la distancia física entre las interconexiones, dificultando el proceso de pruebas. + +A mediados de los 1980s un grupo de ingenieros de pruebas miembros de compañías electrónicas Europeas se reunieron para examinar el problema y buscar posibles soluciones. Este grupo se autodenominó JETAG (Joint European Test Action Group). El método de solución propuesto por ellos estaba basado en el concepto de un registro de corrimiento serial colocado alrededor de la frontera dispositivo, de aquí el nombre ?Boundary Scan?. Después el grupo se asoció a compañías norteamericanas y la ``E'' de ``European'' desapareció del nombre de la organización convirtiéndose en JTAG (Join Test Action Group). + +\subsubsection{Arquitectura BOUNDARY SCAN} +A cada señal de entrada o salida se le adiciona un elemento de memoria multi-propósito llamado ``Boundary Scan Cell'' (BSC). Las celdas conectadas a los pines de entrada reciben el nombre de ``Celdas de entrada'', y las que están conectadas a los pines de salida ``Celdas de salida''. En la Figura \ref{jtag_basics} se muestra esta arquitectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/jtag_basics} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_basics} +\end{figure} + +Las BSC se configuran en un registro de corrimiento de entrada y salida paralela. Una carga paralela de los registros (captura) ocasiona que los valores de las señales aplicadas a los pines del dispositivo pasen a las celdas de entrada y que opcionalmente los valores de las señales internas del dispositivo pasen a las celdas de salida. Una descarga paralela (Actualización) ocasiona que los valores presentes en las celdas de salida pasen a los pines del dispositivo, y opcionalmente los valores almacenados en las celdas de entrada pasen al interior del dispositivo. + +Los datos pueden ser corridos a través del registro de corrimiento, de forma serial, empezando por un pin dedicado TDI (Test Data In) y terminando en un pin de salida dedicado llamado TDO (Test Data Out). La señal de reloj se proporciona por un pin externo TCLK (Test Clock) y el modo de operación se controla por la señal TMS (Test Mode Select). Los elementos del Boundary Scan no afectan el funcionamiento del dispositivo. Y son independientes del núcleo lógico del mismo. + +\subsubsection{Instrucciones JTAG} +El Standard IEEE 1149.1 describe tres instrucciones obligatorias: Bypass, Sample/Preload, y Extest \cite{TI96}. + +\begin{itemize} + \item \textbf{BYPASS} Esta instrucción permite que el chip permanezca en un modo funcional, hace que el registro de Bypass se coloque entre TDI y TDO; permitiendo la transferencia serial de datos a través del circuito integrado desde TDI hacia TDO sin afectar la operación. La codificación en binario para esta instrucción debe ser con todos los bits en uno. + + \item \textbf{SAMPLE/PRELOAD} Esta instrucción selecciona el registro Boundary-Scan para colocarse entre los terminales TDI y TDO. Durante esta instrucción, el registro Boundary-Scan puede ser accesado a través de la operación Data Scan, para tomar una muestra de los datos de entrada y salida del chip. Esta instrucción también se utiliza para precargar los datos de prueba en el registro Boundary-Scan antes de ejecutar la instrucción EXTEST. La codificación de esta instrucción la define el fabricante. + + \item \textbf{EXTEST} Esta instrucción coloca al circuito integrado en modo de test externo (pruebas de la interconexión) y conecta el regsitro Boundary-Scan entre TDI y TDO. Las señales que salen del circuito son cargadas en el registro boundary-scan en el flanco de bajada de TCK en el estado Capture-DR; las señales de entrada al dispositivo son cargadas al registro boundary-scan durante el flanco de bajada de TCK en el estado Update-DR (ver Figura \ref{jtag_sm}) . La codificación para esta instrucción está definida con todos los bits en cero. + + \item \textbf{INTEST} La instrucción opcional INTEST también selecciona el registro boundary-scan, pero es utilizado para capturar las señales que salen del núcleo lógico del dispositivo, y para aplicar valores connocidos a las señales de entrada del núcleo. La codificación para esta señal es asignada por el diseñador. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/jtag_sm} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_sm} +\end{figure} + + + +\subsubsection{Depuración del core ARM \cite{DR05}} + +Todos los nucleos ARM7 y ARM9 poseen soporte de depuración en modo halt, lo que permite detener por competo el núcleo. Durante este estado es posible modificar y capturar las señales del núcleo, permitiendo cambiar y examinar el core y el estado del sistema. En este estado la fuente de reloj del core es el reloj de depuración (DCLK) que es generado por la lógica de depuración. Los núcleos ARM7 y ARM9 implementan un controlador compatible con JTAG, con dos cadena boundary-scan alrededor de las señales del core, una con las señales del core, para pruebas del dispositivo y la otra es un sub-set de la primera con señales importantes para la depuración. La Figura \ref{arm_scan1} muestra el orden de las señales en las cadenas para los núcleos ARM7TDMI y ARM9TDMI. Para popósitos de depuración es suficiente la cadena 1. Esta cadena puede ser utilizada en modo INTEST, permitiendo capturar las señales del core y aplicar vectores al mismo, o en modo EXTEST, permitiendo la salida y entrada de información hacia y desde exterior del core respectivamente. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan1} \end{center} + \caption{Cadena Boundary Scan 1} \label{arm_scan1} +\end{figure} +Las señales D[0:31] del ARM7TDMI están conectadas al bus de datos del núcleo y se utiliza para capturar instrucciones o lectura/escritura de información; la señal BREAKPT se utiliza para indicar que la instrucción debe ejecutarse a la velocidad del sistema, esto es, utilizando el reloj MCLK en lugar de DCLK. + +Las señales ID[0:31] del ARM9TDMI están conectadas al bus de instrucciones y se utilizan para capturar instrucciones, las señales DD[31:0] están conectadas al bus de dtaos bi-direccional y se utilizan para leer o escribir información. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan2} \end{center} + \caption{Cadena Boundary Scan 2 (Embedded ICE)} \label{arm_scan2} +\end{figure} + +Los ARM7 y ARM9 poseen un módulo ICE (In Circuit Emulator) que reemplaza el microcontrolador con una variación que posee facilidades para la depuración hardware. El emulador es conectado a un computador que ejecuta el software de depuración. Esto permite realizar depuración activa y pasiva, dando un punto de vista no intrusivo del flujo del programa. La Figura \ref{arm_scan2} muestra la cadena scan ICE, que es la misma para los núcleos ARM7 y ARM9, esta formada por 32 bits de datos, 5 bits de direcciones y un flag para diferenciar entre lectura (nRW bajo) y escritura. Se puede acceder a las características ICE a través de registros, cuya dirección es colocada en el bus de direcciones. + +El proyecto OPENOCD (Open On-Chip Debugger \footnote{http://openocd.berlios.de/web/}) permite la programación de la memoria flash interna de algunos procesadores ARM7TDMI, y la depuración de procesadores ARM7 y ARM9 utilizndo el módulo ICE. Este proyecto se ha convertido en el más popular dentro del grupo de desarrolladores de sistemas Embebidos. En \cite{DR05} se puede encontrar el funcionamiento interno de esta herramienta. + +\subsubsection{Programación de memorias Flash} +Algunos SoC no poseen programas de inicialización que permitan la descarga de aplicaciones ya sea a las memorias externas o a la interna, una solución podría ser utilizar el protocolo JTAG para cargar las aplicaciones en la RAM interna, sin embargo, existen procesadore en los que no se conocen las espcificaciones del ICE y en en otros este módulo no existe. En estos casos se utiliza la interfaz JTAG en modo EXTEST para controlar directamente las memorias conectadas a los SoCs. El proyecto UrJTAG, \footnote{http://urjtag.sourceforge.net/} permite la programación de diversas memorias flash, utilizando los pines del dispositivo. UrJTAG permite la creación de diferentes interfaces para conectarse con las memorias, estas interfaces reciben el nombre de buses y pueden ser creadas e incluidas en el código original de forma fácil. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION LINUX +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{El sistema Operativo Linux} +\textit{Hello everybody out there using minix - +I'm doing a (free) operating system (just a hobby, won't be big and +professional like gnu) for 386(486) AT clones. +} + +Con este mail enviado al foro de discusión comp.os.minix, Linus Torvalds, un estudiante de la Universidad de Helsinki en Finlandia introduce Linux el 25 de Agosto de 1991. A principios de los 90, el sistema operativo Unix (desarrollado en \textit{The Bell Labs} a principios de los 60s), tenía una solida posición en el mercado de servidores, y estaba muy bien posicionado en las Universidades, por lo tanto, un gran número de estudiantes trabajaban a diario con él y muchos de ellos deseaban poder utilizarlo en sus computadores personales, sin embargo, Unix era un producto comercial muy costoso. La +figura \ref{linuxhistory} muestra el desarrollo previo a la creación de la primera versión de linux hasta el día de hoy. Una de las características más importantes de Linux es que desde su creación, fue pensado como un sistema operativo gratuito y de libre distribución. Esta característica ha permitido que programadores a lo largo del mundo puedan manipular el código fuente para eliminar errores y para aumentar sus capacidades. + +Sin embargo, el crédito de las que conocemos hoy (Debian, Ubuntu, Suse, etc) no solo se debe a Torvalds, ya que linux es solo el kernel del sistema operativo. En 1983, Richard Stallman funda en proyecto GNU, el cual proporciona una parte esencial de los sistemas linux. A principios de los 90s, GNU había producido una serie de herramientas como librerías, compiladores, editores de texto, Shells, etc. Estas herramientas fueron utilizadas por Torvalds para escribir el elemento que le hacía falta al proyecto GNU para completar su sistema operativo: el kernel. + +Desde el lanzamiento de la primera versión de linux, cientos, miles, cientos de miles y millones de programadores se han puesto en la tarea de convertir a linux en un sistema operativo robusto, amigable y actualizado; tan pronto como se desarrolla una nueva pieza de hardware existen cientos de programadores trabajando en crear el soporte para linux. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/linuxhistory} \end{center} + \caption{Linux: Historia Fuente.}\label{linuxhistory} +\end{figure} + +\subsubsection{Porqué Linux} +Existen varias motivaciones para escoger Linux frente a un sistema oeprativo tradicional para sistemas embebidos \cite{KYJM+08}: + +\begin{itemize} + \item \textbf{Calidad Y confiabilidad del código}: Aunque estas medidas son subjetivas, miden el nivel de confianza en el código, que compromete software como el kernel y las aplicacione proporcionadas por las distribuciones. + \item \textbf{Disponibilidad de Código:} Todo el código fuente de las aplicaciones, del sistema operativo y de las herramientas de compilación se encuentran disponibles sin ninguna restricción. Existen varios tipos de licencias: la GNU General Public License (GPL). BSD (Berkeley Software Distribution), la cual permite la distribución de binarios sin el código fuente. + \item \textbf{Soporte de Hardware:} Linux soporta una gran variedad de dispositivos y plataformas, a pesar de que muchos fabricantes no proporcionan soporte para Linux, la comunidad trabaja arduamente en incluir el nuevo hardware en las nuevas distribuciones de Linux. Linux en la actualidad se puede ejecutar en docenas de diferentes arquitecturas hardware, lo cual lo convierte en el Sistema Operativo más portable. + \item \textbf{Protocolos de Comunicación y estándares de Software:} Linux proporciona muchos protocolos de comunicación, lo que permite su fácil integración a marcos de trabajo ya existentes. + \item \textbf{Disponibilidad de Herramientas:} La variedad de herramientas disponibles para Linux lo hacen muy versátil. Existen grandes comunidades como SourceForge\footnote{http://www.sourceforge.net} o Freshmeat \footnote{http://www.freshmeat.net} que permiten a miles de desrroladores compartir sus trabajos y es posible que en ellas se encuentre una aplicación que cumpla con sus necesidades. + \item \textbf{Soporte de la Comunidad:} Esta es la principal fortaleza de Linux. Millones de usuarios alrededor del mundo pueden encontrar errores en alguna aplicación y desarrolladores miembros de la cumonidad (en algunos casos los creadores de las aplicaciones) arreglarán este problema y difundirán su solución. El mejor sitio para hacer esto son las listas de correo de soporte y desarroll. + \item \textbf{Licencia:} Al crear una aplicación bajo alguna de las licencias usuales en Linux, no implica perder la porpiedad intelectual ni los derechos de autor la misma. + \item \textbf{Independencia del vendedor:} No existe solo un distribuidor del sistema operativo GNU-Linux, ya que las licencias de Linux garantizan igualdad a los distribuidores. Algunos vendedores poporcionan aplicaciones adicionales que no son libres y pro lo tanto no se encuentran disponibles con otros vendedores. Esto debe tenerse en cuenta en el momento de elegir la distribución a utilizar. + \item \textbf{Costo:} Muchas de las herramientas de deasrrollo y componentes de Linux son gratuitos, y no requieren el pago por ser incluidos en productos comerciales. +\end{itemize} + + +\subsection{Arquitectura de Linux \cite{IBSS98} \cite{IB98}} + +Linux (Linus' Minix) es un clon del sistema operativo Unix para PC con procesador Intel 386. Linux toma dos características muy importantes de Unix: es un sistema multitarea y multiusuario, lo cual fue implementado posteriormente por los sistemas operativos Windows y MacOS. Con estas características es posible ejecutar tareas de forma independiente, y transparente para el/los usuarios. + +Linux está compuesto por cinco sub-módulos \cite{IB98}: El programador (Scheduler), el manejador de memoria, el sistema de archivos virtual, la interfaz de red y la comunicación entre procesos (IPC). Tal como se ilustra en la figura \ref{linux_kernel}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.55]{./images/kernel} \end{center} + \caption{Estructura del kernel de linux }\label{linux_kernel} +\end{figure} + +Como puede observarse en la figura \ref{linux_kernel} el kernel de linux posee sub-módulos que son independientes de la arquitectura y otros que deben ser escritos para el procesador utilizado, esto hace que Linux sea un sistema operativo portable. En la actualidad existe una gran variedad de arquitecturas soportadas por linux, entre las que se encuentran: + +alpha arm26 frv i386 m32r m68knommu parisc ppc64 sh sparc um x86\_64 +arm cris h8300 ia64 m68k mips ppc s390 sh64 sparc64 v850 + +Las funciones de estos componentes se describen a continuación \cite{IBSS98}: + +\subsubsection*{Programador de procesos (Scheduler)} + +Es el corazón del sistema operativo linux. Esta encargado de realizar las siguientes tareas: +\begin{itemize} +\item Permitir a los procesos hacer copias de si mismos. +\item Determinar que procesos pueden acceder a la CPU y efectuar la transferencia entre los procesos en ejecución. +\item Recibir interrupciones y llevarlas al subsistema del kernel adecuado. +\item Enviar señales a los procesos de usuario. +\item Manejar el timer físico. +\item Liberar los recursos de los procesos, cuando estos finalizan su ejecución. +\end{itemize} + +El programador de procesos proporciona dos interfaces: Una limitada para los procesos de usuario y una interfaz amplia para el resto del kernel. El scheduler de Linux utiliza una interrupción del timer que se presenta cada 10 ms, por lo tanto, el cambio de estado del programador se realiza cada 10 ms. Esto debe ser tenido en cuenta a la hora de realizar procesos que manejen dispositivos hardware veloces. Un proceso puede estar en uno de los siguientes estados: + +\begin{itemize} +\item En ejecución. +\item Retornando de un llamado de sistema. +\item Procesando una rutina de interrupción. +\item Procesando un llamado del sistema. +\item Listo. +\item En espera. +\end{itemize} + + +\subsubsection*{Manejador de Memoria} + + +En el momento en que se energiza la CPU, esta solo ve 1-MB de memoria física (Incluyendo las ROMs). El código de inicialización del Sistema Operativo debe activar el modo protegido del procesador, de tal forma que la memoria Extendida (incluyendo la memoria de los dispositivos) sea accesible. Finalmente el OS habilita la memoria virtual para permitir la ilusión de un espacio de memoria de 4 GB. El manejador de memoria proporciona los siguientes servicios (ver figuras \ref{kernel_mapping} y \ref{app_mapping}): +\begin{itemize} +\item \textbf{Gran espacio de memoria}. Los procesos usuario, pueden referenciar más memoria que la existente físicamente. +\item \textbf{Protección} La memoria de un proceso es privada y no puede ser leída o modificada por + otro proceso. Adicionalmente evita que los procesos sobreescriban datos de solo + lectura. +\item \textbf{Mapeo de memoria} Los usuarios pueden mapear un archivo en un área de memoria virtual + y accesar el archivo como una memoria. +\item \textbf{Acceso transparente a la memoria física} esto asegura un buen desempeño del sistema. +\item \textbf{Memoria compartida} +\end{itemize} + +Al igual que el programador el manejador de memoria proporciona dos diferentes niveles de acceso a memoria el nivel de usuario y el de kernel. + +\begin{itemize} +\item Nivel de Usuario + \begin{itemize} + \item \textit{malloc() / free()}. Asigna o libera memoria para que sea utilizada por un proceso. + \item \textit{mmap() / munmap() / msync() /mremap()} Mapea archivos en regiones de memoria virtual. + \item \textit{mprotect} Cambia la protección sobre una región de una memoria virtual. + \item \textit{mlock() / mlockall() / munlock() / munlockall()} Rutinas que permiten al super + usuario prevenir el intercambio de memoria. + \item \textit{swapon() / swapoff()} Rutinas que le permiten al super-usuario agregar o eliminar + archivos swap en el sistema. + \end{itemize} +\item Nivel de kernel + \begin{itemize} + \item \textit{kmalloc() / kfree()} Asigna o libera memoria para que sea utilizada por estructuras de + datos del kernel. + \item \textit{verify\_area()} Verifica que una región de la memoria de usuario ha sido mapeada con + los permisos necesarios. + + \item \textit{get\_free\_page() / free\_page()} Asigna y libera páginas de memoria física. + \end{itemize} +\end{itemize} + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/kernel_memory_mapping} \end{center} + \caption{Mapeo de memoria del Kernel.}\label{kernel_mapping} +\end{figure} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/application_memory_mapping1} \end{center} + \caption{Mapeo de memoria para una aplicación}\label{app_mapping} +\end{figure} + + +\subsubsection*{Comunicación Entre Procesos (IPC)} + +El mecanismo IPC de Linux posibilita la ejecución \textit{concurrente} de procesos, permitiendo compartir recursos, la sincronización e intercambio de datos entre ellos. Linux proporciona los siguientes mecanismos: + +\begin{itemize} +\item \textbf{Señales} Mensajes asíncronos enviados a los procesos. +\item \textbf{Listas de espera} Proporciona mecanismos para colocar a dormir a los procesos mientras + esperan que una operación se complete, o un recurso se libere. +\item \textbf{Bloqueo de archivos} Permite a un proceso declarar una región de un archivo como solo + lectura para los demás procesos. +\item \textbf{Conductos (pipe)} Permite transferencias bi-direccionales entre dos procesos. +\item \textbf{System V} + \begin{itemize} + \item \textbf{Semáforos} Una implementación del modelo clásico del semáforo. + \item \textbf{Lista de Mensajes} Secuencia de bytes, con un tipo asociado, los mensajes son + escritos a una lista de mensajes y pueden obtenerse leyendo esta lista. + \item \textbf{Memoria Compartida} Mecanismo por medio del cual varios procesos tienen acceso a la + misma región de memoria física. + \end{itemize} +\item \textbf{Sockets del dominio Unix} Mecanismo de transferencia de datos orientada a la conexión. +\end{itemize} + + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + +\subsubsection*{Sistema de archivo virtual} +El sistema de archivos de linux cumple con las siguientes tareas: + +\begin{itemize} +\item \textbf{Controlar múltiples dispositivos hardware} +\item \textbf{Manejar sistemas de archivos lógicos} +\item \textbf{Soporta diferentes formatos ejecutables} Por ejemplo a.out, ELF, java) +\item \textbf{Homogeneidad} Proporciona una interfaz común a todos los dispositivos lógicos o físicos. +\item \textbf{Desempeño} +\item \textbf{Seguridad} +\item \textbf{Confiabilidad} +\end{itemize} + +\subsubsection{Drivers de Dispositivos} +La capa manejador de dispositivos es responsable de presentar una interfaz común a todos los dispositivos físicos. El kernel de Linux tiene 3 tipos de controladores de dispositivo: Caracter (acceso secuencial), bloque (acceso en múltiplos de tamaño de bloque) y red. Ejemplos de controladores secuenciales son el modem, el mouse; ejemplos de controladores tipo bloque son los dispositivos de almacenamiento masivo como discos duros, memorias SD. Los manejadores de dispositivos soportan las operaciones de archivo, y pueden ser tratados como tal. + +\subsubsection{Sistema de Archivos lógico} +Aunque es posible acceder a dispositivos físicos a través de un archivo de dispositivo, es común acceder a dispositivos tipo bloque utilizando un sistema de arcvhivos lógico, el que puede ser montado en un punto del sistema de archivos virtual. + +Para dar soporte al sistema de archivos virtual, Linux utiliza el concepto de \textit{inodes}. Linux usa un inode para representar un archivo sobre un dispositivo tipo bloque. El inode es virtual en el sentido que contiene operaciones que son implementadas diferentemente dependiendo de el sistema lógico y del sistema físico donde reside el archivo. La interfaz inode hace que todos los archivos se vean igual a otros subsistemas Linux. El inode se utiliza como una posición de almacenamiento para la información relacionada con un archivo abierto en el disco. El inode almacena los buffers asociados, la longitud total del archivo en bloques, y el mapeo entre el offset del archivo y los bloques del dispositivo. + +\subsubsection{Módulos} + +La mayor funcionalidad del sistema de archivos virtual se encuentra disponible en la forma de módulos cargados dinámicamente. Esta cconfiguración dinámica permite a los usuarios de Linux compilar un kernel tan pequeño como sea posible, mientras permite cargar el manejador del dispositivo y módulos del sistema de archivos si solo son necesarios durante una sesión. Esto es útil en el caso de los dispositivos que se pueden conectar en caliente, como por ejemplo un scanner, si tenemos el manejador del scanner cragado aún sin que este este conectado a nuestro equipo se esta desperdiciando la memoria asociada a dicho controlador. + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + + +\section{Portando Linux a la plataforma ECBOT y ECB\_AT91} +Como vimos anteriormente el kernel de Linux es el corazón del sistema operativo GNU/Linux y es el encargado de manejar directamente el Hardware asociado a una determinada plataforma, por lo tanto, es necesario que este sea capáz de manejar todos los periféricos asociados a esta y proporcione caminos para controlarlos. En esta sección se describirá el proceso que debe realizarse para hacer que Linux se ejecute de forma correcta en una plataforma y que permita controlar sus diferentes componentes hardware (este proceso recibe el nombre de \textit{Porting}). + +\subsection{El Kernel de Linux} +El código fuente se encuentra dividido entre el código específico a una arquitectura y el código común. El código específico de cada arquitectura lo encontramos en los subdirectorios \textit{arch} y \textit{include/asm-xxx}, en ellos podemos encuentrar los archivos para las arquitecturas: alpha, blackfin, h8300, m68k, parisc, s390, sparc, v850, arm, cris, ia64, m68knommu, powerpc, sh, sparc64, x86, +avr32, frv, m32r, mips, ppc, sh64, um, xtensa. A continuación se listan los directorios que hacen parte sdel código fuente de Linux. + +\begin{lstlisting} +arch fs lib net block +usr include crypto ipc scripts +Documentation mm security drivers kernel +sound +\end{lstlisting} + +Dentro de cada arquitectura soportada por Linux (\textit{arch/xxx/}) encontramos los siguientes directorios: +\begin{itemize} + \item \textbf{kernel} Código del núcleo del kernel. + \item \textbf{mm} Código para el manejo de memoria. + \item \textbf{lib} Librería de funciones internas, optimizadas para la arquitectura (backtrace, memcpy, funciones I/O, bit-twiddling etc); + \item \textbf{nwfpe} Implementaciones de punto flotante. + \item \textbf{boot} Sition donde reside la imágen del kernel una vez compilado, este directorio contiene herramientas para generar imágenes comprimidas. + \item \textbf{tools} Contiene scripts para la autogeneración de archivos, también contiene el archivo \textit{mach-types} que contiene la lista de las máquinas (plataformas) registradas. + \item \textbf{configs} Contiene el archivo de configuración para cada plataforma. +\end{itemize} + +Si deseamos dar soporte a una determinada plataforma debemos trabajar en el directorio que contiene la arquitectura del procesador a utilizar, en nuestro caso trabajaremos con la arquitectura \textit{arm}. En el código fuente de Linux se encuentran muchas plataformas que utilizan las diferentes architecturas, los archivos de configuración de estas pueden ser utilizados para crear una propia. En nuestro caso tomamos como referenica la plataforma \textit{Atmel AT91RM9200-EK} diseñada por ATMEL. Los archivos de configuración de esta plataforma se encuentra en: \textit{arch/arm/mach-at91/board-ek.c}; dentro de la arquitectura arm existen varias sub-arquitecturas que corresponden a las diferentes familias de SoC; El AT91RM9200 hace parte de la familia de SoCs AT91 de ATMEL. + +Existen dos formas en las que podemos adaptar nuestra plataforma al kernel de Linux, la primera es utilizando un archivo de configuración de una plataforma existente, y la otra es registrar la nuestra. Cada plataforma es identificada por un \textit{machine ID}, el primero paso en el proceso de \textit{port} es obter un ID, lo cuál se puede hacer en línea: \textit{http://www.arm.linux.org.uk/developer/machines/}, mientras que se asigna un nuevo número puede asignarse uno que no este utilizado en el archivo: \textit{arch/arm/tools/mach-types}. La entrada correspondiente a la familia de plataformas ECBACT91 es: + +\begin{lstlisting} +ecbat91 MACH_ECBAT91 ECBAT91 1072 +\end{lstlisting} + +Con este ID (o uno temporal) se debe crear la siguiente entrada en el archivo \textit{/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig}: + +\begin{lstlisting} +config MACH_ECBAT91 + bool "emQbit ECB_AT91 SBC" + depends on ARCH_AT91RM9200 + help + Select this if you are using emQbit's ECB_AT91 board. + +\end{lstlisting} + +La que permite seleccionar nuestra plataforma desde el programa de configuración de Linux\footnote{este programa se ejecuta con el comando: \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}}(Ver Figura \ref{ecb_at91_linux_config}) + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/ecb_at91_linux_config} \end{center} + \caption{Herramienta de configuración de Linux mostrando la plataforma ECB\_AT91}\label{ecb_at91_linux_config} +\end{figure} + +Al seleccionar nuestra plataforma el programa de configuración creará un archivo de configuración \textit{.config \footnote{los archivos que comienzan con ``.'' están ocultos}} localizado en la raíz del código fuente, este archivo refleja las selecciones realizadas para configurar la imagen del kernel; en este caso específico se agragará la línea: + +\begin{lstlisting} +CONFIG_MACH_ECBAT91=y +\end{lstlisting} + +Como veremos más adelante, la aplicación encargada de cargar la imágen del kernel de Linux le pasa a este el número de identificación de la plataforma, si este número no es el mismo que el kernel tiene registrado se generará un error, para evitar esto debemos incluir las siguientes líneas en el archivo \textit{arch/arm/boot/compressed/head-at91rm9200.S} + +\begin{lstlisting} + @ emQbit ECB_AT91 : 1072 + mov r3, #(MACH_TYPE_ECBAT91 & 0xff) + orr r3, r3, #(MACH_TYPE_ECBAT91 & 0xff00) + cmp r7, r3 + beq 99f +\end{lstlisting} + +El archivo \textit{/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile} contiene una relación entre la plataforma seleccionada y el archivo de compilación a utilizar, por lo que debemos incluir las siguientes líneas: + +\begin{lstlisting} +obj-$(CONFIG_MACH_ECBAT91) += board-ecbat91.o +\end{lstlisting} + +Con esto asignamos el archivo de configuración \textit{board-ecbat91.c} a la plataforma \textit{MACH\_ECBAT91}. + +\subsubsection{Archivo de configuración de la plataforma ECB\_AT91 } +En esta sección realizaremos una descripción del archivo de configuración de la familia de plataformas \textit{ECB\_AT91} (\textit{board-ecbat91.c}) y se hará una explicación de cada uno de los parámetros de este archivo. + +Como todo archivo escrito en C al comienzo se declaran los encabezados que contienen las funciones utilizadas, en nuestro caso: + +\begin{lstlisting}[numbers=left] +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "generic.h" +#include + +#include +\end{lstlisting} + +Cada arquitectura (CPU) posee un archivo donde se declaran los diferentes periféricos que pueden ser utilizados: \textit{arch/arm/mach-at91/at91rm9200\_devices.c} en el caso del procesador AT91RM9200; En él podemos encontrar soporte para: USB Host, USB Device, Ethernet, Compact Flash / PCMCIA, MMC / SD, NAND / SmartMedia, TWI (i2c), SPI, Timer/Counter blocks, RTC, Watchdog, SSC -- Synchronous Serial Controller, UART. Este archivo además proporciona funciones que permiten incluir y configurar los diferentes controladores asociados al SoC, adicionalmente realiza las operaciones necesarias para poder utilizarlo, como por ejemplo, definir que el control de un determinado pin este a cargo del periférico. + +El primer dispositivo declarado en el archivo de configuración es el puerto serial (UART), este puerto es vital ya que es el único medio de comunicación que tenemos con nuestra plataforma. + +\begin{lstlisting} +static struct at91_uart_config __initdata ecb_at91uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 0, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; +\end{lstlisting} + +Los parámetros de configuración de la \textit{UART} se declaran utilizando la estructura \textit{at91\_uart\_config} declarada en el archivo \textit{include/asm-arm/arch/board.h}, la variable \textit{console\_tty} define el número del dispositivo \textit{tty} asociado a la consola serial, \textit{ttyS0} en nuestro caso, la variable \textit{nr\_tty} define el número de interfaces seriales disponibles \footnote{El AT91RM9200 tiene 4 USARTS y una UART para depuración}, \textit{ttyS0} y \textit{ttyS1} en nuestro caso; \textit{tty\_map} realiza la correspondencia entre los dispositivos \textit{tty} y las UART disponibles en el SoC, para este ejemplo asocia \textit{ttyS0} a la \textit{UART4} y \textit{ttyS1} a la \textit{UART0} + +\begin{lstlisting} +static void __init ecb_at91map_io(void) +{ + /* Initialize processor: 18.432 MHz crystal */ + at91rm9200_initialize(18432000, AT91RM9200_PQFP); + + /* Setup the LEDs */ + at91_init_leds(AT91_PIN_PB20, AT91_PIN_PB20); + + /* Setup the serial ports and console */ + at91_init_serial(&ecb_at91uart_config); +} +\end{lstlisting} + +La función \textit{at91rm9200\_initialize} declarada en \textit{arch/arm/mach-at91/at91rm9200.c} se encarga, como su nombre lo indica, de inicializar el procesador AT91RM9200, específicamente se encarga de configurar, el reloj interno del procesador (con la función \textit{at91\_clock\_init}), registra los Osciladores configurables PCK0 a PCK3 (utilizando la función \textit{at91rm9200\_register\_clocks}) y finalmente habilita el soporte para los pines de entrada/salida de propósito general \textit{GPIOs} (utilizando la función \textit{at91\_gpio\_init}). Adicionalmente informa que se está utilizando el empaquetado TQFP208 (Este chip viene en dos versiones TQFP y BGA). + +Las plataforma que carecen de un dispositivo de visualización como una pantalla, reflejan la actividad de procesos importantes en el estado de diodos emisores de luz LEDs, Linux permite visualizar la actividad de la CPU y el estado de un timer interno (\textit{at91\_init\_leds( cpu\_led, timer\_led)}). Nuestra plataforma utiliza un LED conectado al pin PB20 para estas indicaciones. + +La función \textit{at91\_init\_serial(\&ecb\_at91uart\_config)}, como su nombre lo indica inicializa las interfaces seriales utilizando como configuración la estructura \textit{at91\_init\_serial} explicada anteriormente. + +\begin{lstlisting} +static void __init ecb_at91init_irq(void) +{ + at91rm9200_init_interrupts(NULL); +} +\end{lstlisting} + +La función \textit{at91rm9200\_init\_interrupts} inicializa el Controlador de Interrupciones del AT91RM9200 y permite que estas sean atendidas. + +\begin{lstlisting} +static struct at91_usbh_data __initdata ecb_at91usbh_data = { + .ports = 1, +}; +\end{lstlisting} + +La estructra \textit{at91\_usbh\_data} fija el número de puertos USB host a 1 (El encapsulado TQFP solo tiene un puerto USB host, la versión BGA tiene 2). + +\begin{lstlisting} +static struct at91_mmc_data __initdata ecb_at91mmc_data = { + .slot_b = 0, + .wire4 = 1, +}; +\end{lstlisting} + +El SoC AT91RM9200 puede manejar dos memorias SD, la variable \textit{slot\_b} determina cual se usa, el slot a en nuestro caso; la variable \textit{wire4} selecciona el número de líneas de datos entre 1 y 4 (\textit{wire4 = 1}). + +\begin{lstlisting} +#if defined(CONFIG_MTD_DATAFLASH) +static struct mtd_partition __initdata my_flash0_partitions[] = +{ + { + .name = "Darrel-loader", / 0x0 + .offset = 0, + .size = 12* 1056, // 12672 bytes + }, + { + .name = "uboot", // 0x3180 + .offset = MTDPART_OFS_NXTBLK, + .size = 118 * 1056, + }, + { + .name = "kernel", // 0x21840 + .offset = MTDPART_OFS_NXTBLK, + .size = 1534 * 1056, /* 1619904 bytes */ + }, + { + .name = "filesystem", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL, + } +}; + +static struct flash_platform_data __initdata my_flash0_platform = { + .name = "Removable flash card", + .parts = my_flash0_partitions, + .nr_parts = ARRAY_SIZE(my_flash0_partitions) +}; +#endif +\end{lstlisting} + +Muchos dispositivos flash están divididos en secciones que reciben el nombre de particiones, similares a las particiones encontradas en un disco duro. El subsistema MTD proporciona soporte para estas particiones Flash, si esta función es seleccionada con la herramienta de configuración del kernel (CONFIG\_MTD\_DATAFLASH = y). La familia de plataformas ECB\_AT91 tiene un dispositivo DataFlash serial de 16 Mbits (2Mbytes), en la que creamos 4 particiones, en las que se almacenarán el loader, el u-boot, la imagen del kernel, y el sistema de archivos (En el dispositivo flash actual no hay suficiente espacio para este último). Cada partición se define con una estructura \textit{mtd\_partition} formada por 3 variables: \textit{name}, \textit{offset} (Dirección inicial de la partición) y .\textit{size}. + +\begin{lstlisting} + +static struct spi_board_info __initdata ecb_at91spi_devices[] = { + { /* DataFlash chip */ + .modalias = "mtd_dataflash", + .chip_select = 0, + .max_speed_hz = 10 * 1000 * 1000, + .bus_num = 0, + .platform_data = &my_flash0_platform, + }, + { /* User accessable spi - cs1 (250KHz) */ + .modalias = "spi-cs1", + .chip_select = 1, + .max_speed_hz = 250 * 1000, + }, + { /* User accessable spi - cs2 (1MHz) */ + .modalias = "spi-cs2", + .chip_select = 2, + .max_speed_hz = 1 * 1000 * 1000, + }, + { /* User accessable spi - cs3 (10MHz) */ + .modalias = "spi-cs3", + .chip_select = 3, + .max_speed_hz = 10 * 1000 * 1000, + }, +}; +\end{lstlisting} + +La estructura \textit{spi\_board\_info} define los dispositivos SPI conectados al SoC, esta formada por la variable \textit{modalias}, \textit{chip\_select} y \textit{max\_speed\_hz}. Nuestro dispositivo DataFlash se controla utilizando un puerto SPI, por esto se define la variable \textit{platform\_data = \&my\_flash0\_platform} + +\begin{lstlisting} +static void __init ecb_at91board_init(void) +{ + /* Serial */ + at91_add_device_serial(); + + /* USB Host */ + at91_add_device_usbh(&ecb_at91usbh_data); + + /* I2C */ + at91_add_device_i2c(NULL, 0); + + /* MMC */ + at91_add_device_mmc(0, &ecb_at91mmc_data); + + /* SPI */ + at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices)); + + /* Programmable Clock 1*/ + at91_set_B_periph(AT91_PIN_PA4, 0); +} +\end{lstlisting} + +Una vez configurados los periféricos utilizados en la plataforma debemos agregar estos dispositos, con las funciones correspondientes \textit{at91\_add\_device\_(serial, usbh, i2c, mmc, spi) } estas funciones hacen un llamado a la función \textit{platform\_device\_register} la que adiciona el dispositivo a nivel de plataforma. + +\begin{lstlisting} +MACHINE_START(ECBAT91, "emQbit's ECB_AT91") + /* Maintainer: emQbit.com */ + .phys_io = AT91_BASE_SYS, + .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, + .boot_params = AT91_SDRAM_BASE + 0x100, + .timer = &at91rm9200_timer, + .map_io = ecb_at91map_io, + .init_irq = ecb_at91init_irq, + .init_machine = ecb_at91board_init, +MACHINE_END\end{lstlisting} + +\subsubsection{Archivo de Configuración del kernel} +Finalmente debemos incluir un archivo de configuración para el kernel (\textit{arch/arm/configs/ecbat91\_defconfig}) el cual contiene la configuración inicial que cnfigura de forma correcta todos los periféricos de la plataforma. + +\subsection{Imagen del kernel} +En esta sección se realizará una descripción de los pasos necesarios para compilar la imágen del kernel de Linux para la familia de plataforma ECB\_AT91; después, se realizará un análisis de la imagen, indicando su composición. + +\subsubsection{Compilación de la Imágen del kernel} +En la sección anetrior vimos como dar soporte a nuestra plataforma, en esta sección describiremos el proceso de creación de la imágen del kernel. El primer paso obvio es obtener la imágen del kernel, la que obtenemos del sitio oficial \textit{ftp.kernel.org} + +\begin{lstlisting} +wget http://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.4.tar.bz2 +tar xjf linux-2.6.24.4.tar.bz2 +cd linux-2.6.24.4 +\end{lstlisting} + +A continuación descargargamos un parche que mantienen los desarrolladores de la familia de SoCs de ATMEL, este parche modifica algunos archivos de la distribución oficial de Linux para dar sopote completo y actualizado a los procesadores ATMEL. + +\begin{lstlisting} +wget http://maxim.org.za/AT91RM9200/2.6/2.6.24-at91.patch.gz +zcat 2.6.24-at91.patch.gz | patch -p1 +\end{lstlisting} + +Los cambios que se deben realizar en el código fuente, mencionados anteriormente fueron enviados a los encargados de mantener estas actualizaciones, por lo que no es necesario modificarlos para dar soporte a la familia de plataformas ECB\_AT91. + +Finalmente debemos compilar el kernel utilizando la cadena de herramientas GNU, el resultado de este tipo de compilaciones son ejecutables para una arquitectura ARM, este proceso recibe el nombre de compilación cruzada, debido a que da como resultado archivos que se ejecutan en una arquitectura diferente (ARM) a la que realizó el proceso de compilación (X86 en nuestro caso). Lo primero que debemos hacer es hacer visibles los ejecutables de la cadena de herramientas, esto se hace adicionando la ruta donde se encuentran instalados a la variable de entorno \textit{PATH}. + +\begin{lstlisting} +export export PATH=$PATH:/home/at91/arm-2007q1/bin/ +alias crossmake='make ARCH=arm CROSS_COMPILE=arm-none-eabi-' +\end{lstlisting} + +El alias \textit{crossmake} hace que cada vez que se escriba esta palabra el sistema lo reemplaze por \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}, lo que ahorra tiempo al momento de pasar los parámetros a la herramienta make; estos parámetros son: + +\begin{enumerate} + \item \textit{ARCH=arm} Define la arquitectura \textit{arm}. + \item \textit{CROSS\_COMPILE=arm-none-eabi-} Indica que se realizará una compilación cruzada y que los ejecutables de la cadena de herramientas (\textit{gcc, c++, ld, objcopy, etc}) comienzan con el prefijo \textit{arm-none-eabi-} (por lo que el nombre del ejecutable del compilador de c es arm-none-eabi-gcc) +\end{enumerate} + +Una vez declaradas estas variables de entorno debemos generar el archivo oculto \textit{.config} \footnote{este archivo es utilizado por las herramientas de compilación para determinar que soporte fué incluido en el kernel} ejecutando el siguiente comando: + +\begin{lstlisting} + crossmake ecbat91_defconfig + o + make ARCH=arm CROSS_COMPILE=arm-none-eabi- ecbat91_defconfig +\end{lstlisting} + +A continuación se muestra una sección de este archivo: +\begin{lstlisting} +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.24.4 +# Sat Jul 25 11:39:07 2009 +# +CONFIG_ARM=y +..... +# +# AT91RM9200 Board Type +# +CONFIG_MACH_ECBAT91=y +..... +CONFIG_AEABI=y +..... +\end{lstlisting} + +Finalmente damos incio al proceso de compilación: + +\begin{lstlisting} + crossmake -j2 (o make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j2) +\end{lstlisting} + +Si no ocurre ningún error, al finalizar debemos observar lo siguiente: + +\begin{lstlisting} + LD vmlinux + SYSMAP System.map + SYSMAP .tmp_System.map + OBJCOPY arch/arm/boot/Image + Building modules, stage 2. + MODPOST 1 modules + Kernel: arch/arm/boot/Image is ready + AS arch/arm/boot/compressed/head.o + CC drivers/scsi/scsi_wait_scan.mod.o + GZIP arch/arm/boot/compressed/piggy.gz + LD [M] drivers/scsi/scsi_wait_scan.ko + CC arch/arm/boot/compressed/misc.o + AS arch/arm/boot/compressed/head-at91rm9200.o + AS arch/arm/boot/compressed/piggy.o + LD arch/arm/boot/compressed/vmlinux + OBJCOPY arch/arm/boot/zImage + Kernel: arch/arm/boot/zImage is ready +\end{lstlisting} + +y el contenido de los siguientes ditrectorios debe ser algo como: + +\begin{lstlisting} +$ ls arch/arm/boot/ +bootp compressed Image install.sh Makefile zImage + +$ ls vmlinux* +vmlinux vmlinux.o +\end{lstlisting} + +\subsubsection{Componentes de la Imágen del kernel} + +Como nuestro insterés en este punto es entender la estructura de la imágen del kernel podemos indicarle a nuestra herramienta de compilación que nos muestre más información del proceso, ejecutando el comando: + + +\begin{lstlisting} + crossmake -j2 V=1 +\end{lstlisting} + +Al finalizar el proceso de compilación obtenemos: + +\begin{lstlisting} +arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds + arch/arm/kernel/head.o arch/arm/kernel/init_task.o \ + init/built-in.o \ +--start-group \ + usr/built-in.o arch/arm/kernel/built-in.o \ + arch/arm/mm/built-in.o arch/arm/common/built-in.o \ + arch/arm/mach-at91/built-in.o arch/arm/nwfpe/built-in.o \ + kernel/built-in.o mm/built-in.o \ + fs/built-in.o ipc/built-in.o \ + security/built-in.o crypto/built-in.o \ + block/built-in.o arch/arm/lib/lib.a \ + lib/lib.a arch/arm/lib/built-in.o \ + lib/built-in.o drivers/built-in.o \ + sound/built-in.o net/built-in.o \ +--end-group \ +.tmp_kallsyms2.o + +\end{lstlisting} + + +En la primera línea de el listado anterior (\textit{arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds}) se realiza el proceso de enlace del archivo \textit{vmlinux}, utilizando el script de enlace \textit{vmlinux.lds}, incluyendo los objetos (archivos \textit{.o} indicados en la lista. Nótese que el primer archivo enlazado es \textit{head.o}, el cual se genera a partir de \textit{arch/arm/kernel/head.S}, y contiene rutinas de inicialización del kernel. Este proceso se explicará detalladamente más adelante. El siguiente objeto es \textit{init\_task.o}, el cual establece estructuras de datos e hilos que utilizará el kernel. A continuación se enlazan una serie de objetos con el nombre \textit{built-in.o}, la ruta del archivo indica la función que realiza el objeto, por ejemplo el objeto \textit{arch/arm/mm/built-in.o} realiza operaciones de manejo de memoria específicas a la arquitectura arm. En la Figura \ref{vmlinux_contents} se muestran los componentes de la imágen vmlinux y un tamaño de una compilación en particular que nos da una idea de la relación de tamaños. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/vmlinux_contents} \end{center} + \caption{Componentes de la Imagén del kernel de Linux vmlinux}\label{vmlinux_contents} +\end{figure} + +A continuación se realiza la descripción de los componentes de la imágen del kernel \textit{vmlinux}\cite{CH06} + + +\begin{enumerate} +\item \textbf{arch/arm/kernel/head.o} Código de inicialización del kernel dependiente de la arquitectura. +\item \textbf{init\_task.o} Hilos y estructuras inicialies utilizadas por el kernel. +\item \textbf{init/built-in.o} Código de inicialización del kernel. +\item \textbf{usr/built-in.o} Imágen interna \textit{initramfs}. +\item \textbf{arch/arm/kernel/built-in.o} Código del kernel específico de la arquitectura. +\item \textbf{arch/arm/mm/built-in.o} Código de manejo de memoria específico de la arquitectura. +\item \textbf{arch/arm/common/built-in.o} Código genérico especifico de la arquitectura. +\item \textbf{arch/arm/mach-at91/built-in.o} Código de inicialización específico de la plataforma. +\item \textbf{arch/arm/nwfpe/built-in.o} Emulación de punto flotánte específico de la arquitectura. +\item \textbf{kernel/built-in.o} Código de componentes comúnes del kernel. +\item \textbf{mm/built-in.o} Código de componentes comúnes de manejo de memoria. +\item \textbf{ipc/built-in.o} Comunicación Interproceso. +\item \textbf{security/built-in.o} Componentes de seguridad de Linux. +\item \textbf{lib/lib.a} Diferentes funciones auxiliares. +\item \textbf{arch/arm/lib/lib.a} Diferentes funciones auxiliares, específico de la aquitectura. +\item \textbf{lib/built-in.o} Funciones auxiliares comunes del kernel. +\item \textbf{drivers/built-in.o} Drivers internos o drivers no cargables. +\item \textbf{sound/built-in.o} Drivers de sonido. +\item \textbf{net/built-in.o} Red de Linux. +\item \textbf{.tmp\_kallsyms2.o} Tabla de símbolos. +\end{enumerate} + + +La imágen \textit{vmlinux} generada tiene un tamaño relativamente grande lo que la hace inconveniente para ser almacenada en un dispositivo Flash, por esta razón se acostrumbra comprimirla. A continuación describiremos el proceso que se realiza para crear una imágen compatible con \textit{u-boot}, el cargador de Linux más utilizado para las plataformas embebidas. El primer paso para es reducir el tamaño del ejecutable ELF \textit{vmlinux} es eliminar la información de depuración (notas y comentarios). + +\begin{lstlisting} +$ crossmake -j3 vmlinux (4.4MBytes) +$ arm-none-eabi-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin (3.4MBytes) +$ gzip -c -9 linux.bin > linux.bin.gz (1.6M) +\end{lstlisting} + +A continuación se comprime el archivo resultante utilizando la herramienta \textit{gzip}, como resultado obtenemos un archivo de 1.6M, la tercera parte del archivo original. + +\section{Inicialización del kernel} +Como se mencionó anteriormente, el SoC AT91RM9200, posee un programa residente en una pequeña ROM interna que revisa los controladores de memorias flash en busca de un programa válido. En la familia de plataforma ECB\_AT91 se utiliza la memoria DataFlash para almacenar: el bootloader, el loader de Linux (u-boot) y la imagen del kernel. La Figura \ref{boot_process} indica la secuencia de ejecución de aplicaciones cuando se energiza nuestra plataforma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/boot_process} \end{center} + \caption{Flujo de ejecución en la inicialización de plataforma ECB\_AT91}\label{boot_process} +\end{figure} + +La primera aplicación en ejecutarse es el loader de Darrel \footnote{Originalmente creado por Darrel Harmon: http://dlharmon.com/}. Debido a que la RAM interna del AT91RM9200 es de tan solo 16kBytes, es necesario utilizar otra aplicación para poder cargar el loader de Linux U-boot en la memoria SDRAM externa (con capacida de de 32Mbytes). Recordemos que incialmente el SoC no posee ninguna aplicación válida en la memoria DataFlash, por lo que el programa interno de inicialización dara comienzo a una comunicación Xmodem, para que se descargue una aplicación a la memoria RAM interna utilizando el puerto de depuración serial a una velocidad de 115200 baudios. + + +\subsection{Darrel's Loader} +Esta aplicación permite configurar la memoria externa SDRAM, configurar el puerto serie, implementar un protocolo xmodem que permita transferir aplicaciones a la memoria SDRAM, controlar la memoria DataFlash y almacenar aplicaciones en ella. El loader de Darrel está basado en u-boot, es una versión reducida de este y permite únicamente las operaciones mencioandas anteriormente, lo que resulta en un archivo adecuado para ser almacenado en la memoria RAM interna (9.3 kBytes). + +Es interesante analizar esta aplicación, ya que esta se ejecuta sin ningún soporte de sistema operativo, lo que lo hace interesante para plataformas en las que no se puede ejecutar Linux. Su código fuente lo podemos descargar utilizando el siguiente comando: + +\begin{lstlisting} +$svn co http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/darrell-loader/ +\end{lstlisting} + +La estructura del código fuente se muestra en el siguiente listado: +\begin{lstlisting} +|-- include +| |-- asm +| | |-- arch +| | |-- proc +| | `-- proc-armv +| `-- linux +| |-- byteorder +| `-- mtd +`-- src +\end{lstlisting} + +Antes de estudiar el código fuente demos un vistazo al archivo \textit{Makefile} para ver el proceso de compilación. De ella podemos extraer las partes más interesantes: Los objetos que hacen parte del ejecutable, el proceso de enlazado, y la creación del archivo a descargar en la plataforma: + +\begin{lstlisting} +AOBJS = src/start.o //ASSEMBLER OBJECTS +COBJS = src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +LDSCRIPT := u-boot.lds +LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) +OBJCFLAGS += --gap-fill=0xff +TEXT_BASE = 0x00000000 + +loader: $(AOBJS) $(COBJS) $(LDSCRIPT) + $(LD) $(LDFLAGS) $(AOBJS) $(COBJS) \ + --start-group $(PLATFORM_LIBS) --end-group \ + -Map loader.map -o loader + +loader.bin: loader + $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ +\end{lstlisting} + +Como podemos observar, esta aplicación esta compuesta por el código en ensamblador \textit{src/start.S} y el código en C \textit{src/board.c src/serial.c src/xmodem.c src/dataflash.c src/div0.c src/interrupts.c}. Para generar el ejecutable \textit{loader} (en formato ELF), encadenamos los objetos AOBJS y COBJS utilizando el script de enlazado \textit{u-boot.lds}. A continuación se muestra el comando ejecutado por las herramientas de compilación al crear el ejecutable \textit{loader} + +\begin{lstlisting} +arm-elf-ld -Bstatic -T u-boot.lds -Ttext 0x00000000 +src/start.o src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +--start-group +--no-warn-mismatch -L /home/at91/gnutools/arm-elf/bin/../lib/gcc-lib/arm-elf/3.2.1 -lgcc +--end-group -Map loader.map +-o loader +\end{lstlisting} + + +A continuación se muestra el contenido del archivo \textit{u-boot.lds} +\begin{lstlisting} + OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + . = ALIGN(4); + .text : + { + src/start.o (.text) + *(.text) + } + + . = ALIGN(4); + .rodata : { *(.rodata) } + + . = ALIGN(4); + .data : { *(.data) } + + . = ALIGN(4); + .got : { *(.got) } + + . = ALIGN(4); + __bss_start = .; + .bss : { *(.bss) } + _end = .; +} +\end{lstlisting} + +Este archivo indica que la primera dirección del ejecutable es la 0x0 y que la primera instrucción en ejecutarse (definida por \textit{ENTRY}) se encuentra en el símbolo \textit{\_start} definida en el archivo \textit{start.S}; por otro lado, este script de enlazado nos informa que las secciones \textit{.text} \textit{.rodata} \textit{.data} \textit{.got} y \textit{.bss} serán incluidas en el ejecutable y se encuentran en la misma región de memoria (lo que era de esperarse ya que solo tenemos la memoria interna RAM). + +\subsubsection{crt0.S (startup.S)} +Cuando se crea un ejecutable para ser utilizado en una plataforma específica, es necesario incluir el archivo \textit{crt0.S (C runtime startup code)}. Este archivo contiene el punto de entrada \textit{\_start} y está encargado de las siguientes funciones: + +\begin{enumerate} + \item Inicilización de las pilas (\textit{stacks}). + \item Copiar el contenido de la sección \textit{.data} (datos inicializados) de la memoria no volátil. + \item Inicializar la sección \textit{.bss} + \item Hacer el llamado al punto de entrada \textit{main} ( \textit{start\_armboot} para el Darrel's loader) +\end{enumerate} + +Y esta compuesto por: +\begin{enumerate} +\item \textbf{\_vectors} Tabla de vectores de excepciones. Deben estar colocados en la dirección 0x0000. +\item \textbf{reset\_handler} Esta función maneja el reset , y es el punto de entrada principal de un ejecutable. Realiza operaciones de inicialización específica de la arquitectura. +\item \textbf{undef\_handler} Es el manejador de las instrucciones no definidas. +\item \textbf{swi\_handler} Manejador de las interrupciones software. +\item \textbf{pabort\_handler} Manejador de las excepciones \textit{prefetch abort}. +\item \textbf{dabort\_handler} Manejador de las excepciones \textit{data abort}. +\item \textbf{irq\_handler} Manejador de las IRQ (Interrupt Request). +\item \textbf{fiq\_handler} Manejador de las FIQ (Fast Iterrupt Request). +\end{enumerate} + +El archivo \textit{crt0.S} es escrito en languaje ensamblador, y es fuertemente dependiente de la arquitectura, solo programadores expertos con un muy buen conocimiento de la arquitectura podrían escribirlo; sin embargo, los fabricantes proporcionan ejemplos de este tipo de archivos para que pueden ser utilizados sin tener que estudiar profundamente la arquitectura y el lenguaje ensamblador de la misma. + +Una vez se han ejecutado las operaciones mendionadas anteriormente se hace un llamado al punto de entrada \textit{start\_armboot} (\textit{ldr pc,\_start\_armboot}) + +\subsubsection{serial.c, xmpdem.c, dataflash.c, div0.c, interrupts.c} +A continuación se realiza una descripción de los archivos que hacen parte del loader de Darrel: +\begin{itemize} + \item \textbf{serial.c}: Inicializa y configura el puerto serial de depuración (DBGU) a uan velocidad ed 115200 baudios, 8 bits de datos, paridad, par. Adicionalmente proporciona las funciones: + \begin{itemize} + \item \textit{putc}: Transmite un caracter por la interfaz serial de depuración. + \item \textit{puts}: Transmite una cadena de caracteres. + \item \textit{getc}: Recibe un caracter por la interfaz serial de depuración. + \end{itemize} + \item \textbf{xmodem.c}: Implementa la recepción serial utilizando elprotocolo xmodem. + \item \textbf{dataflash.c}: Inicializa el puerto SPI, y proporciona funciones de alto nivel para la escritura de la DataFlash. + \begin{itemize} + \item \textit{write\_dataflash(addr\_dest, addr\_src, size)} + \end{itemize} + + \item \textbf{div0.c}: Remplazo (dummy) del manejador división por cero de GNU/Linux. + \item \textbf{interrupts.c}: Proporciona funciones para el manejo de interrupciones e implementación de retardos. +\end{itemize} + +\subsubsection{board.c} +El archivo \textit{board.c} proporciona el punto de entrada \textit{start\_armboot} y realiza las siguientes operaciones: + +\begin{itemize} + \item Configuración del Controlador de manejo de potencia (PMC). + \item Hace un llamado a la incialización del puerto serie de depuración \textit{serial\_init()} + \item Configura la SDRAM externa \textit{try\_configure\_sdram} + \item Despliega un menú de funciones. + \item Realiza las operaciones del menú. +\end{itemize} + +Una vez se carga el archivo loader.bin, el que resulta de quitarle al archivo ELF la información de depuración y notas: + +\begin{lstlisting} +/home/at91/gnutools/arm-elf/bin/arm-elf-objcopy --gap-fill=0xff -O binary loader loader.bin +\end{lstlisting} + +El programa desplegará el siguiente menú: + +\begin{lstlisting} +Darrell's loader - Thanks to the u-boot project +Version 1.0. Build Jul 29 2007 12:04:04 +RAM:32MB + +1: Upload Darrell's loader to Dataflash +2: Upload u-boot to Dataflash +3: Upload Kernel to Dataflash +4: Start u-boot +5: Upload Filesystem image +6: Memory test +\end{lstlisting} + +La opción 1. del menú permite almacenar el archivo \textit{loader.bin} en la memoria DataFlash, una vez hecho esto, el programa de inicialización almacenado en la memoria ROM interna lo ejecutará cada vez que se reinicie la plataforma. + +Las opciones 2 y 3 son similares a la 1, solo que se cargan las aplicaciones en diferentes direcciones de memoria, observemos el código fuente que implementa estas opciones: + +\begin{lstlisting} + else if(key == '2'){ + puts("Please transfer u-boot.bin via Xmodem\n\0"); + len = rxmodem((char *)0x20000000); + AT91F_DataflashInit (); + dataflash_print_info (); + if(write_dataflash(DATAFLASH_UBOOT_BASE, 0x20000000, len)) + puts("Dataflash write successful\n"); + dispmenu = 1; + } +\end{lstlisting} + +Aca vemos como si se elije la opción 2, se despliega un mensaje indicandole al usuario que transmita el archivo \textit{u-boot.bin} utilizando el protocolo xmodem, después se ejecuta la función rxmodem la que recibe los datos por el serial y lo almacena en la SDRAM externa (dirección 0x20000000) y finalmente se almacena esta información en la dirección \textit{DATAFLASH\_UBOOT\_BASE}. + +La opción 4. del menú transfiere la ejecución +\begin{lstlisting} + else if(key == '4' || ((scans > 300000) && autoboot)){ + if(AT91F_DataflashInit ()){ + dataflash_print_info (); + if(read_dataflash(DATAFLASH_UBOOT_BASE, 0x1C000, (char *)0x20700000)){ + puts("Dataflash read successful: Starting U-boot\n"); + asm("ldr pc, =0x20700000"); + } + } + } +\end{lstlisting} +En esta opción se copian 0x1C000 bytes del contenido de la memoria DataFlash comenzando en la posición \textit{DATAFLASH\_UBOOT\_BASE} a la dirección de memoria 0x20700000 (SDRAM externa) y luego se carga el contador de programa con la dirección 0x20700000, con lo que se inicia la ejecución del programa almacenado en la DataFlash, es importante hacer notar que el programa debe ser enlazado para que las secciones estén en la posición de memoria donde serán ejecutadas (0x20700000), no en la dirección donde son almacenadas. + +\subsection{U-boot} +La opción número 4 del menú copia el programa u-boot almacenado en la DataFlash a la memoria SDRAM y comienza su ejecución, en esta sección se realizará una descrición del loader u-boot. + +U-boot es un \textit{bootloader} que permite cargar archivos utilizando una gran variedad de periféricos como: Puerto serie, Memoria SD, Memorias Flash Paraleas, seriales, NAND. NOR, Ethernet. Es capáz de iniciar una variedad de tipos de archivos, además de un formato especial propio; este último almacena información sobre el tipo de sistema operativo, la dirección de carga, el punto de entrada, verificación de integridad via CRC, tipos de compresión, y textos descriptivos. La siguiente información es desplegada cuando \textit{u-boot} se inicializa una imagen del kernel de linux. + +\begin{lstlisting} +## Booting image at c0021840 ... + Image Name: Linux Kernel Image + Image Type: ARM Linux Kernel Image (gzip compressed) + Data Size: 1550369 Bytes = 1.5 MB + Load Address: 20008000 + Entry Point: 20008000 + Verifying Checksum ... OK + Uncompressing Kernel Image ... OK +\end{lstlisting} + +Para crear una imágen con el formato \textit{U-boot} basta con ejecutar el siguiente comando: +\begin{lstlisting} +$ mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -n "Linux Kernel Image" \ +-d linux.bin.gz ecb_at91.img +\end{lstlisting} + +Acá definimos \textit{ARM} como arquitectura, \textit{linux} como sistema operativo, \textit{Kernel} como el tipo de imágen, \textit{gzip} el método de compresión, \textit{0x20008000} la dirección de carga y punto de entrada (son iguales para kernels superiores al 2.3.X) \textit{Linux Kernel Image} el nombre de la imágen \textit{linux.bin.gz} el archivo de entrada y \textit{ecb\_at91.img} el archivo de salida. Esta información es almacenada en el encabezado de la imágen y puede ser leido utilizando el comando: + +\begin{lstlisting} +$mkimage -l /home/at91/binaries/ecb_at91.img + +Image Name: Linux Kernel Image +Created: Fri Jun 26 09:26:03 2009 +Image Type: ARM Linux Kernel Image (gzip compressed) +Data Size: 1550369 Bytes = 1514.03 kB = 1.48 MB +Load Address: 0x20008000 +Entry Point: 0x20008000 +\end{lstlisting} + +El siguiente listado muestra la estructura del envabezado definida por \textit{u-boot}, en ella podemos obervar sus componentes y el tamaño de cada uno de ellos. + +\begin{lstlisting} +typedef struct image_header { + uint32_t ih_magic; /* Image Header Magic Number */ + uint32_t ih_hcrc; /* Image Header CRC Checksum */ + uint32_t ih_time; /* Image Creation Timestamp */ + uint32_t ih_size; /* Image Data Size */ + uint32_t ih_load; /* Data Load Address */ + uint32_t ih_ep; /* Entry Point Address */ + uint32_t ih_dcrc; /* Image Data CRC Checksum */ + uint8_t ih_os; /* Operating System */ + uint8_t ih_arch; /* CPU architecture */ + uint8_t ih_type; /* Image Type */ + uint8_t ih_comp; /* Compression Type */ + uint8_t ih_name[IH_NMLEN]; /* Image Name */ +} image_header_t; +\end{lstlisting} + + +\subsection{Portando U-boot a la familia de plataformas ECB\_AT91} +Es necesario modificar varios archivos para que \textit{u-boot} soporte la familia de plataformas ECB\_AT91: + +\subsubsection{Makefile} +Se le debe indicar a las herramientas de compilación la nueva plataforma, adicionando las siguientes líneas. + +\begin{lstlisting} +ecb_at91_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t ecb_at91 NULL at91rm9200 +\end{lstlisting} + +\subsubsection{MAKEALL} +Se debe agregar la siguiente entrada en el archivo MAKEALL: +\begin{lstlisting} + LIST_ARM9=" \ + ----- + at91rm9200dk cmc_pu2 ecb_at91 +\end{lstlisting} + +\subsubsection{board/ecb\_at91/Makefile} +En el directorio \textit{board/ecb\_at91} se alojan los archivos que dan soporte a la nueva arquitectura, el archivo de reglas de Configuración se muestra a continuación: + +\begin{lstlisting} + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).a + +COBJS := $(BOARD).o at45.o flash.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +clean: + rm -f $(SOBJS) $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak .depend + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk +sinclude $(obj).depend +\end{lstlisting} + +Este es el formato utilizado para todas las plataformas, la parte importante se encuentra en la definición de la variable \textit{COBJS}; en la que se incluyen los archivos \textit{ecb\_at91.o}: archivo de la plataforma \textit{at45.0}: soporte a las memorias DataFlash AT45 y \textit{flash.o}: soporte genérico para dispositivos flash\footnote{Estos archivos pueden ser descargados de: http://svn.arhuaco.org/svn/src/emqbit/ECB\_AT91\_V2/u-boot/u-boot-1.1.6-ecbat91.patch}. + +\subsubsection{board/ecb\_at91/board.c} +Este archivo contiene toda la configuración específica de la plataforma, y como se puede ver en el siguiente listado, fija el número de la plataforma a: MACH\_TYPE\_ECBAT91 (1072 definida en \textit{include/asm-arm/mach-types.h}) y los parámetros del boot en: \textit{PHYS\_SDRAM + 0x100;} (PHYS\_SDRAM = 0x20000000 está definido en \textit{include/configs/ecb\_at91.h}). Adicionalmente, inicializa la SDRAM, la interfaz de red y la memoria DataFlash. + +\begin{lstlisting} +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Miscelaneous platform dependant initialisations + */ + +void lowlevel_init(void) +{ + /* Required by assembly functions - do nothing */ +} + +int board_init (void) +{ + /* Enable Ctrlc */ + console_init_f (); + + /* arch number of ECB_AT91 board */ + gd->bd->bi_arch_number = MACH_TYPE_ECBAT91; + + /* adress of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + + return 0; +} + +int dram_init (void) +{ + gd->bd->bi_dram[0].start = PHYS_SDRAM; + gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; + return 0; +} + +#ifdef CONFIG_DRIVER_ETHER +#if (CONFIG_COMMANDS & CFG_CMD_NET) + +/* + * Name: + * at91rm9200_GetPhyInterface + * Description: + * Initialise the interface functions to the PHY + * Arguments: + * None + * Return value: + * None + */ + +void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops) +{ + p_phyops->Init = lxt972_InitPhy; + p_phyops->IsPhyConnected = lxt972_IsPhyConnected; + p_phyops->GetLinkSpeed = lxt972_GetLinkSpeed; + p_phyops->AutoNegotiate = lxt972_AutoNegotiate; +} + +#endif /* CONFIG_COMMANDS & CFG_CMD_NET */ +#endif /* CONFIG_DRIVER_ETHER */ + +#ifdef CONFIG_HAS_DATAFLASH +#include + +void AT91F_DataflashMapInit(void) +{ + static int cs[][CFG_MAX_DATAFLASH_BANKS] = { + /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, + }; + + static dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { + /*define the dataflash offsets*/ + {DATAFLASH_LOADER_BASE /* 0 */, DATAFLASH_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "Darrell loader"}, + {DATAFLASH_UBOOT_BASE, DATAFLASH_ENV_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "U-boot"}, + {DATAFLASH_ENV_UBOOT_BASE, DATAFLASH_KERNEL_BASE - 1, + FLAG_PROTECT_CLEAR, "Environment"}, + {DATAFLASH_KERNEL_BASE, DATAFLASH_FILESYSTEM_BASE - 1, + FLAG_PROTECT_CLEAR, "Kernel"}, + {DATAFLASH_FILESYSTEM_BASE, 0x1fffff, FLAG_PROTECT_SET, "Filesystem"}, + }; + + AT91F_MapInit (cs, area_list); +} + +#endif +\end{lstlisting} + + +\subsubsection{include/configs/ecb\_at91.h} +Este archivo contiene variables que son utilizadas para la inicialización de la plataforma, algunas de estas ellas definen el valor de registros de configuración de periféricos como: El controlador del reloj del sistema, controlador de memorias SDRAM y memorias Flash. + +A continuación se muestra un segmento de este archivo, en el que se define la arquitectura: + +\begin{lstlisting} + +/* ARM asynchronous clock */ +#define AT91C_MAIN_CLOCK 180000000 +#define AT91C_MASTER_CLOCK 60000000 + +#define AT91_SLOW_CLOCK 32768 /* slow clock */ + +#define CONFIG_ARM920T 1 /* This is an ARM920T Core */ +#define CONFIG_AT91RM9200 1 /* It's an Atmel AT91RM9200 SoC */ +#define CONFIG_ECB_AT91 1 /* on an AT91RM9200DK Board */ +#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ +#define USE_920T_MMU 1 + +#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG 1 + +#ifndef CONFIG_SKIP_LOWLEVEL_INIT +#define CFG_LONGHELP +\end{lstlisting} + +Este archivo también incluye el valor predeterminado de las variables de entorno utilizadas por \textit{u-boot}: + +\begin{lstlisting} +#define CONFIG_BOOTARGS "mem=32M root=/dev/mmcblk0p1 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1" +#define CONFIG_ETHADDR 00:00:00:00:00:5b +#define CONFIG_NETMASK 255.255.255.0 +#define CONFIG_IPADDR 192.168.0.135 +#define CONFIG_SERVERIP 192.168.0.128 +#define CONFIG_BOOTDELAY 2 +#define CONFIG_BOOTCOMMAND "bootm C0021840" +#define CONFIG_BOOTFILE "ecb_at91.img" +#define CONFIG_ROOTPATH "/home/at91/rootfs" +#define CONFIG_LOADADDR 0x20200000 +\end{lstlisting} + +La variable \textit{bootargs} son parámetros pasados al kernel en su inicialización, y en este ejemplo fija la memoria RAM en 32 Mbytes, indica que el sistema de archivos se encuentra en el dispositivo \textit{/dev/mmcblk0p1} y utiliza el sistema de archivos \textit{ext3}, la consola es el dispositivo serial \textit{/dev/ttyS0} configurado a una velocidad de 115200 baudios, bit de paridad y 8 bits de datos y que debe esperar 1 segundo para montar el sistema de archivos. + +Las variables \textit{ethaddr, netmask, ipaddr, serverip} configuran la interfaz de red y las direcciones IP de la plataforma y de un servidor de donde puede descargarse la imágen del kernel. La variable \textit{bootdelay} fija el número de segundos que esperará u-boot para ejecutar el comando almacenado en \textit{bootcmd}, este conteo puede detenerse para interactuar con u-boot. El comando \textit{bootm C0021840 (bootcmd)} es utilizado para iniciar la imágen almacenada en la dirección de memoria 0xC0021840 (dirección donde almacena el loader de Darrel la imágen del kernel), \textit{bootm} utiliza la información almacenada en el encabezado de la imágen para utilizar el método de descompresión adecuado, almacenarlo en la dirección requerida y pasarle los parámetros almacenados en \textit{bootcmd}. + +\begin{lstlisting} +#define CONFIG_COMMANDS \ + ((CONFIG_CMD_DFL | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_DHCP ) & \ + ~(CFG_CMD_BDI | CFG_CMD_FPGA | CFG_CMD_MISC)) + +/* Remember that you must have the same mapping in the Darrell loader */ +#define NB_DATAFLASH_AREA 5 /* protected areas (4 + u-boot env) */ +#define DATAFLASH_MAX_PAGESIZE 1056 +#define DATAFLASH_LOADER_BASE (0*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_UBOOT_BASE (12*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_ENV_UBOOT_BASE (122*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_KERNEL_BASE (130*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_FILESYSTEM_BASE (1664*DATAFLASH_MAX_PAGESIZE) + +\end{lstlisting} + +\subsubsection{Compilación de U-boot en la familia de plataformas ECB\_AT91} +A continuación se indican los pasos necesarios para generar el archivo \textit{u-boot.bin} que será almacenado en la memoria DataFlash por el loader de Darrel. + +El primer paso es obviamente descargar el código fuente de la versión 1.1.6 de \textit{http://sourceforge.net/projects/u-boot/}, después debemos descargar el patch que da soporte a la familia de plataformas ECB\_AT91: + +\begin{lstlisting} +$ wget http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/u-boot/u-boot-1.1.6-ecbat91.patch +$ tar xjf u-boot-1.1.6.tar.bz2 +$ cd u-boot-1.1.6 +\end{lstlisting} + +Aplicamos el patch + +\begin{lstlisting} +$ cat ../u-boot-1.1.6-ecbat91.patch | patch -p1 +\end{lstlisting} + +Configuramos y generamos las herramientas utilizadas por \textit{u-boot} (entre ellas \textit{mkimage}). + +\begin{lstlisting} +$ make ecb_at91_config + Configuring for ecb_at91 board... (Este es un comentario) +$ make tools +\end{lstlisting} + +Por último compilamos \textit{u-boot}: + +\begin{lstlisting} +$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- +o +crossmake (si el alias crossmake está definido) +\end{lstlisting} + +Si el proceso se siguió correctamente y no se presentan errores al final del proceso obtenemos el mensaje: +\begin{lstlisting} + arm-none-eabi-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec + arm-none-eabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin +\end{lstlisting} +Lo que nos indica que se generó exitosamente el archivo \textit{u-boot.bin}, que puede ser descargado utilizando la opción 2 del menú del loader de Darrel (\textit{Upload u-boot to Dataflash}) y el protocolo xmodem. + +Podemos verificar que el archivo fué generado y almacenado en la Dataflash podemos ejecutar la opción número 4 del menú del loader de Darrel (\textit{Start u-boot}), como se mencionó anteriormente esta opción copia el archivo \textit{u-boot} desde la DataFlash a la memoria SDRAM y es ejecutado desde alli, con lo que se desplegará el siguiente mensaje: + +\begin{lstlisting} +Dataflash read successful: Starting U-boot +U-Boot 1.1.6 (Jul 29 2007 - 12:12:38) + +DRAM: 32 MB +Atmel: Flash: 0 kB +DataFlash:AT45DB161 +Nb pages: 4096 +Page Size: 528 +Size= 2162688 bytes +Logical address: 0xC0000000 +Area 0: C0000000 to C000317F (RO) Darrell loader +Area 1: C0003180 to C001F73F (RO) U-boot +Area 2: C001F740 to C002183F Environment +Area 3: C0021840 to C01ACFFF Kernel +Area 4: C01AD000 to C020FFFF (RO) Filesystem +In: serial +Out: serial +Err: serial +PHY not connected!! +Hit any key to stop autoboot: 2 +\end{lstlisting} + +Si se presiona cualquier tecla antes de que el contador llegue a \textit{0}, podemos interactuar con \textit{u-boot}, si ejecutamos el comando \textit{print} (Despliega en pantalla las variables de entorno definidas): + +\begin{lstlisting} +bootcmd=bootm C0021840 +bootdelay=2 +baudrate=115200 +ethaddr=00:00:00:00:00:5b +ipaddr=192.168.0.135 +serverip=192.168.0.128 +rootpath="/home/at91/rootfs" +netmask=255.255.255.0 +bootfile="ecb_at91.img" +loadaddr=0x20200000 +bootargs=mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1 +stdin=serial +stdout=serial +stderr=serial +Environment size: 345/8188 +\end{lstlisting} + +Podemos cambiar el valor predeterminado de la variable \textit{bootdelay} a \textit{1}: +\begin{lstlisting} +ecb_at91> setenv bootdelay 1 +\end{lstlisting} + +Y almacenamos los cambios realizados en una sección de la flash reservada para este fin con el comando: +\begin{lstlisting} +ecb_at91> save +Saving Environment to dataflash... +\end{lstlisting}s + +Podemos generar una nueva variable de entorno, almacenarla en la DataFlash +\begin{lstlisting} + +ecb_at91> setenv nfsargs=mem=32M console=ttyS0,115200n8 root=/dev/nfs nfsroot=192.168.0.128:/home +/at91/rootfs,timeo=200,retrans=500 ip=:::::eth0:on + +ecb_at91> save +\end{lstlisting} + + +\subsection{Almacenamiento de la imágen del kernel} +Una vez creada la imágen del kernel (\textit{ecb\_at91.img}) con el formato de \textit{U-boot} debemos probar su correcto funcionamiento; esto lo podemos hacer de dos formas: Almacenandola directamente en una memoria no volátil o cargándola en la memoria RAM y ejecutándola desde allí. + +\subsubsection{Almacenamiento en la memoria DataFlash} +Cuando almacenamos la imágen del kernel de Linux a un medio de almacenamiento no volátil, debemos tener presente que los ciclos de borrado y escritura de este toman un tiempo mucho mayor que en el caso de las memorias no volátiles, por esto, se recomienda esta opción cuando ya se cuente con una imágen estable o cuando no existan otros medios (como en el caso de la plataforma ECBOT). + +Inicialmente debemos ejecutar el loader de Darrel, esto se hace presionando el pulsador de \textit{Reset} disponible en todas las plataformas de la familia \textit{ECB\_AT91}. Inmediatamente después de observar el menú del loader debemos oprimir cualquier tecla para interrumpir la ejecución automática del \textit{u-boot}. + +Seleccionando la opción del menú: \textit{3: Upload linux to Dataflash}, podemos iniciar la transferencia de la imágen a la memoria SDRAM de nuestra plataforma: + +\begin{lstlisting} +Please transfer linux via Xmodem +Receiving Xmodem transfer +\end{lstlisting} + +Cuando aparezca este mensaje se debe transmitir el archivo \textit{ecb\_at91.img} utilizando el protocolo xmodem. Unos minutos después la transferencia finaliza, sin embargo, debemos esperar a que la información sea almacenada en la memoria DataFlash, mientras se completa la escritura la consola no mostrará ninguna actividad, eso es normal y no se debe reiniciar la board. Una vez finalizada la escritura observaremos el mensaje: +\begin{lstlisting} +%%%%%%%%%%%%%%%%%%%%% +\end{lstlisting} + +\subsubsection{Almacenamiento en la memoria RAM} +El proceso de grabación en la memoria DataFlash puede tomar alrededor de 6 minutos, lo que no lo hace conveniente cuando se está tratando de crear una imagen propia o se están realizando cambios a la misma. Cuando necesitamos modificar esta imágen ya sea porque queremos hacerlo nosotros mismos o porque deseamos una versión de kernel más moderna, es preferible utilizar un método de transferencia más rápido. + +La plataforma \textit{ECB\_AT91} posee una interfaz de red que puede ser controlada por \textit{u-boot}. Utilizando el protocolo \textit{tftp} \textit{U-boot} puede descargar la imágen desde un servidor a la memoria SDRAM y ejecutarla desde allí, ese proceso se realiza en segundos, facilitando de esta forma el proceso de desarrollo. A continuación se desciben los pasos que deben seguirse para realizar esta operación: + +Primero debemos instalar y configurar el servidor \textit{tftp} en el computador donde se tiene las herramientas de desarrollo: + +\begin{lstlisting} +$ aptitude install tftpd tftp. +\end{lstlisting} + +Se debe agregar la siguiente línea al archivo \textit{/etc/inetd.conf} +\begin{lstlisting} +tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp +\end{lstlisting} + +Debe asegurarse que el protocolo \textit{tftp} utiliza el puerto \textit{UDP} 69 + +\begin{lstlisting} +$ cat /etc/services | grep tftp +tftp 69/udp +\end{lstlisting} + +Ahora creamos el directorio \textit{/srv/tftp}\footnote{Este directorio tiene restricciones de seguridad, debe contactarse con el administrador de su equipo para permitir el acceso a él} y colocamos la imagen en él: +\begin{lstlisting} +$ mkdir /srv/tftp/ +$ chown myuser. /srv/tftp/ +$ cp ecb_at91.img /srv/tftp/ +\end{lstlisting} + +Para verificar la correcta configuración del servidor, podemos utilizar un cliente \textit{tftp}: + +\begin{lstlisting} +$ cd /tmp/ +$ tftp localhost # from the server +tftp> get ecb_at91.img +Received 1319525 bytes in 0.2 seconds +tftp> quit +\end{lstlisting} + +Ahora se deben configurar algunas variables de entorno en nuestra plataforma para indicarle a \textit{u-boot} la dirección \textit{IP}, el nombre y la ubicación de la imágen del kernel. Estas variables deben ser modificadas para que contengan los siguientes valores: + +\begin{lstlisting} +loadaddr=0x20200000 +bootdelay=1 +bootfile="ecb_at91.img" +fileaddr=20200000 +gatewayip=192.168.0.1 +netmask=255.255.255.0 +serverip=192.168.0.128 +\end{lstlisting} + +Estas variables fijan la dirección \textit{IP} de: la plataforma a \textit{192.168.0.2}, del gateway a \textit{192.168.0.1}, la del servidor \textit{tftp} a \textit{192.168.0.128\footnote{Dirección IP del PC donde están las herramientas de desarrollo}}. Adicionalmente define el nombre de la imágen del kernel a \textit{ecb\_at91.img}. Una vez configurado \textit{U-boot} podemos descargar la imágen a la dirección de memoria \textit{0x20200000}: + +\begin{lstlisting} +ecb_at91 >tftp +TFTP from server 192.168.0.1; our IP address is 192.168.0.2 +Filename 'ecb_at91.img'. +Load address: 0x20200000 +Loading: ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################ +done +Bytes transferred = 1409031 (158007 hex) +ecb_at91 > +\end{lstlisting} + + + +\subsection{Inicialización del Kernel} +En general los cargadores de Linux como el \textit{u-boot} realizan las siguientes funciones: + +\begin{itemize} +\item \textbf{Configurar e inicializar la RAM} +\item \textbf{Inicializar un puerto serial} +\item \textbf{Detectar el tipo de máquina:} El boot loader debe proporcionar un valor \textit{MACH\_TYPE\_XXX} al kernel, como vimos anteriormente tanto \textit{u-boot} como \textit{Linux} fijan este valor a 1072. +\item Configurar la \textit{kernel tagged list}: El boot loader debe crear e inicializar una estructura llamada \textit{kernel tagged list}, al cual comienza con \textit{ATAG\_CORE} y finaliza con \textit{ATAG\_NONE}. El tag \textit{ATAG\_CORE} puede o no estar desocupado, si se encuentra desocupado debe fijar el campo \textit{size} en '2'. El campo \textit{size} del tag \textit{ATAG\_NONE} debe fijarse en 0. Se pueden definir cualquier número de tags, pero se deben definir por lo menos el tamaño y la localización de la memoria del sistema, y la localización del sistema de archivos. Esta \textit{tagged list} debe ser almacenada en RAM, en una región que no pueda ser modificada por el descompresor del kernel o por el programa \textit{initrd}. Se recomienda colocarlo en los primeros 16kBytes de la RAM. + +\item Hacer un llamado a la imágen del kernel: Existen dos formas de hacer este llamado, directamente desde la flash o en en cualquier posición de la RAM. Los dos métodos deben cumplir las siguientes condiciones: + \begin{itemize} + \item Desactiva los dispositivos que tienen capacidad de DMA, de tal forma que la memoria no se corrompa. + \item Fijar los registros de la CPU: \textit{r0 = 0}, \textit{r1 = típo de máquina}, \textit{r2 = dirección física de la \textit{tagged list} en RAM.} + \item Modo de la CPU: Deshabilitar todas las interrupcione (IRQs y FIQs) y colocar a la CPU en modo SVC + \item Caches, MMU: Debe estar desactivada la MMU, La cache de instrucciónes puede estar activada o desactivada, la cache de datos debe estar desactivada. + \end{itemize} +\end{itemize} + + +\subsubsection{Llamado a la Imágen del kernel} + +Como mencionamos anteriormente, \textit{u-boot} ejecuta las instrucciones almacenadas en la variable de entorno \textit{bootcmd}; que para la familia de plataformas ECB\_AT91 almacena el comando \textit{bootm C0021840}, esta instrucción le indica a \textit{u-boot} que ejecute el comando \textit{bootm} con una imágen almacenada en la posición de memoria \textit{0xC0021840}, en la que (como mencionamos anteriormente (Figura \ref{boot_process})) se almacena la imágen del kernel. El código que implementa el comando \textit{bootm} se encuentra en el archivo \textit{common/cmd\_bootm.c}; analizando este archivo podemos descubrir el proceso que realiza \textit{u-boot} al hacer el llamado a la imágen del kernel (la que almacenamos utilizando la opción 3 del loader de Darrel). La función \textit{do\_bootm} realiza las siguientes operaciones: + +\begin{itemize} + \item Verificar la existencia de un número mágico en los primeros 4 bytes de la imágen (0x27051956). Si no se encuentra este número se desplegará el mensaje: \textit{Bad Magic Number} + \item Verifica la integridad del encabezado de la imágen. De no pasar esta prueba se mostrará el mensaje: \textit{Bad Header Checksum}. + \item Imprime el encabezado de la imágen, aparecerá algo como: + \item Cálcula el CRC del archivo almacenado y lo compara con el almacenado en la cabecera de la imágen. Si no se supera esta prueba, se desplegará el mensaje: \textit{Bad Data CRC} + \item Comprueba que la arquitectura está soportada por \textit{u-boot}. + \item Descomprime la imágen almacenada en la dirección \textit{load\_address} (la cual se pasa como parámetro en el momento de la creación de la imágen). + \item Transferir el control a Linux en la función \textit{do\_bootm\_linux}\textit{U-boot es un loader que permite trabajar con: LYNXOS, RTEMS, VXWORKS, QNX, ARTOS, NETBSD} +\end{itemize} + +La función \textit{do\_bootm\_linux} hace el llamado a la imagen del kernel utilizando el siguiente comando: +\begin{lstlisting} +(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); +\end{lstlisting} + +en donde: +\begin{itemize} + \item \textit{kbd} Información de la plataforma de desarrollo: +% \begin{itemize}\item + \begin{lstlisting} +typedef struct bd_info { + int bi_baudrate; /* serial baudrate */ + unsigned long bi_ip_addr; /* IP Address */ + unsigned char bi_enetaddr[6]; /* Ethernet adress */ + struct environment_s *bi_env; + ulong bi_arch_number; /* id for this board */ + ulong bi_boot_params; /* boot params */ + struct /* RAM configuration */ + { + ulong start; + ulong size; + } bi_dram[CONFIG_NR_DRAM_BANKS]; +} bd_t; \end{itemize} + \end{lstlisting} +% \end{itemize} + \item \textit{initrd\_start} - \textit{initrd\_end}: Linux permite que el sistema de archivos sea almacenado en la memoria RAM, el sistema es almacenado en algún medio no volátil y después es descomprimido en la RAM, esto acelera la ejecución ya que como se mencionó anteriormente, el acceso a las memorias volátiles es mucho menor. \textit{initrd\_start} - \textit{initrd\_end} indican el inicio y fin de este archivo + \item \textit{cmd\_start} - \textit{cmd\_end}: Posición de memoria donde se almacenan los parámetros pasados al kernel (\textit{mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1}) +\end{itemize} +En este punto termina el trabajo de \textit{u-boot} y el control es pasado al kernel. Como pudimos darnos cuenta lo más atractivo de \textit{u-boot} es su capacidad para manejar diferentes dispositivos de almacenamiento no volátiles como Memorias Flash, memorias SD y su capacidad para manejar interfaces de red y permitir utilizarlas para al carga de imágenes del kernel. + +\subsubsection{Punto de Entrada del Kernel \textit{head.o}} +Como puede verse en \ref{vmlinux_contents} el primer archivo encadenado en la imágen del kernel es \textit{arch/arm/kernel/head.o}, y corresponde al punto de entrada del kernel de Linux, este archivo ejecuta las siguientes funciones: + +\begin{enumerate} + \item Verificar que la arquitectura y el procesador sean válidos. Si el procesador no es válido se generará un error y en la consola aparecerá una ``\textit{p}'', si la plataforma no corresponde se genera un error y se imprimirá una ``\textit{a}'' en la consola. + \item Se genera una estructura de datos (\textit{page table}) que almacena el mapeo entre las direcciones de memoria virtual y la memoria física. Antes de pasar el control al kernel, el procesador corre un un modo \textit{real}, en el que las direcciones corresponden a direcciones reales de los dispositivos conectados físicamente al procesador. + \item Activa la unidad de manejo de memoria (MMU) del procesador. Cuando se activa la MMU el esquema de memoria físico se remplaza por un direccionamiento virtual determinado por los desarrolladores del kernel. + \item Establece un limitado mecanismo de detección y reporte de errores. + \item Hace un llamado a la función \textit{start\_kernel} en \textit{init/main.c} +\end{enumerate} + + +\begin{lstlisting} + setup_arch(&command_line); + setup_command_line(command_line); + sched_init(); + preempt_disable(); + page_alloc_init(); + console_init(); + mem_init(); + kmem_cache_init(); + setup_per_cpu_pageset(); + numa_policy_init(); + calibrate_delay(); + pidmap_init(); + pgtable_cache_init(); + prio_tree_init(); + anon_vma_init(); + fork_init(num_physpages); + proc_caches_init(); + buffer_init(); + unnamed_dev_init(); + key_init(); + security_init(); + vfs_caches_init(num_physpages); + radix_tree_init(); + signals_init(); + + page_writeback_init(); + proc_root_init(); + cgroup_init(); + cpuset_init(); + taskstats_init_early(); + delayacct_init(); + acpi_early_init(); + schedule(); + preempt_disable(); +\end{lstlisting} + + +En los últimos pasos en el proceso de arranque de Linux, se libera la memoria que será utilizada por los procesos de inicialización, abre un dispositivo que permita la interacción con el usuario \textit{/dev/console} (consola serial en nuestro caso) y ejecuta el primer proceso en espacio de usuario \textit{init}. El siguiente listado muestra el código que implementa esta última fase del proceso de arranque. + +\begin{lstlisting} + static int noinline init_post(void) +{ + free_initmem(); + unlock_kernel(); + mark_rodata_ro(); + system_state = SYSTEM_RUNNING; + numa_default_policy(); + + if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) + printk(KERN_WARNING "Warning: unable to open an initial console.\n"); + + (void) sys_dup(0); + (void) sys_dup(0); + + if (ramdisk_execute_command) { + run_init_process(ramdisk_execute_command); + printk(KERN_WARNING "Failed to execute %s\n", + ramdisk_execute_command); + } + + /* + * We try each of these until one succeeds. + * + * The Bourne shell can be used instead of init if we are + * trying to recover a really broken machine. + */ + if (execute_command) { + run_init_process(execute_command); + printk(KERN_WARNING "Failed to execute %s. Attempting " + "defaults...\n", execute_command); + } + run_init_process("/sbin/init"); + run_init_process("/etc/init"); + run_init_process("/bin/init"); + run_init_process("/bin/sh"); + + panic("No init found. Try passing init= option to kernel."); +} +\end{lstlisting} + +Como podemos obsever el último páso consiste en el llamado a un archivo en espacio de usuario llamado \textit{init} o \textit{sh}, en la siguiente subsección se describirá las acciones que se realizan cuando se ejecuta este archivo. De no encontrarse se desplegará el mensaje \textit{No init found. Try passing init= option to kernel.} y la plataforma pasará a un estado de inactividad. + +\section{Inicialización del Sistema} +En esta sección describiremos el proceso de inicialización de la plataforma embebida, en la sección anterior se estudió la inicialización del kernel de Linux. En esta sección se realizará una descripción del sistema de archivos que contiene aplicaciones que Linux requiere para inicializar servicios como los de red y la consola, cargar drivers (\textit{módulos}) de dispositivos y montar sistemas de archivos adicionales. + +\subsection{Sistema de Archivos} +Anteriormente hemos hecho referencia a la localización de la raíz del sistema de archivos (\textit{root}), e indicamos que está se encuentra en una determinada memoria no volátil, estamos indicando donde se encuentra el nivel más alto del sistema de archivos, el cual se denota como \textit{``/''}. Existen varias opciones entre las que se encuentran: +\begin{itemize} + \item \textbf{Second Extended File System (ext2)} : Este sistema de archivos utiliza bloques como unidad de almacenamiento básico, inodes como medio para mentener un seguimiento de archivos y objetos de sistema, grupos de bloques para dividir lógicamente el disco en secciones más menejables, directorios para proporcionar una organización jerárquica de archivos, bloques y mapas de bits (\textit{bitmap}) de bloques e inodes para mantener un seguimiento de bloques e inodes asignados, y superbloques para definir los parámetros del sistema de archivos y su estado general. Adicionalmente posee la capacidad de crear enlaces simbólicos, un tipo especial de archivo que contiene la referencia a otro archivo o directorio. + + + \item \textbf{Third Extended File System (ext3)}: \textit{ext3} es una extensión del sistema de archivos \textit{ext2} con capacidades de \textit{journaling}. El \textit{Journaling} es utilizado para seguir cambios de archivos y tiene como propósito asegurar que las transacciones sean procesadas de forma adecuada; adicionalmente permite arreglar daños en el sistema de archivos originados por una falla en la fuente de alimentación de la plataforma. + + \item \textbf{ReiserFS}: Este sistema de archivos al igual que \textit{ext3} utiliza \textit{journaling}. Fué creado con el fín de aumentar el desempeño frente al sistema \textit{ext2}, es un sistema eficiente en espacio, y mejora el manejo de grandes directorios. + + \item \textbf{Journalling FIle FLash System 2 (JFFS2)}: Sistema creado para trabajar con dispositivos Flash, los cuales son utilizados ampliamente en aplicaciones embebidas. + + \item \textbf{Compresed ROM file system (cramfs)}: Sistema de solo lectura, es utilizado cuando se dispone de una pequeña memoria flash NOR. El máximo tamaño de cramfs es de 256MB. Los archivos en este sistema de archivos se encuentran comprimidos. + + \item \textbf{Network File System}: Permite montar particiones de disco o directorios de sistemas remotos como un sistema de archivos local, esto permite compartir recursos como unidades de CDs, DVDs u otro medio de almacenamiento masivo. Por otro lado, reduce el tiempo de desarrollo ya que no es necesario transferir archivos entre el sitio donde se encuentran las herramientas de desarrollo y la plataforma. + + \item \textbf{Pseudo File System} Este sistema de archivos es utilizado por Linux para representar el estado actual del kernel. Este sistema de archivos está montado en el directorio \textit{/proc}, y dentro de él podemos encontrar información detallada del hardware del sistema. Adicionalmente algunos archivos pueden ser manipulados para informar al kernel cambios en la configuración. Este sistema de archivos es virtual y es constantemente actualizado por el kernel. Los archivos \textit{/proc/cpuinfo}, \textit{/proc/interrupt}, \textit{/proc/devices}, \textit{/proc/mounts} Proporcionan información sobre los dispositivos Hardware de la plataforma +\end{itemize} + + +\subsubsection{Estructura del Sistema de Archivos} +Todas las distribuciones de linux se basan en el standard \textit{Filesystem Hierarchy Standard \footnote{}} utilizado en los sistemas operativos UNIX. Este standard permite que los programas y los usuarios conozcan de antemano la localización de los archivos instalados. Los siguientes directorios o links simbólicos son de uso obligatorio: + +\begin{enumerate} + + \item \textbf{bin} Ejecutables esenciales. + \item \textbf{boot} Archivos estáticos del boot loader. + \item \textbf{dev} Archivos de dispositivos. + \item \textbf{etc} Configuración específica del host. + \item \textbf{lib} Librerías esenciales y módulos de kernel. + \item \textbf{media} Punto de montaje para sispositivos removibles. + \item \textbf{mnt} Punto de montaje temporal. + \item \textbf{opt} + \item \textbf{sbin} Ejecutables esenciales del sistema. + \item \textbf{srv} Datos de servicios suministrados por el sistema. + \item \textbf{tmp} Archivos temporales. + \item \textbf{usr} Segunda jerarquía. + \item \textbf{var} Datos variables. +\end{enumerate} + +\subsection{Primer Programa en Espacio de Usuario \textit{init}} + +Como vimos anteriormente, la primera aplicación en espacio de usuario que ejecuta el kernel es \textit{/sbin/init}, todos los procesos que no sean del kernel son generados de forma directa o indirecta por él y es responsable de la inicialización de los scripts y terminales. Su papel más importante es generar procesos adicionales bajo la dirección de un archivo de configración especial \textit{/etc/inittab} + +\subsubsection{Modos de operación} +Existen dos modos de operación en Linux: Modo usuario simple y Multi-usuario, en el primero solo se activa una línea de comandos y el único usuario que puede utilizarla es el super-usuario \textit{root}; es utilizado para sistemas en mantenimiento y normalmente se le asigna el nivel de ejecución 1. En este nivel de ejecución, no existen procesos demonios\footnote{Proceso que se ejecuta de forma discreta sin intervención del usuario y es activado por la ocurrencia de una condición específica} en ejecución, y la interfaz de red no está configurada\cite{JF}. + +El modo multi-usuario es el modo normal de ejecución del sistema Linux, cuando Linux inicia en este modo se ejecutan los siguientes procesos: + +\begin{itemize} +\item Se revisa el estado del sistema de archivos con \textit{fsck}. +\item Se monta en sistema de archivos. +\item \textit{init} analiza el archivo \textit{/etc/inittab} y + \begin{itemize} + \item Determina el nivel de ejecución + \item Ejecuta los scripts asociados con este nivel de ejecución. + \end{itemize} +\item Inicializa los demonios. +\item Permite el acceso a usuarios. +\end{itemize} + +\subsubsection{Niveles de ejecución} +Un nivel de ejecución puede entenderse como un estado del sistema Hoy día, la mayoría de las distribuciones utilizan los siguientes niveles de ejecución\cite{JF}: +\begin{enumerate} + \item 0. Cierre o detención del sistema (\textit{halt}). + \item 1. Modo usuario simple para configuración del sistema y mantenimiento. + \item 2. Modo multi-usuario sin red remota. + \item 3. Modo multi-usuario con red. Este es el modo de operación normal de un usuario de un sistema sin capacidades gráficas. + \item 4. No utilizado - Definido por el usuario. + \item 5. Modo multi-usuario con interfáz gráfica. + \item 6. Re-inicialización del sistema (\textit{reboot}). +\end{enumerate} + +El nivel de ejecución pude ser cambiado por el super-usuario (\textit{root}) en cualquier momento utilizando el comando \textit{init n}, donde \textit{n} es el nivel de ejecución deseado. + +\subsubsection{El Archivo \textit{/etc/inittab}} +Como se mencionó anteriormente el programa \textit{init} está encargado de montar el sistema de archivos y de analizar el archivo \textit{/etc/inittab}. Este archivo contiene: + +\begin{itemize} + \item Una entrada para el nivel de ejecución por defecto. Nivel de ejecución en que inicia el sistema a menos que especifique otra cosa en el boot loader. + \item Entradas que deben ser ejecutadas en todos o en un específico nivel de ejecución, su sintáxis es: + \textit{id:runlevels:action:process [arguments]} + \begin{itemize} + \item \textit{id} Cualquier cosa. + \item \textit{runlevels} Puede ser un número o lista de números de 0 a 6. + \item \textit{action} Acción a tomar: + \begin{itemize} + \item \textit{respawn} El proceso debe ser re-iniciado una vez finalice. + \item \textit{wait start} Ejecuta el proceso cuando se ingresa al nivel de ejecución y espera por su terminación. + \item \textit{bootwait} El proceso debe ser ejecutado durante la incialización del sistema. + \item \textit{initdefault} Especifica el nivel de ejecución al que se ingresa después de la inicialización del sistema. + \item \textit{sysinit} El proceso debe ejecutarse durante la inicialización del sistema. Debe ejecutarse antes de cualquier entrada \textit{boot} o \textit{bootinit} + \end{itemize} + \item \textit{process} Programa o script a ser ejecutado. + \end{itemize} +\end{itemize} +En el siguiente listado se muestra un archivo \textit{inittab} típico: + +\begin{lstlisting} +# The default runlevel. +id:5:initdefault: + +# Boot-time system configuration/initialization script. +# This is run first except when booting in emergency (-b) mode. +si::sysinit:/etc/init.d/rcS + +# What to do in single-user mode. +~~:S:wait:/sbin/sulogin + +# /etc/init.d executes the S and K scripts upon change +# of runlevel. + +l0:0:wait:/etc/init.d/rc 0 +l1:1:wait:/etc/init.d/rc 1 +l2:2:wait:/etc/init.d/rc 2 +l3:3:wait:/etc/init.d/rc 3 +l4:4:wait:/etc/init.d/rc 4 +l5:5:wait:/etc/init.d/rc 5 +l6:6:wait:/etc/init.d/rc 6 +# Normally not reached, but fallthrough in case of emergency. +z6:6:respawn:/sbin/sulogin +S:2345:respawn:/sbin/getty 115200 ttyS0 +# /sbin/getty invocations for the runlevels. + +1:2345:respawn:/sbin/getty 38400 tty1 +\end{lstlisting} + +En este archivo se define el nivel de ejecución 5 como el nivel por defecto. El primer script en ejecutarse es \textit{/etc/init.d/rcS} (ya que su acción es del tipo \textit{sysinit}). Luego se ingresa al nivel de ejecución 5 y se ejecuta el script \textit{/etc/init.d/rc} pasándole el argumento ``5'' y espera hasta que el script se complete. \textit{/etc/init.d/rc} ejecuta los scripts localizados en directorios individuales para cada nivel: \textit{/etc/rcX.d} (X un entero de 0 a 6); el nombre de los archivos localizados en estos directorios deben comenzar con el caracter ``\textbf{S}'' (para iniciar procesos) o ``\textbf{K}'' (para ``matar'' procesos), y dos caracteres numéricos: \textit{S[0-9][0-9]}, \textit{S[0-9][0-9]}. Un script típico de inicialización del demonio del servidor web \textit{cherokee} se muestra en el siguiente listado (\textit{/etc/rc5.d/S91cherokee}): + +\begin{lstlisting} +#!/bin/sh +DAEMON=/usr/sbin/cherokee +CONFIG=/etc/cherokee/cherokee.conf +PIDFILE=/var/run/cherokee.pid +NAME="cherokee" +DESC="Cherokee http server" + +test -r /etc/default/cherokee && . /etc/default/cherokee +test -x "$DAEMON" || exit 0 +test ! -r "$CONFIG" && exit 0 + +case "$1" in + start) + echo "Starting $DESC: " + start-stop-daemon --oknodo -S -x $DAEMON -- -b -C $CONFIG + ;; + + stop) + echo "Stopping $DESC:" + start-stop-daemon -K -p $PIDFILE + ;; + + restart) + $0 stop >/dev/null 2>&1 + $0 start + ;; + + *) + echo "Usage: $0 {start|stop|restart}" + exit 0 + ;; +esac +\end{lstlisting} + +Como podemos ver existen tres parámetros que podemos pasar al script: \textit{start}, \textit{stop} y \textit{restart}, cuyas acciones son iniciar, detener y reiniciar el demonio respectivamente. El directorio \textit{/etc/init.d} contiene todos los scripts utilizados en los diferentes niveles de ejecución, el nombre de ellos en este directorio no incluyen los caracteres \textit{S[0-9][0-9]} o \textit{K[0-9][0-9]}. + +La línea \textit{S:2345:respawn:/sbin/getty 115200 ttyS0} inicia una consola por el puerto serial \textit{/dev/ttyS0} con una velocidad de 9200 baudios, cuando el nivel de ejecucion sea 2, 3, 4 o 5. Finalmente se crea una terminal virtual para los niveles de ejecución multi-usuario. + +Cuando el super-usuario cambia el nivel de ejecución con el comando \textit{init}, los procesos únicos al nievel anterior son terminados y los procesos únicos del nuevo nivel son iniciados. + +\subsection{Distribuciones Linux} +Aunque es posible construir el sistema de atchivos nosotros mismos, no es nada práctico ya que es una tarea tediosa que requiere cierto nivel de experiencia. En la actualidad, existen varias distribuciones que realizan estas tareas por nosotros, dentro de las más utilizadas se encuentran: + +\subsubsection{Busybox} +Diseñado para optimizar el tamaño y rendimiento de aplicaciones embebidas, BusyBox \footnote{http://www.busybox.net/} combina en un solo ejecutable más de 70 utilidades estándares UNIX, en sus versiones ligeras. BusyBox es considerada la navaja suiza de los sistema embebidos, dado que permite sustituir la gran mayoría de utilidades que se suelen localizar en los paquetes GNU fileutils, shellutils, findutils, textutils, modutils, grep, gzip, tar, etc. + +Busybox hace parte de la mayoría de distribuciones de Linux para sistemas embebidos y en la actualidad proporciona las siguientes funciones: + +\textit{ +addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bunzip2, busybox, bzcat, cal, cat, chgrp, +chmod, chown, chroot, chvt, clear, cmp, cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, +deluser, df, dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, egrep, env, expr, +false, fbset, fdflush, fdisk, fgrep, find, fold, free, freeramdisk, fsck.minix, ftpget, ftpput, getopt, +getty, grep, gunzip, gzip, halt, head, hexdump, hostid, hostname, httpd, hwclock, id, ifconfig, ifdown, +ifup, init, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall, klogd, last, length, linuxrc, ln, +loadfont, loadkmap, logger, login, logname, logread, losetup, ls, makedevs, md5sum, mesg, mkdir, mkfifo, +mkfs.minix, mknod, mkswap, mktemp, more, mount, mt, mv, nameif, nc, netstat, nslookup, od, openvt, passwd, + patch, pidof, ping, ping6, pivot\_root, poweroff, printf, ps, pwd, rdate, readlink, realpath, reboot, + renice, reset, rm, rmdir, route, rpm, rpm2cpio, run-parts, sed, setkeycodes, sh, sha1sum, sleep, sort, + start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync, syslogd, tail, tar, tee, telnet, + telnetd, test, tftp, time, top, touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname, + uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode, vi, vlock, watch, watchdog, wc, +wget, which, who, whoami, xargs, yes, zcat}. + +\subsubsection{Buildroot} +Buildroot\footnote{http://buildroot.uclibc.org/} Es un grupo de \textit{Makefiles} y \textit{patches} que facilita la generación de la cadena de herramientas y el sistema de archivos para un sistema embebido que usa Linux. Posee una interfaz que permite realizar de forma fácil la configuración; utiliza busybox para generar la utilidades básicas de Linux y permite adaptar software adicional de forma fácil \footnote{http://buildroot.uclibc.org/buildroot.html\#add\_software}. + +\subsubsection{Openembedded} +Al igual que Buildroot, el proyecto openembedded proporciona un entorno que permite generar la cadena de herramientas y el sistema de atchivos para un sistema embebido, utiliza busybox y permite la creación de archivos que permiten compilar software que no se incluya en la distribución original. Adicionalmente openembedded crea archivos de instalación con un formato derivado del proyecto \textit{handhelds} \footnote{http://handhelds.org} \textit{ipk}, lo que permite la instalación de paquetes de forma similar a la distribución debian. + +La información necesaria para generar una distribución utilizando las herramientas de Openembedded se encuentra en http://www.emqbit.com/mediawiki/index.php/Main\_Page/ecb\_at91/OE. + +\section{Módulos del kernel} +Los módulos son pequeñas piezas de código que pueden ser cargadas y descargadas en el kernel en el momento que sea necesario. Ellos extienden la funcionalidad del kernel, sin la necesidad de reiniciar el sistema y recompilar el kernel. Por ejemplo, un tipo de módulo es el controlador de dispositivo, el cual permite al kernel acceder a un dispositivo hardware conectado al sistema. Este tipo de módulos serán estudiados en esta sección. + +Existen tres tipos de dispositivos en Linux \cite{JCAR05}: + +\begin{itemize} +\item Tipo Caracter: Puede accederse de forma similar a un archivo; este tipo de dispositivos permite por lo menos las operaciones \textit{open}, \textit{close}, \textit{read}. Ejemplos de este tipo de dispositivo son el puerto serie (\textit{/dev/ttyS0}) y la consola (\textit{/dev/console}) +\item Tipo Bloque: Este tipo de dispositivo puede hospedar un sistema de archivos; normalmente realiza operaciónes de bloques de datos únicamente; un ejemplo de este tipo de dispositivo es el disco duro (\textit{/dev/hda}). +\item Red: Toda transacción de red se realiza a través de una interfaz, esto es, un dispositivo hardware (\textit{/dev/eth0}) o software (\textit{loopback}) capaz de intercambiar datos con otros hosts. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/kernel_module} \end{center} + \caption{ Interacción entre el área de usuario y el driver del dispositivo. Fuente: \cite{Mo05}}\label{kernel_module} +\end{figure} + + +\subsection{Ejemplo de un driver tipo caracter} + +Recuerde que una aplicación en el área de usario, no puede acceder directamente al área del kernel; los dispositivos se acceden a través de archivos de dispositivos, localizados en \textit{/dev} (ver figura \ref{kernel_module}), A continuación se muestra la salida del comando \textit{ls -l /dev/} + +\begin{lstlisting} +brw-rw---- 1 root disk 3, 0 Nov 27 hda +brw-rw---- 1 root disk 3, 1 Nov 27 hda1 +brw-rw---- 1 root disk 3, 2 Nov 27 hda2 +crw-rw---- 1 root uucp 4, 64 Nov 27 ttyS0 +crw-rw---- 1 root uucp 4, 65 Nov 27 ttyS1 +\end{lstlisting} + + +Los archivos tipo caracter están identificados por una \textit{``c''} en la primera columna, mientras que los dispositivos tipo bloque por una \textit{``b''}. Podemos observar que existen dos números (5ta y 6ta columna) que identifican al driver, el número de la 5ta columna recibe el nombre de \textit{major number} y el de la sexta \textit{minor number}; estos números son utilizados por el sistema operativo para determinar el dispositivo y el driver que deben ser accesados ante una solicitud a nivel de usuario. + +El \textit{major number} identifica la clase o grupo del dispositivo, mientras que el \textit{minor number} se utiliza para identificar sub-dispositivos (Ver Figura \ref{major}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/major} \end{center} + \caption{ \textit{major} y \textit{minor} footnote{http://uw713doc.sco.com/en/HDK\_concepts/ddT\_majmin.html} }\label{kernel_module} +\end{figure} + +El kernel de linux permite que los drivers compartan el número mayor, como el caso del disco duro, hda posee dos particiones hda1 y hda2, las cuales son manejadas por el mismo driver, pero se asigna un número menor único a cada una; lo mismo sucede con el puerto serie. + +\subsubsection{Implementación del driver de un LED} +A continuación se realizará la descripción de un driver tipo caracter para un dispositivo muy sencillo, un LED \cite{OPPS05}. Este ejemplo fue implementado en un procesador PXA255 de Intel y realiza las siguientes operaciones: + +\begin{itemize} +\item \textit{init}: Se ejecuta cuando se carga el módulo, el LED se apagará. +\item \textit{close}: Se ejecuta cuando se descarga el módulo, el LED se encenderá. +\item \textit{open}: Se ejecuta cuando se realiza una operación de lectura o escritura al dispositivo. +\end{itemize} + +Existen dos funciones que deben estar presentes en todo tipo de módulo, estas son: \textit{module\_init} y \textit{module\_exit} las cuales se ejecutan cuando se carga y descarga el módulo respectivamente. + +\begin{lstlisting}[firstnumber=40] +struct file_operations fops = { + .open = device_open, + .release = device_release, +}; + +static int __init blink_init(void) +{ + printk(KERN_INFO "BLINK module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + printk(KERN_ALERT "Registering char device failed + with %d\n", Major); + return Major; + } + + printk(KERN_ALERT "I was assigned major number %d. + To talk to\n", Major); + printk(KERN_ALERT "the driver, create a dev file + with\n"); + printk(KERN_ALERT "'mknod /dev/%s c %d 0'.\n", + DEVICE_NAME, Major); + + pxa_gpio_mode(GPIO_LED_MD); + pxa_gpio_mode(GPIO_LED_OFF); /* Turn LED OFF*/ + + return 0; +} + + +static void __exit blink_exit(void) +{ + int ret; + + ret = unregister_chrdev(Major, DEVICE_NAME); + if ( ret < 0 ) + printk( KERN_ALERT "Error in unregister_chrdev: + %d\n", ret ); + printk( KERN_INFO "BLINK driver is down...\n" ); +} + + +module_init(blink_init); +module_exit(blink_exit); + + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Carlos Camargo UNAL"); +MODULE_DESCRIPTION("BLINKER LED driver"); +MODULE_VERSION("1:0.1"); +\end{lstlisting} \normalsize + +Las funciones \textit{module\_init} \textit{module\_exit} deben ser declaradas como \textit{static} ya que no serán visibles fuera del archivo. Como puede observarse en la línea 83 se hace la definición de las funciones que deben ejecutarse al cargar y descargar el módulo en nuestro caso \textit{blink\_init} y \textit{blink\_exit} respectivamente. La información sobre el módulo aparece en las líneas 87-90. + +En la línea 40 se define la estructura de operaciones de archivo del módulo; cada campo de la estructura corresponde a la dirección de una función definida por el driver para manejar una solicitud determinada. En nuestro caso solo existe una función \textit{open}, la cual será definida más adelante. + +Como se puede ver en la figura \ref{kernel_module} es necesario que el kernel sepa que driver está encargado del dispositivo, esto es, el \textit{major number} del driver que lo maneja; por esto, lo primero que se debe hacer es obtener este número. En la función \textit{blink\_init} (línea 49) podemos observar la forma en que se realiza el registro de nuestro dispositivo. La función \textit{register\_chrdev} retorna el número mayor asignado de forma dinámica, esto es recomendable ya que si se fijara un número de forma arbitaria, podría causar conflictos con otros dispositivos. De esta forma, al cargar el módulo con el comando: \textit{insmod blinker.ko}, el LED se apagará y aparecerá el siguiente mensaje en la consola: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK module is Up. +I was assigned major number 253. To talk to +the driver, create a dev file with +'mknod /dev/blink c 253 0'. +\end{lstlisting} + +Con lo anterior, nuestro dispositivo es registrado y se le asigna el número 253 como \textit{major number}, en el archivo \textit{/proc/devices} aparecen los dispositivos que actualmente están siendo utilizados por el kernel, este archivo debe contener una entrada para blink de la forma: \textit{253 blink}. + +En la función \textit{blink\_exit} se realiza la liberación del dispositivo ( la función \textit{unregister\_chrdev}, línea 75), la cual se ejecuta cuando se lanza el comando: \textit{rmmod blinker.ko}, el que a su vez hace que se encienda el LED y se imprima en la consola el mensaje: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK driver is down... +\end{lstlisting} + +Como se mencionó anteriormente es posible manejar un archivo tipo caracter como si fuera un archivo de texto, por lo tanto, es posible adicionar funciones a las acciones de abrir, cerrar, escribir en o leer del dispositivo. + +\begin{lstlisting}[firstnumber=20, numbers=right] +static int device_open(struct inode *inode, \ + struct file *file) +{ + unsigned int i; + printk( KERN_INFO "Open BLINKER\n" ); + if (is_device_open) + return -EBUSY; + + is_device_open = 1; + + for( i=0; i<5; i++ ){ + pxa_gpio_mode(GPIO_LED_ON); + mdelay(0x0080); + pxa_gpio_mode(GPIO_LED_OFF); + mdelay(0x0080); + } + + try_module_get(THIS_MODULE); + return SUCCESS; +} +\end{lstlisting} + +Esta sección de código se ejecuta cada vez que el archivo de dispositivo /dev/blink es abierto, esto sucede en operaciones de lectura o escritura. Es decir si se utilizan los siguientes comandos: + +\begin{lstlisting}[numbers=none] +more /dev/blink +cat file > /dev/blink +cp file /dev/blink +\end{lstlisting} + +Con cada uno de estos comandos el LED se encenderá y apagará y en la consola se despliega el mensaje: + +\begin{lstlisting}[numbers=none] +Open BLINKER +Close BLINKER +\end{lstlisting} + +\section{Interfaz con Periféricos dedicados} +Es común que algunas aplicaciones requieran ciertos periféricos especiales que les permitan cumplir las restricciones temporales, es decir, es necesario crear tareas Hardware que ayuden a las tareas software a cumplir con las restricciones de diseño. Para esto es necesario implementar algunas funciones en periféricos externos al procesador. Si la tarea no se encuentra implementada en un dispositivo comercial es necesario implementarlas en un Dispositivo Lógico Programable (PLD) o en un Circuito Integrado de Aplicación Específica (ASIC). + +En esta sección realizaremos una explicación detallada del proceso de comunicación entre el procesador y un periférico implementado en una FPGA. + +\subsection{Comunicación Procesador - Periférico} +La figura \ref{computer_arch} muestra una arquitectura básica para la comunicación de tareas Hardware - Software; en ella podemos observar que el procesador maneja tres buses: +\begin{itemize} +\item Bus de Datos: Bus bidireccional por donde se realiza el intercambio de información. +\item Bus de Direcciones: Bis controlado por el procesador y es utilizado para direccionar un determinado periférico o una detrminada funcionalidad del mismo. +\item Bus de control: Señales necesarias para indicarle a los periféricos el tipo de comunicación (Lectura o escritura). +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/computer-simple} \end{center} + \caption{Arquitectura básica Hardware/Software}\label{computer_arch} +\end{figure} + +Todos los periféricos que requieren intercambio de información con el procesador comparten el mismo bus de datos, por lo que es necesario que mientras el procesador no se comunique con ellos permanezcan en estadp de alta impedancia, esto es necesario para evitar corto - circuitos originados por diferentes niveles lógicos en el bus. Por lo tanto, las comunicaciones siempre son iniciadas por el procesador y se selecciona uno y solo un periférico. El decodificador de direcciones es el encargado de habilitar un determinado periférico ante una solicitud del procesador (mediante una dirección de memoria), esto lo hace activando la señal \textit{CSX}, cuando esta señal se encuentra en estado lógico alto el periférico coloca su bus de datos en alta impedancia, si se encuentra en estado lógico bajo el periférica escribe o lee el bus de datos, dependiendo de la activación de las señales del bus de control RD y WR. + +El decodificador de direcciones, como su nombre lo indica utiliza como entradas el bus de direcciones y activa solo una señal de selección de Chip (\textit{CSx}), basándose en un rango de direcciones asignado a cada periférico, este rango de direcciones no debe traslaparse para asegurar que solo un chip es seleccionado. Este rango de direcciones que se asigna a cada dispositivo que puede ser accesado por la unidad de procesamiento recibe el nombre de \textit{mapa de memoria} y puede ser único para cada plataforma. + +Cuando la unidad de procesamiento necesite comunicarse con un determinado periférico, colocará en el bus de direcciones una valor que se encuentre en el rango de direcciones asignado para ese periférico, esto hace que el decodificador de direcciones active la señal de selección adecuada para informarle al periférico que el procesador va a iniciar una transferencia de información. La Figura \ref{rd_wr_timing} muestra el diagrama de tiempos para un ciclo de lectura y escritura del procesador. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/rd_wr_waveform} \end{center} + \caption{Ciclo de lectura y escritura para la arquitectura de la Figura \ref{computer_arch}}\label{rd_wr_timing} +\end{figure} + +De lo anterior podemos concluir que un periférico es visto por el procesador como una posición de memoria más y las transacciones las inicia únicamente el procesador. + +\subsubsection{Implementación de Periféricos en una FPGA} +Es importante tener en cuenta los siguientes items cuando se implemente una tarea Hardware en una FPGA: +\begin{itemize} + \item La frecuencia del reloj de la FPGA es mucho mayor que la de las señales del bus de control, por lo que es necesario asegurarse que cada vez que el procesador realiza una solicitud de lectura o escritura, la señal de activación cambia del estado lógico alto al bajo; si solo se tiene en cuenta el estado bajo de la señal \textit{CSX} el periférico puede ejecutar la tarea varias veces en el mismo ciclo de activación, lo que puede llevar a resultados incorrectos. + \item La fase de los relojes del procesador y la FPGA no es la misma, por lo que es necesario sincronizar las señales del procesador con el reloj de la FPGA; si esto no se hace las señales fuera de fase pueden originar un estado de metaestabilidad en los Flip-Flops internos y por lo tanto el mal-funcionamiento del sistema. + \item El bus de datos es bidireccional, por lo que es necesario que la FPGA lo coloque en alta impedancia cuando no se esté habilitando un periférico. + \item La FPGA no permite implementar buffers tri-estado internamente por lo que es necesario separar los buses de entrada y salida a cada periférico. El bus de entrada es común a todos los periféricos mientra que es necesario utilizar un esquema de multiplexación entre los buses de salida. +\end{itemize} + +La figura \ref{sw_hw_fpga_arch} muestra el diagrama de bloques de la interfaz necesaria para poder comunicar un grupo de periféricos o tareas Hardware con el bus de datos, dirección y control de un procesador. El bloque \textit{SYNC} se encarga de sincronizar las señales provenientes de la FPGA con el reloj interno de la misma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/sw_hw_fpga_arch} \end{center} + \caption{Diagrama de Bloques para la comunicación de tareas HW-SW \ref{computer_arch}}\label{sw_hw_fpga_arch} +\end{figure} + + El módulo \textit{Write Pulse generator} genera un pulso cuando las señales \textit{sncs} y \textit{snwe} son activadas como se indica en la figura \ref{cs_we_pulse}. El decodificador de direcciones selecciona un determinado periférico dependiendo del rango especificado para cado uno. Como mencionamos anteriormente, las FPGAs no permiten implementar buffers tri-estado internamente , por lo que cada periférico debe tener un bus de entrada y uno de salida de datos, los buses de entrada de datos son comunes, mientras que los de salida deben ser manejados por un dispositivo de salida, el cual puede ser un multiplexor controlado por el decodificador de direcciones o una compuerta OR, para este último caso es necesario que los periféricos coloquen el bus de datos en ``0'' cuando no estén seleccionados. Finalmente es necesario colocar un buffer tri-estado en los pines de la FPGA, este buffer está controlado por las señales \textit{nwe, noe, ncs} y solo se activa cuando \textit{nwe = 1, noe = 0, ncs = 0}, es decir, cuando se selecciona el rango de memoria de la FPGA y el procesador inicia una operación de lectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/cs_we_pulse} \end{center} + \caption{Generación del pulso de escritura}\label{cs_we_pulse} +\end{figure} + +\subsubsection{Programa en Espacio de Usuario para la comunicación} +El kernel de Linux proporciona una interfaz que permite a una aplicación \textit{mapear} un archivo en memoria, lo que hace que exista una correspondencia uno a uno entre las direcciones de memoria y el contenido del archivo. Linux implementa la llamada de sistema \textit{mmap()} para \textit{mapear} objetos en memoria.\cite{RL07} + +\begin{lstlisting} + #include + + void * mmap (void *addr, + size_t len, + int prot, + int flags, + int fd, + off_t offset); +\end{lstlisting} + + +Un llamado a \textit{mmap()} le pide al kernel hacer un mapeo en la memoria de \textit{len} bytes del objeto representado por el descriptor de archivo \textit{fd}, comenzando a \textit{offset} bytes dentro del archivo. Si se especifica \textit{addr}, se utiliza este valor como la dirección inicial en la memoria. Los permisos de acceso son determinados por \textit{prot}; PROT\_READ habilita la lectura, PROT\_WRITE habilita escritura y PROT\_EXEC habilita la ejecución. El argumento \textit{flasgs} describe el tipo de mapeo, y algunos elementos de su comportamiento y puede tomar los valores: + +\begin{itemize} + \item MAP\_FIXED: hace que \textit{addr} sea un requerimiento, si el kernel es incapaz de hacer el mapeo en esta dirección el llamado falla, si los parámetros de dirección y longitud traslapan un mapeo existente se descartan las áreas que se traslapan y se remplazan por el nuevo mapeo. + \item MAP\_PRIVATE: Establece que el mapeo no es compartido. Los cambios realizados a la memoria por este proceso no se reflejan en el archivo actual o en el mapeo de los otros procesos. + \item MAP\_SHARED: Comparte el mapeo con otros procesos que usan el mismo archivo. Escribir en el mapeo equivale a escribir en el archivo. +\end{itemize} + +A continuación se lista un ejemplo de la utilización del llamado \textit{mmap} + +\begin{lstlisting} +#define MAP_SIZE 0x2000000l // ECBOT USE A11 to A25 +#define MAP_MASK (MAP_SIZE - 1) + + int fd; + unsigned long i, j; + void *base; + volatile unsigned short *virt_addr; + + io_map(0xFFFFFF7C); // Configure CS3 as 16 bit Memory and 0 Wait States + off_t address = 0x40000000; // CS3 Base Address + + if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1){ + printf ("Cannot open /dev/mem.\n"); + return -1; + } + printf ("/dev/mem opened.\n"); + + base = mmap (0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, address); + if (base == (void *) -1){ + printf ("Cannot mmap.\n"); + return -1; + } + printf ("Memory mapped at address %p.\n", base); + + virt_addr = base; + +\end{lstlisting} + +En este ejemplo utilizamos el llamado \textit{mmap} para hacer un mapeo de la dirección de memoria correspondiente al CS3 (0x40000000). El descriptor del archvio utilizado es el dispositivo \textit{/dev/mem} el cual permite operaciones de lectura y escritura a la memoria virtual. Adicionalmente permitimos operaciones de lectura/escritura (PROT\_READ | PROT\_WRITE) y permitimos el acceso a otros proceso. Finalmente podemos usar la variable \textit{virt\_addres} para escribir en cualquier posición de memoria desde \textit{0x40000000} hasta \textit{0x40000000 + MAP\_SIZE}. El siguiente listado muestra un ejemplo de la forma de hacer estas operaciones. + +\begin{lstlisting} + printf("Writing Memory..\n"); + for (i = 0 ; i <32; i++){ + virt_addr[i<<10] = i*3; // ECBOT use A11 to A25 + } + + printf("Reading Memory..\n"); + for (i = 0 ; i < 32; i++) + { + j = virt_addr[i<<10]; + printf("%X = %X\n", i, j ); + } + if (munmap (base, MAP_SIZE) == -1) + { + printf ("Cannot munmap.\n"); + return -1; + } +\end{lstlisting} + +\subsection{Comunicación Periférico - Procesador} + +Cuando un periférico requiere atención por parte de la CPU debido a que terminó de realizar un proceso o porque requiere nuevas instrucciones para seguir operando, o un evento originado por un usuario necesita ser atendido, se debe iniciar un proceso para que la unidad de procesamiento se comunique con él. Como se mencionó anteriormente la unidad de procesamiento está encargada de forma exclusiva de iniciar las operaciones de lectura/ecritura con los periféricos, por esta razón, el periférico utiliza una señal (IRQ) para informarle al procesador que requiere ser atendido. Algunas arquitecturas poseen un mecanismo que permite el acceso a la memoria por parte de los periféricos sin utilizar el procesador, esto permite que periféricos de diferentes velocidades se comuniquen sin someter al procesador a una carga excesiva. En esta sección hablaremos de la forma de definir las interrupciones en un driver de Linux. + +\subsubsection{Manejo de Interrupciones} +A continuación se describirá la forma de manejar las interrupciones utilizando un driver de Linux. Analicemos la función \textit{qem\_init} + +\begin{lstlisting} + static int __init qem_init(void) +{ + int res; + printk(KERN_INFO "FPGA module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + return Major; + } + + /* Set up the FGPA irq line */ + at91_set_gpio_input(FPGA_IRQ_PIN, 0); + at91_set_deglitch(FPGA_IRQ_PIN, 1); + + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); + + set_irq_type(FPGA_IRQ, IRQT_RISING); + + ioaddress = ioremap(FPGA_BASE, 0x4000); + + return 0; +} + +\end{lstlisting} + +Esta rutina es similar a la presentada anteriormente, solo se agrega un par de comandos para definir un pin del procesador como entrada, para poder utilizarlo como señal IRQ, en la línea: + +\begin{lstlisting} + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); +request_irq (int irq, handler, irqflags, devname, dev_id); +\end{lstlisting} + +Se hace un llamado a la función \textit{request\_irq} que asigna recursos a la interrupción, habilita el manejador y la línea de interrupción. En nuestro caso define el pin \textit{FPGA\_IRQ\_PIN} como la línea de interrupción, la rutina \textit{irq\_handler} será ejecutada cuando se presente una interrupción, el flag \textit{IRQF\_DISABLED} deshabilita las interrupciones locales mientras se procesa, el nombre del dispositivo que realiza la interrupción es \textit{FPGA - IRQ}. + +La función \textit{ioremap(offset, size)}, una secuencia de operaciones que permiten que la memoria de la CPU se pueda acceder con las funciones \textit{readb/readw/readl/writeb/writew/write}, utilizando la variable \textit{ioaddress}. Finalmente se define el tipo de interrupción del pin \textit{FPGA\_IRQ\_PIN} como \textit{IRQT\_RISING}. + +La función que se ejecuta cuando se presenta la interrupción, se define en el siguiente listado: + +\begin{lstlisting} +irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + if(irq_enabled) + { + interrupt_counter++; + printk(KERN_INFO "interrupt_counter=%d\n",interrupt_counter); + printk("\n kernel: IREG_LP:%X \n", readb( &ioaddress[0x40] ) ); + wake_up_interruptible(&wq); + } + return IRQ_HANDLED; +} +\end{lstlisting} + +Cada vez que se produce una interrupción y si la variable global \textit{irq\_enabled} es igual a 1, se aumenta en 1 el valor de \textit{interrupt\_counter}, se imprime su valor y el de un registro interno del periférico. + +En este driver utilizaremos la función \textit{device\_read} para enviar información a un programa en espacio de usuario. +\begin{lstlisting} +static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ + char *buffer, /* buffer to fill with data */ + size_t count, /* length of the buffer */ + loff_t * offset) +{ + if(irq_enabled){ + wait_event_interruptible(wq, interrupt_counter!=0); + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + interrupt_counter=0; + } + else{ + interrupt_counter = -1; + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + } + return sizeof(interrupt_counter); +} + +\end{lstlisting} + +Cuando se realice una operación de lectura desde espacio de usuario, el proceso quedará bloqueado por la función \textit{wait\_event\_interruptible} hasta que la rutina de atención a la interrupción ejecute la función \textit{wake\_up\_interruptible}, pero es necesario que se cumpla la condición evaluada por \textit{wait\_event\_interruptible} para que se ejecute la tarea. Para este ejemplo: + +\begin{lstlisting} + wait\_event\_interruptible(wq, interrupt\_counter!=0); +\end{lstlisting} + +Por lo que \textit{irq\_handler} debe hacer: + +\begin{lstlisting} + interrupt_counter++; + wake_up_interruptible(&wq); +\end{lstlisting} + +Si no se hace esto el proceso nunca se despertará y el proceso de lectura quedará bloqueado. + +En la línea: + +\begin{lstlisting} + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + copy_to_user ( to, from, long n); +\end{lstlisting} + +Se utiliza la función \textit{copy\_to\_user} para intercambiar información con el programa que se ejecuta en espacio de usuario. En este caso se copia a \textit{char *buffer}, la variable \textit{interrupt\_counter}. Existe una función análoga que recibe información proveniente del espacio de usuario \textit{copy\_from\_user} En la Figura \ref{copy_to_from_user} se muestran estas operaciones. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/copy_to_from_user} \end{center} + \caption{Intercambio de información entre los espacios de kernel y usuario\label{copy_to_from_user}} +\end{figure} + +En la función \textit{qem\_exit} se liberan los recursos de la interrupción y la variable \textit{ioaddress}. + +\begin{lstlisting} +static void __exit qem_exit(void) +{ + int ret; + /*Tho order for free_irq, iounmap & unregister is very important */ + free_irq(FPGA_IRQ_PIN, NULL); + iounmap(ioaddress); + unregister_chrdev(Major, DEVICE_NAME); + + printk(KERN_INFO "FPGA driver is down...\n"); +} +\end{lstlisting} + + +Finalmente el programa en espacion de usuario es: + +\begin{lstlisting} + int main(void) { + + int fileNum, bytes; + char data[40]; + + fileNum = open("/dev/fpga", O_RDWR); + if (fileNum < 0) { + printf(" Unable to open file\n"); + exit(1); + } + + printf(" Opened device\n"); + + bytes = read(fileNum, data, sizeof(data)); + + if (bytes > 0) + printf("%x\n", data); + + close(fileNum); + + return (0); +} +\end{lstlisting} + +En este programa se abre el dispositivo \textit{/dev/fpga} que corresponde a nuestro driver y se utiliza la función \textit{read} para leer la información suministrada por el driver. \ No newline at end of file diff --git a/course/.docs/book/platform.tex.backup b/course/.docs/book/platform.tex.backup new file mode 100644 index 0000000..f445660 --- /dev/null +++ b/course/.docs/book/platform.tex.backup @@ -0,0 +1,2874 @@ +\chapter{PLATAFORMA DE DESARROLLO ECBOT} + + +\section{Introducción} +En esta sección se realizará una explicación detallada del proceso de adaptación de Linux a la familia de plataformas ECB\_AT91, este proceso es aplicable a otros dispositivos que trabajen con procesadores soportados por la distribución de Linux. Adicionalmente, se explicará de forma detallada el funcionamiento de este sistema operativo, el proceso de arranque y su puesta en marcha, así como las principales distribuciones, aplicaciones y librerías disponibles para el desarrollo de aplicaciones. Esta y otra información recolectada durante más de tres años permite que la industria y la academia desarrollen aplicaciones comerciales utilizando herramientas de diseño modernas. + +\subsection{Contribuciones al desarrollo tecnológico en Colombia} + +Durante la realización de esta investigación se llevaron a cabo varias actividades, cuyo objetivo principal es contribuir al desarrollo tecnológico en Colombia, como se expuso anteriormente el país presenta serias dificultades en este campo y es deber de la comunidad académica nacional atacar los problemas locales. Por esta razón unoa de las matas del presente trabajo fué la creación de una plataforma hardware que permita implementar las diferentes modelos bio-inspirados. En la mayoría de estudios similares no se contempla la creación de estas plataformas ya que en los países donde se desarrollan la investigación existe una industria electrónica competitiva y que esta al tanto de los desarrollos tecnológicos a nivel mundial. Como se mencionó anteriormente este no es el caso de nuestro pais, en la mayoría de las industrias nacionales y en las facultades relacionadas con la electrónica se trabaja con tecnologías de hace 30 años (Familias 74 TTL y 40 CMOS) y se utilizan herramientas de programación de bajo nivel como el lenguaje ensamblador. + + A continuación se mestran una lista del trabajo realizado sobre algunas de las recomendaciones dadas por los estudios acerca del desarrollo tecnológico en Colombia; vale la pena anotar que no todas están dentro del alcance de este trabajo, se eligieron en las que se podía hacer un aporte significativo. + +\begin{enumerate} + + \item Realización de proyectos de aplicación: La primera decisión que se tomó en cuanto a la naturaleza de esta investigación fué la de generar una aplicación física real que validara los modelos propuestos, este trabajo no se limitará a realizar simulaciones, sino que se construirá una plataforma que sea tecnológicamente ``moderna'' y que esté al nivel de las plataformas utilizadas en estudios similares. Para esto se diseñó la primer \textit{Computadora en una sola placa} (SBC \footnote{Single Board Computer}) que utiliza un procesador de 32 Bits y utiliza Linux como sistema operativo. Adicionalmente, se crearon plataformas de desa + + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología: En las condiciones actuales no es posible que la industria electrónica del país se modernice por sí sola, es necesario que las Universidades doten al sistema productivo con profesionales que tengan habilidades especiales, siendo la más importante la capacidad de diseñar y construir dispositivos que puedan ser explotados comercialmente. En la actualidad, nuestros estudiantes se limitan a analizar y a simular la mayoría de los procesos, lo que es necesario pero no suficiente, el nivel de las implementaciones físicas que realizan en los últimos semestres de sus carreras es muy baja y un mínimo porcentaje llegan a un diseño de circuito Impreso. En la Sección \ref{academic} mostraremos los cambios introducidos en las asignaturas de la línea de Electrónica Digital y como estos generan las habilidades mencionadas anteriormente. + + \item El contacto con las empresas no debe ser encargada únicamente a los estudiantes, la Universidad debe desarrollar las competencias que la empresa requiere: Se realizó una investigación del estado actual de las empresas involucradas en el proceso de manufactura de dispositivos relacionados con la electrónica digital, se identificaron las empresas proveedoras de servicios con el fín de determinar que procesos se pueden realizar en el país, así mismo se identificaron algunas de las necesidades del sector productivo. En la sección \ref{industry} se muestra un ejemplo de creación de empresa con soporte de la Universidad, específicamente del presente trabajo. + + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial: Es importante el dialogo continuo entre todas las Universidades del país y la divulgación de sus investigaciones, en muchas ocasiones los escasos recursos económicos son utilizados para repetir temas de investigación, o sus resultados no son dados a conocer. Adicionalmente, los programas académicos de programas curriculares equivalentes presentan diferentes enfoques y diferentes niveles de excelencia, lo que impide el conocimiento de los trabajos realizados. + + \item Innovación curricular, actualización continua de profesionales: Durante el último año se introdujeron cambios en los contenidos de las asignaturas del área de sistemas digitales, estos cambios tienen como objetivo crear una metodología de diseño unificada que pueda ser utilizada en los tres cursos, del mismo modo se realizó una actualización tecnológica en cuanto al software y al hardware utilizado en estos cursos, se eliminó el uso de tecnologías viejas y se abrió el paso a tecnologías y metodología de diseño que se utilizan en cursos similares en Universidades de paises desarrollados. + + + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología: Se crearon alianzas con diferentes profesiones con el fín de crear condiciones de trabajo cercanas a las que se puedan encontrar en la industria, es importante para la situación del país que nuestros egresados sean capáces de crear nuevos productos que puedan satisfacer las necesidades de la industria local. Por esta razón durante este trabajo se dió un especial énfasis en el proceso de fabricación de dispositivos electrónicos. + +\end{enumerate} + + +\subsubsection{Contribuciones a Nivel Tecnológico y Académico} + +En este capítulo se realiza la presentación de la plataforma Hardware y Software utilizada en el desarrollo de esta investigación. Uno de los objetivos de este trabajo, es la creación de una plataforma Embebida que permita la apropiación de nuevas herramientas y metodologías de diseño. El mercado de los sistemas embebidos continúa en aumento y su campo de acción se ha extendido en casi todas las actividades humanas. Según BBC, inc. \footnote{http://www.bccresearch.com/} el mercado para el software embebido puede crecer de \$1.6 billones a \$3.5 billones en 2009, con una tasa de crecimiemto anual (AAGR) del 16\%, mientras la tasa de crecimiento para las tarjetas embebidas es del 10\%. (Favor ver Figura \ref{GESM}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_system_market} \end{center} +% \includegraphics[scale=.6]{./images/glob-emb-software-rev-regio} \end{center} + \caption{Mercado Global de Sistemas Embebidos 2003-2009. Fuente: BCC Inc.} \label{GESM} +\end{figure} + +Esto unido a: el gran nivel de integración obtenido por la industria de los semiconductores en los \textit{SOC}, la disponibilidad de herramientas software de desarrollo gratuitas (compiladores, simuladores, librerías, Sistemas Operativos) abre grandes posibilidades comerciales para paises en vía de desarrollo ya que no son necesarias grandes inversiones de capital para la implementación de estos sistemas. + +Más de un billón de dispositivos embebidos fueron vendidos en el 2004, según \textit{Venture Development Corporation (VDC)}. De acuerdo con VDC el porcentaje de dispositivos basados en Sistemas Operativos comerciales tiende a disminuir callendo del 43.1\% en 2001 a 37.1\% en 2004, esta tendencia se debe al aumento de complejidad de los dispositivos y a las necesidades de conexión (tales como Ethernet, bluetooth, WiFi, etc); además, la caida de precios del hardware, elimina la necesidad de eficiencia en el manejo de recursos proporcionada por muchos productos comerciales. Otro factor es el deseo de utilizar el mismo Sistema Operativo para varios proyectos. + +Recientes investigaciones de VDC sugieren que entre el 13 y el 15\% de los desarrolladores utilizan linux como su sistema operativo principal, y se espera que esta cifra aumente al madurar la tecnología y el soporte de los recursos de la comunidad aumenten. La figura \ref{os_trends} muestra una encuenta realizada a 932 desarrolladores de todo el mundo por \textit{linuxdevices} \footnote{http://www.linuxdevices.com} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_OS_sourcing_trends} \end{center} + \caption{Preferencia de Sistema Operativo para Sistemas Embebidos 2003-2007. Fuente: linuxdevices.} \label{os_trends} +\end{figure} + +La elección de Linux como herramienta de desarrollo esta fuertemente influenciada por su caracter libre, la gran disponibilidad de herramientas de desarrollo, aplicaciones, librerías y la posibilidad de modificar o adaptar código ya existente. + +El corazón de todo sistema embebido es su procesador, en la actualidad existen diversos fabricantes que ponen a disposición de los desarrolladores \textit{System On Chip} (SOC) que incluyen una gran variedad de periféricos que incluyen dispositivos de comunicación (UARTs, USB, Ethernet), interface con el humano (Controladores de: LCD, tarjetas de sonido, dispositivos touch screen), almacenamiento (memorias: RAM, SDRAM, SD, MMC). Al incluir la mayoría de los periféricos en el mismo Chip se reduce el espacio de la placa de circuito impreso (PCB) y se reduce la posibilidad de errores debido a interconexión y contrario a lo que se podría esperar, el costo de este SOC es muy bajo (en comparación con el costo de cada periférico por separado). La figura \ref{cpu_trends} muestra la preferencia de los desarrolladores encuestados por \textit{linuxdevices}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/embedded_processor_preference_history} \end{center} + \caption{Preferencia de CPU para Sistemas Embebidos 2004-2007. Fuente: linuxdevices.} \label{cpu_trends} +\end{figure} + +Como puede verse en la Figura \ref{cpu_trends} existe una clara preferencia entre los procesadores x86 y los procesadores ARM, siendo estos últimos los más populares en dispositivos de consumo como PDAs, Routers, teléfonos celulares, consolas de juego portátiles.\ref{cpu_trends} + + + +\section{Sistemas Embebidos} +Un Sistema Embebidos es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo el tamaño y costo del producto \cite{Wik} + +\subsection{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\subsection{Arquitectura} + +En la Figura \ref{es_arch} se muestra la arquitectura típica de un Sistema Embebido. La cual integra un componente hardware, implementado ya sea en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos. \footnote{http://www.sharpsma.com, http://www.atmel.com, http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. Este tipo de implementación es muy popular en los dispositivos de consumo masivo (Reproductores de MP3, consolas de juego, etc), debido a los grandes niveles de producción (del orden de millones de unidades) resulta más económico contar con un dispositivo que integre el mayor número de funcionalidades, esto disminuye el costo de componentes y reduce el área de circuito impreso. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado un SoC con la cantidad de periféricos requerida para una determinada aplicación, o con una funcionalidad específica, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha operación, en algunas ocaciones el periférico puede relizar funciones poco comúnes y no se proporciona comercialmente, la solución es entonces, implementar estas funcionalidades en una FPGA; también se recomienda la utilización de FPGAs en sistemas que requieren la utilización de la misma funcionalidad un gran número de veces (Puertos seriales, Pines de Entrada/Salida). Esta decisión esta atada al nivel de producción, ya que al incluir una FPGA aumenta el costo global del proyecto. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la longitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales, lo cual disminuye la máxima velocidad de funcionamiento. Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze y Picoblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + +\subsection{Metodología de Diseño} + +El proceso de diseño de un Sistema Embebido comienza con la {\textit{especificaci\'on del sistema}}, (ver Figura \ref{des_flow}), en este +punto se describe la funcionalidad y se definen las restricciones +f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy +general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de +ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La +especificaci\'on puede ser verificada a trav\'es de una serie de pasos de +an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos +seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los +resultados satisfacen las especificaciones. Desde el punto de vista de la +re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de +una librer\'{\i}a de algor\'{\i}tmos existentes. + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido \cite{Cor05}}\label{des_flow} +\end{figure} + + +Una vez definidas las especificaciones del sistema se debe realizar un +modelamiento que permita extraer de estas la funcionalidad. El modelamiento es +crucial en el diseño ya que de \'el depende el paso existoso de la +especificaci\'on a la implementaci\'on. Es importante definir que modelo +matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados +son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de +Eventos Discretos y Redes de Petri. Cada modelo posee propiedades +matem\'aticas que pueden explotarse de forma eficiente para responder +preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas +tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para +comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su +{\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su +inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de +diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una +funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, +confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas +del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos +opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un sistema + digital dedicado. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser +implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en +tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la +generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan +en SW y que tareas se implementan en HW recibe el nombre de +{\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de +restricciones econ\'omicas y temporales. + + +Las tareas Software deben compartir los recursos que existan en el sistema +(procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden +de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de +{\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir +informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del +sistema. + + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto +las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso +recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del +sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para +verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas +realimentaciones permiten depurar el resultado de pasos anteriores en el caso +de no cumplirse con las especificaciones iniciales. + + +\subsection{Herramientas Software de libre distribución \textit{GNU toolchain}} +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, +sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; +esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. Soporta los siguientes lenguajes: ADA, C, C++, Fortran, Java, Objective-C, Objective-C++ para las arquitecturas: Alpha, ARM, Atmel AVR, Blackfin, H8/300, System/370, System/390, IA-32 (x86) and x86-64, IA-64 i.e. the "Itanium", Motorola 68000, Motorola 88000, MIPS, PA-RISC, PDP-11, PowerPC, SuperH, SPARC, VAX, Renesas R8C/M16C/M32C, MorphoSys. + +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. + +\subsubsection{Librerías C} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +\subsubsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente de una aplicación hasta su implementación en la tarjeta de desarrollo. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Flujo de diseño SW utilizando la cadena de herramientas GNU}\label{toolchain_flow} +\end{figure} + +A continuación se realiza una breve descripción de los pasos necesarios para generar un ejecutable para un sistema embebido: + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de archivos de texto. + \item \textbf{Compilación:} Utilizando el compilador gcc se compila el código fuente; vala la pena mencionar que en este punto el compilador solo busca en los encabezados (\textit{headers}) de las librerías la definición de una determinada función, como por ejemplo el \textit{printf} en el archivo \textit{stdio.h}. Como resultado de este paso se obtiene un archivo tipo objeto. + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con las librerías, si una determinada función no es edfinida por ninguna de las librerías pasadas como parámetro al linker, este generará un error y no se generará el ejecutable. + \item Se define la posiciónes físicas de las secciones del ejecutable tipo ELF, esto se realiza a través de un link de enlazado el cual define de forma explícita su localización. + \end{enumerate} + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones es necesario extraer únicamente las secciones que residen en los medios de almacenamiento no volátil y eliminar las demás secciones del ejecutable. Esto se realiza con la herramiento \textit{objcopy}, la cual, permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como por ejemplo S19 e Intel Hex. + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma de desarrollo: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie o un adaptador de red. + +\end{enumerate} + + +\subsubsection{Make} +Como vimoas anteriormente es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola de comandos, es necesario escribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico durante la etapa de desarrollo. Para realizar este proceso de forma automática, se creó la herramienta make, la cual recibe como entrada un archivo que normalmente recibe el nombre de \textit{Makefile} o \textit{makefile}. La herramienta make ejecuta los comandos necesarios para realizar la compilación, depuración, o programación, indicados en el archivo \textit{Makefile} o \textit{makefile}. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente los compiladores de C (CC), de assembler (AS), el linker (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este caso \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador de C (CFLAGS) y al liniker (LDFLAGS) + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} esta es la forma de definir reglas y permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta el comando: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}}, estos reciben el nombre de dependencias y le indican a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}}, esto es: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o + at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{linker} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utilice 0 como símbolo para el inicio de ejecución. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. Esto se explicará con mayor detalle más adelante. + +\subsubsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + +se ve la asignación de esta variable. + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas: +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + +En Linux todas las variables no inicializadas, se inicializadan en cero. + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +Observamos que en el archivo se almacena la cadena de caracteres \textit{Printing \%d\\n} la cual no se modifica durante la ejecución del programa. + +\subsubsection{Linker Script} +Como vimos anteriormente, el \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, este \textit{linker} permite definir donde serán ubicados los diferentes segmentos del archivo ELF, por medio de un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria.Esto brinda un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga de guardar las secciones en el lugar indicado, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +En algunos procesadores (como el AT91RM9200) no se dispone de una memoria no volátil, por lo que es necesario que la aplicación sea cargada por completo en la RAM. Algunos desarrolladores prefieren almacenar y ejecutar sus aplicaciones en las memorias volátiles durante la etapa de desarrollo, debido a que la programación de las memorias no volátiles toman mucho más tiempo. Obviamente una vez finalizada la etapa de desarrollo las aplicaciones deben ser almacenadas en memorias no volátiles. + +\subsection{Herramientas hardware} +Como se mencionó anteriormente existen varias alternativas al momento de implementar un Sistema Embebido (ver Figura \ref{es_arch}). En este trabajo se utiliza una arquitectura compuesta por el SoC de Atmel el AT91RM9200 y una FPGA, teniendo en cuenta que esta pataforma tiene fines académicos es muy importante tener la posibilidad de crear tareas HW en un Dispositivo Lógico Programable (PLD). + +\subsubsection{SoC} +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. Dentro de los periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, SD/MMC + \item Puerto USB 2.0 host. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item 4 Puertos SPI. + \item 2 puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. A continuación se realizará una descripción de los diferentes periféricos que se encuentran disponibles en este SoC, indicando los que fueron utilizados en la plataforma de desarrollo. + +\subsubsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones del ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. La figura \ref{sdram_ecbot} muestra el diagrama de conexiones de una memoria de 32MB utilizada en la plataforma ECBOT. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/sdram_ecbot} \end{center} + \caption{Diagrama de conexiones de la memoria SDRAM de la plataforma ECBOT} \label{sdram_ecbot} +\end{figure} + +El SoC AT91RM9200 posee un periférico que es capáz de controlar la memoria SDRAM sin necesidad de lógica adicional. + +\subsubsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido; existen dos tipos de memoria las memorias NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y puedens er modificadas una vez instaladas en el circuito integrado. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los requeridos por las memorias RAM. + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits datos pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que permite reducir el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes se utilizan como memorias ROM. Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +El AT91RM9200 tiene un periférico que puede manejar una memoria flash NAND, sin embargo, no se utilizó en esta aplicación. En su lugar se utilizó una memoria \textit{DataFlash} de Atmel, este dispositivo básicamente es una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. La figura \ref{dataflash_ecbot} muestra el diagrama de conexiones de esta memoria. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/dataflash_ecbot} \end{center} + \caption{Conexiones de la memoria DataFlash de la plataforma ECBOT} \label{dataflash_ecbot} +\end{figure} + + +\subsubsection{Métodos de arranque} + +Como es obvio todo SoC debe ser programado para que pueda ejecutar una determinada tarea; este programa debe estar almacenado en una memoria no volátil y debe estar en el formato requerido por el procesador. Normalmente los SoCs proporcionan varios caminos (habilitando diferentes periféricos) para hacer esto. Un programa de inicialización \textit{(boot program)} contenido en una pequeña ROM del SoC se encarga de configurar, y revisar ciertos periféricos en búsqueda de un ejecutable, una vez lo encuentra, lo copia a la memoria RAM interna y lo ejecuta desde allí. No sobra mencionar que este ejecutable debe estar enlazado de tal forma que todas las secciones se encuentren en el espacio de la memoria RAM interna (0x0 después del REMAP \footnote{Los procesadores ARM pueden intercambiar el sitio de la memoria RAM interna y la memoria no volátil}). El AT91RM9200 posee una memoria interna SRAM de 16 kbytes. Después del reset esta memoria esta disponible en la posición 0x200000, después del remap esta memoria se puede acceder en la posición 0x0. Algunos fabricantes, en la etapa de producción graban en las memorias no volátiles las apliacaciones definitivas, y soldan en la placa de circuito impreso los dispoditivos programados, esto es muy conveniente cuando se trabaja con grandes cantidades ya que ahorra tiempo en el montaje de los dispositivos. + +El programa de inicialización del AT91RM9200 (se ejecuta si el pin BMS se encuentra en un valor lógico alto) busca una secuencia de 8 vectores de excepción ARM válidos en la DataFlash conectada al puerto SPI, en una EEPROM conectada a la interfaz I2C o en una memoria de 8 bits conectada a la interfaz de bus externo (EBI), estos vectores deben ser instrucciones LDR o Bbranch, menos la sexta instrucción (posición 14 a 17) que contiene información sobre el tamaño de la imágen (en bytes) a descargar y el tipo de dispositivo DataFlash. Si la secuencia es encontrada, el código es almacenado en la memoria SRAM interna y se realiza un remap (con lo que la memoria interna SRAM es accesible en la posición 0x0 ver Figura \ref{soc_boot_remap}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_remap} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_remap} +\end{figure} + +Si no se encuentra la secuencia de vectores ARM, se inicializa un programa que configura el puerto serial de depuración (DBGU) y el puerto USB Device. Quedando en espera de la descarga de una aplicación a través del protocolo DFU (Digital Firmware Upgrade) por el puerto USB o con el protocolo XMODEM en el puerto DBGU. La figura \ref{soc_boot_proc} muestra el diagrama de flujo del programa de inicialización del SoC AT91RM9200 + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_proc} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_proc} +\end{figure} + +El programa descargado a la memoria SRAM interna debe ser capaz de programar una memoria no volátil (La Flash DataFlash SPI para el ECBOT), debe proporcionar un canal de comunicación que permita descargar ejecutables más grandes, y debe inicializar el controlador de memoria SDRAM para que almacene temporalmente el ejecutable a grabar, esto es necesario ya que la memoria interna del AT91RM9200 solo es de 16kBytes. Más adelante hablaremos detalladamente de la aplicación que realiza estas funciones. + + +\subsection{Interfaz JTAG} +A mediados de los 1970s, la estructura de pruebas para tarjetas de circuito impreso (PCB, Printed Circuit Boards) se basaba en el uso de la técnica ``bed-of-nails''. Este método hacia uso de un dispositivo que contenía una serie de puntos de prueba, que permitían el acceso a dispositivos en la tarjeta a través de puntos de prueba colocados en la capa de cobre, o en otros puntos de contacto convenientes. Las pruebas se realizaban en dos fases: La prueba del circuito apagado y la prueba del circuito funcionando. Con la aparición de los dispositivos de montaje superficial se empezó a colocar dispositivos en las dos caras de la tarjeta, debido a que las dimensiones de los dispositivos de montaje superficial son muy pequeñas, se disminuyó la distancia física entre las interconexiones, dificultando el proceso de pruebas. + +A mediados de los 1980s un grupo de ingenieros de pruebas miembros de compañías electrónicas Europeas se reunieron para examinar el problema y buscar posibles soluciones. Este grupo se autodenominó JETAG (Joint European Test Action Group). El método de solución propuesto por ellos estaba basado en el concepto de un registro de corrimiento serial colocado alrededor de la frontera dispositivo, de aquí el nombre ?Boundary Scan?. Después el grupo se asoció a compañías norteamericanas y la ``E'' de ``European'' desapareció del nombre de la organización convirtiéndose en JTAG (Join Test Action Group). + +\subsubsection{Arquitectura BOUNDARY SCAN} +A cada señal de entrada o salida se le adiciona un elemento de memoria multi-propósito llamado ``Boundary Scan Cell'' (BSC). Las celdas conectadas a los pines de entrada reciben el nombre de ``Celdas de entrada'', y las que están conectadas a los pines de salida ``Celdas de salida''. En la Figura \ref{jtag_basics} se muestra esta arquitectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/jtag_basics} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_basics} +\end{figure} + +Las BSC se configuran en un registro de corrimiento de entrada y salida paralela. Una carga paralela de los registros (captura) ocasiona que los valores de las señales aplicadas a los pines del dispositivo pasen a las celdas de entrada y que opcionalmente los valores de las señales internas del dispositivo pasen a las celdas de salida. Una descarga paralela (Actualización) ocasiona que los valores presentes en las celdas de salida pasen a los pines del dispositivo, y opcionalmente los valores almacenados en las celdas de entrada pasen al interior del dispositivo. + +Los datos pueden ser corridos a través del registro de corrimiento, de forma serial, empezando por un pin dedicado TDI (Test Data In) y terminando en un pin de salida dedicado llamado TDO (Test Data Out). La señal de reloj se proporciona por un pin externo TCLK (Test Clock) y el modo de operación se controla por la señal TMS (Test Mode Select). Los elementos del Boundary Scan no afectan el funcionamiento del dispositivo. Y son independientes del núcleo lógico del mismo. + +\subsubsection{Instrucciones JTAG} +El Standard IEEE 1149.1 describe tres instrucciones obligatorias: Bypass, Sample/Preload, y Extest \cite{TI96}. + +\begin{itemize} + \item \textbf{BYPASS} Esta instrucción permite que el chip permanezca en un modo funcional, hace que el registro de Bypass se coloque entre TDI y TDO; permitiendo la transferencia serial de datos a través del circuito integrado desde TDI hacia TDO sin afectar la operación. La codificación en binario para esta instrucción debe ser con todos los bits en uno. + + \item \textbf{SAMPLE/PRELOAD} Esta instrucción selecciona el registro Boundary-Scan para colocarse entre los terminales TDI y TDO. Durante esta instrucción, el registro Boundary-Scan puede ser accesado a través de la operación Data Scan, para tomar una muestra de los datos de entrada y salida del chip. Esta instrucción también se utiliza para precargar los datos de prueba en el registro Boundary-Scan antes de ejecutar la instrucción EXTEST. La codificación de esta instrucción la define el fabricante. + + \item \textbf{EXTEST} Esta instrucción coloca al circuito integrado en modo de test externo (pruebas de la interconexión) y conecta el regsitro Boundary-Scan entre TDI y TDO. Las señales que salen del circuito son cargadas en el registro boundary-scan en el flanco de bajada de TCK en el estado Capture-DR; las señales de entrada al dispositivo son cargadas al registro boundary-scan durante el flanco de bajada de TCK en el estado Update-DR (ver Figura \ref{jtag_sm}) . La codificación para esta instrucción está definida con todos los bits en cero. + + \item \textbf{INTEST} La instrucción opcional INTEST también selecciona el registro boundary-scan, pero es utilizado para capturar las señales que salen del núcleo lógico del dispositivo, y para aplicar valores connocidos a las señales de entrada del núcleo. La codificación para esta señal es asignada por el diseñador. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/jtag_sm} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_sm} +\end{figure} + + + +\subsubsection{Depuración del core ARM \cite{DR05}} + +Todos los nucleos ARM7 y ARM9 poseen soporte de depuración en modo halt, lo que permite detener por competo el núcleo. Durante este estado es posible modificar y capturar las señales del núcleo, permitiendo cambiar y examinar el core y el estado del sistema. En este estado la fuente de reloj del core es el reloj de depuración (DCLK) que es generado por la lógica de depuración. Los núcleos ARM7 y ARM9 implementan un controlador compatible con JTAG, con dos cadena boundary-scan alrededor de las señales del core, una con las señales del core, para pruebas del dispositivo y la otra es un sub-set de la primera con señales importantes para la depuración. La Figura \ref{arm_scan1} muestra el orden de las señales en las cadenas para los núcleos ARM7TDMI y ARM9TDMI. Para popósitos de depuración es suficiente la cadena 1. Esta cadena puede ser utilizada en modo INTEST, permitiendo capturar las señales del core y aplicar vectores al mismo, o en modo EXTEST, permitiendo la salida y entrada de información hacia y desde exterior del core respectivamente. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan1} \end{center} + \caption{Cadena Boundary Scan 1} \label{arm_scan1} +\end{figure} +Las señales D[0:31] del ARM7TDMI están conectadas al bus de datos del núcleo y se utiliza para capturar instrucciones o lectura/escritura de información; la señal BREAKPT se utiliza para indicar que la instrucción debe ejecutarse a la velocidad del sistema, esto es, utilizando el reloj MCLK en lugar de DCLK. + +Las señales ID[0:31] del ARM9TDMI están conectadas al bus de instrucciones y se utilizan para capturar instrucciones, las señales DD[31:0] están conectadas al bus de dtaos bi-direccional y se utilizan para leer o escribir información. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan2} \end{center} + \caption{Cadena Boundary Scan 2 (Embedded ICE)} \label{arm_scan2} +\end{figure} + +Los ARM7 y ARM9 poseen un módulo ICE (In Circuit Emulator) que reemplaza el microcontrolador con una variación que posee facilidades para la depuración hardware. El emulador es conectado a un computador que ejecuta el software de depuración. Esto permite realizar depuración activa y pasiva, dando un punto de vista no intrusivo del flujo del programa. La Figura \ref{arm_scan2} muestra la cadena scan ICE, que es la misma para los núcleos ARM7 y ARM9, esta formada por 32 bits de datos, 5 bits de direcciones y un flag para diferenciar entre lectura (nRW bajo) y escritura. Se puede acceder a las características ICE a través de registros, cuya dirección es colocada en el bus de direcciones. + +El proyecto OPENOCD (Open On-Chip Debugger \footnote{http://openocd.berlios.de/web/}) permite la programación de la memoria flash interna de algunos procesadores ARM7TDMI, y la depuración de procesadores ARM7 y ARM9 utilizndo el módulo ICE. Este proyecto se ha convertido en el más popular dentro del grupo de desarrolladores de sistemas Embebidos. En \cite{DR05} se puede encontrar el funcionamiento interno de esta herramienta. + +\subsubsection{Programación de memorias Flash} +Algunos SoC no poseen programas de inicialización que permitan la descarga de aplicaciones ya sea a las memorias externas o a la interna, una solución podría ser utilizar el protocolo JTAG para cargar las aplicaciones en la RAM interna, sin embargo, existen procesadore en los que no se conocen las espcificaciones del ICE y en en otros este módulo no existe. En estos casos se utiliza la interfaz JTAG en modo EXTEST para controlar directamente las memorias conectadas a los SoCs. El proyecto UrJTAG, \footnote{http://urjtag.sourceforge.net/} permite la programación de diversas memorias flash, utilizando los pines del dispositivo. UrJTAG permite la creación de diferentes interfaces para conectarse con las memorias, estas interfaces reciben el nombre de buses y pueden ser creadas e incluidas en el código original de forma fácil. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION LINUX +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{El sistema Operativo Linux} +\textit{Hello everybody out there using minix - +I'm doing a (free) operating system (just a hobby, won't be big and +professional like gnu) for 386(486) AT clones. +} + +Con este mail enviado al foro de discusión comp.os.minix, Linus Torvalds, un estudiante de la Universidad de Helsinki en Finlandia introduce Linux el 25 de Agosto de 1991. A principios de los 90, el sistema operativo Unix (desarrollado en \textit{The Bell Labs} a principios de los 60s), tenía una solida posición en el mercado de servidores, y estaba muy bien posicionado en las Universidades, por lo tanto, un gran número de estudiantes trabajaban a diario con él y muchos de ellos deseaban poder utilizarlo en sus computadores personales, sin embargo, Unix era un producto comercial muy costoso. La +figura \ref{linuxhistory} muestra el desarrollo previo a la creación de la primera versión de linux hasta el día de hoy. Una de las características más importantes de Linux es que desde su creación, fue pensado como un sistema operativo gratuito y de libre distribución. Esta característica ha permitido que programadores a lo largo del mundo puedan manipular el código fuente para eliminar errores y para aumentar sus capacidades. + +Sin embargo, el crédito de las que conocemos hoy (Debian, Ubuntu, Suse, etc) no solo se debe a Torvalds, ya que linux es solo el kernel del sistema operativo. En 1983, Richard Stallman funda en proyecto GNU, el cual proporciona una parte esencial de los sistemas linux. A principios de los 90s, GNU había producido una serie de herramientas como librerías, compiladores, editores de texto, Shells, etc. Estas herramientas fueron utilizadas por Torvalds para escribir el elemento que le hacía falta al proyecto GNU para completar su sistema operativo: el kernel. + +Desde el lanzamiento de la primera versión de linux, cientos, miles, cientos de miles y millones de programadores se han puesto en la tarea de convertir a linux en un sistema operativo robusto, amigable y actualizado; tan pronto como se desarrolla una nueva pieza de hardware existen cientos de programadores trabajando en crear el soporte para linux. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/linuxhistory} \end{center} + \caption{Linux: Historia Fuente.}\label{linuxhistory} +\end{figure} + +\subsubsection{Porqué Linux} +Existen varias motivaciones para escoger Linux frente a un sistema oeprativo tradicional para sistemas embebidos \cite{KYJM+08}: + +\begin{itemize} + \item \textbf{Calidad Y confiabilidad del código}: Aunque estas medidas son subjetivas, miden el nivel de confianza en el código, que compromete software como el kernel y las aplicacione proporcionadas por las distribuciones. + \item \textbf{Disponibilidad de Código:} Todo el código fuente de las aplicaciones, del sistema operativo y de las herramientas de compilación se encuentran disponibles sin ninguna restricción. Existen varios tipos de licencias: la GNU General Public License (GPL). BSD (Berkeley Software Distribution), la cual permite la distribución de binarios sin el código fuente. + \item \textbf{Soporte de Hardware:} Linux soporta una gran variedad de dispositivos y plataformas, a pesar de que muchos fabricantes no proporcionan soporte para Linux, la comunidad trabaja arduamente en incluir el nuevo hardware en las nuevas distribuciones de Linux. Linux en la actualidad se puede ejecutar en docenas de diferentes arquitecturas hardware, lo cual lo convierte en el Sistema Operativo más portable. + \item \textbf{Protocolos de Comunicación y estándares de Software:} Linux proporciona muchos protocolos de comunicación, lo que permite su fácil integración a marcos de trabajo ya existentes. + \item \textbf{Disponibilidad de Herramientas:} La variedad de herramientas disponibles para Linux lo hacen muy versátil. Existen grandes comunidades como SourceForge\footnote{http://www.sourceforge.net} o Freshmeat \footnote{http://www.freshmeat.net} que permiten a miles de desrroladores compartir sus trabajos y es posible que en ellas se encuentre una aplicación que cumpla con sus necesidades. + \item \textbf{Soporte de la Comunidad:} Esta es la principal fortaleza de Linux. Millones de usuarios alrededor del mundo pueden encontrar errores en alguna aplicación y desarrolladores miembros de la cumonidad (en algunos casos los creadores de las aplicaciones) arreglarán este problema y difundirán su solución. El mejor sitio para hacer esto son las listas de correo de soporte y desarroll. + \item \textbf{Licencia:} Al crear una aplicación bajo alguna de las licencias usuales en Linux, no implica perder la porpiedad intelectual ni los derechos de autor la misma. + \item \textbf{Independencia del vendedor:} No existe solo un distribuidor del sistema operativo GNU-Linux, ya que las licencias de Linux garantizan igualdad a los distribuidores. Algunos vendedores poporcionan aplicaciones adicionales que no son libres y pro lo tanto no se encuentran disponibles con otros vendedores. Esto debe tenerse en cuenta en el momento de elegir la distribución a utilizar. + \item \textbf{Costo:} Muchas de las herramientas de deasrrollo y componentes de Linux son gratuitos, y no requieren el pago por ser incluidos en productos comerciales. +\end{itemize} + + +\subsection{Arquitectura de Linux \cite{IBSS98} \cite{IB98}} + +Linux (Linus' Minix) es un clon del sistema operativo Unix para PC con procesador Intel 386. Linux toma dos características muy importantes de Unix: es un sistema multitarea y multiusuario, lo cual fue implementado posteriormente por los sistemas operativos Windows y MacOS. Con estas características es posible ejecutar tareas de forma independiente, y transparente para el/los usuarios. + +Linux está compuesto por cinco sub-módulos \cite{IB98}: El programador (Scheduler), el manejador de memoria, el sistema de archivos virtual, la interfaz de red y la comunicación entre procesos (IPC). Tal como se ilustra en la figura \ref{linux_kernel}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.55]{./images/kernel} \end{center} + \caption{Estructura del kernel de linux }\label{linux_kernel} +\end{figure} + +Como puede observarse en la figura \ref{linux_kernel} el kernel de linux posee sub-módulos que son independientes de la arquitectura y otros que deben ser escritos para el procesador utilizado, esto hace que Linux sea un sistema operativo portable. En la actualidad existe una gran variedad de arquitecturas soportadas por linux, entre las que se encuentran: + +alpha arm26 frv i386 m32r m68knommu parisc ppc64 sh sparc um x86\_64 +arm cris h8300 ia64 m68k mips ppc s390 sh64 sparc64 v850 + +Las funciones de estos componentes se describen a continuación \cite{IBSS98}: + +\subsubsection*{Programador de procesos (Scheduler)} + +Es el corazón del sistema operativo linux. Esta encargado de realizar las siguientes tareas: +\begin{itemize} +\item Permitir a los procesos hacer copias de si mismos. +\item Determinar que procesos pueden acceder a la CPU y efectuar la transferencia entre los procesos en ejecución. +\item Recibir interrupciones y llevarlas al subsistema del kernel adecuado. +\item Enviar señales a los procesos de usuario. +\item Manejar el timer físico. +\item Liberar los recursos de los procesos, cuando estos finalizan su ejecución. +\end{itemize} + +El programador de procesos proporciona dos interfaces: Una limitada para los procesos de usuario y una interfaz amplia para el resto del kernel. El scheduler de Linux utiliza una interrupción del timer que se presenta cada 10 ms, por lo tanto, el cambio de estado del programador se realiza cada 10 ms. Esto debe ser tenido en cuenta a la hora de realizar procesos que manejen dispositivos hardware veloces. Un proceso puede estar en uno de los siguientes estados: + +\begin{itemize} +\item En ejecución. +\item Retornando de un llamado de sistema. +\item Procesando una rutina de interrupción. +\item Procesando un llamado del sistema. +\item Listo. +\item En espera. +\end{itemize} + + +\subsubsection*{Manejador de Memoria} + + +En el momento en que se energiza la CPU, esta solo ve 1-MB de memoria física (Incluyendo las ROMs). El código de inicialización del Sistema Operativo debe activar el modo protegido del procesador, de tal forma que la memoria Extendida (incluyendo la memoria de los dispositivos) sea accesible. Finalmente el OS habilita la memoria virtual para permitir la ilusión de un espacio de memoria de 4 GB. El manejador de memoria proporciona los siguientes servicios (ver figuras \ref{kernel_mapping} y \ref{app_mapping}): +\begin{itemize} +\item \textbf{Gran espacio de memoria}. Los procesos usuario, pueden referenciar más memoria que la existente físicamente. +\item \textbf{Protección} La memoria de un proceso es privada y no puede ser leída o modificada por + otro proceso. Adicionalmente evita que los procesos sobreescriban datos de solo + lectura. +\item \textbf{Mapeo de memoria} Los usuarios pueden mapear un archivo en un área de memoria virtual + y accesar el archivo como una memoria. +\item \textbf{Acceso transparente a la memoria física} esto asegura un buen desempeño del sistema. +\item \textbf{Memoria compartida} +\end{itemize} + +Al igual que el programador el manejador de memoria proporciona dos diferentes niveles de acceso a memoria el nivel de usuario y el de kernel. + +\begin{itemize} +\item Nivel de Usuario + \begin{itemize} + \item \textit{malloc() / free()}. Asigna o libera memoria para que sea utilizada por un proceso. + \item \textit{mmap() / munmap() / msync() /mremap()} Mapea archivos en regiones de memoria virtual. + \item \textit{mprotect} Cambia la protección sobre una región de una memoria virtual. + \item \textit{mlock() / mlockall() / munlock() / munlockall()} Rutinas que permiten al super + usuario prevenir el intercambio de memoria. + \item \textit{swapon() / swapoff()} Rutinas que le permiten al super-usuario agregar o eliminar + archivos swap en el sistema. + \end{itemize} +\item Nivel de kernel + \begin{itemize} + \item \textit{kmalloc() / kfree()} Asigna o libera memoria para que sea utilizada por estructuras de + datos del kernel. + \item \textit{verify\_area()} Verifica que una región de la memoria de usuario ha sido mapeada con + los permisos necesarios. + + \item \textit{get\_free\_page() / free\_page()} Asigna y libera páginas de memoria física. + \end{itemize} +\end{itemize} + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/kernel_memory_mapping} \end{center} + \caption{Mapeo de memoria del Kernel.}\label{kernel_mapping} +\end{figure} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/application_memory_mapping1} \end{center} + \caption{Mapeo de memoria para una aplicación}\label{app_mapping} +\end{figure} + + +\subsubsection*{Comunicación Entre Procesos (IPC)} + +El mecanismo IPC de Linux posibilita la ejecución \textit{concurrente} de procesos, permitiendo compartir recursos, la sincronización e intercambio de datos entre ellos. Linux proporciona los siguientes mecanismos: + +\begin{itemize} +\item \textbf{Señales} Mensajes asíncronos enviados a los procesos. +\item \textbf{Listas de espera} Proporciona mecanismos para colocar a dormir a los procesos mientras + esperan que una operación se complete, o un recurso se libere. +\item \textbf{Bloqueo de archivos} Permite a un proceso declarar una región de un archivo como solo + lectura para los demás procesos. +\item \textbf{Conductos (pipe)} Permite transferencias bi-direccionales entre dos procesos. +\item \textbf{System V} + \begin{itemize} + \item \textbf{Semáforos} Una implementación del modelo clásico del semáforo. + \item \textbf{Lista de Mensajes} Secuencia de bytes, con un tipo asociado, los mensajes son + escritos a una lista de mensajes y pueden obtenerse leyendo esta lista. + \item \textbf{Memoria Compartida} Mecanismo por medio del cual varios procesos tienen acceso a la + misma región de memoria física. + \end{itemize} +\item \textbf{Sockets del dominio Unix} Mecanismo de transferencia de datos orientada a la conexión. +\end{itemize} + + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + +\subsubsection*{Sistema de archivo virtual} +El sistema de archivos de linux cumple con las siguientes tareas: + +\begin{itemize} +\item \textbf{Controlar múltiples dispositivos hardware} +\item \textbf{Manejar sistemas de archivos lógicos} +\item \textbf{Soporta diferentes formatos ejecutables} Por ejemplo a.out, ELF, java) +\item \textbf{Homogeneidad} Proporciona una interfaz común a todos los dispositivos lógicos o físicos. +\item \textbf{Desempeño} +\item \textbf{Seguridad} +\item \textbf{Confiabilidad} +\end{itemize} + +\subsubsection{Drivers de Dispositivos} +La capa manejador de dispositivos es responsable de presentar una interfaz común a todos los dispositivos físicos. El kernel de Linux tiene 3 tipos de controladores de dispositivo: Caracter (acceso secuencial), bloque (acceso en múltiplos de tamaño de bloque) y red. Ejemplos de controladores secuenciales son el modem, el mouse; ejemplos de controladores tipo bloque son los dispositivos de almacenamiento masivo como discos duros, memorias SD. Los manejadores de dispositivos soportan las operaciones de archivo, y pueden ser tratados como tal. + +\subsubsection{Sistema de Archivos lógico} +Aunque es posible acceder a dispositivos físicos a través de un archivo de dispositivo, es común acceder a dispositivos tipo bloque utilizando un sistema de arcvhivos lógico, el que puede ser montado en un punto del sistema de archivos virtual. + +Para dar soporte al sistema de archivos virtual, Linux utiliza el concepto de \textit{inodes}. Linux usa un inode para representar un archivo sobre un dispositivo tipo bloque. El inode es virtual en el sentido que contiene operaciones que son implementadas diferentemente dependiendo de el sistema lógico y del sistema físico donde reside el archivo. La interfaz inode hace que todos los archivos se vean igual a otros subsistemas Linux. El inode se utiliza como una posición de almacenamiento para la información relacionada con un archivo abierto en el disco. El inode almacena los buffers asociados, la longitud total del archivo en bloques, y el mapeo entre el offset del archivo y los bloques del dispositivo. + +\subsubsection{Módulos} + +La mayor funcionalidad del sistema de archivos virtual se encuentra disponible en la forma de módulos cargados dinámicamente. Esta cconfiguración dinámica permite a los usuarios de Linux compilar un kernel tan pequeño como sea posible, mientras permite cargar el manejador del dispositivo y módulos del sistema de archivos si solo son necesarios durante una sesión. Esto es útil en el caso de los dispositivos que se pueden conectar en caliente, como por ejemplo un scanner, si tenemos el manejador del scanner cragado aún sin que este este conectado a nuestro equipo se esta desperdiciando la memoria asociada a dicho controlador. + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + + +\section{Portando Linux a la plataforma ECBOT y ECB\_AT91} +Como vimos anteriormente el kernel de Linux es el corazón del sistema operativo GNU/Linux y es el encargado de manejar directamente el Hardware asociado a una determinada plataforma, por lo tanto, es necesario que este sea capáz de manejar todos los periféricos asociados a esta y proporcione caminos para controlarlos. En esta sección se describirá el proceso que debe realizarse para hacer que Linux se ejecute de forma correcta en una plataforma y que permita controlar sus diferentes componentes hardware (este proceso recibe el nombre de \textit{Porting}). + +\subsection{El Kernel de Linux} +El código fuente se encuentra dividido entre el código específico a una arquitectura y el código común. El código específico de cada arquitectura lo encontramos en los subdirectorios \textit{arch} y \textit{include/asm-xxx}, en ellos podemos encuentrar los archivos para las arquitecturas: alpha, blackfin, h8300, m68k, parisc, s390, sparc, v850, arm, cris, ia64, m68knommu, powerpc, sh, sparc64, x86, +avr32, frv, m32r, mips, ppc, sh64, um, xtensa. A continuación se listan los directorios que hacen parte sdel código fuente de Linux. + +\begin{lstlisting} +arch fs lib net block +usr include crypto ipc scripts +Documentation mm security drivers kernel +sound +\end{lstlisting} + +Dentro de cada arquitectura soportada por Linux (\textit{arch/xxx/}) encontramos los siguientes directorios: +\begin{itemize} + \item \textbf{kernel} Código del núcleo del kernel. + \item \textbf{mm} Código para el manejo de memoria. + \item \textbf{lib} Librería de funciones internas, optimizadas para la arquitectura (backtrace, memcpy, funciones I/O, bit-twiddling etc); + \item \textbf{nwfpe} Implementaciones de punto flotante. + \item \textbf{boot} Sition donde reside la imágen del kernel una vez compilado, este directorio contiene herramientas para generar imágenes comprimidas. + \item \textbf{tools} Contiene scripts para la autogeneración de archivos, también contiene el archivo \textit{mach-types} que contiene la lista de las máquinas (plataformas) registradas. + \item \textbf{configs} Contiene el archivo de configuración para cada plataforma. +\end{itemize} + +Si deseamos dar soporte a una determinada plataforma debemos trabajar en el directorio que contiene la arquitectura del procesador a utilizar, en nuestro caso trabajaremos con la arquitectura \textit{arm}. En el código fuente de Linux se encuentran muchas plataformas que utilizan las diferentes architecturas, los archivos de configuración de estas pueden ser utilizados para crear una propia. En nuestro caso tomamos como referenica la plataforma \textit{Atmel AT91RM9200-EK} diseñada por ATMEL. Los archivos de configuración de esta plataforma se encuentra en: \textit{arch/arm/mach-at91/board-ek.c}; dentro de la arquitectura arm existen varias sub-arquitecturas que corresponden a las diferentes familias de SoC; El AT91RM9200 hace parte de la familia de SoCs AT91 de ATMEL. + +Existen dos formas en las que podemos adaptar nuestra plataforma al kernel de Linux, la primera es utilizando un archivo de configuración de una plataforma existente, y la otra es registrar la nuestra. Cada plataforma es identificada por un \textit{machine ID}, el primero paso en el proceso de \textit{port} es obter un ID, lo cuál se puede hacer en línea: \textit{http://www.arm.linux.org.uk/developer/machines/}, mientras que se asigna un nuevo número puede asignarse uno que no este utilizado en el archivo: \textit{arch/arm/tools/mach-types}. La entrada correspondiente a la familia de plataformas ECBACT91 es: + +\begin{lstlisting} +ecbat91 MACH_ECBAT91 ECBAT91 1072 +\end{lstlisting} + +Con este ID (o uno temporal) se debe crear la siguiente entrada en el archivo \textit{/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig}: + +\begin{lstlisting} +config MACH_ECBAT91 + bool "emQbit ECB_AT91 SBC" + depends on ARCH_AT91RM9200 + help + Select this if you are using emQbit's ECB_AT91 board. + +\end{lstlisting} + +La que permite seleccionar nuestra plataforma desde el programa de configuración de Linux\footnote{este programa se ejecuta con el comando: \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}}(Ver Figura \ref{ecb_at91_linux_config}) + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/ecb_at91_linux_config} \end{center} + \caption{Herramienta de configuración de Linux mostrando la plataforma ECB\_AT91}\label{ecb_at91_linux_config} +\end{figure} + +Al seleccionar nuestra plataforma el programa de configuración creará un archivo de configuración \textit{.config \footnote{los archivos que comienzan con ``.'' están ocultos}} localizado en la raíz del código fuente, este archivo refleja las selecciones realizadas para configurar la imagen del kernel; en este caso específico se agragará la línea: + +\begin{lstlisting} +CONFIG_MACH_ECBAT91=y +\end{lstlisting} + +Como veremos más adelante, la aplicación encargada de cargar la imágen del kernel de Linux le pasa a este el número de identificación de la plataforma, si este número no es el mismo que el kernel tiene registrado se generará un error, para evitar esto debemos incluir las siguientes líneas en el archivo \textit{arch/arm/boot/compressed/head-at91rm9200.S} + +\begin{lstlisting} + @ emQbit ECB_AT91 : 1072 + mov r3, #(MACH_TYPE_ECBAT91 & 0xff) + orr r3, r3, #(MACH_TYPE_ECBAT91 & 0xff00) + cmp r7, r3 + beq 99f +\end{lstlisting} + +El archivo \textit{/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile} contiene una relación entre la plataforma seleccionada y el archivo de compilación a utilizar, por lo que debemos incluir las siguientes líneas: + +\begin{lstlisting} +obj-$(CONFIG_MACH_ECBAT91) += board-ecbat91.o +\end{lstlisting} + +Con esto asignamos el archivo de configuración \textit{board-ecbat91.c} a la plataforma \textit{MACH\_ECBAT91}. + +\subsubsection{Archivo de configuración de la plataforma ECB\_AT91 } +En esta sección realizaremos una descripción del archivo de configuración de la familia de plataformas \textit{ECB\_AT91} (\textit{board-ecbat91.c}) y se hará una explicación de cada uno de los parámetros de este archivo. + +Como todo archivo escrito en C al comienzo se declaran los encabezados que contienen las funciones utilizadas, en nuestro caso: + +\begin{lstlisting}[numbers=left] +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "generic.h" +#include + +#include +\end{lstlisting} + +Cada arquitectura (CPU) posee un archivo donde se declaran los diferentes periféricos que pueden ser utilizados: \textit{arch/arm/mach-at91/at91rm9200\_devices.c} en el caso del procesador AT91RM9200; En él podemos encontrar soporte para: USB Host, USB Device, Ethernet, Compact Flash / PCMCIA, MMC / SD, NAND / SmartMedia, TWI (i2c), SPI, Timer/Counter blocks, RTC, Watchdog, SSC -- Synchronous Serial Controller, UART. Este archivo además proporciona funciones que permiten incluir y configurar los diferentes controladores asociados al SoC, adicionalmente realiza las operaciones necesarias para poder utilizarlo, como por ejemplo, definir que el control de un determinado pin este a cargo del periférico. + +El primer dispositivo declarado en el archivo de configuración es el puerto serial (UART), este puerto es vital ya que es el único medio de comunicación que tenemos con nuestra plataforma. + +\begin{lstlisting} +static struct at91_uart_config __initdata ecb_at91uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 0, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; +\end{lstlisting} + +Los parámetros de configuración de la \textit{UART} se declaran utilizando la estructura \textit{at91\_uart\_config} declarada en el archivo \textit{include/asm-arm/arch/board.h}, la variable \textit{console\_tty} define el número del dispositivo \textit{tty} asociado a la consola serial, \textit{ttyS0} en nuestro caso, la variable \textit{nr\_tty} define el número de interfaces seriales disponibles \footnote{El AT91RM9200 tiene 4 USARTS y una UART para depuración}, \textit{ttyS0} y \textit{ttyS1} en nuestro caso; \textit{tty\_map} realiza la correspondencia entre los dispositivos \textit{tty} y las UART disponibles en el SoC, para este ejemplo asocia \textit{ttyS0} a la \textit{UART4} y \textit{ttyS1} a la \textit{UART0} + +\begin{lstlisting} +static void __init ecb_at91map_io(void) +{ + /* Initialize processor: 18.432 MHz crystal */ + at91rm9200_initialize(18432000, AT91RM9200_PQFP); + + /* Setup the LEDs */ + at91_init_leds(AT91_PIN_PB20, AT91_PIN_PB20); + + /* Setup the serial ports and console */ + at91_init_serial(&ecb_at91uart_config); +} +\end{lstlisting} + +La función \textit{at91rm9200\_initialize} declarada en \textit{arch/arm/mach-at91/at91rm9200.c} se encarga, como su nombre lo indica, de inicializar el procesador AT91RM9200, específicamente se encarga de configurar, el reloj interno del procesador (con la función \textit{at91\_clock\_init}), registra los Osciladores configurables PCK0 a PCK3 (utilizando la función \textit{at91rm9200\_register\_clocks}) y finalmente habilita el soporte para los pines de entrada/salida de propósito general \textit{GPIOs} (utilizando la función \textit{at91\_gpio\_init}). Adicionalmente informa que se está utilizando el empaquetado TQFP208 (Este chip viene en dos versiones TQFP y BGA). + +Las plataforma que carecen de un dispositivo de visualización como una pantalla, reflejan la actividad de procesos importantes en el estado de diodos emisores de luz LEDs, Linux permite visualizar la actividad de la CPU y el estado de un timer interno (\textit{at91\_init\_leds( cpu\_led, timer\_led)}). Nuestra plataforma utiliza un LED conectado al pin PB20 para estas indicaciones. + +La función \textit{at91\_init\_serial(\&ecb\_at91uart\_config)}, como su nombre lo indica inicializa las interfaces seriales utilizando como configuración la estructura \textit{at91\_init\_serial} explicada anteriormente. + +\begin{lstlisting} +static void __init ecb_at91init_irq(void) +{ + at91rm9200_init_interrupts(NULL); +} +\end{lstlisting} + +La función \textit{at91rm9200\_init\_interrupts} inicializa el Controlador de Interrupciones del AT91RM9200 y permite que estas sean atendidas. + +\begin{lstlisting} +static struct at91_usbh_data __initdata ecb_at91usbh_data = { + .ports = 1, +}; +\end{lstlisting} + +La estructra \textit{at91\_usbh\_data} fija el número de puertos USB host a 1 (El encapsulado TQFP solo tiene un puerto USB host, la versión BGA tiene 2). + +\begin{lstlisting} +static struct at91_mmc_data __initdata ecb_at91mmc_data = { + .slot_b = 0, + .wire4 = 1, +}; +\end{lstlisting} + +El SoC AT91RM9200 puede manejar dos memorias SD, la variable \textit{slot\_b} determina cual se usa, el slot a en nuestro caso; la variable \textit{wire4} selecciona el número de líneas de datos entre 1 y 4 (\textit{wire4 = 1}). + +\begin{lstlisting} +#if defined(CONFIG_MTD_DATAFLASH) +static struct mtd_partition __initdata my_flash0_partitions[] = +{ + { + .name = "Darrel-loader", / 0x0 + .offset = 0, + .size = 12* 1056, // 12672 bytes + }, + { + .name = "uboot", // 0x3180 + .offset = MTDPART_OFS_NXTBLK, + .size = 118 * 1056, + }, + { + .name = "kernel", // 0x21840 + .offset = MTDPART_OFS_NXTBLK, + .size = 1534 * 1056, /* 1619904 bytes */ + }, + { + .name = "filesystem", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL, + } +}; + +static struct flash_platform_data __initdata my_flash0_platform = { + .name = "Removable flash card", + .parts = my_flash0_partitions, + .nr_parts = ARRAY_SIZE(my_flash0_partitions) +}; +#endif +\end{lstlisting} + +Muchos dispositivos flash están divididos en secciones que reciben el nombre de particiones, similares a las particiones encontradas en un disco duro. El subsistema MTD proporciona soporte para estas particiones Flash, si esta función es seleccionada con la herramienta de configuración del kernel (CONFIG\_MTD\_DATAFLASH = y). La familia de plataformas ECB\_AT91 tiene un dispositivo DataFlash serial de 16 Mbits (2Mbytes), en la que creamos 4 particiones, en las que se almacenarán el loader, el u-boot, la imagen del kernel, y el sistema de archivos (En el dispositivo flash actual no hay suficiente espacio para este último). Cada partición se define con una estructura \textit{mtd\_partition} formada por 3 variables: \textit{name}, \textit{offset} (Dirección inicial de la partición) y .\textit{size}. + +\begin{lstlisting} + +static struct spi_board_info __initdata ecb_at91spi_devices[] = { + { /* DataFlash chip */ + .modalias = "mtd_dataflash", + .chip_select = 0, + .max_speed_hz = 10 * 1000 * 1000, + .bus_num = 0, + .platform_data = &my_flash0_platform, + }, + { /* User accessable spi - cs1 (250KHz) */ + .modalias = "spi-cs1", + .chip_select = 1, + .max_speed_hz = 250 * 1000, + }, + { /* User accessable spi - cs2 (1MHz) */ + .modalias = "spi-cs2", + .chip_select = 2, + .max_speed_hz = 1 * 1000 * 1000, + }, + { /* User accessable spi - cs3 (10MHz) */ + .modalias = "spi-cs3", + .chip_select = 3, + .max_speed_hz = 10 * 1000 * 1000, + }, +}; +\end{lstlisting} + +La estructura \textit{spi\_board\_info} define los dispositivos SPI conectados al SoC, esta formada por la variable \textit{modalias}, \textit{chip\_select} y \textit{max\_speed\_hz}. Nuestro dispositivo DataFlash se controla utilizando un puerto SPI, por esto se define la variable \textit{platform\_data = \&my\_flash0\_platform} + +\begin{lstlisting} +static void __init ecb_at91board_init(void) +{ + /* Serial */ + at91_add_device_serial(); + + /* USB Host */ + at91_add_device_usbh(&ecb_at91usbh_data); + + /* I2C */ + at91_add_device_i2c(NULL, 0); + + /* MMC */ + at91_add_device_mmc(0, &ecb_at91mmc_data); + + /* SPI */ + at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices)); + + /* Programmable Clock 1*/ + at91_set_B_periph(AT91_PIN_PA4, 0); +} +\end{lstlisting} + +Una vez configurados los periféricos utilizados en la plataforma debemos agregar estos dispositos, con las funciones correspondientes \textit{at91\_add\_device\_(serial, usbh, i2c, mmc, spi) } estas funciones hacen un llamado a la función \textit{platform\_device\_register} la que adiciona el dispositivo a nivel de plataforma. + +\begin{lstlisting} +MACHINE_START(ECBAT91, "emQbit's ECB_AT91") + /* Maintainer: emQbit.com */ + .phys_io = AT91_BASE_SYS, + .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, + .boot_params = AT91_SDRAM_BASE + 0x100, + .timer = &at91rm9200_timer, + .map_io = ecb_at91map_io, + .init_irq = ecb_at91init_irq, + .init_machine = ecb_at91board_init, +MACHINE_END\end{lstlisting} + +\subsubsection{Archivo de Configuración del kernel} +Finalmente debemos incluir un archivo de configuración para el kernel (\textit{arch/arm/configs/ecbat91\_defconfig}) el cual contiene la configuración inicial que cnfigura de forma correcta todos los periféricos de la plataforma. + +\subsection{Imagen del kernel} +En esta sección se realizará una descripción de los pasos necesarios para compilar la imágen del kernel de Linux para la familia de plataforma ECB\_AT91; después, se realizará un análisis de la imagen, indicando su composición. + +\subsubsection{Compilación de la Imágen del kernel} +En la sección anetrior vimos como dar soporte a nuestra plataforma, en esta sección describiremos el proceso de creación de la imágen del kernel. El primer paso obvio es obtener la imágen del kernel, la que obtenemos del sitio oficial \textit{ftp.kernel.org} + +\begin{lstlisting} +wget http://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.4.tar.bz2 +tar xjf linux-2.6.24.4.tar.bz2 +cd linux-2.6.24.4 +\end{lstlisting} + +A continuación descargargamos un parche que mantienen los desarrolladores de la familia de SoCs de ATMEL, este parche modifica algunos archivos de la distribución oficial de Linux para dar sopote completo y actualizado a los procesadores ATMEL. + +\begin{lstlisting} +wget http://maxim.org.za/AT91RM9200/2.6/2.6.24-at91.patch.gz +zcat 2.6.24-at91.patch.gz | patch -p1 +\end{lstlisting} + +Los cambios que se deben realizar en el código fuente, mencionados anteriormente fueron enviados a los encargados de mantener estas actualizaciones, por lo que no es necesario modificarlos para dar soporte a la familia de plataformas ECB\_AT91. + +Finalmente debemos compilar el kernel utilizando la cadena de herramientas GNU, el resultado de este tipo de compilaciones son ejecutables para una arquitectura ARM, este proceso recibe el nombre de compilación cruzada, debido a que da como resultado archivos que se ejecutan en una arquitectura diferente (ARM) a la que realizó el proceso de compilación (X86 en nuestro caso). Lo primero que debemos hacer es hacer visibles los ejecutables de la cadena de herramientas, esto se hace adicionando la ruta donde se encuentran instalados a la variable de entorno \textit{PATH}. + +\begin{lstlisting} +export export PATH=$PATH:/home/at91/arm-2007q1/bin/ +alias crossmake='make ARCH=arm CROSS_COMPILE=arm-none-eabi-' +\end{lstlisting} + +El alias \textit{crossmake} hace que cada vez que se escriba esta palabra el sistema lo reemplaze por \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}, lo que ahorra tiempo al momento de pasar los parámetros a la herramienta make; estos parámetros son: + +\begin{enumerate} + \item \textit{ARCH=arm} Define la arquitectura \textit{arm}. + \item \textit{CROSS\_COMPILE=arm-none-eabi-} Indica que se realizará una compilación cruzada y que los ejecutables de la cadena de herramientas (\textit{gcc, c++, ld, objcopy, etc}) comienzan con el prefijo \textit{arm-none-eabi-} (por lo que el nombre del ejecutable del compilador de c es arm-none-eabi-gcc) +\end{enumerate} + +Una vez declaradas estas variables de entorno debemos generar el archivo oculto \textit{.config} \footnote{este archivo es utilizado por las herramientas de compilación para determinar que soporte fué incluido en el kernel} ejecutando el siguiente comando: + +\begin{lstlisting} + crossmake ecbat91_defconfig + o + make ARCH=arm CROSS_COMPILE=arm-none-eabi- ecbat91_defconfig +\end{lstlisting} + +A continuación se muestra una sección de este archivo: +\begin{lstlisting} +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.24.4 +# Sat Jul 25 11:39:07 2009 +# +CONFIG_ARM=y +..... +# +# AT91RM9200 Board Type +# +CONFIG_MACH_ECBAT91=y +..... +CONFIG_AEABI=y +..... +\end{lstlisting} + +Finalmente damos incio al proceso de compilación: + +\begin{lstlisting} + crossmake -j2 (o make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j2) +\end{lstlisting} + +Si no ocurre ningún error, al finalizar debemos observar lo siguiente: + +\begin{lstlisting} + LD vmlinux + SYSMAP System.map + SYSMAP .tmp_System.map + OBJCOPY arch/arm/boot/Image + Building modules, stage 2. + MODPOST 1 modules + Kernel: arch/arm/boot/Image is ready + AS arch/arm/boot/compressed/head.o + CC drivers/scsi/scsi_wait_scan.mod.o + GZIP arch/arm/boot/compressed/piggy.gz + LD [M] drivers/scsi/scsi_wait_scan.ko + CC arch/arm/boot/compressed/misc.o + AS arch/arm/boot/compressed/head-at91rm9200.o + AS arch/arm/boot/compressed/piggy.o + LD arch/arm/boot/compressed/vmlinux + OBJCOPY arch/arm/boot/zImage + Kernel: arch/arm/boot/zImage is ready +\end{lstlisting} + +y el contenido de los siguientes ditrectorios debe ser algo como: + +\begin{lstlisting} +$ ls arch/arm/boot/ +bootp compressed Image install.sh Makefile zImage + +$ ls vmlinux* +vmlinux vmlinux.o +\end{lstlisting} + +\subsubsection{Componentes de la Imágen del kernel} + +Como nuestro insterés en este punto es entender la estructura de la imágen del kernel podemos indicarle a nuestra herramienta de compilación que nos muestre más información del proceso, ejecutando el comando: + + +\begin{lstlisting} + crossmake -j2 V=1 +\end{lstlisting} + +Al finalizar el proceso de compilación obtenemos: + +\begin{lstlisting} +arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds + arch/arm/kernel/head.o arch/arm/kernel/init_task.o \ + init/built-in.o \ +--start-group \ + usr/built-in.o arch/arm/kernel/built-in.o \ + arch/arm/mm/built-in.o arch/arm/common/built-in.o \ + arch/arm/mach-at91/built-in.o arch/arm/nwfpe/built-in.o \ + kernel/built-in.o mm/built-in.o \ + fs/built-in.o ipc/built-in.o \ + security/built-in.o crypto/built-in.o \ + block/built-in.o arch/arm/lib/lib.a \ + lib/lib.a arch/arm/lib/built-in.o \ + lib/built-in.o drivers/built-in.o \ + sound/built-in.o net/built-in.o \ +--end-group \ +.tmp_kallsyms2.o + +\end{lstlisting} + + +En la primera línea de el listado anterior (\textit{arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds}) se realiza el proceso de enlace del archivo \textit{vmlinux}, utilizando el script de enlace \textit{vmlinux.lds}, incluyendo los objetos (archivos \textit{.o} indicados en la lista. Nótese que el primer archivo enlazado es \textit{head.o}, el cual se genera a partir de \textit{arch/arm/kernel/head.S}, y contiene rutinas de inicialización del kernel. Este proceso se explicará detalladamente más adelante. El siguiente objeto es \textit{init\_task.o}, el cual establece estructuras de datos e hilos que utilizará el kernel. A continuación se enlazan una serie de objetos con el nombre \textit{built-in.o}, la ruta del archivo indica la función que realiza el objeto, por ejemplo el objeto \textit{arch/arm/mm/built-in.o} realiza operaciones de manejo de memoria específicas a la arquitectura arm. En la Figura \ref{vmlinux_contents} se muestran los componentes de la imágen vmlinux y un tamaño de una compilación en particular que nos da una idea de la relación de tamaños. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/vmlinux_contents} \end{center} + \caption{Componentes de la Imagén del kernel de Linux vmlinux}\label{vmlinux_contents} +\end{figure} + +A continuación se realiza la descripción de los componentes de la imágen del kernel \textit{vmlinux}\cite{CH06} + + +\begin{enumerate} +\item \textbf{arch/arm/kernel/head.o} Código de inicialización del kernel dependiente de la arquitectura. +\item \textbf{init\_task.o} Hilos y estructuras inicialies utilizadas por el kernel. +\item \textbf{init/built-in.o} Código de inicialización del kernel. +\item \textbf{usr/built-in.o} Imágen interna \textit{initramfs}. +\item \textbf{arch/arm/kernel/built-in.o} Código del kernel específico de la arquitectura. +\item \textbf{arch/arm/mm/built-in.o} Código de manejo de memoria específico de la arquitectura. +\item \textbf{arch/arm/common/built-in.o} Código genérico especifico de la arquitectura. +\item \textbf{arch/arm/mach-at91/built-in.o} Código de inicialización específico de la plataforma. +\item \textbf{arch/arm/nwfpe/built-in.o} Emulación de punto flotánte específico de la arquitectura. +\item \textbf{kernel/built-in.o} Código de componentes comúnes del kernel. +\item \textbf{mm/built-in.o} Código de componentes comúnes de manejo de memoria. +\item \textbf{ipc/built-in.o} Comunicación Interproceso. +\item \textbf{security/built-in.o} Componentes de seguridad de Linux. +\item \textbf{lib/lib.a} Diferentes funciones auxiliares. +\item \textbf{arch/arm/lib/lib.a} Diferentes funciones auxiliares, específico de la aquitectura. +\item \textbf{lib/built-in.o} Funciones auxiliares comunes del kernel. +\item \textbf{drivers/built-in.o} Drivers internos o drivers no cargables. +\item \textbf{sound/built-in.o} Drivers de sonido. +\item \textbf{net/built-in.o} Red de Linux. +\item \textbf{.tmp\_kallsyms2.o} Tabla de símbolos. +\end{enumerate} + + +La imágen \textit{vmlinux} generada tiene un tamaño relativamente grande lo que la hace inconveniente para ser almacenada en un dispositivo Flash, por esta razón se acostrumbra comprimirla. A continuación describiremos el proceso que se realiza para crear una imágen compatible con \textit{u-boot}, el cargador de Linux más utilizado para las plataformas embebidas. El primer paso para es reducir el tamaño del ejecutable ELF \textit{vmlinux} es eliminar la información de depuración (notas y comentarios). + +\begin{lstlisting} +$ crossmake -j3 vmlinux (4.4MBytes) +$ arm-none-eabi-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin (3.4MBytes) +$ gzip -c -9 linux.bin > linux.bin.gz (1.6M) +\end{lstlisting} + +A continuación se comprime el archivo resultante utilizando la herramienta \textit{gzip}, como resultado obtenemos un archivo de 1.6M, la tercera parte del archivo original. + +\section{Inicialización del kernel} +Como se mencionó anteriormente, el SoC AT91RM9200, posee un programa residente en una pequeña ROM interna que revisa los controladores de memorias flash en busca de un programa válido. En la familia de plataforma ECB\_AT91 se utiliza la memoria DataFlash para almacenar: el bootloader, el loader de Linux (u-boot) y la imagen del kernel. La Figura \ref{boot_process} indica la secuencia de ejecución de aplicaciones cuando se energiza nuestra plataforma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/boot_process} \end{center} + \caption{Flujo de ejecución en la inicialización de plataforma ECB\_AT91}\label{boot_process} +\end{figure} + +La primera aplicación en ejecutarse es el loader de Darrel \footnote{Originalmente creado por Darrel Harmon: http://dlharmon.com/}. Debido a que la RAM interna del AT91RM9200 es de tan solo 16kBytes, es necesario utilizar otra aplicación para poder cargar el loader de Linux U-boot en la memoria SDRAM externa (con capacida de de 32Mbytes). Recordemos que incialmente el SoC no posee ninguna aplicación válida en la memoria DataFlash, por lo que el programa interno de inicialización dara comienzo a una comunicación Xmodem, para que se descargue una aplicación a la memoria RAM interna utilizando el puerto de depuración serial a una velocidad de 115200 baudios. + + +\subsection{Darrel's Loader} +Esta aplicación permite configurar la memoria externa SDRAM, configurar el puerto serie, implementar un protocolo xmodem que permita transferir aplicaciones a la memoria SDRAM, controlar la memoria DataFlash y almacenar aplicaciones en ella. El loader de Darrel está basado en u-boot, es una versión reducida de este y permite únicamente las operaciones mencioandas anteriormente, lo que resulta en un archivo adecuado para ser almacenado en la memoria RAM interna (9.3 kBytes). + +Es interesante analizar esta aplicación, ya que esta se ejecuta sin ningún soporte de sistema operativo, lo que lo hace interesante para plataformas en las que no se puede ejecutar Linux. Su código fuente lo podemos descargar utilizando el siguiente comando: + +\begin{lstlisting} +$svn co http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/darrell-loader/ +\end{lstlisting} + +La estructura del código fuente se muestra en el siguiente listado: +\begin{lstlisting} +|-- include +| |-- asm +| | |-- arch +| | |-- proc +| | `-- proc-armv +| `-- linux +| |-- byteorder +| `-- mtd +`-- src +\end{lstlisting} + +Antes de estudiar el código fuente demos un vistazo al archivo \textit{Makefile} para ver el proceso de compilación. De ella podemos extraer las partes más interesantes: Los objetos que hacen parte del ejecutable, el proceso de enlazado, y la creación del archivo a descargar en la plataforma: + +\begin{lstlisting} +AOBJS = src/start.o //ASSEMBLER OBJECTS +COBJS = src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +LDSCRIPT := u-boot.lds +LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) +OBJCFLAGS += --gap-fill=0xff +TEXT_BASE = 0x00000000 + +loader: $(AOBJS) $(COBJS) $(LDSCRIPT) + $(LD) $(LDFLAGS) $(AOBJS) $(COBJS) \ + --start-group $(PLATFORM_LIBS) --end-group \ + -Map loader.map -o loader + +loader.bin: loader + $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ +\end{lstlisting} + +Como podemos observar, esta aplicación esta compuesta por el código en ensamblador \textit{src/start.S} y el código en C \textit{src/board.c src/serial.c src/xmodem.c src/dataflash.c src/div0.c src/interrupts.c}. Para generar el ejecutable \textit{loader} (en formato ELF), encadenamos los objetos AOBJS y COBJS utilizando el script de enlazado \textit{u-boot.lds}. A continuación se muestra el comando ejecutado por las herramientas de compilación al crear el ejecutable \textit{loader} + +\begin{lstlisting} +arm-elf-ld -Bstatic -T u-boot.lds -Ttext 0x00000000 +src/start.o src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +--start-group +--no-warn-mismatch -L /home/at91/gnutools/arm-elf/bin/../lib/gcc-lib/arm-elf/3.2.1 -lgcc +--end-group -Map loader.map +-o loader +\end{lstlisting} + + +A continuación se muestra el contenido del archivo \textit{u-boot.lds} +\begin{lstlisting} + OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + . = ALIGN(4); + .text : + { + src/start.o (.text) + *(.text) + } + + . = ALIGN(4); + .rodata : { *(.rodata) } + + . = ALIGN(4); + .data : { *(.data) } + + . = ALIGN(4); + .got : { *(.got) } + + . = ALIGN(4); + __bss_start = .; + .bss : { *(.bss) } + _end = .; +} +\end{lstlisting} + +Este archivo indica que la primera dirección del ejecutable es la 0x0 y que la primera instrucción en ejecutarse (definida por \textit{ENTRY}) se encuentra en el símbolo \textit{\_start} definida en el archivo \textit{start.S}; por otro lado, este script de enlazado nos informa que las secciones \textit{.text} \textit{.rodata} \textit{.data} \textit{.got} y \textit{.bss} serán incluidas en el ejecutable y se encuentran en la misma región de memoria (lo que era de esperarse ya que solo tenemos la memoria interna RAM). + +\subsubsection{crt0.S (startup.S)} +Cuando se crea un ejecutable para ser utilizado en una plataforma específica, es necesario incluir el archivo \textit{crt0.S (C runtime startup code)}. Este archivo contiene el punto de entrada \textit{\_start} y está encargado de las siguientes funciones: + +\begin{enumerate} + \item Inicilización de las pilas (\textit{stacks}). + \item Copiar el contenido de la sección \textit{.data} (datos inicializados) de la memoria no volátil. + \item Inicializar la sección \textit{.bss} + \item Hacer el llamado al punto de entrada \textit{main} ( \textit{start\_armboot} para el Darrel's loader) +\end{enumerate} + +Y esta compuesto por: +\begin{enumerate} +\item \textbf{\_vectors} Tabla de vectores de excepciones. Deben estar colocados en la dirección 0x0000. +\item \textbf{reset\_handler} Esta función maneja el reset , y es el punto de entrada principal de un ejecutable. Realiza operaciones de inicialización específica de la arquitectura. +\item \textbf{undef\_handler} Es el manejador de las instrucciones no definidas. +\item \textbf{swi\_handler} Manejador de las interrupciones software. +\item \textbf{pabort\_handler} Manejador de las excepciones \textit{prefetch abort}. +\item \textbf{dabort\_handler} Manejador de las excepciones \textit{data abort}. +\item \textbf{irq\_handler} Manejador de las IRQ (Interrupt Request). +\item \textbf{fiq\_handler} Manejador de las FIQ (Fast Iterrupt Request). +\end{enumerate} + +El archivo \textit{crt0.S} es escrito en languaje ensamblador, y es fuertemente dependiente de la arquitectura, solo programadores expertos con un muy buen conocimiento de la arquitectura podrían escribirlo; sin embargo, los fabricantes proporcionan ejemplos de este tipo de archivos para que pueden ser utilizados sin tener que estudiar profundamente la arquitectura y el lenguaje ensamblador de la misma. + +Una vez se han ejecutado las operaciones mendionadas anteriormente se hace un llamado al punto de entrada \textit{start\_armboot} (\textit{ldr pc,\_start\_armboot}) + +\subsubsection{serial.c, xmpdem.c, dataflash.c, div0.c, interrupts.c} +A continuación se realiza una descripción de los archivos que hacen parte del loader de Darrel: +\begin{itemize} + \item \textbf{serial.c}: Inicializa y configura el puerto serial de depuración (DBGU) a uan velocidad ed 115200 baudios, 8 bits de datos, paridad, par. Adicionalmente proporciona las funciones: + \begin{itemize} + \item \textit{putc}: Transmite un caracter por la interfaz serial de depuración. + \item \textit{puts}: Transmite una cadena de caracteres. + \item \textit{getc}: Recibe un caracter por la interfaz serial de depuración. + \end{itemize} + \item \textbf{xmodem.c}: Implementa la recepción serial utilizando elprotocolo xmodem. + \item \textbf{dataflash.c}: Inicializa el puerto SPI, y proporciona funciones de alto nivel para la escritura de la DataFlash. + \begin{itemize} + \item \textit{write\_dataflash(addr\_dest, addr\_src, size)} + \end{itemize} + + \item \textbf{div0.c}: Remplazo (dummy) del manejador división por cero de GNU/Linux. + \item \textbf{interrupts.c}: Proporciona funciones para el manejo de interrupciones e implementación de retardos. +\end{itemize} + +\subsubsection{board.c} +El archivo \textit{board.c} proporciona el punto de entrada \textit{start\_armboot} y realiza las siguientes operaciones: + +\begin{itemize} + \item Configuración del Controlador de manejo de potencia (PMC). + \item Hace un llamado a la incialización del puerto serie de depuración \textit{serial\_init()} + \item Configura la SDRAM externa \textit{try\_configure\_sdram} + \item Despliega un menú de funciones. + \item Realiza las operaciones del menú. +\end{itemize} + +Una vez se carga el archivo loader.bin, el que resulta de quitarle al archivo ELF la información de depuración y notas: + +\begin{lstlisting} +/home/at91/gnutools/arm-elf/bin/arm-elf-objcopy --gap-fill=0xff -O binary loader loader.bin +\end{lstlisting} + +El programa desplegará el siguiente menú: + +\begin{lstlisting} +Darrell's loader - Thanks to the u-boot project +Version 1.0. Build Jul 29 2007 12:04:04 +RAM:32MB + +1: Upload Darrell's loader to Dataflash +2: Upload u-boot to Dataflash +3: Upload Kernel to Dataflash +4: Start u-boot +5: Upload Filesystem image +6: Memory test +\end{lstlisting} + +La opción 1. del menú permite almacenar el archivo \textit{loader.bin} en la memoria DataFlash, una vez hecho esto, el programa de inicialización almacenado en la memoria ROM interna lo ejecutará cada vez que se reinicie la plataforma. + +Las opciones 2 y 3 son similares a la 1, solo que se cargan las aplicaciones en diferentes direcciones de memoria, observemos el código fuente que implementa estas opciones: + +\begin{lstlisting} + else if(key == '2'){ + puts("Please transfer u-boot.bin via Xmodem\n\0"); + len = rxmodem((char *)0x20000000); + AT91F_DataflashInit (); + dataflash_print_info (); + if(write_dataflash(DATAFLASH_UBOOT_BASE, 0x20000000, len)) + puts("Dataflash write successful\n"); + dispmenu = 1; + } +\end{lstlisting} + +Aca vemos como si se elije la opción 2, se despliega un mensaje indicandole al usuario que transmita el archivo \textit{u-boot.bin} utilizando el protocolo xmodem, después se ejecuta la función rxmodem la que recibe los datos por el serial y lo almacena en la SDRAM externa (dirección 0x20000000) y finalmente se almacena esta información en la dirección \textit{DATAFLASH\_UBOOT\_BASE}. + +La opción 4. del menú transfiere la ejecución +\begin{lstlisting} + else if(key == '4' || ((scans > 300000) && autoboot)){ + if(AT91F_DataflashInit ()){ + dataflash_print_info (); + if(read_dataflash(DATAFLASH_UBOOT_BASE, 0x1C000, (char *)0x20700000)){ + puts("Dataflash read successful: Starting U-boot\n"); + asm("ldr pc, =0x20700000"); + } + } + } +\end{lstlisting} +En esta opción se copian 0x1C000 bytes del contenido de la memoria DataFlash comenzando en la posición \textit{DATAFLASH\_UBOOT\_BASE} a la dirección de memoria 0x20700000 (SDRAM externa) y luego se carga el contador de programa con la dirección 0x20700000, con lo que se inicia la ejecución del programa almacenado en la DataFlash, es importante hacer notar que el programa debe ser enlazado para que las secciones estén en la posición de memoria donde serán ejecutadas (0x20700000), no en la dirección donde son almacenadas. + +\subsection{U-boot} +La opción número 4 del menú copia el programa u-boot almacenado en la DataFlash a la memoria SDRAM y comienza su ejecución, en esta sección se realizará una descrición del loader u-boot. + +U-boot es un \textit{bootloader} que permite cargar archivos utilizando una gran variedad de periféricos como: Puerto serie, Memoria SD, Memorias Flash Paraleas, seriales, NAND. NOR, Ethernet. Es capáz de iniciar una variedad de tipos de archivos, además de un formato especial propio; este último almacena información sobre el tipo de sistema operativo, la dirección de carga, el punto de entrada, verificación de integridad via CRC, tipos de compresión, y textos descriptivos. La siguiente información es desplegada cuando \textit{u-boot} se inicializa una imagen del kernel de linux. + +\begin{lstlisting} +## Booting image at c0021840 ... + Image Name: Linux Kernel Image + Image Type: ARM Linux Kernel Image (gzip compressed) + Data Size: 1550369 Bytes = 1.5 MB + Load Address: 20008000 + Entry Point: 20008000 + Verifying Checksum ... OK + Uncompressing Kernel Image ... OK +\end{lstlisting} + +Para crear una imágen con el formato \textit{U-boot} basta con ejecutar el siguiente comando: +\begin{lstlisting} +$ mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -n "Linux Kernel Image" \ +-d linux.bin.gz ecb_at91.img +\end{lstlisting} + +Acá definimos \textit{ARM} como arquitectura, \textit{linux} como sistema operativo, \textit{Kernel} como el tipo de imágen, \textit{gzip} el método de compresión, \textit{0x20008000} la dirección de carga y punto de entrada (son iguales para kernels superiores al 2.3.X) \textit{Linux Kernel Image} el nombre de la imágen \textit{linux.bin.gz} el archivo de entrada y \textit{ecb\_at91.img} el archivo de salida. Esta información es almacenada en el encabezado de la imágen y puede ser leido utilizando el comando: + +\begin{lstlisting} +$mkimage -l /home/at91/binaries/ecb_at91.img + +Image Name: Linux Kernel Image +Created: Fri Jun 26 09:26:03 2009 +Image Type: ARM Linux Kernel Image (gzip compressed) +Data Size: 1550369 Bytes = 1514.03 kB = 1.48 MB +Load Address: 0x20008000 +Entry Point: 0x20008000 +\end{lstlisting} + +El siguiente listado muestra la estructura del envabezado definida por \textit{u-boot}, en ella podemos obervar sus componentes y el tamaño de cada uno de ellos. + +\begin{lstlisting} +typedef struct image_header { + uint32_t ih_magic; /* Image Header Magic Number */ + uint32_t ih_hcrc; /* Image Header CRC Checksum */ + uint32_t ih_time; /* Image Creation Timestamp */ + uint32_t ih_size; /* Image Data Size */ + uint32_t ih_load; /* Data Load Address */ + uint32_t ih_ep; /* Entry Point Address */ + uint32_t ih_dcrc; /* Image Data CRC Checksum */ + uint8_t ih_os; /* Operating System */ + uint8_t ih_arch; /* CPU architecture */ + uint8_t ih_type; /* Image Type */ + uint8_t ih_comp; /* Compression Type */ + uint8_t ih_name[IH_NMLEN]; /* Image Name */ +} image_header_t; +\end{lstlisting} + + +\subsection{Portando U-boot a la familia de plataformas ECB\_AT91} +Es necesario modificar varios archivos para que \textit{u-boot} soporte la familia de plataformas ECB\_AT91: + +\subsubsection{Makefile} +Se le debe indicar a las herramientas de compilación la nueva plataforma, adicionando las siguientes líneas. + +\begin{lstlisting} +ecb_at91_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t ecb_at91 NULL at91rm9200 +\end{lstlisting} + +\subsubsection{MAKEALL} +Se debe agregar la siguiente entrada en el archivo MAKEALL: +\begin{lstlisting} + LIST_ARM9=" \ + ----- + at91rm9200dk cmc_pu2 ecb_at91 +\end{lstlisting} + +\subsubsection{board/ecb\_at91/Makefile} +En el directorio \textit{board/ecb\_at91} se alojan los archivos que dan soporte a la nueva arquitectura, el archivo de reglas de Configuración se muestra a continuación: + +\begin{lstlisting} + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).a + +COBJS := $(BOARD).o at45.o flash.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +clean: + rm -f $(SOBJS) $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak .depend + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk +sinclude $(obj).depend +\end{lstlisting} + +Este es el formato utilizado para todas las plataformas, la parte importante se encuentra en la definición de la variable \textit{COBJS}; en la que se incluyen los archivos \textit{ecb\_at91.o}: archivo de la plataforma \textit{at45.0}: soporte a las memorias DataFlash AT45 y \textit{flash.o}: soporte genérico para dispositivos flash\footnote{Estos archivos pueden ser descargados de: http://svn.arhuaco.org/svn/src/emqbit/ECB\_AT91\_V2/u-boot/u-boot-1.1.6-ecbat91.patch}. + +\subsubsection{board/ecb\_at91/board.c} +Este archivo contiene toda la configuración específica de la plataforma, y como se puede ver en el siguiente listado, fija el número de la plataforma a: MACH\_TYPE\_ECBAT91 (1072 definida en \textit{include/asm-arm/mach-types.h}) y los parámetros del boot en: \textit{PHYS\_SDRAM + 0x100;} (PHYS\_SDRAM = 0x20000000 está definido en \textit{include/configs/ecb\_at91.h}). Adicionalmente, inicializa la SDRAM, la interfaz de red y la memoria DataFlash. + +\begin{lstlisting} +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Miscelaneous platform dependant initialisations + */ + +void lowlevel_init(void) +{ + /* Required by assembly functions - do nothing */ +} + +int board_init (void) +{ + /* Enable Ctrlc */ + console_init_f (); + + /* arch number of ECB_AT91 board */ + gd->bd->bi_arch_number = MACH_TYPE_ECBAT91; + + /* adress of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + + return 0; +} + +int dram_init (void) +{ + gd->bd->bi_dram[0].start = PHYS_SDRAM; + gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; + return 0; +} + +#ifdef CONFIG_DRIVER_ETHER +#if (CONFIG_COMMANDS & CFG_CMD_NET) + +/* + * Name: + * at91rm9200_GetPhyInterface + * Description: + * Initialise the interface functions to the PHY + * Arguments: + * None + * Return value: + * None + */ + +void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops) +{ + p_phyops->Init = lxt972_InitPhy; + p_phyops->IsPhyConnected = lxt972_IsPhyConnected; + p_phyops->GetLinkSpeed = lxt972_GetLinkSpeed; + p_phyops->AutoNegotiate = lxt972_AutoNegotiate; +} + +#endif /* CONFIG_COMMANDS & CFG_CMD_NET */ +#endif /* CONFIG_DRIVER_ETHER */ + +#ifdef CONFIG_HAS_DATAFLASH +#include + +void AT91F_DataflashMapInit(void) +{ + static int cs[][CFG_MAX_DATAFLASH_BANKS] = { + /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, + }; + + static dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { + /*define the dataflash offsets*/ + {DATAFLASH_LOADER_BASE /* 0 */, DATAFLASH_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "Darrell loader"}, + {DATAFLASH_UBOOT_BASE, DATAFLASH_ENV_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "U-boot"}, + {DATAFLASH_ENV_UBOOT_BASE, DATAFLASH_KERNEL_BASE - 1, + FLAG_PROTECT_CLEAR, "Environment"}, + {DATAFLASH_KERNEL_BASE, DATAFLASH_FILESYSTEM_BASE - 1, + FLAG_PROTECT_CLEAR, "Kernel"}, + {DATAFLASH_FILESYSTEM_BASE, 0x1fffff, FLAG_PROTECT_SET, "Filesystem"}, + }; + + AT91F_MapInit (cs, area_list); +} + +#endif +\end{lstlisting} + + +\subsubsection{include/configs/ecb\_at91.h} +Este archivo contiene variables que son utilizadas para la inicialización de la plataforma, algunas de estas ellas definen el valor de registros de configuración de periféricos como: El controlador del reloj del sistema, controlador de memorias SDRAM y memorias Flash. + +A continuación se muestra un segmento de este archivo, en el que se define la arquitectura: + +\begin{lstlisting} + +/* ARM asynchronous clock */ +#define AT91C_MAIN_CLOCK 180000000 +#define AT91C_MASTER_CLOCK 60000000 + +#define AT91_SLOW_CLOCK 32768 /* slow clock */ + +#define CONFIG_ARM920T 1 /* This is an ARM920T Core */ +#define CONFIG_AT91RM9200 1 /* It's an Atmel AT91RM9200 SoC */ +#define CONFIG_ECB_AT91 1 /* on an AT91RM9200DK Board */ +#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ +#define USE_920T_MMU 1 + +#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG 1 + +#ifndef CONFIG_SKIP_LOWLEVEL_INIT +#define CFG_LONGHELP +\end{lstlisting} + +Este archivo también incluye el valor predeterminado de las variables de entorno utilizadas por \textit{u-boot}: + +\begin{lstlisting} +#define CONFIG_BOOTARGS "mem=32M root=/dev/mmcblk0p1 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1" +#define CONFIG_ETHADDR 00:00:00:00:00:5b +#define CONFIG_NETMASK 255.255.255.0 +#define CONFIG_IPADDR 192.168.0.135 +#define CONFIG_SERVERIP 192.168.0.128 +#define CONFIG_BOOTDELAY 2 +#define CONFIG_BOOTCOMMAND "bootm C0021840" +#define CONFIG_BOOTFILE "ecb_at91.img" +#define CONFIG_ROOTPATH "/home/at91/rootfs" +#define CONFIG_LOADADDR 0x20200000 +\end{lstlisting} + +La variable \textit{bootargs} son parámetros pasados al kernel en su inicialización, y en este ejemplo fija la memoria RAM en 32 Mbytes, indica que el sistema de archivos se encuentra en el dispositivo \textit{/dev/mmcblk0p1} y utiliza el sistema de archivos \textit{ext3}, la consola es el dispositivo serial \textit{/dev/ttyS0} configurado a una velocidad de 115200 baudios, bit de paridad y 8 bits de datos y que debe esperar 1 segundo para montar el sistema de archivos. + +Las variables \textit{ethaddr, netmask, ipaddr, serverip} configuran la interfaz de red y las direcciones IP de la plataforma y de un servidor de donde puede descargarse la imágen del kernel. La variable \textit{bootdelay} fija el número de segundos que esperará u-boot para ejecutar el comando almacenado en \textit{bootcmd}, este conteo puede detenerse para interactuar con u-boot. El comando \textit{bootm C0021840 (bootcmd)} es utilizado para iniciar la imágen almacenada en la dirección de memoria 0xC0021840 (dirección donde almacena el loader de Darrel la imágen del kernel), \textit{bootm} utiliza la información almacenada en el encabezado de la imágen para utilizar el método de descompresión adecuado, almacenarlo en la dirección requerida y pasarle los parámetros almacenados en \textit{bootcmd}. + +\begin{lstlisting} +#define CONFIG_COMMANDS \ + ((CONFIG_CMD_DFL | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_DHCP ) & \ + ~(CFG_CMD_BDI | CFG_CMD_FPGA | CFG_CMD_MISC)) + +/* Remember that you must have the same mapping in the Darrell loader */ +#define NB_DATAFLASH_AREA 5 /* protected areas (4 + u-boot env) */ +#define DATAFLASH_MAX_PAGESIZE 1056 +#define DATAFLASH_LOADER_BASE (0*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_UBOOT_BASE (12*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_ENV_UBOOT_BASE (122*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_KERNEL_BASE (130*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_FILESYSTEM_BASE (1664*DATAFLASH_MAX_PAGESIZE) + +\end{lstlisting} + +\subsubsection{Compilación de U-boot en la familia de plataformas ECB\_AT91} +A continuación se indican los pasos necesarios para generar el archivo \textit{u-boot.bin} que será almacenado en la memoria DataFlash por el loader de Darrel. + +El primer paso es obviamente descargar el código fuente de la versión 1.1.6 de \textit{http://sourceforge.net/projects/u-boot/}, después debemos descargar el patch que da soporte a la familia de plataformas ECB\_AT91: + +\begin{lstlisting} +$ wget http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/u-boot/u-boot-1.1.6-ecbat91.patch +$ tar xjf u-boot-1.1.6.tar.bz2 +$ cd u-boot-1.1.6 +\end{lstlisting} + +Aplicamos el patch + +\begin{lstlisting} +$ cat ../u-boot-1.1.6-ecbat91.patch | patch -p1 +\end{lstlisting} + +Configuramos y generamos las herramientas utilizadas por \textit{u-boot} (entre ellas \textit{mkimage}). + +\begin{lstlisting} +$ make ecb_at91_config + Configuring for ecb_at91 board... (Este es un comentario) +$ make tools +\end{lstlisting} + +Por último compilamos \textit{u-boot}: + +\begin{lstlisting} +$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- +o +crossmake (si el alias crossmake está definido) +\end{lstlisting} + +Si el proceso se siguió correctamente y no se presentan errores al final del proceso obtenemos el mensaje: +\begin{lstlisting} + arm-none-eabi-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec + arm-none-eabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin +\end{lstlisting} +Lo que nos indica que se generó exitosamente el archivo \textit{u-boot.bin}, que puede ser descargado utilizando la opción 2 del menú del loader de Darrel (\textit{Upload u-boot to Dataflash}) y el protocolo xmodem. + +Podemos verificar que el archivo fué generado y almacenado en la Dataflash podemos ejecutar la opción número 4 del menú del loader de Darrel (\textit{Start u-boot}), como se mencionó anteriormente esta opción copia el archivo \textit{u-boot} desde la DataFlash a la memoria SDRAM y es ejecutado desde alli, con lo que se desplegará el siguiente mensaje: + +\begin{lstlisting} +Dataflash read successful: Starting U-boot +U-Boot 1.1.6 (Jul 29 2007 - 12:12:38) + +DRAM: 32 MB +Atmel: Flash: 0 kB +DataFlash:AT45DB161 +Nb pages: 4096 +Page Size: 528 +Size= 2162688 bytes +Logical address: 0xC0000000 +Area 0: C0000000 to C000317F (RO) Darrell loader +Area 1: C0003180 to C001F73F (RO) U-boot +Area 2: C001F740 to C002183F Environment +Area 3: C0021840 to C01ACFFF Kernel +Area 4: C01AD000 to C020FFFF (RO) Filesystem +In: serial +Out: serial +Err: serial +PHY not connected!! +Hit any key to stop autoboot: 2 +\end{lstlisting} + +Si se presiona cualquier tecla antes de que el contador llegue a \textit{0}, podemos interactuar con \textit{u-boot}, si ejecutamos el comando \textit{print} (Despliega en pantalla las variables de entorno definidas): + +\begin{lstlisting} +bootcmd=bootm C0021840 +bootdelay=2 +baudrate=115200 +ethaddr=00:00:00:00:00:5b +ipaddr=192.168.0.135 +serverip=192.168.0.128 +rootpath="/home/at91/rootfs" +netmask=255.255.255.0 +bootfile="ecb_at91.img" +loadaddr=0x20200000 +bootargs=mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1 +stdin=serial +stdout=serial +stderr=serial +Environment size: 345/8188 +\end{lstlisting} + +Podemos cambiar el valor predeterminado de la variable \textit{bootdelay} a \textit{1}: +\begin{lstlisting} +ecb_at91> setenv bootdelay 1 +\end{lstlisting} + +Y almacenamos los cambios realizados en una sección de la flash reservada para este fin con el comando: +\begin{lstlisting} +ecb_at91> save +Saving Environment to dataflash... +\end{lstlisting}s + +Podemos generar una nueva variable de entorno, almacenarla en la DataFlash +\begin{lstlisting} + +ecb_at91> setenv nfsargs=mem=32M console=ttyS0,115200n8 root=/dev/nfs nfsroot=192.168.0.128:/home +/at91/rootfs,timeo=200,retrans=500 ip=:::::eth0:on + +ecb_at91> save +\end{lstlisting} + + +\subsection{Almacenamiento de la imágen del kernel} +Una vez creada la imágen del kernel (\textit{ecb\_at91.img}) con el formato de \textit{U-boot} debemos probar su correcto funcionamiento; esto lo podemos hacer de dos formas: Almacenandola directamente en una memoria no volátil o cargándola en la memoria RAM y ejecutándola desde allí. + +\subsubsection{Almacenamiento en la memoria DataFlash} +Cuando almacenamos la imágen del kernel de Linux a un medio de almacenamiento no volátil, debemos tener presente que los ciclos de borrado y escritura de este toman un tiempo mucho mayor que en el caso de las memorias no volátiles, por esto, se recomienda esta opción cuando ya se cuente con una imágen estable o cuando no existan otros medios (como en el caso de la plataforma ECBOT). + +Inicialmente debemos ejecutar el loader de Darrel, esto se hace presionando el pulsador de \textit{Reset} disponible en todas las plataformas de la familia \textit{ECB\_AT91}. Inmediatamente después de observar el menú del loader debemos oprimir cualquier tecla para interrumpir la ejecución automática del \textit{u-boot}. + +Seleccionando la opción del menú: \textit{3: Upload linux to Dataflash}, podemos iniciar la transferencia de la imágen a la memoria SDRAM de nuestra plataforma: + +\begin{lstlisting} +Please transfer linux via Xmodem +Receiving Xmodem transfer +\end{lstlisting} + +Cuando aparezca este mensaje se debe transmitir el archivo \textit{ecb\_at91.img} utilizando el protocolo xmodem. Unos minutos después la transferencia finaliza, sin embargo, debemos esperar a que la información sea almacenada en la memoria DataFlash, mientras se completa la escritura la consola no mostrará ninguna actividad, eso es normal y no se debe reiniciar la board. Una vez finalizada la escritura observaremos el mensaje: +\begin{lstlisting} +%%%%%%%%%%%%%%%%%%%%% +\end{lstlisting} + +\subsubsection{Almacenamiento en la memoria RAM} +El proceso de grabación en la memoria DataFlash puede tomar alrededor de 6 minutos, lo que no lo hace conveniente cuando se está tratando de crear una imagen propia o se están realizando cambios a la misma. Cuando necesitamos modificar esta imágen ya sea porque queremos hacerlo nosotros mismos o porque deseamos una versión de kernel más moderna, es preferible utilizar un método de transferencia más rápido. + +La plataforma \textit{ECB\_AT91} posee una interfaz de red que puede ser controlada por \textit{u-boot}. Utilizando el protocolo \textit{tftp} \textit{U-boot} puede descargar la imágen desde un servidor a la memoria SDRAM y ejecutarla desde allí, ese proceso se realiza en segundos, facilitando de esta forma el proceso de desarrollo. A continuación se desciben los pasos que deben seguirse para realizar esta operación: + +Primero debemos instalar y configurar el servidor \textit{tftp} en el computador donde se tiene las herramientas de desarrollo: + +\begin{lstlisting} +$ aptitude install tftpd tftp. +\end{lstlisting} + +Se debe agregar la siguiente línea al archivo \textit{/etc/inetd.conf} +\begin{lstlisting} +tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp +\end{lstlisting} + +Debe asegurarse que el protocolo \textit{tftp} utiliza el puerto \textit{UDP} 69 + +\begin{lstlisting} +$ cat /etc/services | grep tftp +tftp 69/udp +\end{lstlisting} + +Ahora creamos el directorio \textit{/srv/tftp}\footnote{Este directorio tiene restricciones de seguridad, debe contactarse con el administrador de su equipo para permitir el acceso a él} y colocamos la imagen en él: +\begin{lstlisting} +$ mkdir /srv/tftp/ +$ chown myuser. /srv/tftp/ +$ cp ecb_at91.img /srv/tftp/ +\end{lstlisting} + +Para verificar la correcta configuración del servidor, podemos utilizar un cliente \textit{tftp}: + +\begin{lstlisting} +$ cd /tmp/ +$ tftp localhost # from the server +tftp> get ecb_at91.img +Received 1319525 bytes in 0.2 seconds +tftp> quit +\end{lstlisting} + +Ahora se deben configurar algunas variables de entorno en nuestra plataforma para indicarle a \textit{u-boot} la dirección \textit{IP}, el nombre y la ubicación de la imágen del kernel. Estas variables deben ser modificadas para que contengan los siguientes valores: + +\begin{lstlisting} +loadaddr=0x20200000 +bootdelay=1 +bootfile="ecb_at91.img" +fileaddr=20200000 +gatewayip=192.168.0.1 +netmask=255.255.255.0 +serverip=192.168.0.128 +\end{lstlisting} + +Estas variables fijan la dirección \textit{IP} de: la plataforma a \textit{192.168.0.2}, del gateway a \textit{192.168.0.1}, la del servidor \textit{tftp} a \textit{192.168.0.128\footnote{Dirección IP del PC donde están las herramientas de desarrollo}}. Adicionalmente define el nombre de la imágen del kernel a \textit{ecb\_at91.img}. Una vez configurado \textit{U-boot} podemos descargar la imágen a la dirección de memoria \textit{0x20200000}: + +\begin{lstlisting} +ecb_at91 >tftp +TFTP from server 192.168.0.1; our IP address is 192.168.0.2 +Filename 'ecb_at91.img'. +Load address: 0x20200000 +Loading: ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################ +done +Bytes transferred = 1409031 (158007 hex) +ecb_at91 > +\end{lstlisting} + + + +\subsection{Inicialización del Kernel} +En general los cargadores de Linux como el \textit{u-boot} realizan las siguientes funciones: + +\begin{itemize} +\item \textbf{Configurar e inicializar la RAM} +\item \textbf{Inicializar un puerto serial} +\item \textbf{Detectar el tipo de máquina:} El boot loader debe proporcionar un valor \textit{MACH\_TYPE\_XXX} al kernel, como vimos anteriormente tanto \textit{u-boot} como \textit{Linux} fijan este valor a 1072. +\item Configurar la \textit{kernel tagged list}: El boot loader debe crear e inicializar una estructura llamada \textit{kernel tagged list}, al cual comienza con \textit{ATAG\_CORE} y finaliza con \textit{ATAG\_NONE}. El tag \textit{ATAG\_CORE} puede o no estar desocupado, si se encuentra desocupado debe fijar el campo \textit{size} en '2'. El campo \textit{size} del tag \textit{ATAG\_NONE} debe fijarse en 0. Se pueden definir cualquier número de tags, pero se deben definir por lo menos el tamaño y la localización de la memoria del sistema, y la localización del sistema de archivos. Esta \textit{tagged list} debe ser almacenada en RAM, en una región que no pueda ser modificada por el descompresor del kernel o por el programa \textit{initrd}. Se recomienda colocarlo en los primeros 16kBytes de la RAM. + +\item Hacer un llamado a la imágen del kernel: Existen dos formas de hacer este llamado, directamente desde la flash o en en cualquier posición de la RAM. Los dos métodos deben cumplir las siguientes condiciones: + \begin{itemize} + \item Desactiva los dispositivos que tienen capacidad de DMA, de tal forma que la memoria no se corrompa. + \item Fijar los registros de la CPU: \textit{r0 = 0}, \textit{r1 = típo de máquina}, \textit{r2 = dirección física de la \textit{tagged list} en RAM.} + \item Modo de la CPU: Deshabilitar todas las interrupcione (IRQs y FIQs) y colocar a la CPU en modo SVC + \item Caches, MMU: Debe estar desactivada la MMU, La cache de instrucciónes puede estar activada o desactivada, la cache de datos debe estar desactivada. + \end{itemize} +\end{itemize} + + +\subsubsection{Llamado a la Imágen del kernel} + +Como mencionamos anteriormente, \textit{u-boot} ejecuta las instrucciones almacenadas en la variable de entorno \textit{bootcmd}; que para la familia de plataformas ECB\_AT91 almacena el comando \textit{bootm C0021840}, esta instrucción le indica a \textit{u-boot} que ejecute el comando \textit{bootm} con una imágen almacenada en la posición de memoria \textit{0xC0021840}, en la que (como mencionamos anteriormente (Figura \ref{boot_process})) se almacena la imágen del kernel. El código que implementa el comando \textit{bootm} se encuentra en el archivo \textit{common/cmd\_bootm.c}; analizando este archivo podemos descubrir el proceso que realiza \textit{u-boot} al hacer el llamado a la imágen del kernel (la que almacenamos utilizando la opción 3 del loader de Darrel). La función \textit{do\_bootm} realiza las siguientes operaciones: + +\begin{itemize} + \item Verificar la existencia de un número mágico en los primeros 4 bytes de la imágen (0x27051956). Si no se encuentra este número se desplegará el mensaje: \textit{Bad Magic Number} + \item Verifica la integridad del encabezado de la imágen. De no pasar esta prueba se mostrará el mensaje: \textit{Bad Header Checksum}. + \item Imprime el encabezado de la imágen, aparecerá algo como: + \item Cálcula el CRC del archivo almacenado y lo compara con el almacenado en la cabecera de la imágen. Si no se supera esta prueba, se desplegará el mensaje: \textit{Bad Data CRC} + \item Comprueba que la arquitectura está soportada por \textit{u-boot}. + \item Descomprime la imágen almacenada en la dirección \textit{load\_address} (la cual se pasa como parámetro en el momento de la creación de la imágen). + \item Transferir el control a Linux en la función \textit{do\_bootm\_linux}\textit{U-boot es un loader que permite trabajar con: LYNXOS, RTEMS, VXWORKS, QNX, ARTOS, NETBSD} +\end{itemize} + +La función \textit{do\_bootm\_linux} hace el llamado a la imagen del kernel utilizando el siguiente comando: +\begin{lstlisting} +(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); +\end{lstlisting} + +en donde: +\begin{itemize} + \item \textit{kbd} Información de la plataforma de desarrollo: +% \begin{itemize}\item + \begin{lstlisting} +typedef struct bd_info { + int bi_baudrate; /* serial baudrate */ + unsigned long bi_ip_addr; /* IP Address */ + unsigned char bi_enetaddr[6]; /* Ethernet adress */ + struct environment_s *bi_env; + ulong bi_arch_number; /* id for this board */ + ulong bi_boot_params; /* boot params */ + struct /* RAM configuration */ + { + ulong start; + ulong size; + } bi_dram[CONFIG_NR_DRAM_BANKS]; +} bd_t; \end{itemize} + \end{lstlisting} +% \end{itemize} + \item \textit{initrd\_start} - \textit{initrd\_end}: Linux permite que el sistema de archivos sea almacenado en la memoria RAM, el sistema es almacenado en algún medio no volátil y después es descomprimido en la RAM, esto acelera la ejecución ya que como se mencionó anteriormente, el acceso a las memorias volátiles es mucho menor. \textit{initrd\_start} - \textit{initrd\_end} indican el inicio y fin de este archivo + \item \textit{cmd\_start} - \textit{cmd\_end}: Posición de memoria donde se almacenan los parámetros pasados al kernel (\textit{mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1}) +\end{itemize} +En este punto termina el trabajo de \textit{u-boot} y el control es pasado al kernel. Como pudimos darnos cuenta lo más atractivo de \textit{u-boot} es su capacidad para manejar diferentes dispositivos de almacenamiento no volátiles como Memorias Flash, memorias SD y su capacidad para manejar interfaces de red y permitir utilizarlas para al carga de imágenes del kernel. + +\subsubsection{Punto de Entrada del Kernel \textit{head.o}} +Como puede verse en \ref{vmlinux_contents} el primer archivo encadenado en la imágen del kernel es \textit{arch/arm/kernel/head.o}, y corresponde al punto de entrada del kernel de Linux, este archivo ejecuta las siguientes funciones: + +\begin{enumerate} + \item Verificar que la arquitectura y el procesador sean válidos. Si el procesador no es válido se generará un error y en la consola aparecerá una ``\textit{p}'', si la plataforma no corresponde se genera un error y se imprimirá una ``\textit{a}'' en la consola. + \item Se genera una estructura de datos (\textit{page table}) que almacena el mapeo entre las direcciones de memoria virtual y la memoria física. Antes de pasar el control al kernel, el procesador corre un un modo \textit{real}, en el que las direcciones corresponden a direcciones reales de los dispositivos conectados físicamente al procesador. + \item Activa la unidad de manejo de memoria (MMU) del procesador. Cuando se activa la MMU el esquema de memoria físico se remplaza por un direccionamiento virtual determinado por los desarrolladores del kernel. + \item Establece un limitado mecanismo de detección y reporte de errores. + \item Hace un llamado a la función \textit{start\_kernel} en \textit{init/main.c} +\end{enumerate} + + +\begin{lstlisting} + setup_arch(&command_line); + setup_command_line(command_line); + sched_init(); + preempt_disable(); + page_alloc_init(); + console_init(); + mem_init(); + kmem_cache_init(); + setup_per_cpu_pageset(); + numa_policy_init(); + calibrate_delay(); + pidmap_init(); + pgtable_cache_init(); + prio_tree_init(); + anon_vma_init(); + fork_init(num_physpages); + proc_caches_init(); + buffer_init(); + unnamed_dev_init(); + key_init(); + security_init(); + vfs_caches_init(num_physpages); + radix_tree_init(); + signals_init(); + + page_writeback_init(); + proc_root_init(); + cgroup_init(); + cpuset_init(); + taskstats_init_early(); + delayacct_init(); + acpi_early_init(); + schedule(); + preempt_disable(); +\end{lstlisting} + + +En los últimos pasos en el proceso de arranque de Linux, se libera la memoria que será utilizada por los procesos de inicialización, abre un dispositivo que permita la interacción con el usuario \textit{/dev/console} (consola serial en nuestro caso) y ejecuta el primer proceso en espacio de usuario \textit{init}. El siguiente listado muestra el código que implementa esta última fase del proceso de arranque. + +\begin{lstlisting} + static int noinline init_post(void) +{ + free_initmem(); + unlock_kernel(); + mark_rodata_ro(); + system_state = SYSTEM_RUNNING; + numa_default_policy(); + + if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) + printk(KERN_WARNING "Warning: unable to open an initial console.\n"); + + (void) sys_dup(0); + (void) sys_dup(0); + + if (ramdisk_execute_command) { + run_init_process(ramdisk_execute_command); + printk(KERN_WARNING "Failed to execute %s\n", + ramdisk_execute_command); + } + + /* + * We try each of these until one succeeds. + * + * The Bourne shell can be used instead of init if we are + * trying to recover a really broken machine. + */ + if (execute_command) { + run_init_process(execute_command); + printk(KERN_WARNING "Failed to execute %s. Attempting " + "defaults...\n", execute_command); + } + run_init_process("/sbin/init"); + run_init_process("/etc/init"); + run_init_process("/bin/init"); + run_init_process("/bin/sh"); + + panic("No init found. Try passing init= option to kernel."); +} +\end{lstlisting} + +Como podemos obsever el último páso consiste en el llamado a un archivo en espacio de usuario llamado \textit{init} o \textit{sh}, en la siguiente subsección se describirá las acciones que se realizan cuando se ejecuta este archivo. De no encontrarse se desplegará el mensaje \textit{No init found. Try passing init= option to kernel.} y la plataforma pasará a un estado de inactividad. + +\section{Inicialización del Sistema} +En esta sección describiremos el proceso de inicialización de la plataforma embebida, en la sección anterior se estudió la inicialización del kernel de Linux. En esta sección se realizará una descripción del sistema de archivos que contiene aplicaciones que Linux requiere para inicializar servicios como los de red y la consola, cargar drivers (\textit{módulos}) de dispositivos y montar sistemas de archivos adicionales. + +\subsection{Sistema de Archivos} +Anteriormente hemos hecho referencia a la localización de la raíz del sistema de archivos (\textit{root}), e indicamos que está se encuentra en una determinada memoria no volátil, estamos indicando donde se encuentra el nivel más alto del sistema de archivos, el cual se denota como \textit{``/''}. Existen varias opciones entre las que se encuentran: +\begin{itemize} + \item \textbf{Second Extended File System (ext2)} : Este sistema de archivos utiliza bloques como unidad de almacenamiento básico, inodes como medio para mentener un seguimiento de archivos y objetos de sistema, grupos de bloques para dividir lógicamente el disco en secciones más menejables, directorios para proporcionar una organización jerárquica de archivos, bloques y mapas de bits (\textit{bitmap}) de bloques e inodes para mantener un seguimiento de bloques e inodes asignados, y superbloques para definir los parámetros del sistema de archivos y su estado general. Adicionalmente posee la capacidad de crear enlaces simbólicos, un tipo especial de archivo que contiene la referencia a otro archivo o directorio. + + + \item \textbf{Third Extended File System (ext3)}: \textit{ext3} es una extensión del sistema de archivos \textit{ext2} con capacidades de \textit{journaling}. El \textit{Journaling} es utilizado para seguir cambios de archivos y tiene como propósito asegurar que las transacciones sean procesadas de forma adecuada; adicionalmente permite arreglar daños en el sistema de archivos originados por una falla en la fuente de alimentación de la plataforma. + + \item \textbf{ReiserFS}: Este sistema de archivos al igual que \textit{ext3} utiliza \textit{journaling}. Fué creado con el fín de aumentar el desempeño frente al sistema \textit{ext2}, es un sistema eficiente en espacio, y mejora el manejo de grandes directorios. + + \item \textbf{Journalling FIle FLash System 2 (JFFS2)}: Sistema creado para trabajar con dispositivos Flash, los cuales son utilizados ampliamente en aplicaciones embebidas. + + \item \textbf{Compresed ROM file system (cramfs)}: Sistema de solo lectura, es utilizado cuando se dispone de una pequeña memoria flash NOR. El máximo tamaño de cramfs es de 256MB. Los archivos en este sistema de archivos se encuentran comprimidos. + + \item \textbf{Network File System}: Permite montar particiones de disco o directorios de sistemas remotos como un sistema de archivos local, esto permite compartir recursos como unidades de CDs, DVDs u otro medio de almacenamiento masivo. Por otro lado, reduce el tiempo de desarrollo ya que no es necesario transferir archivos entre el sitio donde se encuentran las herramientas de desarrollo y la plataforma. + + \item \textbf{Pseudo File System} Este sistema de archivos es utilizado por Linux para representar el estado actual del kernel. Este sistema de archivos está montado en el directorio \textit{/proc}, y dentro de él podemos encontrar información detallada del hardware del sistema. Adicionalmente algunos archivos pueden ser manipulados para informar al kernel cambios en la configuración. Este sistema de archivos es virtual y es constantemente actualizado por el kernel. Los archivos \textit{/proc/cpuinfo}, \textit{/proc/interrupt}, \textit{/proc/devices}, \textit{/proc/mounts} Proporcionan información sobre los dispositivos Hardware de la plataforma +\end{itemize} + + +\subsubsection{Estructura del Sistema de Archivos} +Todas las distribuciones de linux se basan en el standard \textit{Filesystem Hierarchy Standard \footnote{}} utilizado en los sistemas operativos UNIX. Este standard permite que los programas y los usuarios conozcan de antemano la localización de los archivos instalados. Los siguientes directorios o links simbólicos son de uso obligatorio: + +\begin{enumerate} + + \item \textbf{bin} Ejecutables esenciales. + \item \textbf{boot} Archivos estáticos del boot loader. + \item \textbf{dev} Archivos de dispositivos. + \item \textbf{etc} Configuración específica del host. + \item \textbf{lib} Librerías esenciales y módulos de kernel. + \item \textbf{media} Punto de montaje para sispositivos removibles. + \item \textbf{mnt} Punto de montaje temporal. + \item \textbf{opt} + \item \textbf{sbin} Ejecutables esenciales del sistema. + \item \textbf{srv} Datos de servicios suministrados por el sistema. + \item \textbf{tmp} Archivos temporales. + \item \textbf{usr} Segunda jerarquía. + \item \textbf{var} Datos variables. +\end{enumerate} + +\subsection{Primer Programa en Espacio de Usuario \textit{init}} + +Como vimos anteriormente, la primera aplicación en espacio de usuario que ejecuta el kernel es \textit{/sbin/init}, todos los procesos que no sean del kernel son generados de forma directa o indirecta por él y es responsable de la inicialización de los scripts y terminales. Su papel más importante es generar procesos adicionales bajo la dirección de un archivo de configración especial \textit{/etc/inittab} + +\subsubsection{Modos de operación} +Existen dos modos de operación en Linux: Modo usuario simple y Multi-usuario, en el primero solo se activa una línea de comandos y el único usuario que puede utilizarla es el super-usuario \textit{root}; es utilizado para sistemas en mantenimiento y normalmente se le asigna el nivel de ejecución 1. En este nivel de ejecución, no existen procesos demonios\footnote{Proceso que se ejecuta de forma discreta sin intervención del usuario y es activado por la ocurrencia de una condición específica} en ejecución, y la interfaz de red no está configurada\cite{JF}. + +El modo multi-usuario es el modo normal de ejecución del sistema Linux, cuando Linux inicia en este modo se ejecutan los siguientes procesos: + +\begin{itemize} +\item Se revisa el estado del sistema de archivos con \textit{fsck}. +\item Se monta en sistema de archivos. +\item \textit{init} analiza el archivo \textit{/etc/inittab} y + \begin{itemize} + \item Determina el nivel de ejecución + \item Ejecuta los scripts asociados con este nivel de ejecución. + \end{itemize} +\item Inicializa los demonios. +\item Permite el acceso a usuarios. +\end{itemize} + +\subsubsection{Niveles de ejecución} +Un nivel de ejecución puede entenderse como un estado del sistema Hoy día, la mayoría de las distribuciones utilizan los siguientes niveles de ejecución\cite{JF}: +\begin{enumerate} + \item 0. Cierre o detención del sistema (\textit{halt}). + \item 1. Modo usuario simple para configuración del sistema y mantenimiento. + \item 2. Modo multi-usuario sin red remota. + \item 3. Modo multi-usuario con red. Este es el modo de operación normal de un usuario de un sistema sin capacidades gráficas. + \item 4. No utilizado - Definido por el usuario. + \item 5. Modo multi-usuario con interfáz gráfica. + \item 6. Re-inicialización del sistema (\textit{reboot}). +\end{enumerate} + +El nivel de ejecución pude ser cambiado por el super-usuario (\textit{root}) en cualquier momento utilizando el comando \textit{init n}, donde \textit{n} es el nivel de ejecución deseado. + +\subsubsection{El Archivo \textit{/etc/inittab}} +Como se mencionó anteriormente el programa \textit{init} está encargado de montar el sistema de archivos y de analizar el archivo \textit{/etc/inittab}. Este archivo contiene: + +\begin{itemize} + \item Una entrada para el nivel de ejecución por defecto. Nivel de ejecución en que inicia el sistema a menos que especifique otra cosa en el boot loader. + \item Entradas que deben ser ejecutadas en todos o en un específico nivel de ejecución, su sintáxis es: + \textit{id:runlevels:action:process [arguments]} + \begin{itemize} + \item \textit{id} Cualquier cosa. + \item \textit{runlevels} Puede ser un número o lista de números de 0 a 6. + \item \textit{action} Acción a tomar: + \begin{itemize} + \item \textit{respawn} El proceso debe ser re-iniciado una vez finalice. + \item \textit{wait start} Ejecuta el proceso cuando se ingresa al nivel de ejecución y espera por su terminación. + \item \textit{bootwait} El proceso debe ser ejecutado durante la incialización del sistema. + \item \textit{initdefault} Especifica el nivel de ejecución al que se ingresa después de la inicialización del sistema. + \item \textit{sysinit} El proceso debe ejecutarse durante la inicialización del sistema. Debe ejecutarse antes de cualquier entrada \textit{boot} o \textit{bootinit} + \end{itemize} + \item \textit{process} Programa o script a ser ejecutado. + \end{itemize} +\end{itemize} +En el siguiente listado se muestra un archivo \textit{inittab} típico: + +\begin{lstlisting} +# The default runlevel. +id:5:initdefault: + +# Boot-time system configuration/initialization script. +# This is run first except when booting in emergency (-b) mode. +si::sysinit:/etc/init.d/rcS + +# What to do in single-user mode. +~~:S:wait:/sbin/sulogin + +# /etc/init.d executes the S and K scripts upon change +# of runlevel. + +l0:0:wait:/etc/init.d/rc 0 +l1:1:wait:/etc/init.d/rc 1 +l2:2:wait:/etc/init.d/rc 2 +l3:3:wait:/etc/init.d/rc 3 +l4:4:wait:/etc/init.d/rc 4 +l5:5:wait:/etc/init.d/rc 5 +l6:6:wait:/etc/init.d/rc 6 +# Normally not reached, but fallthrough in case of emergency. +z6:6:respawn:/sbin/sulogin +S:2345:respawn:/sbin/getty 115200 ttyS0 +# /sbin/getty invocations for the runlevels. + +1:2345:respawn:/sbin/getty 38400 tty1 +\end{lstlisting} + +En este archivo se define el nivel de ejecución 5 como el nivel por defecto. El primer script en ejecutarse es \textit{/etc/init.d/rcS} (ya que su acción es del tipo \textit{sysinit}). Luego se ingresa al nivel de ejecución 5 y se ejecuta el script \textit{/etc/init.d/rc} pasándole el argumento ``5'' y espera hasta que el script se complete. \textit{/etc/init.d/rc} ejecuta los scripts localizados en directorios individuales para cada nivel: \textit{/etc/rcX.d} (X un entero de 0 a 6); el nombre de los archivos localizados en estos directorios deben comenzar con el caracter ``\textbf{S}'' (para iniciar procesos) o ``\textbf{K}'' (para ``matar'' procesos), y dos caracteres numéricos: \textit{S[0-9][0-9]}, \textit{S[0-9][0-9]}. Un script típico de inicialización del demonio del servidor web \textit{cherokee} se muestra en el siguiente listado (\textit{/etc/rc5.d/S91cherokee}): + +\begin{lstlisting} +#!/bin/sh +DAEMON=/usr/sbin/cherokee +CONFIG=/etc/cherokee/cherokee.conf +PIDFILE=/var/run/cherokee.pid +NAME="cherokee" +DESC="Cherokee http server" + +test -r /etc/default/cherokee && . /etc/default/cherokee +test -x "$DAEMON" || exit 0 +test ! -r "$CONFIG" && exit 0 + +case "$1" in + start) + echo "Starting $DESC: " + start-stop-daemon --oknodo -S -x $DAEMON -- -b -C $CONFIG + ;; + + stop) + echo "Stopping $DESC:" + start-stop-daemon -K -p $PIDFILE + ;; + + restart) + $0 stop >/dev/null 2>&1 + $0 start + ;; + + *) + echo "Usage: $0 {start|stop|restart}" + exit 0 + ;; +esac +\end{lstlisting} + +Como podemos ver existen tres parámetros que podemos pasar al script: \textit{start}, \textit{stop} y \textit{restart}, cuyas acciones son iniciar, detener y reiniciar el demonio respectivamente. El directorio \textit{/etc/init.d} contiene todos los scripts utilizados en los diferentes niveles de ejecución, el nombre de ellos en este directorio no incluyen los caracteres \textit{S[0-9][0-9]} o \textit{K[0-9][0-9]}. + +La línea \textit{S:2345:respawn:/sbin/getty 115200 ttyS0} inicia una consola por el puerto serial \textit{/dev/ttyS0} con una velocidad de 9200 baudios, cuando el nivel de ejecucion sea 2, 3, 4 o 5. Finalmente se crea una terminal virtual para los niveles de ejecución multi-usuario. + +Cuando el super-usuario cambia el nivel de ejecución con el comando \textit{init}, los procesos únicos al nievel anterior son terminados y los procesos únicos del nuevo nivel son iniciados. + +\subsection{Distribuciones Linux} +Aunque es posible construir el sistema de atchivos nosotros mismos, no es nada práctico ya que es una tarea tediosa que requiere cierto nivel de experiencia. En la actualidad, existen varias distribuciones que realizan estas tareas por nosotros, dentro de las más utilizadas se encuentran: + +\subsubsection{Busybox} +Diseñado para optimizar el tamaño y rendimiento de aplicaciones embebidas, BusyBox \footnote{http://www.busybox.net/} combina en un solo ejecutable más de 70 utilidades estándares UNIX, en sus versiones ligeras. BusyBox es considerada la navaja suiza de los sistema embebidos, dado que permite sustituir la gran mayoría de utilidades que se suelen localizar en los paquetes GNU fileutils, shellutils, findutils, textutils, modutils, grep, gzip, tar, etc. + +Busybox hace parte de la mayoría de distribuciones de Linux para sistemas embebidos y en la actualidad proporciona las siguientes funciones: + +\textit{ +addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bunzip2, busybox, bzcat, cal, cat, chgrp, +chmod, chown, chroot, chvt, clear, cmp, cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, +deluser, df, dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, egrep, env, expr, +false, fbset, fdflush, fdisk, fgrep, find, fold, free, freeramdisk, fsck.minix, ftpget, ftpput, getopt, +getty, grep, gunzip, gzip, halt, head, hexdump, hostid, hostname, httpd, hwclock, id, ifconfig, ifdown, +ifup, init, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall, klogd, last, length, linuxrc, ln, +loadfont, loadkmap, logger, login, logname, logread, losetup, ls, makedevs, md5sum, mesg, mkdir, mkfifo, +mkfs.minix, mknod, mkswap, mktemp, more, mount, mt, mv, nameif, nc, netstat, nslookup, od, openvt, passwd, + patch, pidof, ping, ping6, pivot\_root, poweroff, printf, ps, pwd, rdate, readlink, realpath, reboot, + renice, reset, rm, rmdir, route, rpm, rpm2cpio, run-parts, sed, setkeycodes, sh, sha1sum, sleep, sort, + start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync, syslogd, tail, tar, tee, telnet, + telnetd, test, tftp, time, top, touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname, + uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode, vi, vlock, watch, watchdog, wc, +wget, which, who, whoami, xargs, yes, zcat}. + +\subsubsection{Buildroot} +Buildroot\footnote{http://buildroot.uclibc.org/} Es un grupo de \textit{Makefiles} y \textit{patches} que facilita la generación de la cadena de herramientas y el sistema de archivos para un sistema embebido que usa Linux. Posee una interfaz que permite realizar de forma fácil la configuración; utiliza busybox para generar la utilidades básicas de Linux y permite adaptar software adicional de forma fácil \footnote{http://buildroot.uclibc.org/buildroot.html\#add\_software}. + +\subsubsection{Openembedded} +Al igual que Buildroot, el proyecto openembedded proporciona un entorno que permite generar la cadena de herramientas y el sistema de atchivos para un sistema embebido, utiliza busybox y permite la creación de archivos que permiten compilar software que no se incluya en la distribución original. Adicionalmente openembedded crea archivos de instalación con un formato derivado del proyecto \textit{handhelds} \footnote{http://handhelds.org} \textit{ipk}, lo que permite la instalación de paquetes de forma similar a la distribución debian. + +La información necesaria para generar una distribución utilizando las herramientas de Openembedded se encuentra en http://www.emqbit.com/mediawiki/index.php/Main\_Page/ecb\_at91/OE. + +\section{Módulos del kernel} +Los módulos son pequeñas piezas de código que pueden ser cargadas y descargadas en el kernel en el momento que sea necesario. Ellos extienden la funcionalidad del kernel, sin la necesidad de reiniciar el sistema y recompilar el kernel. Por ejemplo, un tipo de módulo es el controlador de dispositivo, el cual permite al kernel acceder a un dispositivo hardware conectado al sistema. Este tipo de módulos serán estudiados en esta sección. + +Existen tres tipos de dispositivos en Linux \cite{JCAR05}: + +\begin{itemize} +\item Tipo Caracter: Puede accederse de forma similar a un archivo; este tipo de dispositivos permite por lo menos las operaciones \textit{open}, \textit{close}, \textit{read}. Ejemplos de este tipo de dispositivo son el puerto serie (\textit{/dev/ttyS0}) y la consola (\textit{/dev/console}) +\item Tipo Bloque: Este tipo de dispositivo puede hospedar un sistema de archivos; normalmente realiza operaciónes de bloques de datos únicamente; un ejemplo de este tipo de dispositivo es el disco duro (\textit{/dev/hda}). +\item Red: Toda transacción de red se realiza a través de una interfaz, esto es, un dispositivo hardware (\textit{/dev/eth0}) o software (\textit{loopback}) capaz de intercambiar datos con otros hosts. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/kernel_module} \end{center} + \caption{ Interacción entre el área de usuario y el driver del dispositivo. Fuente: \cite{Mo05}}\label{kernel_module} +\end{figure} + + +\subsection{Ejemplo de un driver tipo caracter} + +Recuerde que una aplicación en el área de usario, no puede acceder directamente al área del kernel; los dispositivos se acceden a través de archivos de dispositivos, localizados en \textit{/dev} (ver figura \ref{kernel_module}), A continuación se muestra la salida del comando \textit{ls -l /dev/} + +\begin{lstlisting} +brw-rw---- 1 root disk 3, 0 Nov 27 hda +brw-rw---- 1 root disk 3, 1 Nov 27 hda1 +brw-rw---- 1 root disk 3, 2 Nov 27 hda2 +crw-rw---- 1 root uucp 4, 64 Nov 27 ttyS0 +crw-rw---- 1 root uucp 4, 65 Nov 27 ttyS1 +\end{lstlisting} + + +Los archivos tipo caracter están identificados por una \textit{``c''} en la primera columna, mientras que los dispositivos tipo bloque por una \textit{``b''}. Podemos observar que existen dos números (5ta y 6ta columna) que identifican al driver, el número de la 5ta columna recibe el nombre de \textit{major number} y el de la sexta \textit{minor number}; estos números son utilizados por el sistema operativo para determinar el dispositivo y el driver que deben ser accesados ante una solicitud a nivel de usuario. + +El \textit{major number} identifica la clase o grupo del dispositivo, mientras que el \textit{minor number} se utiliza para identificar sub-dispositivos (Ver Figura \ref{major}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/major} \end{center} + \caption{ \textit{major} y \textit{minor} footnote{http://uw713doc.sco.com/en/HDK\_concepts/ddT\_majmin.html} }\label{kernel_module} +\end{figure} + +El kernel de linux permite que los drivers compartan el número mayor, como el caso del disco duro, hda posee dos particiones hda1 y hda2, las cuales son manejadas por el mismo driver, pero se asigna un número menor único a cada una; lo mismo sucede con el puerto serie. + +\subsubsection{Implementación del driver de un LED} +A continuación se realizará la descripción de un driver tipo caracter para un dispositivo muy sencillo, un LED \cite{OPPS05}. Este ejemplo fue implementado en un procesador PXA255 de Intel y realiza las siguientes operaciones: + +\begin{itemize} +\item \textit{init}: Se ejecuta cuando se carga el módulo, el LED se apagará. +\item \textit{close}: Se ejecuta cuando se descarga el módulo, el LED se encenderá. +\item \textit{open}: Se ejecuta cuando se realiza una operación de lectura o escritura al dispositivo. +\end{itemize} + +Existen dos funciones que deben estar presentes en todo tipo de módulo, estas son: \textit{module\_init} y \textit{module\_exit} las cuales se ejecutan cuando se carga y descarga el módulo respectivamente. + +\begin{lstlisting}[firstnumber=40] +struct file_operations fops = { + .open = device_open, + .release = device_release, +}; + +static int __init blink_init(void) +{ + printk(KERN_INFO "BLINK module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + printk(KERN_ALERT "Registering char device failed + with %d\n", Major); + return Major; + } + + printk(KERN_ALERT "I was assigned major number %d. + To talk to\n", Major); + printk(KERN_ALERT "the driver, create a dev file + with\n"); + printk(KERN_ALERT "'mknod /dev/%s c %d 0'.\n", + DEVICE_NAME, Major); + + pxa_gpio_mode(GPIO_LED_MD); + pxa_gpio_mode(GPIO_LED_OFF); /* Turn LED OFF*/ + + return 0; +} + + +static void __exit blink_exit(void) +{ + int ret; + + ret = unregister_chrdev(Major, DEVICE_NAME); + if ( ret < 0 ) + printk( KERN_ALERT "Error in unregister_chrdev: + %d\n", ret ); + printk( KERN_INFO "BLINK driver is down...\n" ); +} + + +module_init(blink_init); +module_exit(blink_exit); + + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Carlos Camargo UNAL"); +MODULE_DESCRIPTION("BLINKER LED driver"); +MODULE_VERSION("1:0.1"); +\end{lstlisting} \normalsize + +Las funciones \textit{module\_init} \textit{module\_exit} deben ser declaradas como \textit{static} ya que no serán visibles fuera del archivo. Como puede observarse en la línea 83 se hace la definición de las funciones que deben ejecutarse al cargar y descargar el módulo en nuestro caso \textit{blink\_init} y \textit{blink\_exit} respectivamente. La información sobre el módulo aparece en las líneas 87-90. + +En la línea 40 se define la estructura de operaciones de archivo del módulo; cada campo de la estructura corresponde a la dirección de una función definida por el driver para manejar una solicitud determinada. En nuestro caso solo existe una función \textit{open}, la cual será definida más adelante. + +Como se puede ver en la figura \ref{kernel_module} es necesario que el kernel sepa que driver está encargado del dispositivo, esto es, el \textit{major number} del driver que lo maneja; por esto, lo primero que se debe hacer es obtener este número. En la función \textit{blink\_init} (línea 49) podemos observar la forma en que se realiza el registro de nuestro dispositivo. La función \textit{register\_chrdev} retorna el número mayor asignado de forma dinámica, esto es recomendable ya que si se fijara un número de forma arbitaria, podría causar conflictos con otros dispositivos. De esta forma, al cargar el módulo con el comando: \textit{insmod blinker.ko}, el LED se apagará y aparecerá el siguiente mensaje en la consola: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK module is Up. +I was assigned major number 253. To talk to +the driver, create a dev file with +'mknod /dev/blink c 253 0'. +\end{lstlisting} + +Con lo anterior, nuestro dispositivo es registrado y se le asigna el número 253 como \textit{major number}, en el archivo \textit{/proc/devices} aparecen los dispositivos que actualmente están siendo utilizados por el kernel, este archivo debe contener una entrada para blink de la forma: \textit{253 blink}. + +En la función \textit{blink\_exit} se realiza la liberación del dispositivo ( la función \textit{unregister\_chrdev}, línea 75), la cual se ejecuta cuando se lanza el comando: \textit{rmmod blinker.ko}, el que a su vez hace que se encienda el LED y se imprima en la consola el mensaje: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK driver is down... +\end{lstlisting} + +Como se mencionó anteriormente es posible manejar un archivo tipo caracter como si fuera un archivo de texto, por lo tanto, es posible adicionar funciones a las acciones de abrir, cerrar, escribir en o leer del dispositivo. + +\begin{lstlisting}[firstnumber=20, numbers=right] +static int device_open(struct inode *inode, \ + struct file *file) +{ + unsigned int i; + printk( KERN_INFO "Open BLINKER\n" ); + if (is_device_open) + return -EBUSY; + + is_device_open = 1; + + for( i=0; i<5; i++ ){ + pxa_gpio_mode(GPIO_LED_ON); + mdelay(0x0080); + pxa_gpio_mode(GPIO_LED_OFF); + mdelay(0x0080); + } + + try_module_get(THIS_MODULE); + return SUCCESS; +} +\end{lstlisting} + +Esta sección de código se ejecuta cada vez que el archivo de dispositivo /dev/blink es abierto, esto sucede en operaciones de lectura o escritura. Es decir si se utilizan los siguientes comandos: + +\begin{lstlisting}[numbers=none] +more /dev/blink +cat file > /dev/blink +cp file /dev/blink +\end{lstlisting} + +Con cada uno de estos comandos el LED se encenderá y apagará y en la consola se despliega el mensaje: + +\begin{lstlisting}[numbers=none] +Open BLINKER +Close BLINKER +\end{lstlisting} + +\section{Interfaz con Periféricos dedicados} +Es común que algunas aplicaciones requieran ciertos periféricos especiales que les permitan cumplir las restricciones temporales, es decir, es necesario crear tareas Hardware que ayuden a las tareas software a cumplir con las restricciones de diseño. Para esto es necesario implementar algunas funciones en periféricos externos al procesador. Si la tarea no se encuentra implementada en un dispositivo comercial es necesario implementarlas en un Dispositivo Lógico Programable (PLD) o en un Circuito Integrado de Aplicación Específica (ASIC). + +En esta sección realizaremos una explicación detallada del proceso de comunicación entre el procesador y un periférico implementado en una FPGA. + +\subsection{Comunicación Procesador - Periférico} +La figura \ref{computer_arch} muestra una arquitectura básica para la comunicación de tareas Hardware - Software; en ella podemos observar que el procesador maneja tres buses: +\begin{itemize} +\item Bus de Datos: Bus bidireccional por donde se realiza el intercambio de información. +\item Bus de Direcciones: Bis controlado por el procesador y es utilizado para direccionar un determinado periférico o una detrminada funcionalidad del mismo. +\item Bus de control: Señales necesarias para indicarle a los periféricos el tipo de comunicación (Lectura o escritura). +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/computer-simple} \end{center} + \caption{Arquitectura básica Hardware/Software}\label{computer_arch} +\end{figure} + +Todos los periféricos que requieren intercambio de información con el procesador comparten el mismo bus de datos, por lo que es necesario que mientras el procesador no se comunique con ellos permanezcan en estadp de alta impedancia, esto es necesario para evitar corto - circuitos originados por diferentes niveles lógicos en el bus. Por lo tanto, las comunicaciones siempre son iniciadas por el procesador y se selecciona uno y solo un periférico. El decodificador de direcciones es el encargado de habilitar un determinado periférico ante una solicitud del procesador (mediante una dirección de memoria), esto lo hace activando la señal \textit{CSX}, cuando esta señal se encuentra en estado lógico alto el periférico coloca su bus de datos en alta impedancia, si se encuentra en estado lógico bajo el periférica escribe o lee el bus de datos, dependiendo de la activación de las señales del bus de control RD y WR. + +El decodificador de direcciones, como su nombre lo indica utiliza como entradas el bus de direcciones y activa solo una señal de selección de Chip (\textit{CSx}), basándose en un rango de direcciones asignado a cada periférico, este rango de direcciones no debe traslaparse para asegurar que solo un chip es seleccionado. Este rango de direcciones que se asigna a cada dispositivo que puede ser accesado por la unidad de procesamiento recibe el nombre de \textit{mapa de memoria} y puede ser único para cada plataforma. + +Cuando la unidad de procesamiento necesite comunicarse con un determinado periférico, colocará en el bus de direcciones una valor que se encuentre en el rango de direcciones asignado para ese periférico, esto hace que el decodificador de direcciones active la señal de selección adecuada para informarle al periférico que el procesador va a iniciar una transferencia de información. La Figura \ref{rd_wr_timing} muestra el diagrama de tiempos para un ciclo de lectura y escritura del procesador. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/rd_wr_waveform} \end{center} + \caption{Ciclo de lectura y escritura para la arquitectura de la Figura \ref{computer_arch}}\label{rd_wr_timing} +\end{figure} + +De lo anterior podemos concluir que un periférico es visto por el procesador como una posición de memoria más y las transacciones las inicia únicamente el procesador. + +\subsubsection{Implementación de Periféricos en una FPGA} +Es importante tener en cuenta los siguientes items cuando se implemente una tarea Hardware en una FPGA: +\begin{itemize} + \item La frecuencia del reloj de la FPGA es mucho mayor que la de las señales del bus de control, por lo que es necesario asegurarse que cada vez que el procesador realiza una solicitud de lectura o escritura, la señal de activación cambia del estado lógico alto al bajo; si solo se tiene en cuenta el estado bajo de la señal \textit{CSX} el periférico puede ejecutar la tarea varias veces en el mismo ciclo de activación, lo que puede llevar a resultados incorrectos. + \item La fase de los relojes del procesador y la FPGA no es la misma, por lo que es necesario sincronizar las señales del procesador con el reloj de la FPGA; si esto no se hace las señales fuera de fase pueden originar un estado de metaestabilidad en los Flip-Flops internos y por lo tanto el mal-funcionamiento del sistema. + \item El bus de datos es bidireccional, por lo que es necesario que la FPGA lo coloque en alta impedancia cuando no se esté habilitando un periférico. + \item La FPGA no permite implementar buffers tri-estado internamente por lo que es necesario separar los buses de entrada y salida a cada periférico. El bus de entrada es común a todos los periféricos mientra que es necesario utilizar un esquema de multiplexación entre los buses de salida. +\end{itemize} + +La figura \ref{sw_hw_fpga_arch} muestra el diagrama de bloques de la interfaz necesaria para poder comunicar un grupo de periféricos o tareas Hardware con el bus de datos, dirección y control de un procesador. El bloque \textit{SYNC} se encarga de sincronizar las señales provenientes de la FPGA con el reloj interno de la misma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/sw_hw_fpga_arch} \end{center} + \caption{Diagrama de Bloques para la comunicación de tareas HW-SW \ref{computer_arch}}\label{sw_hw_fpga_arch} +\end{figure} + + El módulo \textit{Write Pulse generator} genera un pulso cuando las señales \textit{sncs} y \textit{snwe} son activadas como se indica en la figura \ref{cs_we_pulse}. El decodificador de direcciones selecciona un determinado periférico dependiendo del rango especificado para cado uno. Como mencionamos anteriormente, las FPGAs no permiten implementar buffers tri-estado internamente , por lo que cada periférico debe tener un bus de entrada y uno de salida de datos, los buses de entrada de datos son comunes, mientras que los de salida deben ser manejados por un dispositivo de salida, el cual puede ser un multiplexor controlado por el decodificador de direcciones o una compuerta OR, para este último caso es necesario que los periféricos coloquen el bus de datos en ``0'' cuando no estén seleccionados. Finalmente es necesario colocar un buffer tri-estado en los pines de la FPGA, este buffer está controlado por las señales \textit{nwe, noe, ncs} y solo se activa cuando \textit{nwe = 1, noe = 0, ncs = 0}, es decir, cuando se selecciona el rango de memoria de la FPGA y el procesador inicia una operación de lectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/cs_we_pulse} \end{center} + \caption{Generación del pulso de escritura}\label{cs_we_pulse} +\end{figure} + +\subsubsection{Programa en Espacio de Usuario para la comunicación} +El kernel de Linux proporciona una interfaz que permite a una aplicación \textit{mapear} un archivo en memoria, lo que hace que exista una correspondencia uno a uno entre las direcciones de memoria y el contenido del archivo. Linux implementa la llamada de sistema \textit{mmap()} para \textit{mapear} objetos en memoria.\cite{RL07} + +\begin{lstlisting} + #include + + void * mmap (void *addr, + size_t len, + int prot, + int flags, + int fd, + off_t offset); +\end{lstlisting} + + +Un llamado a \textit{mmap()} le pide al kernel hacer un mapeo en la memoria de \textit{len} bytes del objeto representado por el descriptor de archivo \textit{fd}, comenzando a \textit{offset} bytes dentro del archivo. Si se especifica \textit{addr}, se utiliza este valor como la dirección inicial en la memoria. Los permisos de acceso son determinados por \textit{prot}; PROT\_READ habilita la lectura, PROT\_WRITE habilita escritura y PROT\_EXEC habilita la ejecución. El argumento \textit{flasgs} describe el tipo de mapeo, y algunos elementos de su comportamiento y puede tomar los valores: + +\begin{itemize} + \item MAP\_FIXED: hace que \textit{addr} sea un requerimiento, si el kernel es incapaz de hacer el mapeo en esta dirección el llamado falla, si los parámetros de dirección y longitud traslapan un mapeo existente se descartan las áreas que se traslapan y se remplazan por el nuevo mapeo. + \item MAP\_PRIVATE: Establece que el mapeo no es compartido. Los cambios realizados a la memoria por este proceso no se reflejan en el archivo actual o en el mapeo de los otros procesos. + \item MAP\_SHARED: Comparte el mapeo con otros procesos que usan el mismo archivo. Escribir en el mapeo equivale a escribir en el archivo. +\end{itemize} + +A continuación se lista un ejemplo de la utilización del llamado \textit{mmap} + +\begin{lstlisting} +#define MAP_SIZE 0x2000000l // ECBOT USE A11 to A25 +#define MAP_MASK (MAP_SIZE - 1) + + int fd; + unsigned long i, j; + void *base; + volatile unsigned short *virt_addr; + + io_map(0xFFFFFF7C); // Configure CS3 as 16 bit Memory and 0 Wait States + off_t address = 0x40000000; // CS3 Base Address + + if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1){ + printf ("Cannot open /dev/mem.\n"); + return -1; + } + printf ("/dev/mem opened.\n"); + + base = mmap (0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, address); + if (base == (void *) -1){ + printf ("Cannot mmap.\n"); + return -1; + } + printf ("Memory mapped at address %p.\n", base); + + virt_addr = base; + +\end{lstlisting} + +En este ejemplo utilizamos el llamado \textit{mmap} para hacer un mapeo de la dirección de memoria correspondiente al CS3 (0x40000000). El descriptor del archvio utilizado es el dispositivo \textit{/dev/mem} el cual permite operaciones de lectura y escritura a la memoria virtual. Adicionalmente permitimos operaciones de lectura/escritura (PROT\_READ | PROT\_WRITE) y permitimos el acceso a otros proceso. Finalmente podemos usar la variable \textit{virt\_addres} para escribir en cualquier posición de memoria desde \textit{0x40000000} hasta \textit{0x40000000 + MAP\_SIZE}. El siguiente listado muestra un ejemplo de la forma de hacer estas operaciones. + +\begin{lstlisting} + printf("Writing Memory..\n"); + for (i = 0 ; i <32; i++){ + virt_addr[i<<10] = i*3; // ECBOT use A11 to A25 + } + + printf("Reading Memory..\n"); + for (i = 0 ; i < 32; i++) + { + j = virt_addr[i<<10]; + printf("%X = %X\n", i, j ); + } + if (munmap (base, MAP_SIZE) == -1) + { + printf ("Cannot munmap.\n"); + return -1; + } +\end{lstlisting} + +\subsection{Comunicación Periférico - Procesador} + +Cuando un periférico requiere atención por parte de la CPU debido a que terminó de realizar un proceso o porque requiere nuevas instrucciones para seguir operando, o un evento originado por un usuario necesita ser atendido, se debe iniciar un proceso para que la unidad de procesamiento se comunique con él. Como se mencionó anteriormente la unidad de procesamiento está encargada de forma exclusiva de iniciar las operaciones de lectura/ecritura con los periféricos, por esta razón, el periférico utiliza una señal (IRQ) para informarle al procesador que requiere ser atendido. Algunas arquitecturas poseen un mecanismo que permite el acceso a la memoria por parte de los periféricos sin utilizar el procesador, esto permite que periféricos de diferentes velocidades se comuniquen sin someter al procesador a una carga excesiva. En esta sección hablaremos de la forma de definir las interrupciones en un driver de Linux. + +\subsubsection{Manejo de Interrupciones} +A continuación se describirá la forma de manejar las interrupciones utilizando un driver de Linux. Analicemos la función \textit{qem\_init} + +\begin{lstlisting} + static int __init qem_init(void) +{ + int res; + printk(KERN_INFO "FPGA module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + return Major; + } + + /* Set up the FGPA irq line */ + at91_set_gpio_input(FPGA_IRQ_PIN, 0); + at91_set_deglitch(FPGA_IRQ_PIN, 1); + + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); + + set_irq_type(FPGA_IRQ, IRQT_RISING); + + ioaddress = ioremap(FPGA_BASE, 0x4000); + + return 0; +} + +\end{lstlisting} + +Esta rutina es similar a la presentada anteriormente, solo se agrega un par de comandos para definir un pin del procesador como entrada, para poder utilizarlo como señal IRQ, en la línea: + +\begin{lstlisting} + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); +request_irq (int irq, handler, irqflags, devname, dev_id); +\end{lstlisting} + +Se hace un llamado a la función \textit{request\_irq} que asigna recursos a la interrupción, habilita el manejador y la línea de interrupción. En nuestro caso define el pin \textit{FPGA\_IRQ\_PIN} como la línea de interrupción, la rutina \textit{irq\_handler} será ejecutada cuando se presente una interrupción, el flag \textit{IRQF\_DISABLED} deshabilita las interrupciones locales mientras se procesa, el nombre del dispositivo que realiza la interrupción es \textit{FPGA - IRQ}. + +La función \textit{ioremap(offset, size)}, una secuencia de operaciones que permiten que la memoria de la CPU se pueda acceder con las funciones \textit{readb/readw/readl/writeb/writew/write}, utilizando la variable \textit{ioaddress}. Finalmente se define el tipo de interrupción del pin \textit{FPGA\_IRQ\_PIN} como \textit{IRQT\_RISING}. + +La función que se ejecuta cuando se presenta la interrupción, se define en el siguiente listado: + +\begin{lstlisting} +irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + if(irq_enabled) + { + interrupt_counter++; + printk(KERN_INFO "interrupt_counter=%d\n",interrupt_counter); + printk("\n kernel: IREG_LP:%X \n", readb( &ioaddress[0x40] ) ); + wake_up_interruptible(&wq); + } + return IRQ_HANDLED; +} +\end{lstlisting} + +Cada vez que se produce una interrupción y si la variable global \textit{irq\_enabled} es igual a 1, se aumenta en 1 el valor de \textit{interrupt\_counter}, se imprime su valor y el de un registro interno del periférico. + +En este driver utilizaremos la función \textit{device\_read} para enviar información a un programa en espacio de usuario. +\begin{lstlisting} +static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ + char *buffer, /* buffer to fill with data */ + size_t count, /* length of the buffer */ + loff_t * offset) +{ + if(irq_enabled){ + wait_event_interruptible(wq, interrupt_counter!=0); + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + interrupt_counter=0; + } + else{ + interrupt_counter = -1; + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + } + return sizeof(interrupt_counter); +} + +\end{lstlisting} + +Cuando se realice una operación de lectura desde espacio de usuario, el proceso quedará bloqueado por la función \textit{wait\_event\_interruptible} hasta que la rutina de atención a la interrupción ejecute la función \textit{wake\_up\_interruptible}, pero es necesario que se cumpla la condición evaluada por \textit{wait\_event\_interruptible} para que se ejecute la tarea. Para este ejemplo: + +\begin{lstlisting} + wait\_event\_interruptible(wq, interrupt\_counter!=0); +\end{lstlisting} + +Por lo que \textit{irq\_handler} debe hacer: + +\begin{lstlisting} + interrupt_counter++; + wake_up_interruptible(&wq); +\end{lstlisting} + +Si no se hace esto el proceso nunca se despertará y el proceso de lectura quedará bloqueado. + +En la línea: + +\begin{lstlisting} + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + copy_to_user ( to, from, long n); +\end{lstlisting} + +Se utiliza la función \textit{copy\_to\_user} para intercambiar información con el programa que se ejecuta en espacio de usuario. En este caso se copia a \textit{char *buffer}, la variable \textit{interrupt\_counter}. Existe una función análoga que recibe información proveniente del espacio de usuario \textit{copy\_from\_user} En la Figura \ref{copy_to_from_user} se muestran estas operaciones. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/copy_to_from_user} \end{center} + \caption{Intercambio de información entre los espacios de kernel y usuario\label{copy_to_from_user}} +\end{figure} + +En la función \textit{qem\_exit} se liberan los recursos de la interrupción y la variable \textit{ioaddress}. + +\begin{lstlisting} +static void __exit qem_exit(void) +{ + int ret; + /*Tho order for free_irq, iounmap & unregister is very important */ + free_irq(FPGA_IRQ_PIN, NULL); + iounmap(ioaddress); + unregister_chrdev(Major, DEVICE_NAME); + + printk(KERN_INFO "FPGA driver is down...\n"); +} +\end{lstlisting} + + +Finalmente el programa en espacion de usuario es: + +\begin{lstlisting} + int main(void) { + + int fileNum, bytes; + char data[40]; + + fileNum = open("/dev/fpga", O_RDWR); + if (fileNum < 0) { + printf(" Unable to open file\n"); + exit(1); + } + + printf(" Opened device\n"); + + bytes = read(fileNum, data, sizeof(data)); + + if (bytes > 0) + printf("%x\n", data); + + close(fileNum); + + return (0); +} +\end{lstlisting} + +En este programa se abre el dispositivo \textit{/dev/fpga} que corresponde a nuestro driver y se utiliza la función \textit{read} para leer la información suministrada por el driver. \ No newline at end of file diff --git a/course/.docs/book/problem.tex b/course/.docs/book/problem.tex new file mode 100644 index 0000000..c4b98e9 --- /dev/null +++ b/course/.docs/book/problem.tex @@ -0,0 +1,516 @@ +\section{Definici\'on del problema } + +\section{Introducción} +Uno de los objetivos principales del presente trabajo es la realización de actividades que ayude al país en su desarrollo tecnológico; en la actualidad Colombia es un consumidor de tecnología, es decir, busca en el exterior soluciones a sus problemas, en la mayoría de las ocasiones, estas soluciones no se ajustan a los requerimientos, ya que no tienen en cuenta la situación política, cultural y social del país. En la mayoría de los casos, no se aumenta el conocimiento tecnológicos del país, y reduce las opciones de negocios para las empresas locales a representantes de ventas o suministro de sevicios de mantenimiento. + +Este esquema es nocivo para la industria Colombiana, ya que no existen mecanismos que permita su desarrollo, protegiéndola de alguna forma frente a los productos foráneos. Esto unido a las politicas de estado encaminadas a la apertura comercial, en donde los productos nacionales compiten con productos de paises con mayor desarrollo tecnológico nos llevará a la eliminación total de la industrias Colombianas. A continuación se presenta un resúmen del estudio realizado por Hector Martínez sobre la Apropiación del conocimiento en Colombia \cite{Mar04} durante los años 1991 a 2000. + +En la actualidad Colombia atraviesa por una $''$\textit{\textit{crisis}}$''$ a +nivel de diseño de sistemas digitales, existe un atraso muy grande en esta +\'area; a mi modo de ver existen dos grandes responsables de esta situaci\'on. +Por un lado, las pol\'{\i}ticas de la mayor\'{\i}a de las industrias al no +realizar inversi\'on de capital en sus departamentos de I+D; algunas de ellas +ni siquiera cuentan con este departamento. Por otro lado, las Universidades no +cuentan con programas actualizados que permitan explotar los avances +realizados en las industrias electr\'onica y de semiconductores; en un gran +n\'umero de Universidades Colombianas a\'un se trabaja con dispositivos de +funci\'on fija como las familias 74 y 40. Los lenguajes de descripci\'on de +hardware han sido adoptados recientemente en la mayor\'{\i}a de programas de +ingenier\'{\i}a electr\'onica, pero en algunos casos no existe una base +metodol\'ogica que soporte su adecuada utilizaci\'on. La disponibilidad de +dispositivos l\'ogicos programables (FPGAs, CPLDs) es limitada debido a la +inexistencia de un proveedor local. Se dedican cursos completos para +$''$enseñar$''$ a programar microprocesadores de 8 bits en lenguaje +ensamblador y muchos educadores a\'un miran con desconfianza a los lenguajes +de alto nivel como el C, C++ o UML. En muy pocos programas de Ingenier\'{\i}a +Electr\'onica no se cuenta con una asignatura dedicada a sistemas operativos y +en muchos de ellos no se le da la importancia que tiene la enseñanza de +lenguajes estructurados. + +La situaci\'on se agrava a\'un m\'as al ver el estado de la relaci\'on entre +la universidad y la industria, la cual no existe en algunos casos. Desde el +punto de vista industrial los resultados obtenidos en la academia parten de +entornos ideales y no se tienen en cuenta las caracter\'{\i}sticas de los +entornos industriales, lo cual da como resultado sistemas poco robustos y con +problemas funcionales. Por otro lado, los tiempos de desarrollos son muy +largos ya que la mayor\'{\i}a de las universidades Colombianas no se cuenta +con grupos de investigaci\'on cuyos miembros se encuentren dedicados de forma +exclusiva al desarrollo de este tipo de proyectos, la mayor\'{\i}a \ de los +miembros de estos grupos son temporales (estudiantes de pregrado) y sin paga, +lo cual no garantiza el cumplimiento ni la continuidad de las investigaciones. + +\subsection{Apropiación de Conocimiento} + +Para que Colombia deje de ser un país que consume tecnología y llegue en algún momento a ser generador de productos tecnológicos, es necesario que se genere un conocimiento que permita esta transición. ``Para que el conocimiento sea motor de desarrollo es necesario el traspaso desde sus creadores a la sociedad, mediante la conversión a tecnologías que produzcan cambios radicales que incrementen la producción. Esa transmisión de tecnología generadora de crecimiento económico esta influenciada por diversos factores: medio geográfico, leyes de propiedad industrial, costos laborales, nivel de ciencia y tecnología, religión, tipos de instituciones, resistencia a innovar, políticas de estado, guerras, factores demográficos, entre otros'' \cite{Mok90} + +Pero como apropiar este conocimiento? Arrow \cite{Arr62} afirma que la apropicación de conocimiento puede efectuarse de varias formas: ``aprender haciendo'', ``aprender usando'', ``aprender leyendo''. Cuando una empresa decide transmitir su conocimiento disponible, lo hace en procesos de investigaciones conjuntas, en actividades de producción, y distribución, mercadeo, servicio y soporte operativo o riesgo compartido. También se presentan alianzas entre firmas como: contratos de I+D, acuerdos de licencias, licencias cruzadas. La conformación de estas asociaciones permite crear redes tecnológicas dominadas por países industrializados con sus respectivas empresas multinacionales monopolizando conocimiento \cite{Mar04} + +Para Colombia, el problema radica en que mediante contratos de importación de tecnología, las empresas de capital nacional no están adquiriendo el conocimiento necesario para lograr innovaciones al interior de las mismas. De forma que puedan ser competitivas y logren acceder a mercados internacionales ofreciendo productos innovadores, de calidad y a precios competitivos. Con efectos directos como: generación de empleos especializados, desarrollo tecnológico e industrial sostenido, ampliación del acervo de conocimiento nacional y disminución de la salida de divisas (al mejorar los procesos de negociación) y creación de externalidades positivas \cite{Mar04}. + +Ligado al problema de la senda tecnológica está el del grado de lo tácito del conocimiento científico. Teece \cite{Tee81} señala que al existir conocimiento tácito toda la tecnología disponible no se transfiere de los productores a los receptores o compradores de la misma. Por tanto, los países seguidores siempre van a estar a la zaga tecnológica. Forbes y Wield \cite{FW00} señalan que los esfuerzos adaptativos son mayores porque deben acomodar las ``innovaciones'' a los materiales locales, fuerza laboral nativa, mercados internos y medio ambiente local. Entonces, el problema no se limita a cómo transferir conocimiento, cómo develar su parte tácita y cómo extraerlo de las multinacionales, sino que radica en el bajo poder de negociación y adquisición de tecnología por firmas pequeñas y medianas, las cuales carecen de recursos y tienen procesos deficientes de contratación. + +En este orden de ideas, si el país no es un innovador neto ¿no debería más bien mostrar una tendencia a importar conocimiento? Y las firmas nacionales ¿no deberían ser las que más efectuaran este tipo de contratos, para así acceder al conocimiento de la tecnología adquirida? En resumen, conociendo mejor qué tecnología se importa y qué tipos de contratos se utilizan, es posible crear marcos de referencia para empresas nacionales que estén interesadas en adquirir tecnología. Esto produciría externalidades positivas en empresas importadoras de conocimiento y, a su vez, en la economía del país. Con una adecuada importación de conocimientos tecnológicos se crearía una ventaja competitiva de carácter estructural, basada en un acervo de conocimiento tecnológico que permita incrementar la productividad en todos los sectores económicos de manera permanente \cite{Mar04}. + +Según los estudios realizados por Martínez, con base en registros del Decreto 259/92, del Incomex. La importación de conocimiento no está siendo empleada con el propósito de utilizar tecnologías de punta que permitan efectuar innovaciones al interior de las empresas y de los sectores. Las empresas nacionales se limitan a comprar un determinado dispositivo, sin tener el conocimiento para operarlo, hacerle mantenimiento ni mucho menos mejorarlo, por lo que se ven obligadas a contratar con el vendedor contratos para dicho fín. Esto indica que la adquisición de tecnología no se realiza con base en programa desarrollado de antemano, sino son una respuesta a cambios en el mercado, lo cual evidencia la inexistencia de programas de innovación encaminados a la disminución de la brecha tecnológica. + +\subsubsection{Situación de la Industria Electrónica en Colombia} + +La industria electrónica nacional no es ajena a las políticas que siguen las empresas nacionales en cuanto a la apropiación de tecnología; Colombia depende totalmente de economías más desarrolladas para el suministro de dispositivos electrónicos en diversas areas (comunicaciones, entretenimiento, industria, medicina, etc). Mientras en otros sectores de la economía han pasado de ser consumidores a exportadores, y adquieren nuevas tecnologías para ser más competitivos, el sector electrónico del país ha reducido sus actividades de Investigación y Desarrollo hasta el punto de depender totalmente de productos externos unos de baja calidad y que no suplen los requerimientos del mercado local, pero que son muy económicos. + +En la actualidad la industria electrónica presenta una gran dinámica a nivel mundial, el uso de los sistemas electrónicos se extiende a todas las actividades humanas; La demanda mundial de este tipo de sistemas aumentará de forma dramática en los próximos años, especialmente en los sectores de tecnología médica, movilidad, seguridad, comunicaciones y consumo \cite{ETPoSSI(09}. El mercado de los sistemas embebidos es una industria que movió alrededor de 25 billones de dólares en el 2008 según Venture Development Corporation \cite{Vc08}. Por otro lado, la inversión de capital necesaria para el diseño de Sistemas Embebidos es relativamente baja, gracias a la gran demanda originada, los insumos y los servicios de fabricación son muy económicos, por otro lado, las herramientas de desarrollo necesarias para la programación y depuración de este tipo de sistemas son de libre distribución. + + +Desafortunadamente en Colombia la industria electrónica se encuentra muy rezagada en relación a las de los países industrializados, y las ventajas y oportunidades de negocios mencionadas anteriormente no son aprovechadas en la actualidad. + + +Según ASESEL \footnote{Asociación de entidades del Sector Electrónico} en el 2001 existían 154 empresas productoras de componentes y equipos de la cadena electrónica. Dentro de los productos que la industria electrónica exporta se encuentran registrados: Circuitos integrados, circuitos impresos, microestructuras, instrumentos para medida y control, Instrumentos y aparatos eléctricos o electrónicos. Es importante decir que la industria colombiana, en la actualidad no fabrica circuitos integrados, ni microestructuras, por lo que estas son ventas de productos comprados en países desarrollados. Según Proexport el 91\% de las exportaciones son realizadas por Bogotá y los destinos se encuentran en países cercanos como Venezuela, Perú, Ecuador y USA. + +La electrónica en Colombia y en el mundo hace parte de esas industrias que se mueven velozmente en un +camino desconocido, como consecuencia se hace necesario tener una actualización constante de los +avances tecnológicos y las proyecciones futuras del sector. Debido a la importancia del sector tecnológico es primordial que en Colombia se esté consciente del estado actual y que se puede hacer en términos de +Investigación Científica y Desarrollo Tecnológico (I+D) en Ingeniería Electrónica. + +Un estudio realizado en la Universidad Nacional de Colombia \cite{MTRR07} identificó los siguientes obstáculos para el desarrollo de la industria electrónica en Colombia: Deficientes relaciones Universidad Empresa, Pobre enfoque académico hacia la industria, Calidad de los productos nacionales, políticas gubernamentales, falta de cultura de Investigación y Reducida apropiación tecnológica, competencia de países asiáticos, atraso tecnológico, limitado recurso humano con formación avanzada. + +De los problemas expuestos anteriormente podemos identificar cuales son los que más afectan el desarrollo de la industria electrónica en Colombia, el que más perjudica sin lugar a dudas es el atraso tecnológico, no es posible ser competitivo en el mercado electrónico mundial con tecnologías y metodologías de diseño obsoletas, en Colombia trabajamos aún con circuitos integrados que se crearon en la decada de los 80 del siglo pasado y utilizamos lenguajes de programación como el assembler, para el cual el tiempo de aprendizaje, desarrollo y de depuración es muy largo. La culpa de este atraso tecnológico no es exclusiva de la induatria, aunque, como vimos anteriormente muchas industrial Colombianas se resisten al cambio y prefieren comprar equipos en el exterior a buscarlos localmente, la falta de confiabilidad en los productos Colombianos agrava este problema, esta falta de confianza en la industria local no es infundada, la mayoría de los productos Colombianos no cumplen con las normas mínimas de calidad y utilizan productos de bajo costo obtenidos en remates de componetes. + +Otro actor que contribuye al retraso tecnológico es el sector académico; según el Sistema Nacional de Información Superior, durante los últimos 10 años se han abierto 230 programas relacionados con la industria electrónica, estos programas están repartidos entre programas de formación Universitaria, tecnológica terminal y de técnica profesional, la mayoría de estos centros de formación se encuentran ubicados en 3 Departamentos: Bogotá, Antioquia y Valle \cite{DZSC+07}. El número de Ingenieros graduados en un año es entre 2 y 8 veces mayor que en los países en vía de desarrollo y doce veces mayor que los que se gradúan en los países desarrollados, en Colombia, este aumento es aportado por instituciones de poca consolidación. Además las preferencias en la educación superior son Formación técnica / form. tecnológica / form. profesional que es justamente lo opuesto a la de los países desarrollados \cite{MDAG99}. + +Por otro lado, el contenido de las asignaturas relacionadas directamente con la industria electrónica se encuentran muy desactualizados, y fuera del contexto mundial, se utilizan metodologías de diseño antiguas en las que primaba la experiencia del diseñador, se realizan tareas manuales, repetitivas que pueden ser realizadas por herramientas de diseño moderno, los currículos son conservadores hay poca experimentación y su estructuración y metodologías son muy clásicas. Otro problema adicional radica en la falta de experiencia en el sector productivo por parte del personal académico, un componente importante de los profesores nunca han sido parte de un proceso productivo o de un proceso de desarrollo que tenga como fín la creación de un producto comercial, razón por la cual se evita la experimentación y se da más énfasis al análisis y solo se llega a una simulación. + +De lo anterior podemos concluir que en Colombia se presenta una sobre-oferta de profesionales en el área electrónica, muchos de los cuales provienen de instituciones educativas con poca consolidación, y que han sido formados con programas desactualizados que no tienen en cuenta los avances tecnológicos y metodológicos, lo cual explica la pobreza de ingenieros con altos niveles de formación. Por esta razón no es de extrañar la poca confianza que tienen los industriales en los productos nacionales. + +Lo anterior unido a la falta de políticas de estado que: tracen normas encaminadas a incentivar la inversión en investigación y desarrollo, defina líneas y campos de investigación, regulación de la oferta laboral, regulación de los programas académicos, generan el clima perfecto para que el atraso tecnológico se mantenga durante mucho tiempo y Colombia no deje de ser un consumidor de tecnología. + + +\subsubsection{Pasos a seguir para iniciar la solución al problema de atraso tecnológico} + +Estudios consultados \cite{MDAG99} \cite{DZSC+07} \cite{MTRR07} \cite{Mar04}, coinciden en que para dar solución a los problemas expuestos anteriormente se deben seguir las siguientes recomendaciones: + +Al gobierno: + +\begin{itemize} + \item Fomento gubernamental de centros de investigación y productividad para fortalecer la relaciones universidad empresa. + \item Fomentar cooperación internacional e inversión extranjera con transferencia de tecnología. a nivel gubernamental, Apoyo del gobierno a personas que tienen un alto potencial de crear y desarrollar tecnología. + \item Definir agendas de investigación acordes con las tendencias mundiales y desarrollar capacidades en el país. +\end{itemize} + +A los centros de Enseñanza: +\begin{itemize} + \item Creación de portafolio de servicios. + \item Realizar seminarios y líneas de profundización de temas afines a la administración y la gerencia en empresas de base tecnológica. + \item Montar laboratorios de pruebas e incentivar los productores nacionales para que logren una calidad que cumpla con los estándares internacionales. + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología. + \item Incentivar la formación de maestrías y doctorados nacionales acorde con una agenda de investigación. + \item Realización de proyectos de aplicación. + \item El contacto con las empresas no debe ser encargada únicamente a los estudiantes, la Universidad debe desarrollar las competencias que la empresa requiere. + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial + \item Innovación curricular, actualización continua de profesionales. + \item Las facultades de Ingeniería deben acompañar las demandas que surgen del sector productivo. + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología. +\end{itemize} + + + +\subsubsection{Estado de la Electrónica Digital en la Universidad Nacional de Colombia} + +Hasta hace un año en las asignaturas del área de electrónica digital de la Universidad Nacional de Colombia (La Universidad más grande e importante del pais), se trabajaba con dispositivos que fueron sacados al mercado en 1966 y 1968, las familia lógica TTL 7400 y CMOS 4000. El problema principal al utilizar esta tecnología no es su año de creación, ni siquiera que en la actualidad se consideren obsoletas para el diseño de un sistema digital completo. \footnote{En la actualidad estas compuertas se utilizan para la implementación de pequeñas operaciones lógicas} El problema detrás del uso de esta tecnología se encuentra en la ausencia total de metodologías de diseño (en el caso Colombiano). Y el desconocimiento en herramientas tipo CAD. El proceso de diseño que realizaban los estudiantes era: + +\begin{enumerate} + \item Especificaciones del sistema. + \item Generación manual de ecuaciones boolenas. + \item Minimización manual utilizando mapas de Karnaugh. + \item Implementación de las ecuaciones minimizadas utilizando las familias lógicas 7400 y 4000, sobre placas de pruebas (protoboards, breadboards) + \item Pruebas del sistema. +\end{enumerate} + +A manera de ejercicio académico se justifica el uso de las familias 7400 y 4000, sin embargo, el quedarse ahi no es bueno para una industria electrónica desactualizada, debido a que este tipo de implementaciones no pueden generar productos competitivos a nivel mundial. La razón de esto es que existen muchas fuentes de error en el proceso, generados por la ausencia de herramientas CAD que realizan las operaciones tediosas como las minimización de ecuaciones booleanas, las cuales están sujetas a errores humanos originados por cansancio, falta de concentración, etc. Otro aspecto que vale la pena resaltar es la falta de ua simulación funcional, la mayoría de los estudiantes consultados no realizaban simulaciones funcionales y preferían probar el diseño una vez implementado físicamente, esto unido a la dificultad de depuración innata a este tipo de implementaciones, aumentaba considerablemente el tiempo requerido para realizar las pruebas al sistema. + +A los problemas mencionados anteriormente se suma la gran cantidad de circuitos integrados necesarios para implementar un sistema sencillo, se observaron hasta 8 placas de pruebas con cerca de 50 circuitos integrados interconectados entre sí, lo cual aumenta las posibles causas de error y aumenta el tiempo de desarrollo en forma considerable. + + +En el segundo curso del área de electrónica digital, se introduce al estudiante al uso de los dispositivos lógicos programables (PLD) y los lenguajes de descripción de hardware (HDL) como herramientas para el diseño de sistemas digitales, al comienzo, el contenido de estos cursos se limitaba al uso de una herramienta de diseño y la enseñanza de nociones básicas del lenguaje VHDL, se daba más importancia al uso de la herramienta y no a la metodología de diseño, de nuevo el estudiante ataca los problemas sin una metodología de diseño clara. Vale la pena indicar que este curso fue dictado por profesores ocasionales durante los últimos cuatro años, cada profesor utilizaba contenidos y niveles de exigencia diferentes. + +En la tercera parte del curso se trabaja con sistemas microcontrolados, se utilizan microcontroladores de 8 bits de diferentes familias y se utiliza el lenguaje ensamblador como herramienta de desarrollo. Una de las principales desventajas que presenta este curso (y de la línea en general) es la falta de continuidad en los contenidos y en la metodología utilizada, ya que el contenido de este curso se encuentra totalmente desligado al de los dos anteriores. Sin embargo, durante este curso se proporciona una metodología de diseño en la que los estudiantes emulan el comportamiento del microcontrolador antes de ser programado, sin embargo, esta práctica no es seguida por la mayoría de los estudiantes, una posible causa de este comportamiento puede ser la falta de metodologías de diseño en los cursos anteriores. + +La sensación que queda al terminar el área de electrónica digital es que lo único que importa son los microcontroladores y que lo visto en los primeros cursos no es muy útil. La siguiente tabla muestra los problemas encontrados en el área de electrónica digital de las carreras de Ingeniería Eléctrica y Electrónica de la Universidad Nacional de Colombia: + +\begin{enumerate} + \item Falta de una metodología de diseño. + \item Utilización de herramientas obsoletas: Familias Lógicas, lenguajes de programación. + \item Poco uso de las herramientas CAD. + \item Falta de continuidad en las asignaturas. + \item Falta de docentes. + \item No se suministra una formación adecuada que ayude a la industria electronica a salir del retraso tecnológico. +\end{enumerate} + + + +\begin{enumerate} + + \item Estudio de sistemas y algoritmos bio-inspirados: Algoritmos + Gen\'eticos (GA), Sistema Inmune Artificial (AIS), Hardware Evolutivo (EHW), + Chips de ADN, Aut\'omatas Celulares (CA), entre otros. el cu\'al ha + producido las siguientes publicaciones \cite{JSCC04c},\cite{JSCC04},\cite{JSCC03},\cite{JSCC04b}: + \begin{itemize} + \item J. Sep\'ulveda and C. Camargo. Implementaci\'on de un + Sistema InmuneArtificial sobre un FPGA para Reconocimiento de Patrones. + \textit{Memorias del X WorkShop de Iberchip}, 2004. + + \item J. Sep\'ulveda, C. Camargo, and A. Delgado. El Problema + SAT: Enfoque Comparativo con ADN y FPGA. \textit{Memorias del + IX Workshop de Iberchip}, 2003. + + \item J. Sep\'ulveda, C. Camargo, and A. Delgado. + Implementaci\'on de Chip de ADN en FPGA. \textit{Memorias del X Workshop de Iberchip}, 2004. + + \item J. Sep\'ulveda, C. Camargo, and S. Bolivar. + Metodolog\'{\i}a de Implementaci\'on de Aut\'omatas Celulares + en FPGA. \textit{Memorias del X Workshop de Iberchip}, 2004. + \end{itemize} + \item Estudio del proyecto Embrionics, implementaci\'on de un arreglo de + c\'elulas en una FPGA; como resultado se obtuvo el siguiente art\'{\i}culo + {\cite{JEFS05}}: + \begin{itemize} + \item J. Espinosa, C. Camargo, and F. Segura. Evoluci\'on de un + Arreglo de C\'elulas Utilizando Algoritmos Gen\'eticos. + \textit{Memorias del XI Workshop de Iberchip}, 2005. + \end{itemize} + + + \item Estudio del proyecto Amorphous Computing. + + + + \item Investigaci\'on en nuevas tecnolog\'{\i}as y en metodolog\'{\i}as de + diseño de sistemas digitales: + \begin{enumerate} + \item Implementaci\'on de aplicaciones de Sistemas Embebidos utilizando + herramientas GNU y el sistema operativo de libre distribuci\'on + eCos{\footnote{http://sources.redhat.com/ecos}}, sobre un procesador ARM + (AT91 de Atmel y GameBoy Advance de Nintendo); como parte de este estudio + se publicaron los art\'{\i}culos {\cite{CC05}}, {\cite{FPFS+05}}: + \begin{itemize} + \item C. Camargo. Implementaci\'on de Sistemas Digitales + Complejos Utilizando Sistemas Embebidos. \textit{Memorias + del XI Workshop de Iberchip}, 2005. + + \item F. Pedraza, C. Camargo, F. Segura, and A. Gauthier. + Control Adaptativo Embebido. \textit{Memorias + del XI workshop de Iberchip}, 2005. + \end{itemize} + \item Implementaci\'on de aplicaciones linux sobre una FPGA Spartan 3 de + Xilinx, utilizando el procesador microblaze de Xilinx. + + \item Implementaci\'on de aplicaciones Java sobre una JVM implementada en + hardware{\footnote{http://www.jopdesign.com}} sobre una FPGA Spartan 3 de + Xilinx. + + \item Desarrollo de aplicaciones sobre el sistema operativo linux + utilizando el SoC de Sharp LH79520. + + \item Desarrollo de plataformas de desarrollo para FPGAs, SoC y + Procesadores ARM. + + \end{enumerate} + \item Construcci\'on de la plataforma rob\'otica y desarrollo de Software y + Hardware para su funcionamiento: + \begin{itemize} + \item C. Camargo ECBOT: Arquitectura Abierta para Robots M\'obiles. + \textit{IEEE CWCAS'07 Noviembre Bogot\'a - Colombia.} + \end{itemize} +\end{enumerate} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\chapter{Paradigmas para la inteligencia Ubicua} + +\section{Trabajo Previo} +En esta sección realizaremos una revisión de los trabajos realizados en las áreas relacionadas con auto-organización con implementaciones Hardware..... + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AUTO - ORGANIZACION +\subsection{Auto-Organización} + +Trabajos en Auto-Organización han sido desarrollados en muchos campos, Por ejemplo, en \cite{SOQX04} utilizan un protocolo de auto-organización para optimizar la energía de una red de sensores inalámbricos, proporcionar adaptabilidad (en tamaño, topología y densidad) a la infraestructura de comunicaciones y permite comunicaciones multi-hop + +Las técnicas para modelamiento de sistemas complejos se pueden dividir en aproximaciones \cite{JLXJ}: +\begin{itemize} + \item Top-Down: Comienza con una descripción de alto nivel del sistema y utiliza herramientas como ecuaciones diferenciales. Trata cada parte del sistema complejo de forma genérica y es efectivo modelando casos promedio, donde la diferencia de comportamiento de los individuos puede ser ignorada. Sin embargo, esta aproximación no puede ser utilizada en todos los casos. Por ejemplo, las ecuaciones diferenciales no pueden modelar de forma precisa, la dinámica y el comportamiento emergente de algunos de los sistemas biológicos (la distribución de anticuerpos en el sistema inmunológico humano tiende a ser heterogéneo) +\item Bottom-Up: Comienza con una descripción de la entidad más pequeña del sistema complejo y modela su funcionamiento de la siguiente forma: + \begin{itemize} + \item Autónomo: Los elementos del sistema son individuos racionales que actúan de forma independiente. + \item Emergente: Exhiben comportamientos complejos que no estan presentes o son predefinidos en el funcionamiento de las unidades autónomas. + \item Adaptativo: Modifican su comportamiento ante cambios en el entorno donde estan localizados. + \item Auto-Organizado: Son capaces de organizar los elementos para alcanzar los funcionamientos anteriormente mencionados. + \end{itemize} + +\end{itemize} + + +Autonomy-Oriented Computing (AOC) \cite{JLXJ} es una aproximación bottom-up que intenta resolver problemas computacionales de alto grado de dificultad o caracterizar el funcionamiento de sistemas complejos basado en la observación de la naturaleza, los pasos para construir un modelo AOC son: + +\begin{enumerate} + \item Observar el comportamiento macroscópico del sistema natural + \item Diseñar las entidades funcionamiento deseado asi como el entorno donde residen dichas entidades. + \item Observar el comportamiento macroscópico del sistema artificial. + \item Validar el comporatmiento del sistema artificial con su contraparte natural. + \item Modificar el diseño obtenido en 2) de acuerdo a los resultados obtenidos en 4) + \item Repetir 3) y 5) hasta encontrar el comportamiento deseado. + \item Encontrar un modelo de 1) en términos de 2). +\end{enumerate} + +\subsection{Auto-Organización de sensores} +\cite{KPJZ} + + +El CEBOT \cite{TUTF} esta conformado por un gran número de unidades robóticas autónomas, llamadas celúlas, cada una con capaz de realizar una función simple. CEBOT permite configurar de forma dinámica la estructura del SW y HW con el fín de realizar una determminada función o ante cambios en el entorno, esta reconfiguración se logra modificando la interacción entre las células. En este trabajo el comportamiento cooperativo se define como un comportamiento de la célula para generar la configuración estructural. + + + +\section{Coordinación basada en el comportamiento de un sistema multi-robot\cite{JaMJM05}} + +\subsection{Arquitecturas de control de robots} + +\subsubsection{Control de un robot} +Aca se define el control de un robot como el proceso de mapear la información obtenida por los sensores del mismo en acciones en el mundo real. las aproximaciones para controlar un robot pueden describirse como un espectro que va desde el control deliberativo al reactivo. + +La aproximación deliberativa es computacionalmente intensiva, ya que utiliza razonamiento o planeación explícita utilizando una representación simbólica y modelos del mundo \cite{RK95}. Para que el proceso de razonamiento sea efectivo, se requiere que los modelos del mundo sean completos y precisos. En dominios donde dicho modelo es difiícil de obtener, por ejemplo, en entornos dinámicos y de rápido cambio o en situaciones donde exista una gran incertidumbre sobre los sensores y acciones de los robots, puede ser imposible para un robot actuar de forma adecuada utilizando este tipo de control. + +En contraste al control deliberativo, el reactivo se caracteriza por tener un fuerte acople entre el sensado y la acción, donde típicamente no existe ningún tipo de razonamiento\cite{BC86}\cite{Bro91}. El control reactivo no requiere la creación o el mantenimiento de modelos del mundo, ya que no se basa en procesos de razonamientos complejos utilizados en el control deliberativo. En lugar de esto, utilizan métodos que involucran una cantidad mpinima de computación, representación interna o cinicimiento del mundo. Esto hace al control reactivo adecuado para entornos dinámicos, donde tener un modelo del mismo no es muy realista. Aún mejor, la baja necesidad computacional permite a los sistemas reactivos responder de forma adecuada a dinámicas de cambios rápidos. + +El control híbrido se encuentra localizado entre el control deliberativo y reactivo, en el cual un controlador posee componentes reactivos y deliberativos. EL control reactivo maneja tareas de control a bajo nivel que requieren una respuesta rápida, tal como evación local de obstáculos. La parte deliberativa del control maneja tareas de alto nivel saobre una mayor escala de tiempo, tales como planeación de camino (path planning). Adicionalmente el control hibrido debe tener una tercera capa que realice la interfaz entre el componente reactivo y el deliberativo. Esta arquitectura de tres capas pretende extraer lo mejor del control reactivo en términos de control dinámico y tiempo de respuesta y lo mejor lo mejor de los controladores deliberativos en la forma de acciones globales eficientes sobre una gran escala de tiempo. Sin embargo existen asuntos complejos que involucrados en la interfaz de estos dos componentes fundamentalmente distintos y la forma en la cual su funcionalidad puede ser particionada no es muy clara aún. + + +\subsection{Control Basado en el Comportamiento (BB)} + +La aproximación BB para el control de robots no puede ser clasificada como reactiva o deliberativa, ya que puede ser, y en mucho casos son, las dos. Sin embargo, el control BB se identifica más con el control reactivo del espectro de control, porque se presta una gran atención en mantener una estrecha realación entre sensado y acción. \cite{Con92} \cite{Gat98} + +Fundamentalmente un Controlador Basado en el Comportamiento esta compuesto por un grupo de componentes modulares,llamados \textit{funcionamientos}, los cuales, son ejecutados en paralelo. Un \textit{funcionamiento} es una ley de control que agrupa una serie de restricciones con el fín de alcanzar y mantener una meta.\cite{Mat97}\cite{Ark88} + +Cada funcionamiento recibe entradas desde los sensores y/o otros funcionamientos y proporciona salidas los actudores del robot o a otros funcionamientos. + +Los actuadores pueden compartir entradas de sensores y enviar comandos de salida a los mismos actuadores. El escoger una determinada acción ante múltiples entradas de sensores y funcionamientos secibe el nombre de \textit{Selección de acción}\cite{Pir00}. Uno de los mecanimos mejor conocidos para selección de acción es el uso de una jerarquía de funcionamiento predefinida, como la \textit{Subsumption Architecture \cite{Bro86}}, en la cual, los comandos de los funcionamientos activos de mayor-rango son enviados al actuador y los otros son ignorados. + + +Los sistemas BB son variados, pero existem dos principios fundamentales a los que todos los sistemas BB se adhieren inherentemente: 1) En robot posee un cuerpo físico y su funcionamiento está limitado por realidades fisicas, incertidumbres y consecuencias de sus acciones, todas ellas difíciles de predecir y 2) El robot está imerso en un mundo real y actúa directamente en base a la información de sus sensores, no sobre una representación abstracta o procesada del mismo. + +\subsection{Desde el control de un robot a control de múltiples robots} + +Los Sistemas distribuidos Multi-Robot contrastan con los sistemas centralizados Multi-Robot, en los cuales, todas las acciones de un robot no son determinadas localmente, ellas deben ser determinadas por una entidad externa, tal como otro robot o por cualquier tipo de comando externo. En los sistemas multi-Robot distribuidos, cada robot debe tomar sus propias decisiones de control, basándose únicamente en la información de sus sensores, la cual es limitada, local y con presencia de ruido. + +\subsubsection{Ventajas y Retos en los sistemas Multi-Robot} +Las potenciales ventajas de los Sistemas Multi-Robot sobre los SRS (Simple Robot System) incluyen una reducción del costo total del sistema, al utilizar robots simples y económicos en lugar de un robot complejo y costoso. Además, una arquitectura Multi-Robot puede aumentar la flexibilidad y robustez del sistema tomando ventaja del paralelismo y la redundancia. Asimismo, la complejidad inherente de algunos entornos de trabajo requiere el uso de una arquitectura Multi-Robot, cuando las capacidades o los requerimientos de recursos necesarios son muy grandes para ser alcanzados por un solo robot. + +Sin embargo, la utilización de Sistemas Multi-Robot (MRS) presenta desventajas potenciales y retos adicionales que deben ser tratados para que presenten una alternativa efectiva y viable a los SRS. Un sistema MRS diseñado pobremente, con robots individuales trabajando en oposición, puede ser menos efectivo que un sistema SRS diseñado cuidadosamente. El reto más grande en el diseño de sistemas MRS efectivos es el manejo de la complejidad introducida por la interacción entre los robots. + +\subsubsection{Necesidad de Coordinación en Sistemas Multi-Robot} +Con el fín de maximizar la efectividad de un MRS, las acciones de los robots deben ser espacio-temporalmente coordinadas y dirigirlas hacia el logro de una determinada tarea o un determinado objetivo a nivel de sistema. El solo hecho de tener robots interactuando entre si, no es suficiente para producir un comportamiento a nivel de sistema coordinado, interesante o práctico. Para que la interacción de los robots produzcan funcionamientos coherentes, debe existir algun mecanismo de coordinación que organice espacio-temporalmente las interacciones de forma apropiada para la tarea. + + +\subsection{Coordinación global a partir de interacciones locales} + +Existen muchos mecanismos por los cuales se pueden organizar las interacciones. Nosotros los clasificaremos en tres clases: Interacción a través del entorno, interacción a través de sensores, e interacción a través de comunicacion. Estas clases no son mutuamente excluyentes ya que los MRS pueden y en algunos casos utilizan mecanismos simultáneos de cualquiera o de las tres clases para alcanzar un funcionamieno coordinado a nivel de sistema. + + +\subsubsection{Interacción por medio del entorno} + +El primer mecanismo de interacción es através del entorno compartido de los robots. Esta forma de interacción es indirecta, ya que no existe comunicación explícita o física entre los robots. En lugar de esto, el mismo entorno se utiliza como medio de la comunicación indirecta. + +Con el cuidadoso diseño de los sensores, actuadores y las cualidades del control, es posible utilizar el concepto de +\textit{stigmergy \cite{HM99}\footnote{\textit{Stigmergy} es un método de comunicación indirecta en un sistema de auto-organización emergente, donde sus partes individuales se comunican con las otras modificando su entorno local.}} en MRS. Este poderoso mecanismo de coordinación es muy atractivo ya que típicamente requiere capacidades mínimas de los robots individuales. Los robots no requieren comunicación directa, solo reconocer a los otros robots o distinguirlos entre diferentes objetos en el entorno, tampoco requieren realizar razonmientos computacionales intensivos de razonamiento y planeación. + +Las acciones de construcción de un robot alteran el entorno, y por lo tanto la información de los sensores disponible para los otros robots. Esta nueva información activa acciones de construcción posteriores. + +\subsubsection{Iteracción através de sensores} +El segundo mecanismo para la interacción entre robots es através de sensores. Como se describe en \cite{CFK97}, la interacción utilizando sensores se refiere a interacciones locales que pueden ocurrir entre robots como resultado de el sensado de otro robot., pero sin comunicación explícita. Al igual que la interacción por medio del entorno, la interacción utilizando sensores es también indirecta ya que no existe comunicación explícita entre los robots; sin embargo, requiere que cada robot sea capaz de distinguir otros robots entre diferentes objetos del entorno. En algunas circunstancias, cada robot puede ser requerido para identificar a todos los demás robots, o clases de los otros robots. En otros casos, puede ser necesario distingir robots de otros objetos del entorno. + +La interación por medio de sensores puede ser usada por un robot para modelar el comportamiento de otros robots o para determinar que está haciendo otro robot con el fín de tomar decisiones y reponder de forma adecuada. Por ejemplo, las bandadas de aves utilizan sus sensores para monitorear las acciones de otras aves en su vecindad para hecer correcciones locales a su propio movimiento. Ha sido demostrado que los resultados efectivos del grupo a partir de relativamente simples reglas locales seguidas por cada ave respondiendo a la dirección y velocidad de los vecinos locales \cite{Rey87}. + +Otros dominios en los cuales la interacción a través de sensores han sido utilizada en MRS inclute \textit{flocking}\cite{Mat95}, en donde cada robot ajusta su movimiento de acuerdo al movimiento de los robots observados localmente. La interacción a través de sensores también ha sido demostrada en el dominio de división adaptativa de tareas \cite{JM03}. En este dominio, cada robot cambia de forma dinámica las tarea que está ejecutando basándose en las acciones observadas de otros robots y la disponibilidad de tareas en el entorno. + +\subsubsection{Caso de Estudio Interacción por medio de Sensores: Formación de marcha} + +La aproximación a la formación de marcha aca descrita fué presentada en \cite{FM02}. La idea general de esta aproximación es que cada robot en el MRS se posiciona el mismo relativamente a un robot vecino designado. Este robot vecino, a su vez, se posisiona el mismo de forma relativa a su propio robot vecino designado. Ya que todos los robots solo tienen en cuanta su posición relativa con respecto a su robot vecino, ningún robot esta, ni necesita estar pendiente de, la posición global de todos los robots en la formación. Cada robot solo necesita ser capaz de determinar la distancia y dirección a su vecino. La geometría global de la formación fue determinada a través de la cadena de vecinos. La formación puede ser cambiada de forma dinámica alterando la estructura de la relación local del vecino. + +\subsubsection{Interacción por medio de comunicación} +La comunicación en los robots físicos no es gratuita o confiable y puede ser restringida limitanfo el ancho de banda y el alcance, y la inpredecible interferencia. En los sistemas reales de robots, el rango y la confiabilidad de la comunicación son factores de diseño muy importantes \cite{GM(.I.W01}. + +Existen muchos tipos de comunicación. La comunicación puede ser directa de un robot a otro, de un robot a una clase de robots, o difundir desde un robot a todos los demás robots. Así mismo, los protocolos pueden ir desde esquemas simples carentes de protocolo a esquemas complejos basados en negociación y comunicación intensiva. La información codificada en una comunicación puede ser información de estado, un comando a uno o más robots, una petición de información adicional por otros robots. + +\subsubsection{Casi de estudio Interacción por medio de comunicación: Seguimiento de múltiples objetivos} + +En \cite{Par97}, el objetivo es tener un grupo de robots con rangos de sensores limitados se posicionan y orientan ellos mismos de tal forma que son capaces de adquirir y seguir multiples objetos que se mueven a través de su entorno. Las posiciones, trayectorias y numero de objetivos no se conocen a priori. Estas dificultades son compuestas en un MRS distribuido, donde el sistema debe determinar que robot(s) deben monitorear que objetivo(s). Cada robot tiene un rango limitado de sensores y comunicación. La comunicación fue utilizada por cada robot para transmitir la posición y velocidad de todos los objetivos dentro de su rango de sensado a los demás robots dentro de su rango de comunicación. + +Cada robot evalúa constantemente la importancia de su actual actividad de seguimiento y los posibles cambios de posición que podrían aumentar la importancia de sus actividades de seguimiento. La comunicación fue utilizada para permitir a cada robot mantener un mapa local de los movimientos de los objetivos dentro del rango de comunicación pero fuera fuera de su rango de sensado. Como resultado, el grupo como un todo, pudo seguir un número máximo de objetivos, con un mínimo número de robots. + + +\subsection{Diseño formal y análisis de un Sistema Multi-Robot} + +El diseño de los mecanismos de coordinación para un sistema multi-robot (MRS) ha probado ser un problema dificil de resolver. En la última década, el diseño de una variedad de tales mecanismos sobre un amplio rango de dominios de aplicación ha sido estudiado \cite{CFK97b} \cite{DJM+02}. + +Las siguientes preguntas deben ser resueltas antes de poder producir rápida y eficientemente un MRS efectivo para una nuevo dominio: + +\begin{itemize} + \item Que tan apropiado es un determinado mecanismo de coordinación para un dominio en particular. + \item Que características de desempeño se pueden esperar de el. + \item Como esta relacionado con otros mecanismos de coordinación. + \item Como se puede modificar para aumentar el desempeño del sistema. +\end{itemize} + +El paradigma BB para control multi-robot es popular en MRS debido a su robustez a las interacciones dinámicas inherentes a cualquier MRS. Un MRS representa un sistema de alta no linealidad en el cual las acciones de un robot son afectadas por las acciones de los demás rebots. Esto hace que cualquier esquema de control que se base en razonamiento o planeación complejos no sean efectivos debido a que es muy difícil predecir de forma precisa futuros estados de un sistema MRS no trivial. Por esta razón, el control BB es utilizado frecuentemente en MRS. La simplicidad del robot individual tambien presenta una ventaja al permitir que sea posible el análisi externo para predecir el desempeño del sistema. + +\subsubsection{Analisis de Sistemas Multi-Robot Utilizando Modelos Macroscópicos} + +Los modelos macroscópicos se enfocan en el funcionamiento a nivel de sistema del MRS sin considerar de forma explícita cada robot individualmente en el sistema. + +Un modelo matemático macroscópico MRS ha sido demostrado en el dominio de tareas de recolección de alimentos \cite{LG02}. El modelo fué usado para estudiar los efectos de la interferencia entre robots, el resultado pudo ser utilizado para modificar el control individual de los robots o para determinar la densidad óptima de robots con el fín de maximizar el desempeño de la tarea. Un modelo analítico macroscópico ha sido aplicado para el estudio de la dinámica del comportamiento colectivo en un dominio colaborativo utilizando una serie de ecuaciones diferenciales \cite{LGM+01}. + +Un modelo macroscópico general para el estudio de sistemas adaptativos multi-agente fué presentado en \cite{LG03} y fué aplicado al análisis en el dominio de localización de tareas que fué realizado de forma experimental en \cite{JM03}. En este trabajo los robors que forman el MRS mantienen una cantidad limitada de estados internos persistentes para representar una historia corta de eventos pasados, pero no se comunican de forma explícita con otros robots. + + +\subsubsection{Análisi de Sistemas Multi-Robot Utilizando Modelos Microscópicos} + +El modelamiento microscópico considera directamente cada robot en el sistema y puede modelar de forma individual las interacciones de un robot con otros robots y con la tarea con un detalle arbitrario, incluyendo la simulación exacta del funcionamiento de cada robot. Sin embargo, la mayoría de las aproximaciones microscópicas modelan el funcionamienro de cada robot como una serie de eventos estocásticos. Típicamente, el controlador del robot individual es abstraido a algún grado y las trayectorias e interacciones no son consideradas directamente. + +Una metodología de modelamiento microscópico probabilístico para el estudio de funcionamiento colectivo en en dominio de clustering fué presentado en \cite{MIM99}. El modelo fué validado a través de un acuerdo cuantitativo entre la predicción de la evolución del tamaño del cluster, con la simulación de experimentos y con experimentos sobre robots reales. La efectividad y precisión de las técnicas de modelamiento macroscópico y microscópico comparadas con los experimentos con robots reales y simulaciones se discuten en \cite{ME02}. + +Un paso hacia adelante en las metodologías para el análisis formal de un determinado diseño MRS se encuentra en las metodologías formales para la síntesis de controladores MRS. La síntesis es el proceso de construcción de un controlador MRS que cumple con las restricciones del diseño, tales como alcanzar el nivel de desempeño deseado mientras cumple las restricciones impuestas por las limitadas capacidades del robot. + +Ser capaz de definir un dominio de aplicación y tener un método formal que diseñe el MRS para cumplir con la tarea mientras se alcanza el criterio de desempeño especificado es uno de los objetivos de largo plazo en la comunidad MRS. + +Una herramienta de trabajo importante en el diseño formal de MRS coordinados fué el desarrollo de \textit{information invariants}, la cual intenta definir los requerimientos de información de una tarea dada e indica cual de estos requerimientos pueden ser alcanzados en un contolador \cite{Don95}. El concepto de \textit{information invariants} fué estudiado experimentalmente en el dominia de manipulación distribuida de tareas \cite{DJR95} y fué extendido a través de la definición de equivalencia de clases entre definiciones de tareas y capacidades del robot para ayudar en la elección de una clase de controlador apropiada en un dominio dado \cite{Par98}. + + +Otras aproximaciones alternativas a la síntesis de controladores MRS pueden ser encontrados en métodos evolutivos \cite{Mat95} \cite{Par98b}. También existen un número de entornos de diseño de MRS, arquitecturas de control, y lenguajes de programación, los cuales ayudan en el diseño de MRS coordinados \cite{Mat95b} \cite{AB97} \cite{AGH+00} + + +%******************************************************************************************************************* + +\subsection{Asignación dínámica de tareas \cite{KLCJ+0}} + +En un MRS distibuido no existe un mecanismo de control centralizado, a cambio, cada robot opera de forma independiente bajo control y sensado local, con un comportamiento coordinado a nivel de sistema que resulta de las interacciones locales entre los robots y entre los robots y el entorno. El diseño efectivo de un MRS coordinado está restringido por la carencia de herramientas de diseño y metodologías formales. El diseño de un SRS (Single Robot System) se ha visto beneficiado en gran medida por los formalismos proporcionados por la teoría de control -- el diseño de MRS esta necesitando un formalismo análogo. + +Para que un grupo de robots realicen de forma efectiva una determinada tarea a nivel de sistema, el diseñador debe hacerse la pregunta: ¿Qué robot puede realizar que tarea y cuando?. La asignación dinámica de tareas es una clase de asignación de tareas en la cual, la asignación de robots a las sub-tareas es un proceso dinámico y puede requerir un ajuste continuo en respuesta a cambios en el entorno de la tarea o al desempeño del grupo. El problema de la asignación de la asigación de tareas en un MRS distribuido esta compuesto por el hecho que la asignación debe ocurrir como resultado de un proceso distribuido ya que no existe un coordinador central para hacer estas asignaciones. Esto aumenta la complejidad del problema ya que debido al rango local de los sensores del robot, ningún robot posee una visión completa del estado del mundo. Con esta información incompleta y en algunos casos ruidosa, cada robot debe hacer decisiones locales de control sobre que acciones realizar y cuando, sin un conocimiento completo de que estén haciendo otros robots que la hayan realizado en el pasado, o que harían en el futuro \cite{KLCJ+}. + +Existe un número de modelos y filosofías de asignación de tareas. Históricamente, la más popular se basa en la coordinación intencional para lograr la asignación de tareas \cite{Par98b}. En esta, los robots coordinan sus respectivas acciones de forma explícita a través de comunicaciones y negocioaciones deliberadas. Debido a problemas relacioados con la escala, dichas aproximaciones son utilizadas en MRS con un numero relativamente pequeño de robots (i.e. menor que 10). Este método es el preferido debido a que es el más conocido, fácil de diseñar e implementar, y más adecuado para el análisis formal \cite{BPG}. + +Al aumentar el tamaño del MRS, la complejidad introducida al aumentar las interacciones de los robots, hace que estos sistemas sean más difíciles de analizar y diseñar. Esto lleva a la alternativa de coordinación intencional, es decir, asignación de tareas utilizando coordinación emergente. En sistemas que utilizan la coordinación emergente, los robots individuales coordinan sus acciones basadándose únicamente en información local de sensores e interacciones locales. Típicamente, existe muy poca o ninguna comunicación directa o negociaciones explícitas entre los robots. Ellos son, por lo tanto, más escalables a grandes números de robots y son más capaces de tomar ventaja de la robustez y paralelismo provisto por la agregación de grandes números de robots coordinados. + + +\subsubsection{Trabajo relacionado} + +Sugawara et al \cite{KSMS97} \cite{KSMS+} desarrollaron un modelo simple de recolección de alimentos cooperativo en grupos de robots con y sin comunicación. Kazadi et al. [11] \cite{SKAA02} estudió la propiedad general de una agregación multi-robot utilizando modelos mocroscópicos fenomenológicos. Agassounon y Martinoli \cite{WAAM02} presentan un modelo de agregación en el cual el número de robots toman parte de en la tarea de clustering se basa en el mecanismo de división de labores de las antenas. + + +Estos modelos son ad-hoc y e dominio específico, y los autores no dan explicación de como aplicar estos modelos a otros dominios. En trabajos recientes hemos desarrollado un marco de trabajo general para crear modelos fenomenológicos de funcionamiento colectivo en grupos de robots \cite{KLAG04} \cite{KLAM05}. + +Muchas de las aproximaciones listadas arriba están de forma implícita o explícita basadas en la teoría de procesos estocásticos. Otro ejemplo de una aproximación estocástica es el modelo probabilístico desarrollado por Martinoli y sus colaboradores \cite{AMPt99} \cite{AMAJI99} \cite{AJI+01} para estudiar el funcionamiento colectivo de un grupo de robots. + +Muy poco trabajo ha sido desarrollado sobre análisis de sistemas multirobot en entornos dinámicos. En \cite{KLAG03} se extiende el marco de trabajo de los procesos estocásticos desarrollado en trabajos recientes, a robots que cambian su comportamiento basándose en la historia de observaciones locales del (probablemente cambiante) entorno \cite{LG03}. + +En \cite{BAH88} Huberman y Hogg, realizaron un estudio matemático sobre funcionamiento colectivo de sistemas de agentes adaptativos utilizando la dinámica de juego como un mecanismo de adaptación. En los sistemas de dinámica de juegos, las estrategias ganadoras son premiadas, y los agentes utilizan las mejores estrategias para decidir su próximo movimiento. + + +\subsubsection{Mecanismos de asignación de tareas} +El esenario de asignación de tareas dinámico estudiado considera un mundo poblado con tareas de \textit{T} tipos diferentes y robots que son igualmente capaces de realizar cada tarea, pero solo se les puede asignar un tipo de tarea en un momento dado. El estado de un robot es un atajo para el tipo de tarea asignada al robot. Un robot puyede cambiar su estado de acuerdoa sus políticas de control cuando lo determine apropiado (evitando cambios de tarea no necesarios). + +El propósito de la asignación de tareas es asignar robots a las tareas de una forma que aumente el desempeño del sistema, lo que normalmente significa reducir el tiempo total de ejecución. Esto es, si todas las tareas toman igual cantidad de tiempo en completarse, en la mejor asignación, la fracción de robots en el estado \textit{i} será igual a la fracción de tareas de tipo \textit{i}. En general, sin embargo, la asignación deseada puede tomar otras formas, -- por ejemplo, puede estar relacionada a la recompensa relativa o costo de realización total (completing) de cada tipo de tarea -- sin cambiar nuestra aproximación. En el escenario de asignación dinámica de tareas, el número de tareas y el número de robots disponibles pueden variar en el tiempo, por ejemplo, agragando nuevas tareas, desarrollando nuevos robots, o removiendo robots defectuosos. + +El reto al que se enfrenta el diseñador es divisar un mecanismoque permita una asignación de tareas deseada en un MRS distribuido ante cambios en el entorno. Se asume que los robots son capaces de observar tareas y discriminar sus tipos. Ellos también son capaces de observar y discriminar los estados de las tareas de los otros robots. + +Una forma de dar al robot la habilidad de responder a cambios en el entorno es dotarlo con un estado interno donde el puede almacenar su conocimiento del mundo capturado por sus observaciones \cite{CVJ03} \cite{KLAG03}. Las observaciones son almacenadas en una lista continua cíclica de longitud finita, donde las nuevas observaciones reemplazan las anteriores. El robot consulta estas observaciones periódicamente y actualiza su estado de acuerdo a una función de transición especificada por el diseñador \cite{LG03} \cite{CVJ03}. + + +\subsection{Analisis de Asignción Automática de Tareas} + +En esta sección asumiremos que existen dos tipos de tareas, -- denominadas de forma arbitraria \textit{red} y \textit{green}. Esta simplificación se hace con fines pedagógicos, el modelo puede expandirse. Durante un intervalo de tiempo suficientemente corto, puede considerarse que cada robot permanece en la tarea Red o Green, cada tarea esta compuesta por muchas acciones y funcionamientos del robot, por ejemplo, buscando nuevas tareas, detectando y ejecutándolas, evitando obstáculos, etc. Sin embargo, ya que lo que se desea es modelar como evoluciona en el tiempo la fracción de robots en cada tarea, es suficiente considerar solo estos dos estados. Si encontramos que se necesitan niveles de detalle adicionales para explicar el funcionamiento del sistema podemos elaborar el modelo descomponiendo los estados de alto nivel en sus componentes. + +\subsubsection{Observación de tareas} +En esta sección estudiaremos en mecanismo en el cual los robots hacen decisiones paea cambiar de estado de tarea basándose únicamente en la observación de las tareas disponibles. Sean $m_{r}$ y $m_{g}$ el número de tareas Red y Green observadas, en la memoria de un robot. El robot elige cambiar su estado o el tipo de tarea a la que esta asignado, con probabilidades dadas por las funciones de transición $f_{g \to r}(m_{r}, m_{g})$ (probabilidad de cambiar a Red desde Green) y $f_{r \to g}(m_{r}, m_{g})$ (probabilidad de cambiar a Green desde Red). Se desea definir reglas de transición de tal forma que la fracción de tiempo que el robot esté en el estado Red (Green) sea igual a la fracción de tareas Red (Green). Esto asegura que en promedio el número de robots Red y Green refleja la distribución de tareas deseada. Si los robots tienen conocimiento global sobre el número de tareas Red Y Green $M_{r}$ y $M_{g}$, entonces cada robot podría elegir cada estado con probabilidades igual a la fracción de las tareas del tipo correspondiente. Dicho conocimiento no está disponible; por eso, se desea investigar comoo el observamiento incompleto del entorno (a través de observaciones locales) así como de los cambios dinámicos del mismo (por ejemplo, cambiando la relación entre tareas Red y Green), afectan la asignación de tareas. + +\subsection{Recolección múltiple con Múltiples Robots} + +\subsubsection{Descripción de la tarea} +La tarea tradicional de recolección se define al tener un robot o grupo de robots recolectando un grupo de objetos del entorno, cada uno consume uno y regrese a un lugar común \cite{DGMJM02}. La recolección múliple, es una variación de la recolección tradicional, se define en \cite{TB99} y consiste en una arena poblada por objetos de varios tipos que deben ser recolectados de forma concurrente. + +Existen dos tipos de objetos dispersados de forma aleatoria a lo largo de la arena: \textit{PuckRed} y \textit{PuckGreen}. Cada robot es capaz de recolectar ambos tipos de objetos, pero solo puede ser asignado a la recolección de un tipo en un instante de tiempo dado. Adicionalmente, todos los robots están recolectando todo el tiempo, es decir, no existen robots en estado de ``inactividad''. Un robot puede cambiar el tipo de objeto que está recolectando de acuerdo a su política de control, cuando el determina que es apropiado hacerlo. Los robots se mueven en un espacio cerrado y recogen los objetos que van encontrando. Cuando un robot recoge un objeto, el objeto es consumido y el robot lo lleva al sitio de recolección de los otros objetos. Una vez que se consume el objeto, se coloca otro del mismo tipo de forma inmediata en un lugar aleatorio. Esto se hace para mantener la densidad de objetos constante. + + +\textit{En algunas ocaciones, la densidad de objetos puede afectar la precisión o la velocidad de convergencia a la asignación de tareas deseada. \textbf{Nos reservamos el estudio del impacto de la variación de densidad para trabajos futuros}} + +El papel de la asignación dinámica de tareas en este dominio requiere que los robots dividan su número recolectando unos los objetos \textit{PuckRed} y otros los \textit{PuckGreen}. En este experimento, se desea que la asignación de robots converja a una situación en la que la proporción de robots recolectando objetos \textit{PuckRed} sea igual a la proporción de objetos \textit{PuckRed} presentes en la arena. + +Se ha observado que las capacidades limitadas de sensado y la falta de comunicación directa de los robots, les impide adquirir información global tal como el tamaño y forma de la arena de recolección, el número inicial o actual de objetos a ser recolectados (total o por tipo), o el número inicial o total de robots recolectores (total o por tipo). + + +\textit{Utilizar la red idiotípica para aumentar el conocimiento del robot sobre el entorno} + +\subsubsection{Controlador del robot basado en funcionamiento} + +Todos los robots tienen controladores idénticos basados en el comportamiento, los cuales consisten en los siguientes comportamientos mutuamente excluyentes: + +\begin{itemize} + \item El comportamiento \textit{ovoiding} provoca que el robot gire para evitar obstáculos en su camino. + \item El comportamiento \textit{wandering (caminar sin una dirección determinada)} provoca que el robot se mueva hacia adelante y, después de un lapso de tiempo aleatorio, gire a la izquierda o a la derecha describiendo un arco aleatorio por un período de tiempo aleatorio. + \item El comportamiento \textit{Puck Servoing} hace que el robot se mueva hacia un objeto (detectado) del tipo deseado. + \item El comportamiento \textit{Grasping} hace que el robot recoja y consuma un objeto. + \item El comportamiento \textit{Observing} hace que el robot tome la información de sus sensores y almacene los objetos y robots detectados en su respsctiva historia. El robot entonces actualiza su estado de recolección basado en esas historias. +\end{itemize} + + + \begin{tabular}{|c|c|c|c|c|} + \hline + \multirow{2}{1.8cm}{Obstáculo Detectado} & \multirow{2}{1.8cm}{Objeto Detectado} & \multirow{2}{2.7cm}{Gripper Break-Beam On} & \multirow{2}{2cm}{Señal de Observación} & \multirow{2}{2.2cm}{Funcionamiento Activo} \\ \\ \hline + X & X & X & 1 & Observing \\ \hline + 1 & X & X & X & Avoiding \\ \hline + 0 & 1 & 0 & 0 & Puck Servoing \\ \hline + 0 & X & 1 & 0 & Grasping \\ \hline + 0 & X & X & X & Wandering \\ \hline + \end{tabular} + +\tablename{Condiciones de activación de los comportamientos} + +Todos los robots mantienen tres tipos de información de estado: estado de recolección, historia de objetos observados, e historia de robots observados. Cada robot es dotado con un indicador luminoso observable por los robots cercanos, el cual indica el estado actual del robot. Es decir, este indicador luminoso actúa como una comunicación local, pasiva. + + +Todos los robots mantienen una historia limitada de tamaño constante donde se almacena el estado de recolección de los robots observados recientemente. Ninguna de estas historias contiene una identidad única o localización de los objetos o robots detectados. + + +Después que el robot hace una observación, hace una re-evaluación y cambia de forma probabilística su estado actual de recolección dadas las nuvas historias de objetos y robots. La probabilidad con la cual el robot cambia su estado de recolección se define con la función de transición. + + + + + diff --git a/course/.docs/book/review.tex b/course/.docs/book/review.tex new file mode 100644 index 0000000..2414f5f --- /dev/null +++ b/course/.docs/book/review.tex @@ -0,0 +1,564 @@ +\chapter{TRANSFERENCIA TECNOLÓGICA} +\begin{quote} + "Social development today is determined by the ability to stablish a synergistic interaction between technological innovation and human values" + Castells 1999 +\end{quote} + +La transferencia de tecnología según Van Gigch involucra la adquisición de "actividad Inventiva" por parte de usuarios secundarios. Es decir, la +transferencia tecnológica no involucra necesariamente maquinaria o dispositivos físicos. El conocimiento puede ser transferido a través de entrenamiento y +educación, y puede incluir temas como manejo efectivo de procesos y cambios tecnológicos\cite{FBFP07} . + +La transferencia tecnológica es un proceso dinámico que debe ser re-evaluado periódicamente, requiere una infraestructura adecuada que involucra +instituciones, institutos de formación vocacional, técnica y administrativa, personal con diferentes especialidades y un entorno cultural adecuado. +Es difícil que la tecnología desarrollada en un entorno determinado pueda ser transferida sin realizar modificaciones en la escala de producción y +la adopción de productos al mercado local. + +La transferencia de tecnología ha introducido técnicas de alta productividad y en muchos casos cambios técnicos en países menos desarrollados. +La adquisición de tecnología foránea contribuye a mejorar la competitividad en los mercados locales e internacionales en estos países, en los que debe +ser considerada como un proceso vital. Este proceso presenta problemas cuando se pierde capacidad de absorción por parte del país receptor y la +renuencia del país que transfiere a transferir tecnología real y el know-how. Por lo que es necesario que estos países promuevan sus capacidades +tecnológicas locales con el fin de absorber las tecnologías foráneas de forma eficiente en función de sus necesidades locales y de esta forma forma +generar un rápido proceso de industrialización. + +No debe confundirse la transferencia tecnológica con la apropiación de tecnología que se define como el proceso de interacción con la tecnología, +la modificación de la forma como es usada y el marco social dentro del cual es usada. Un ejemplo de apropiación de tecnología lo podemos encontrar +en la telefonía celular, nuestras sociedades han cambiado drásticamente su forma de comunicarse y han generado nuevas actividades alrededor de esta +tecnología, los usuarios pueden generar aplicaciones que adicionan funcionalidades y servicios. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DEFINICION DE TRANSFERENICA TECNOLOGíA %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Tecnología} + +La tecnología es definida como el factor más significativo para mejorar la productividad, calidad y competitividad \cite{GC04} y puede verse como +un proceso de transformación de recursos que tiene como entrada recursos naturales, bienes, o preductos semi-manufacturados y como salida se obtienen +bienes consumibles de capital y semi-manufacturados. El \textit{Technology Atlas team} identifica cuatro componentes de la tecnología \cite{FBFP07}: + +\begin{itemize} + \item Techno-ware Relacionado con objetos: Herramientas, equipos, máquinas, vehículos, facilidades físicas, instrumentos, dispositivos y fábricas + \item Human-ware Relacionado con personas: Habilidades en conocimiento experimental, sabiduría y creatividad, experiencia, competencia, creatividad. + \item Info-ware Relacionado con la Información: Incluye todo tipo de documentación y datos acumulados relacionados con especificación de procesos, +procedimientos, diseños, teorías, y observaciones + \item orga-ware Relacionado con la Organización: Acuerdos y Alianzas necesarias para facilitar la integración de los componentes Técnico, Humano, y +de información. Involucra asignación, sistematización, organización, redes de comunicación. +\end{itemize} + +El uso efectivo de estos cuatro componentes requiere el cumplimiento de ciertas condiciones. El componente técnico requiere de personal con habilidades +específicas para poder ser utilizado. Para mejorar la eficiencia del sistema el componente humano necesita de adaptación y motivación. A medida que la +organización cambia para adaptarse a nuevas condiciones o requerimientos se debe actualizar el sector de la información. \textbf{No es posible realizar +operaciones de transformación ante la ausencia de uno de estos cuatro componentes} + +La interacción de estos cuatro componentes puedes ser resumida de la siguiente forma: + +\begin{itemize} + \item \textit{Tecnoware} constituye el núcleo de cualquier tecnología, es decir, una habilidad de transformación, y es desarrollada, instalada y operada +por \textit{humanware}. + \item \textit{Humanware} o las habilidades individuales representan el elemento clave de cualquier operación de transfomación guiada por el \textit{infoware} + \item \textit{Infoware} almacena conocimiento acumulado para ahorrar tiempo en el aprendizaje individual. Es generado y utilizado por \textit{humanware} +para los procesos de toma de decisiones y operaciones. + \item \textit{Orgaware}, o el marco de trabajo administrativo, adquiere y administra el tecnoware, humanware e infoware con el fin de realizar la operación. +Orgaware se compone de las actividades de planeación, organización, activación, motivación y control de operaciones. +\end{itemize} + + +La tecnología no esta asociada a un sistema socio-económico abstracto. La tecnología se encuentra fuertemente relacionada con un espectro amplio de las +necesidades humanas, si se dictan por las condiciones físicas existentes o por factores culturales derivados de las especificidades históricas de +diferentes grupos sociales \cite{KGSB95}. En resúmen, la tecnología esta compuesta de conocimiento, herramientas, técnicas y actividades utilizadas +para transformar las entradas de la organización en salidas. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DEFINICION DE TRANSFERENICA TECNOLÓGICA %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Definición} + +Odedra \cite{Mo94} define la transferencia tecnológica como el problema de transfencia de conocimiento +(o know-how) sobre un número de aspectos (que incluyen el conocimiento) sobre como funciona +un determinado sistema, como operarlo y desarrollar sus aplicaciones, como mantenerlo y si +es necesario, como producir sus componentes y montar un sistema similar. La transferencia +tecnológica se considera exitosa cuando los receptores de la tecnología asimilan los conceptos +anteriores para suplir sus necesidades locales. + +Según Jolly \cite{Jol77} La innovación tecnológica es entendida como un nuevo método, medio o capacidad del individuo para realizar una determinada actividad. El resultado de la transferencia tecnológica puede ser la aceptación de una práctica común en otros lugares, o la aplicación de una técnica +diseñada para otro uso en la salución de problemas locales, debe distinguirse del proceso general de difusión de tecnología: un movimiento no planeado de artículos sociales y tecnológicos de un lugar a otro sin ningún esfuerzo centrado en la transferencia. La transferencia tecnológica incluye la difusión de conocimiento científico y la preocupación por la transformación del conocimiento en innovaciones útiles. El conocimiento es lo que queda al final de un proceso documentado y difundido de forma apropiada. Para que la transferencia tecnológica sea exitosa es necesario transferir los componentes de la tecnología, es decir: Los conocimientos técnicos, las habilidades humanas, la información y la estructura de la organización. + +\subsection{Tipos de Transferencia Tecnológica} + +Mansfield clasifica la transferencia tecnológica en transferencia de material, diseño y capacidades, la transferencia de material no constituye una transfencia tecnológica real, ya que no genera el conocimiento necesario para transformarlos y generar nuevos productos que cumplan con las necesidades locales + +\begin{itemize} + \item Transferencia material: Artefactos tecnológicos: Materiales, productos finales, componentes, equipos + \item Transferenica de diseño: Diseños, proyectos, know-how para fabricar productos diseñados previamente. Los productos son copiados para producirlos +localmente. + \item Transferencia de Capacidades: Proporciona know-how y software no solo para fabricar componentes existentes, sino, innovar y adaptar tecnologías +existentes para producir nuevos productos. +\end{itemize} + +La transferencia de diseños permite adquirir mayor conocimiento sobre la tecnología transferida, sin embargo, es necesario que el pais receptor cuente con la plataforma tecnológica adecuada para absorver estos conocimientos, de lo contario no se generarán nuevos productos y las actividades se limitarán al ensamblaje de productos pre-manufacturados. La transferencia de capacidades es ideal, ya que proporciona las herramientas necesarias para que la transferencia sea exitosa, está asociada a una transferencia de conocimiento, lo cual es vital para entender plenamente la tecnología, mejorando las habilidades de los profesionales del receptor. + +Otra clasificación distingue entre Transferencia Vertical y Horizontal: + +\begin{itemize} + \item Transferencia Vertical: Transferencia de información técnica a diferentes niveles de un proceso innovativo determinado. Por ejemplo de +investigación básica a investigación aplicada, de investigación aplicada a desarrollo y de desarrollo a producción. es decir, una progresión +tecnológica desde la teoría al producto terminado. + \item Transferencia Horizontal: Cuando se utiliza en un lugar, organización o contexto y es transferida y utilizada en otro lugar. +\end{itemize} + +La transferencia vertical establece varios pasos en la transferencia, que pueden ser aplicados en diferentes niveles: Entre centros académicos, transferencia entre la academia y la empresa para generar aplicaciones, prototipos y producción en masa. La desconcexión entre la Universidad y la empresa en Colombia y en la mayoría de los países en desarrollo hace que los objetivos que persigue la Academia no están sintonizados con las necesidades de la industria y en muchas ocasiones los productos generados en la Academia nunca llegan a las industrias locales, ya sea porque no tienen la infraestructura tecnológica para hacerlo o porque la Universidad no proporciona el soporte necesario para que ese producto pueda ser utilizado en la práctica. + +\subsection{Canales Para la Transferencia de tecnología} + +Erdilec and Rapoport [45] clasifican los mecanismos en Formales: Acuerdos de licenciamiento, Inversión extranjera, compañías conjuntas, acuerdos de cooperación en investigación, arreglos de producción conjunta e Informales: No involucran acuerdos entre las partes y son difíciles de detectar y monitorear, por ejemplo, exportación de productos tecnológicos o bienes de capital, ingeniería inversa, intercambio de personal técnico y científico, conferencias de ciencia y tecnología, ferias y exposiciones, educación y entrenamiento realizado por extranjeros, visitas comerciales, literatura abierta (artículos, revistas, libros técnicos), espionaje industrial. Adicionalmente, existe una división basada en la naturaleza de la institución que proporciona los recursos para que se realice la transferencia, la institución puede ser de carácter: + +\begin{itemize} + \item \textit{Abierta} en donde la tecnología y el conocimiento són considerados bienes públicos, no existen restricciones para acceder a la información necesaria para adquirir, usar y transformar estos conocimientos en productos comerciales, y su éxito radica en obtener la máxima difusión posible para que los usuarios de este conocimiento mejoren el material existente y contribuyan con experiencias personale, + \item \textit{Cerrada} La tecnología y el conocimiento se genera para fines privados, la utilización de este conocimiento esta sometida a acuerdos comerciales. No es posible entender las bases de la tecnología, por lo que no se pueden generar productos derivados. +\end{itemize} + +Las actividades realizadas durante este estudio están enmarcadas dentro del concepto: \textit{El conocimiento es un Bien Común}, toda la documentación necesaria para reproducir, entrenar, entender y modificar los productos generados se encuentran disponibles en servidores públicos \cite{WSCC} \cite{CC} y se proporciona soporte a través de listas de discusión, adicionalmente se proporciona soporte comercial para permitir la producción de estas modificaciones. A continuación se realiza una descripción de los canales más utilizados para la transferencia de tecnología y conocimiento en países en vía de desarrollo (\cite{MO90} \cite{Mo94} \cite{MO91}) indicando en cada caso sus ventajes, limitaciones y desventajas. + +\subsubsection{Adquisición de IT} + +La adquisición de equipo ha sido uno de los mecanismos de transferencia más importantes para los países en desarrollo. Estos equipos +se entregan con el software requerido para su funcionamiento con lo que no es necesario que los usuarios generen aplicaciones, por lo que +solo adquieren el conocimiento necesario para utilizar estas máquinas, y por lo tanto no saben como funcionan. + +Otra forma de transferencia se presenta cuando una empresa vende una solución personalizada a las necesidades de los clientes. La +transferencia tecnológica se presenta en el proceso de personalización, esto, unido a otras habilidades en programación ayudan a elevar +el mercado de SW local. Sin embargo, en muchas ocasiones no se detectó ningún tipo de transferencia de knowhow en la adquisición de estas máquinas. + +Las grandes multinacionales como IBM, Microsoft, NCR dominan el mercado de Software y Hardware y hacen que sea imposible el ingreso de +pequeñas compañías locales, lo que se traduce en que el mantenimiento y servicios asociados al hardware, así como los ajustes de Software +sean realizados por los proveedores de las multinacionales y en muy pocos casos los usuarios de esta tecnología adquieren habilidades +para sostener el equipo. La transferencia se realiza a subsidiarias de las multinacionales, con lo que la transferencia es mínima, esto se +hace para que la dependencia no se pierda. + +En conclusión con la venta de equipos se transmite únicamente el conocimiento para operar, programar o mantener, sin embargo, +este conocimiento sobre el sistema puede ayudar a concientizarse sobre la tecnología e impulsar la formación de capital humano. + +La experiencia de países que lograron un rápido desarrollo económico e industrial muestra que la adquisición de una gran cantidad de +tecnología foránea jugó un papel importante en este proceso. Colombia ha realizado un proceso de transformación tecnológica pero no ha +diseñado políticas efectivas y eficientes para la transferencia de tecnologías de alto nivel +. + +\subsubsection{Educación y Entrenamiento} +Educar a las personas a través de cursos y entrenamiento en el país y enviándolas al extranjero para otros estudios es una forma de adquirir +know-how sobre nuevas tecnologías, o tecnologías que no se utilizan en el país de origen. Muchas instituciones ofrecen carreras en +Ingeniería Electrónica, Ciencias de la computación y afines, algunas de ellas utilizan modelos pedagógicos utilizados en países desarrollados, +los que no han sido adaptados plenamente a la infraestructura tecnológica local, y no es raro encontrar estudiantes que no están satisfechos +con su profesión al finalizar los cursos\cite{Mo94}. + +En muchas Universidades temas como Nanotecnología, Diseño de Circuitos integrados de muy alta integración (VLSI) hacen parte importante de las +actividades de investigación; la pertinencia de estos tópicos avanzados ante la situación tecnológica del país es discutible ya que muchos +estudiantes no aplicarán nunca estos conocimientos en el entorno local, por lo que la enseñanza de estos tópicos puede resultar una pérdida de +recursos. Es más, con los rápidos cambios en la industria electrónica estos conocimientos pueden resultar irrelevantes, aún si la +infraestructura del país se mejora. Es decir, es importante no dejarse llevar por el momento, o por la "fama" de un tópico de investigación +o de una tecnología novedosa, es necesario evaluar la pertinencia de los cursos que se dictan en el entorno tecnológico local, por supuesto, +es necesario que la academia impulse cambios en el sector, pero estos cambios deben ser consecuentes con el nivel tecnológico que posea el país. + +La transferencia tecnológica no ocurre cuando estudiantes formados en el exterior no pueden aplicar sus conocimientos en su país de origen, +por lo que es necesario crear políticas que definan que áreas de estudio son prioritarias para el país. + +Las multinacionales también ofrecen cursos de capacitación, sin embargo, se limitan al uso de sus productos, creando dependencia hacia +sus herramientas. Adicionalmente, existen centros privados de capacitación que ofrecen cursos para el manejo de paquetes y lenguajes de +programación, estos centros aprovechan la falta de centros de enseñanza tecnológica y personal calificado para cobrar altas sumas de dinero, +lo cual limita el acceso. Programas académicos inapropiados, acceso limitado a libros y computadores, falta de facilidades para capacitación, reduce la efectividad +de la educación y capacitación como canal para la transferencia tecnológica. + +\subsubsection{Asistencia Técnica} + +La ventaja de contratar consultores externos radica en el ahorro de tiempo y dinero, ya que, utilizar personal local implicaría un gran esfuerzo +y posiblemente se tendrían que asumir errores costosos en el proceso. Sin embargo, no es bueno confiar a consultores externos la responsabilidad +de construir habilidades locales, ya que reduce el desarrollo de estas habilidades, especialmente, la del personal encargado de manejar proyectos. +En algunas ocasiones los consultores no están familiarizados con las condiciones y requerimientos locales, con lo que diseñan soluciones que no se +ajustan perfectamente a las necesidades, lo que significa que el sistema es sub-utilizado y la transferencia de tecnología es poca. La falta de +personal calificado hace que los consultores se encarguen de todas las tareas del proyecto, lo que aumenta su carga de trabajo y disminuye la +posibilidad de entrenamiento de personal local\cite{Mo94}. + +En algunas ocaciones los consultores son representantes de grandes multimacionales y todas sus acciones están dirigidas a aumentar la dependencia +con los productos generados por dichas transnacionales y a ignorar de forma sistemática opciones que pueden ayudar a la transferencia de conocimiento, +llegando hasta el punto de influir en la formulación de políticas para transferencia tecnológica. Un ejemplo de este tipo de alianzas no convenientes +se presenta en la industria del Software dominada por Microsft. Microsoft firma acuerdos con centros educativos oficiales para la distribución de +sus productos con licencias a muy bajo costo, el estudiante se acostumbra a utilizarlas y cuando sea un profesional debe adquirirlas a un precio +elevado para poder realizar su actividad profesional con la única herramienta que conoce. + +\subsubsection{Licenciamiento} + +El licenciamiento es un canal que se utiliza para transferencia de know-how sobre productos o procesos, es aplicado de forma individual o en +combinación con otros instrumentos como investigación extranjera, importación de maquinaria o de técnicos. Sin embargo, no es efectivo si no +se acompaña de habilidades administrativas y de producción. Adicionalmente, es necesario contar con una infraestructura tecnológica adecuada, +capacidades locales de fabricación de hardware y software y políticas de gobierno adecuadas \cite{Mo94}. + +Un ejemplo de este tipo de práctica se presenta en el ensamble de dispositivos electrónicos, todos los componentes se importan completamente +terminados y el dispositivo final es ensamblado probado y se carga la configuración inical, no se producen actividades de ingeniería inversa con +lo que se transmite muy poco conocimiento.Odedra \cite{Mo94} define la transferencia tecnológica como el problema de transfencia de conocimiento +(o know-how) sobre un número de aspectos (que incluyen el conocimiento) sobre como funciona un determinado sistema, como operarlo y desarrollar sus aplicaciones, como mantenerlo y si es necesario, como producir sus componentes y montar un sistema similar. La transferencia tecnológica se considera exitosa cuando los receptores de la tecnología asimilan los conceptos anteriores para suplir sus necesidades locales. + + +Sin embargo, es necesario crear una confianza en los productos locales, el gobierno debe crear políticas de protección de los productos generados +localmente, países de latinoamerica aplican este tipo de protecciones y solo permiten la importación de productos que no se fabriquen en el país. +Esto aumenta la confianza en los productos generados localmente e impulsa el desarrollo industrial y la generación de empleo. + +\subsubsection{Inversión Extranjera Directa} + +La inversión directa de multinacionales es una forma de obtener tecnología externa. Esto asegura una rápida transferencia de información +tecnológica, pero no necesariamente del entendimiento o know-how. Lo que hace que la tecnología transferida a través de este canal sea mínima. +Las grandes multinacionales pueden tener cierto control político en los países en vía de desarrollo, hasta tal punto que son asesores de +instituciones encargadas de fijar políticas para la transferencia tecnológica \cite{Mo94}. + +El objetivo de la transferencia tecnológica debe ser el aumento de la auto-suficiencia en el pais receptor, unido a un uso compartido de +recursos y experiencia entre los países desarrollados y en vía de desarrollo. La compra de equipo o de software transfiere muy poco conocimiento +sobre la tecnología, el servicio post-venta y el mantenimiento es realizado por el proveedor. Por otro lado, las facilidades en educación y capacitación +son limitadas lo cual obstaculiza la formación de capital humano. La asistencia técnica utilizada para suplir la falta de personal especializado y +ayudar con el proceso de transferencia no ha sido muy efectiva. + + +\subsection{Conclusión} + +La efectividad de cada canal depende de la naturaleza de la tecnología que se va a adquirir, el tipo de organización y de las capacidades de absorción del recipiente. La tecnología es efectiva únicamente cuando la economía del país es capaz de utilizarla. Cuando se transfiere una tecnología se debe contar con el dinero para adquirirla y se deben generar las actividades necesarias para mejorar la plataforma tecnológica, incluyendo la educación y la capacitación, de tal forma que el país sea capaz de absorberla y generar nuevos productos que satisfagan necesidades locales. + +El éxito de la transferencia tecnológica no depende de un factor único, sino de la confluencia de multiples factores dentro y fuera de la institución académica. Las relaciones personales entre los agentes de transferencia tecnológica y la facultad, licencias corporativas, y las comunidades de investigación y de negocios son la clave de esfuerzos exitosos. En muchos casos, las Universidades han liderado el proceso de transferencia tecnológica a través de sus directivos, estos a través de incentivos crean una cultura académica que recompensa la transferencia tecnológica y el emprendimiento. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Modelo %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Modelo} + +Un programa de transferencia tecnológica bebe incluir mecanismos que unan de forma eficiente la fuente del conocimiento con la utilización del mismo. +Estos canales de comunicación son mecanismos de recursos humanos que pueden ser incorporados tanto en la fuente como en el destino, +el proceso de una efectiva transferencia tecnológica puede comenzar con potenciales usuarios en lugar de fuentes \cite{Jol77} +La figura \ref{tech_trans_model_global} muestra + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/transfer_model_global.png} \end{center} + \caption{Modelo del proceso de Transferencia de Tecnología} \label{tech_trans_model_global} +\end{figure} + + +\subsection{Los factores formales} + +\subsubsection{Documentación} +Es el formato, organización, o presentación de la tecnología que será transferida. El formato y el lenguaje se relacionan directamente con el entendimiento del material por parte del receptor. La información que no se entiende no se utiliza. Los científicos e ingenieros ocupan hasta 4 horas diarias leyendo artículos, hablando con sus pares o buscando información, mientras que los nuevos usuarios (por ejemplo, gobiernos locales, y grupos de ciudadanos) desean gastar menos tiempo en dar respuestas a sus preguntas. + + +\subsubsection{Distribución} +Constituye el canal físico a través del cual la tecnología fluye e involucra tanto el número de entradas y el fácil acceso al canal, así como el plan de distribución. knox 1973, dice: "Una medida de la efectividad del sistema de información tecnológica es al capacidad de permitir el contacto entre personas con necesidades y con posibles soluciones. Ames 1965, Encontró que los abstracts y los papers son la fuente de información más importante, mientras que las reuniones y conferencias el mejor vehículo para crear conciencia, la cual es indispensable para que el proceso de distribución sea exitoso, por lo que, el intercambio personal debe ser considerado como parte del proceso de distribución de tecnología. Este canal ayuda a eliminar retardos en la investigación, ya que permite determinar el estado del arte de una determinada actividad o área de trabajo. + + +\subsubsection{Organización} +La percepción del receptor de la organización. Schon 1967, caracteriza a una organización que es favorable a la transferencia tecnológica y utilización de conocimiento como aquella que vive en un estado de urgencia, donde los conflictos son resueltos por mandato, donde los recursos son enviados sin vacilar, y donde la incertidumbre se convierte en un riesgo. Stephenson, Ganz y Erickson 1974, reportan un estudio realizado sobre 109 científicos e ingenieros donde algunos de ellos sienten que una organización ocasionalmente puede actuar como una barrera a las nuevas ideas. + + +\subsubsection{Selección de Proyectos} + +Proceso de selección para proyectos de investigación y desarrollo realizado por el proveedor con ayuda del receptor. Es importante que la investigación comience como respuesta a una necesidad del cliente. + +La figura \ref{tech_trans_model} muestra + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/transfer_model.png} \end{center} + \caption{Modelo del proceso de Transferencia de Tecnología Indicando La Composición de Los Canales Formales e Informales} \label{tech_trans_model} +\end{figure} + + +\subsection{Factores Informales} +Los factores informales son de naturaleza sociológica y/o comportamental, y contribuyen fuertemente al éxito de la utilización del conocimiento por una determinada organización. + +\subsubsection{Capacidad} +La capacidad del usuario para utilizar nuevas ideas que cubren un amplio espectro de rasgos que incluyen riesgo, riqueza, poder, educación, experiencia, edad, confianza en sí mismos. + +Atributos como: Atrevimiento, status profesional y educativo, domino, sociabilidad, no son considerados tan importantes frente a la autosuficiencia que es el más valorado. + + +\subsubsection{Enlace (contacto)} +Presencia y efectos de enlaces informales en la organización receptora. El enlace opera dentro de la organización receptora y exhibe características similares al supervisor, líder de opinión, innovador y previo conocedor de la innovación. + + +\subsubsection{Credibilidad} + +La credibilidad es una evaluación por parte del usuario, de la confiabilidad de la información. Es evaluada analizando la fuente y el canal del mensaje. La opinión cambia dependiendo de la fuente de la información, es decir, la credibilidad es influenciada por su fuente. + +\subsubsection{Recompensa} + +Reconocimiento del sistema social del cual hace parte un individuo ante un comportamiento innovador. + +\subsubsection{Disposición} + +La habilidad y/o deseo del individuo para aceptar un cambio en la organización de la cual es miembro. Así mismo es importante la capacidad de adopción de nuevas ideas, Gallup 1955 señaló que aunque una idea halla sido aceptada intelectualmente, toma un período de tiempo antes de ser incorporada en la forma de pensar. Ser consciente de la importancia de de una nueva idea no s suficiente para asegurar su uso; debe existir una disposición, un interés, una motivación personal para utilizar un mejor método, proceso o concepto. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Historia %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Transferenica Tecnológica en Latinoamérica \cite{UNE}} + +\subsection{Trasfondo histórico} + +Durante el período que va de los años 40 a la década de los 80, en América Latina y el Caribe se puso en práctica una política de +industrialización por sustitución de importaciones mediante modalidades de proteccionismo de la industria manufacturera local. +Con lo que se comenzó a importar los bienes de capital necesarios para la fabricación en el ámbito local, desarrollando +de esta forma a las industrias locales. Mientras tanto, en los países de donde provenían estos bienes, se transformaba el conocimiento +adquirido de la investigación, en nuevos productos, procesos y modelos de gestión más competitivos. Es decir, se importaron los equipos +para realizar la transformación industrial, pero no se generaron las bases científico-tecnológicas que se encargaran de generar nuevos +productos asociados a las materias primas proporcionadas por los recursos naturales locales, se descuidó el capital humano capaz de entender, +adaptar y llevar estos inventos a la sociedad, salvo en algunas disciplinas agrícolas donde la especificidad local obligó a la investigación. +Adicionalmente, no se generó demanda local que impulsara la producción de conocimiento, las nuevas empresas no contaban con departamentos de +Investigación y desarrollo (I+D) y los gobiernos no estimulaban la creación de centros de investigación asociados a este proceso de industrialización. + +Cuando los gobiernos de la región se dieron cuenta de esta situación crearon la Comisión para América Latina y el Caribe (CEPAL). A partir +de las décadas de los cincuentas y setentas comenzaron a crear políticas en las áreas científicas y tecnológicas, creando instituciones +destinadas al fomento de la ciencia y la tecnología. Muchos de estos esfuerzos fueron discontinuos y contradictorios, pero algunos siguieron +las pautas establecidas por la UNESCO y la OEA (basadas en "la idea de que la ciencia y la tecnología eran una usina de crecimiento, en un rico +suelo fertilizado por el deseo de la modernización y el desarrollo") exhibieron una continuidad notable. Esto unido al apoyo gubernamental y +el interés de las universidades fue clave para la formulación de políticas de apoyo a la ciencia y la tecnología. + +Gracias a estas políticas hubo un fuerte proceso de institucionalización de la investigación científica y de los mecanismos de desarrollo: +Sistemas de promoción del I+D, legislación en transferencia de tecnología, planificación de la ciencia, métodos de diagnóstico de recursos, +sistemas de fijación de prioridades tecnológicas, etc. A finales de los 50s y dyrante los 60s y 70s, estas actividades eran soportadas casi de +forma exclusiva por el estado (incluyendo las universidades públicas), estos esfuerzos no provocaron una dinámica sostenida de innovación en el +conocimiento y en la economía ya que en muchos sectores no se generó un vínculo sólido entre la producción y la investigación, esto debido a la +creación de dos modelos de investigación en ciencia y tecnología: +\begin{itemize} + \item Ciencia Académica: Basada en las universidades, es incorporada a la comunidad científica internacional, de quien recibe legitimidad, orientación, +organización. + \item Actividad Tecnológica: Sustentada por organismos sectoriales, legitimada por instituciones estatales, su objetivo es dar solución a problemas +prácticos y a la transferencia de tecnología al sector productivo. +\end{itemize} + +En los años 80 disminuyó la confianza de poder encontrar un camino hacia un desarrollo endógeno, lo que originó un giro hacia políticas de ajuste, +estabilización y apertura de la economía que buscaban vías alternas para llegar a la globalización. La apertura de la economía suponía un +abastecimiento de nuevos conocimientos por parte de las empresas locales para estar a tono con el estado internacional o la búsqueda de nuevos +nichos de mercado; por otro lado, la apertura forzaría una homogeneización tecnológica, por lo que el aumento de la competitividad se lograría +a través de la transferencia de productos externos y no la inventiva e innovación local. + +En los años 90 los países de la región realizan grandes compras a costa de su endeudamiento externo. La industria local se ve enfrentadas a +productos extranjeros baratos, lo que ocasiona el cierre de muchas industrias manufactureras y la transformación de muchas en importadores; +esta política desmantela el aparato productivo y no fomenta actividades de adaptación, mejora y creación de productos. La oferta tecnológica +proviene del exterior, se diluye el sistema nacional de ciencia y tecnología basado en el aumento de la oferta interna de conocimiento. +Las políticas públicas se reducen a la aceptación de normas de la Organización Mundial de Comercio (OMC) basadas en presiones de Estados +Unidos y la Unión Europea sobre patentes farmacéuticas, tecnologías agrícolas y de otros tipos. No es que no existan esfuerzos e interacciones tecnológicas entre la ciencia y la producción; el problema es que no constituyen un sistema autosostenido de relaciones dinámicas que marquen un rumbo claro a la investigación en ciencia y tecnología vinculado con las sociedades y las economías donde se desenvuelven. + +Según Gibbons y Schwartzman, la investigación científica se origina y justifica cada vez más en el contexto de aplicación del conocimiento, +es decir, en la posibilidad de su utilización. Por lo que los temas de investigación no son fijados por los científicos sino por redes formadas +por empresarios, ingenieros de planta e inversionistas. Lo que lleva a que las diferencias entre las dos formas de investigación disminuyan. +En tal sentido, no es seguro que la inserción en el comercio internacional de América Latina favorezca su posición en la producción de +conocimientos en ciencia y tecnología. + +La ciencia y la tecnología en la región presenta dos grandes probleams: a) su escasa magnitud; b) su desvinculación con la sociedad a +la que pertenece, con el agravante de la pérdida de legitimidad que se produjo en las últimas dos décadas, sustentada por una parte en +el Estado, y en su integración en una ciencia internacional fuertemente académica, por la otra. + +\subsection{Financiación} + +Según la Red de Indicadores de Ciencia y Tecnología (RYCIT), el gasto en actividades de ciencia y tecnología en los países latinoamericanos alcanza poco menos de los 8.000 millones de dólares anuales, lo cual representa el 2,3\% del gasto mundial en el sector. Mientras el PBI de Estados Unidos cuadruplica al de América Latina y el Caribe, su inversión en I+D es más de 20 veces mayor que la latinoamericana. Dicho de otro modo, el esfuerzo de los países de la región en ciencia y tecnología es inferior al que les correspondería realizar tomando en cuenta el valor del producto regional. + +Según la Organization for Economic Co-operation and Development (OCED) los países Latinoamericanos dedican en promedio algo más del 0,6\% de su Producto Interno Bruto a I+D. Esta inversión se concentra en Brasil, México y Argentina, en Colombia el gasto es del 0.18\% lo que contrasta fuertemente con el gasto militar de 3.4\%. En la Unión Europea, en cambio, el porcentaje alcanza el 1,7\% del PIB, en Estados Unidos alcanza el 2,8\%, Japón (3,13\%), Corea del Sur (2,52\%) y otros como China e India en los cuales, aunque la inversión es algo inferior, la tendencia de los últimos años hace pensar en un aumento progresivo de sus inversiones en I+D. El gasto en ciencia y tecnología como el recurso promedio que tienen los investigadores para llevar a cabo su tarea, en EEUU asciende a 171.000 dólares por investigador, y en el conjunto de países latinoamericanos a 59.000. + +Un rasgo característico de la investigación científica en América Latina es su gran dependencia del Estado, según un estudio de la OCED, en el plano estrictamente tecnológico, las estadísticas sobre patentes describen un panorama entre el norte y el sur similar a los datos del I+D: el número de solicitudes de patentes en EEUU es del orden de los 200.000 por año, más de 50.000 y de 40.000 en España y Canadá, respectivamente. En América Latina, sólo Brasil y México (pero ambos con marcados desniveles anuales) presentan cifras algo significativas: entre 6.000 y 10.000 patentes anuales. Aun así son valores marcadamente inferiores. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Obstaculo %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Obstáculos para una Transferencia Exitosa} + +La cantidad de conocimiento y tecnología transferida es afectada por políticas gubernamentales, la situación económica, facilidades de educación y capacitación, personal calificado, aspectos organizacionales y sociales, proveedores de tecnología e infraestructura tecnológica. El gobierno juega un papel importante en el proceso de transferencia tecnológica ya que puede invertir en la infraestructura para impulsar una determinada tecnología o colocar restricciones para des-estimular su uso. Estas políticas son dependientes de la situación económica del país y del entendimiento de la importancia de la transferencia por parte de de sus dirigentes. La falta de facilidades en educación y en capacitación obstaculizan el proceso de transferencia, limitando el acceso. La falta de estas habilidades indica que los canales de transferencia no son eficientes porque la infraestructura del país no lo permite. Las personas son las que finalmente absorben el know-how tecnológico, si no existe el suficiente personal disponible y dispuesto, el proceso de transferencia se detendrá. + +La administración a nivel de organización juega el papel más importante en el proceso de transferencia tecnológica. La resistencia o el +desconocimiento a la tecnología, la adquisición de tecnología por motivos particulares no contemplan la implementación y la capacitación. +Por esta razón, es necesario que los encargados de tomar las decisiones y trazar políticas, conozcan la tecnología, o que estén conscientes de +su importancia. La transferencia tecnológica debe ser un proceso de dos vías, por lo que es indispensable tener habilidades adecuadas en +investigación, capacidades organizacionales y de ingeniería para que estos conocimientos sean asimilados y utilizados en la solución de +problemas locales. Es necesario que la adquisición de tecnología obedezca a un plan y que esta tecnología supla una necesidad real, de +lo contrario los equipos adquiridos y la capacitación recibida no serán utilizados, por otro lado, la tecnología adquirida que no es +asimilada y transformada en herramienta para la solución de problemas locales aumenta el grado de dependencia, lo que representa justamente +lo contrario a lo que se debe buscar en una actividad de transferencia tecnológica. + +Los procesos de transferencia tecnológica son influenciados de forma directo o indirecta por las infraestructuras organizacionales y +tecnológicas de los países, los cuales, deben exceder sus capacidades para absorber la tecnología transferida. Esta transferencia es efectiva solo +si la economía en la cual es introducida es capaz de utilizarla. Si un país cuenta con los recursos económicos necesarios para adquirir la tecnología, +debe mejorar la infraestructura para soportarla, incluyendo la educación y las facilidades de entrenamiento, así como los enlaces de telecomunicaciones \cite{MO90}. + +La falta de facilidades de educación y capacitación afecta la transferencia del knowhow, obstaculizando el desarrollo de habilidades a través del proceso de aprendizaje. La carencia de estas facilidades limita la difusión del conocimiento; la pérdida de estas habilidades se pueden originar porque la transferencia no se realizó o porque la infraestructura no lo permite. + +Si no existen personas disponibles y dispuestas a absorber el knowhow el proceso de transferencia se detendrá. El proceso de transferencia +tecnológico también es influenciado por la falta de políticas claras en la Tecnología de la Información, y los planes de negocios estratégicos, +los cuales pueden identificar las necesidades que traerán beneficios a la nación o determinar lo que se puede lograr con los recursos disponibles. + +Algunas políticas regulatorias sobre procesos de adquisición de hardware y software que existen en varios países obstaculizan los procesos de +transferencia de tecnología. Al hacer convenios con multinacionales para suministro de tecnología, a menudo estas multinacionales no están +interesadas en difundir el conocimiento necesario para reproducir sus productos y el soporte se limita a tópicos relacionados con su manejo. +Ejemplos claros de esto se encuentran en el software propietario, los usuarios deben usar el programa como se les suministra y no tienen +acceso al código fuente, con lo que no pueden adquirir habilidades estudiando su estructura y no pueden hacer modificaciones para adaptarlo a +sus necesidades. Esto se traduce en una sub-utilización del producto y en el aumento de la dependencia del proveedor. + +Las tecnologías de la Información deben ser utilizadas como una facilidad en el proceso de educación y capacitación, es necesario tomar +conciencia de la importancia de la información a nivel organizacional y gubernamental. + +La gran ausente en las políticas Tecnológicas parece ser la sociedad. Nada permite suponer que el interés de los cultores del campo +se pretenda una democratización de la ciencia y la tecnología, una apropiación de su dinámica y de sus resultados por parte de la sociedad +en su conjunto. Llama la atención que, por una parte, no existan trabajos o programas que destaquen desde un punto de vista +crítico los impactos tecnológicos sobre la vida de la sociedad (calidad, tejido social, integración social, distribución de beneficios, etc.); +por otro lado, no se registran estudios o programas de formación destinados a plantear la cuestión de la divulgación científica y tecnológica +como procesos de apropiación simbólica por parte de los ciudadanos respecto de los contenidos de la ciencia y la tecnología. + + +\section{Recomendaciones Para una Transferencia Tecnológica Exitosa} +Estudios consultados \cite{MO90} \cite{IAI} \cite{MDAG99} \cite{DZSC+07} \cite{MTRR07} \cite{Mar04}, coinciden en que para dar solución a los problemas expuestos anteriormente se deben seguir las siguientes recomendaciones: + +\subsection{Recomendaciones para los generadores de políticas} +\begin{itemize} + + \item{Promover la Importancia de la Transferencia Tecnológica como Motor de Desarrollo Económico} + \begin{itemize} + \item Proporcionar educación en transferencia tecnológica y comercialización a las nuevas instituciones académicas. + \item Promover las asociaciones regionales de I+D. + \item Tomar conciencia que la innovación involucra el desarrollo científico y tecnológico a varios niveles, por diferentes medios y a través de un amplio rango de instituciones académicas. + \item Promover las actividades de Transferencia tecnológica que involucren transferencia de conocimiento que permita la creación de nuevos productos y servicios. Del mismo modo, desalentar la compra de equipo y software propietario como política para la transferencia tecnológica. + \end{itemize} + + \item{Fomentar la Generación de Empresas Locales de Base Tecnológica} + \begin{itemize} + \item Evaluar y abordar la transferencia de tecnología desde una perspectiva corporativa. + \item Revisión de la política gubernamental de apoyo a las pequeñas empresas. + \end{itemize} + + \item{Promover el Mejoramiento de la Plataforma Tecnológica} + \begin{itemize} + \item Desarrollar sistemas de medición para capturar de forma efectiva el valor de las actividades relacionadas con la innovación. + \item Crear un centro de intercambio de información para transferencia tecnológica y difundir la información de forma activa. + \end{itemize} + +\end{itemize} + +\subsection{Recomendaciones para la academia} + +\begin{itemize} + \item{Actualización Curricular} + \begin{itemize} + \item Innovación + \item Crear planes de transferencia de tecnología flexibles + \item hacer compromisos con el desarrollo económico. + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología. + \item Innovación curricular, actualización continua de profesionales. + \item Incentivar la formación de maestrías y doctorados nacionales acorde con una agenda de investigación. + \end{itemize} + + \item{Alianza con la industria} + \begin{itemize} + \item La Universidad debe desarrollar las habilidades y competencias que la empresa requiere. + \item Buscar alianzas industriales para lograr beneficios a largo-plazo. + \item Vinculación de miembros de la industria a centros de investigación para formar relaciones formales e informales. + \item Buscar tener fortalezas en áreas dominadas por las industrias locales + \item Promover y soportar la Transferencia de Tecnología + \item Fortalecer el espíritu empresarial para apoyar la comercialización + \item Montar laboratorios de pruebas e incentivar a los productores nacionales para que logren una calidad que cumpla con los estándares internacionales. + \end{itemize} + + \item{Promover y Soportar la Transferencia Tecnológica} + \begin{itemize} + \item Elevar la transferencia tecnológica a un nivel superior y promover la excelencia. + \item Concientizar a los creadores de políticas gubernamentales sobre la importancia de la transferencia tecnológica y las alianzas con la investigación industrial. + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología. + \end{itemize} + + \item{Búsqueda de Financiación para Investigación y Desarrollo} + \begin{itemize} + \item Buscar de forma agresiva fondos para la investigación. + \item Crear recursos empresariales en las instituciones académicas, y enlazarlos con actividades de transferencia tecnológica. + \item Aumentar las alianzas con fuentes de inversión de capital para nuevas empresas. + \item Creación de empresas como parte del proceso de transferencia tecnológica de la institución y de los compromisos con el desarrollo económico + \item Realizar seminarios y líneas de profundización de temas afines a la administración y la gerencia en empresas de base tecnológica. + \end{itemize} + +\end{itemize} + + +\subsection{Recomendaciones para el Gobierno} +\begin{itemize} + + \item{Promover la Relación Universidad-Empresa} + \begin{itemize} + \item Fomento a centros de investigación y productividad para fortalecer la relaciones universidad empresa. + \item Fomentar la colaboración Universidad-Empresa en I+D, mediante la financiación de becas de cooperación, centros de investigación e incentivos fiscales. + \item Crear estrategias para mejorar la relación Universidad - empresa, creando premios para casos exitosos de transferencia tecnológica. + \item Educar a las instituciones académicas sobre los recursos empresariales locales. + \item Trabajar con corporaciones y fundaciones para el fomento de patrocinios y participación en transferencia de tecnología, I+D y desarrollo empresarial. + \item Desarrollar o mejorar infraestructuras regionales para capturar y retener empresas creadas en las instituciones académicas. + \end{itemize} + + + \item{Formular políticas Para Incentivar Actividades de Transferencia Tecnológica} + \begin{itemize} + \item Fomentar en líderes universitarios el compromiso con el desarrollo económico. + \item Definir agendas de investigación acordes con las tendencias mundiales y desarrollar capacidades en el país. + \item Fomentar cooperación internacional e inversión extranjera con transferencia de tecnología. a nivel gubernamental, Apoyo del gobierno a personas que tienen un alto potencial de crear y desarrollar tecnología. + \item Mejorar la plataforma Tecnológica. + \end{itemize} + + + \item{Promover la Excelencia Académica y la Investigación} + \begin{itemize} + \item Promoción de las instituciones académicas como bienes económicos + \item Trabajar con las instituciones académicas para identificar sus competencias. + \item Proporcionar fondos para temas específicos de investigación en instituciones académicas. + \item Promover la Investigación y Desarrollo y la transferencia tecnológica + \item Promover la investigación, la colaboración, la transferencia tecnológica y el desarrollo empresarial. + \item Ayudar a las instituciones académicas a evaluar su impacto sobre las economías locales y difundir los resultados a las instituciones gubernamentales. + \end{itemize} + +\end{itemize} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% CONCLUSIONES %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\section{Actividades Prioritarias Para Obtener Una Transferencia de Tecnología Exitosa} + +Las Anteriores recomendaciones coinciden en que para que se presente una Transferencia Tecnológica exitosa, es decir, para que los elementos técnicos, habilidades humanas, la documentación y la organización asociadas a una determinada tecnología, puedan ser asimilados por personal calificado (disponible y dispuesto) para posteriormente transformar estos conocimientos en la creación de nuevos productos o servicios que suplan necesidades locales es necesario: + +\textbf{Fomentar la Creación de Empresas de Base Tecnológica} El gobierno debe crear facilidades y créditos para que empresas tecnológicas con la capacidad de innovación puedan realizar su actividad comercial (productos o servicios) y de esta forma crear nuevos empleos, aumentar la demanda de servicios tecnológicos. Así mismo, las universidades deben crear empresas que comercialicen productos derivados de sus actividades de Investigación. + +\textbf{Promoción de la Transferencia Tecnológica} El gobierno y las Universidades deben centrar sus esfuerzos en identificar las necesidades de las empresas locales y cambiar sus prioridades para solucionarlas, las universidades deben realizar proyectos de aplicación que puedan ser utilizados por el sector productivo a corto o mediano plazo. Las políticas de gobierno deben desalentar la compra de equipo que solo transfiera conocimiento sobre su operación y no permita la creación de nuevos conocimientos a partir de ellos, asi mismo, debe formular políticas que protejan las empresas locales de base tecnológica impidiendo el ingreso de productos similares provenientes del mercado asiático premiando a las empresas locales que realicen productos innovadores ya sea con beneficios tributarios temporales o con la adjudiación de créditos condonables destinados al desarrollo de nuevos productos. Universidad, Gobierno e Industria deben trazar políticas que definan las áreas en las que se deben formar los profesionales en el exterior, las cuales deben estar en sintonía con el estado de la plataforma tecnológica y el sector productivo, estas políticas deben cambiar a medida que se mejora la plataforma tecnológica local y se presentan cambios en el entorno mundial. Se debe trabajar en la creación de una cultura de la Transferencia Tecnológica, resaltando su importancia para el desarrollo del país. + +\textbf{Promover la Excelencia Académica} Debe exisitir una evaluación continua de los planes académicos para que se adapten a las necesidades del sistema productivo local, proporcionando a sus profesionales las habilidades requeridas por la industria, en especial las requeridas para crear líderes emprendedores que puedan crear nuevas empresas y que sean conscientes de la importancia del aprendizaje continuo. Por otro lado, es necesaria la creación de maestrías y doctorados que sigan políticas nacionales encaminadas al desarrollo económico y crear mecanismos de medición que permitan comparar y clasificar las instituciones académicas según las competencias de las habilidades (liderazgo y emprendimiento) de sus egresados y de esta forma determinar que instituciones son merecedoras de créditos, becas, o financiación para desarrollar actividades. + +Los centro de educación de diferentes niveles deben trabajar de forma conjunta para definir los objetivos y habilidades que requiere el sector productivo a nivel de formación tecnológica y profesional. Esto con el fin de delimitar sus funciones para que no interfieran en el mercado laboral. En la actualidad estos limites no están definidos, esto debido a la falta de producción tecnológica del pais, somos un país consumidor de tecnología y productos manufacturaodos, y las funciones de compra de productos pueden ser realizadas por técnicos e ingenieros, adicionalmente la venta de estos productos tambien puede ser realizada por cualquier persona, razón por la cual lo ingenieros tienen problemas a la hora de conseguir empleo. Esta situación se vuelve crítica debido a la gran cantidad de programas de Ingeniería que se crearon en Colombia, solo en la Universidad Nacional de Colombia se gradúan cerca de 60 ingenieros electrónicos al año. + +"Para hacer esto posible se requiere una comisión de regulación de la educación superior que vele, especialmente, por la calidad de los diferentes programas. Ésta debe ser una comisión independiente y mixta con la participación del sector privado. Por otra parte, es menester tener en cuenta que el programa planteado requerirá un incremento sustancial de inversión en la oferta docente, tecnológica y de investigación'" \footnote{Publicado en el Espectador: 16 de julio 1999 `\textit{Urge elevar la competitividad} Santiago Montenegro} + +\textbf{Promover la Relación Universidad Empresa} El sector productivo debe ser el principal inversionista para las actividades de Transferenica Tecnológica e Investigación y Desarrollo, ya que es el directamente beneficiado con ellas. El gobierno debe desalentar las prácticas comerciales que no generan actividades de I+D, en especial las que solo comercializan productos manufacturados en países asiáticos ya que esto hace que la empresas no vean la necesidad de crear productos propios y por lo tanto no es necesario hacer inversión en Investigación y Desarrollo. La academia debe proporcionar a la industria herramientas que le permitan competir con productos provenientes del mercado asiático, es una realidad que a corto plazo no podemos competir con la industra manufacturera asiática, pero si podemos utilizarla para producir productos diseñados en el país, por Colombianos, para satisfacer necesidades locales. Se debe crear consciencia en la industria de las ventajas de tener productos diseñados localmente, resaltando los servicios adicionales que pieden generarse al personalisar estos productos y proporcionar servicios derivados de su uso. Adicionalmente, se deben crear espacios donde los empresarios participen en los procesos de toma de decisiones y creación de políticas gubernamentales sobre educación e Investigación y Desarrollo, para esto es vital determinar que acividades económicas contribuyen al desarrollo tecnológico, cuales son generadoras de conocimientos y de esta forma incentivar su práctica. Por otra parte, las Universidades deben continuar con sus labores de investigación en temas de actualidad y aumentar la visibilidad de la academia colombiana en el entorno centífico mundia, sin embargo, muchos de estos trabajo no se pueden aplicar a corto, mediano y algunos ni a muy largo plazo en Colombia debido al estado de la plataforma tecnológica actual. Los centros académicos deben trabajar en problemas del entorno local, que aunque no tienen reconocimiento a nivel internacional si refleja un grado de compromiso con el entorno social en donde ellas operan. + +\textbf{Alianzas Para Obtener y Compartir Recursos} +Como se mencionó anteriormente Colombia es el país de Sur-América que menos invierte en Investigación y Desarrollo, por esta razón es necesario crear alianzas estratégicas para compartir los escasos recursos disponibles, en la actualidad no existe una red nacional de Universidades que trabajen conjuntamente en temas tecnológicos, por eso vemos que muchas investigaciones se repiten y se compran costosos equipos que en muchos casos se sub-utilizan. En la actualidad el Servicio Nacional de Aprendizaje SENA posee una gran cantidad de recursos económicos, de infraestructura y de equipos, adicionalmente tiene una muy buena relación con pequeñas empresas y conoce las necesidades de este sector, la función del SENA es proporcionar formación a nivel técnico que soporte las actividades de las empresas Colombianas, sin embargo, los centros de educación superior no utilizan esta coyuntura para acercarse a la empresa y de esta forma obtener recursos necesarios para sus actividades en investigación. + + +\section{Actividades} +En la Figura \ref{thesis_flow} se hace un resúmen de las recomendaciones formuladas anteriormente para lograr una transferencia tecnológica exitosa y como estas están relacionadas con actividades requeridas para el mejoramiento de la plataforma tecnológica y la creación de una cultura de transferencia de tecnología en el área de Sistemas Embebidos. Área en la que (como veremos más adelante) el país puede competir a corto plazo con productos provenientes de paises industrializados. Adicionalmente, los sistemas embebidos cubren un amplio campo de aplicaciones comerciales y requieren de conocimientos y habilidades especiales. Estas habilidades deben ser desarrolladas por los centros de formación teniendo en mente la situación actual del país y la situación a la que se quiere llegar. + +\begin{sidewaysfigure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/thesis_flow_diagram.png} \end{center} + \caption{esumén de las Actividades Realizadas Para Encontrar una Metodología para la Transferencia Tecnológica en Sistemas Embebidos} \label{thesis_flow} +\end{sidewaysfigure} + +Todas las actividades desarrolladas buscan la creación de conocimiento alrededor del tema de Transferencia Tecnológica en el área de Sistemas Embebidos (SE), se parte del concepto \textit{El Conocimiento como Bien Común} \cite{Ost00} \cite{EO92} \cite{EO90} \cite{AC09}, y por lo tanto, se deben crear mecanismos que permitan su distribución, organización, mejoramiento y actualización. Este trabajo representa la semilla de este recurso y es el fruto del trabajo de 5 años de estudio de metodologías de diseño, fabricación y producción, experimentación, establecimiento de relaciones de todo tipo para entender la dinámica de la industria Colombiana y mundial. Todo esto para identificar las habilidades con las que debe contar un profesional para que lidere proyectos innovadores y emprendedores que permitan la creación de empresas locales y de esta forma generar empleo y mejorar las condiciones de vida de la comunidad asociada a la Universidad Nacional de Colombia. Y adicionalmente, detectar las necesidades de la industria Colombiana y generar actividades para la transferencia de estos conocimientos. Las actividades se dividieron en los siguientes cuatro grupos: + + +\begin{itemize} + \item \textbf{Creación de Habilidades Necesarias Para una Transferenica Tecnológica Exitosa}: Aplicación del plan de estudios \textit{CDIO} \cite{WCI} a las asignaturas del área de Electrónica Digital, utilizando las habilidades que requiere la industra electrónica nacional. Para poder generar estas habilidades se requiere de una serie de conocimientos con los que no se contaba hasta el momento en la Concepción, Diseño e Implementación de Sistemas Embebidos, por lo que se realizó un estudio sobre metodologías de diseño, implementación y producción de sistemas digitales. El conocimiento y la experiencia adquirida se esta documentando en un servidor públio y hace parte del proyecto QI-Hardware \cite{QH}, esta información le permitirá a cualquier personal entender, usar y modificar la gran variedad de plataformas de referencia ya sea para adquirir o mejorar habilidades en la Concepción, Diseño e Implementación de SE o para crear nuevos dispositivos que satisfagan una determinada necesidad. En el capítulo \ref{ch:embedded} se realizará una descripción de las actividades realizadas y las plataformas diseñadas durante este estudio. En el capítulo \ref{ch:education} se hace una descripción del proceso que se llevó a cabo para la aplicación del plan de estudios \textit{CDIO} a las asignaturas del área de Electrónica Digital. + + \item \textbf{Creación de Empresas de Base Tecnológica}: La principal fuente de información sobre la dinámica de la industria electrónica Colombiana y el estado de la industria Electrónica mundial (la que se utilizó para determinar las necesidades de las empresas locales, y las habilidades que los prefesionales en el área deben poseer para suplirlas) fué la empresa Colombiana emQbit, esta empresa fue creada por un grupo de egresados de la Universidad Nacional de Colombia, los cuales con la asesoría del autor de este trabajo de investigación incursionaron en la concepción, diseño e Implementación de Sistemas Digitales, concirtiéndose en la primera y única empresa en Colombia que realiza el proceso completo del proceso de diseño de SE \cite{CC06}.\cite{emQ}. En el capítulo \ref{ch:embedded} se enumerarán las actividades realizadas con esta empresa. + + \item \textbf{Hardware Copyleft}: El movimiento de Software Libre y de Código Abierto (FOSS) es hoy en día la estructura auto-gobernada más exitosa, millones de personas alrededor del mundo trabajan de forma conjunta y distribuida en busca de un bien común: Generación y distribución de herramientas software, sistema operativo y todo tipo de aplicaciones incluyendo el código fuente bajo una licencia que permite su distribución y modificación. Este movimiento busca romper los grandes monopolios en la industria del Software, donde el usuario final no puede participar en el proceso de creación del mismo y debe pagar por aplicaciones que no se ajustan a sus necesidades, que presentan errores en su funcionamiento, acaptar todos estos problemas y pagar por actualizaciones. Adicionalmente, buscan difundir los conocimientos que un determinado programador adquirió para el desarrollo de una aplicación permitiendo el estudio del código fuente, creando listas de discusión donde se resuelven todo tipo de dudas y se planifica de forma conjunta el desarrollo de estas aplicaciones, desarrollando tutoriales y libros disponibles en línea. + +Este movimiento ha creado toda una serie de herramientas que compiten con las suministradas por multinacionales como Microsoft y Apple, dentro de las más destacables se encuentran: La \textit{cadena de herramientas de compilación GNU}, librerías, el sistema operativo \textit{Linux}, aplicaciones como el servidor web \textit{Apache}, el explorador \textit{Mozilla}, la suite ofimática \textit{OpenOffice} y distribuciones como \textit{Debian}, \textit{Ubuntu}, \textit{Suse}, \textit{Redhat}. Gracias a esto es, se dispone de una cantidad enorme de aplicaciones en diversos campos que pueden ser utilizadas para adquirir conocimientos y desarrollar aplicaciones en diferentes áreas. + +El resultado más notable, es la creación de un recurso de bien común: el conocimiento contenido en las herramientas y aplicaciones, la infra-estructura física y tecnológica para su distribución y difusión, y una comunidad que se encarga de contribuir, mejorar y administrar este recurso. Este recurso está basado en principios de libertad y de confianza, esto es, cualquier persona puede ser parte de la comunidad y participar en los procesos de toma de decisiones y creación de normas, y deben conocer de antemano las reglas de interacción entre los miembros y como sus acciones afectan a los otros miembros y al recurso. En el capítulo \ref{ch:common} estudiaremos con más detalle este movimiento. + +Este trabajo contribuye con la creación de un movimiento inspirado en el movimiento FOSS, pero dirigido al desarrollo de aplicaciones Hardware, esto es, Circuitos Integrados, Placas de Circuito Impreso, Dispositivos comercializables, programación y generación de bienes y servicios asociados a estos productos. En la actualidad existen varios proyectos que proporcionan los archivos de diseño para reproducir el componente hardware, sin embargo, no existe un consenso sobre las características que se deben cumplir para que sea considerado \textit{copyleft}, esta es una de los tópicos que se abordarán en el capítulo \ref{ch:common} + + +\end{itemize} diff --git a/course/.docs/book/review.tex.backup b/course/.docs/book/review.tex.backup new file mode 100644 index 0000000..84c6161 --- /dev/null +++ b/course/.docs/book/review.tex.backup @@ -0,0 +1,563 @@ +\chapter{TRANSFERENCIA TECNOLÓGICA} +\begin{quote} + "Social development today is determined by the ability to stablish a synergistic interaction between technological innovation and human values" + Castells 1999 +\end{quote} + +La transferencia de tecnología según Van Gigch involucra la adquisición de "actividad Inventiva" por parte de usuarios secundarios. Es decir, la +transferencia tecnológica no involucra necesariamente maquinaria o dispositivos físicos. El conocimiento puede ser transferido a través de entrenamiento y +educación, y puede incluir temas como manejo efectivo de procesos y cambios tecnológicos\cite{FBFP07} . + +La transferencia tecnológica es un proceso dinámico que debe ser re-evaluado periódicamente, requiere una infraestructura adecuada que involucra +instituciones, institutos de formación vocacional, técnica y administrativa, personal con diferentes especialidades y un entorno cultural adecuado. +Es difícil que la tecnología desarrollada en un entorno determinado pueda ser transferida sin realizar modificaciones en la escala de producción y +la adopción de productos al mercado local. + +La transferencia de tecnología ha introducido técnicas de alta productividad y en muchos casos cambios técnicos en países menos desarrollados. +La adquisición de tecnología foránea contribuye a mejorar la competitividad en los mercados locales e internacionales en estos países, en los que debe +ser considerada como un proceso vital. Este proceso presenta problemas cuando se pierde capacidad de absorción por parte del país receptor y la +renuencia del país que transfiere a transferir tecnología real y el know-how. Por lo que es necesario que estos países promuevan sus capacidades +tecnológicas locales con el fin de absorber las tecnologías foráneas de forma eficiente en función de sus necesidades locales y de esta forma forma +generar un rápido proceso de industrialización. + +No debe confundirse la transferencia tecnológica con la apropiación de tecnología que se define como el proceso de interacción con la tecnología, +la modificación de la forma como es usada y el marco social dentro del cual es usada. Un ejemplo de apropiación de tecnología lo podemos encontrar +en la telefonía celular, nuestras sociedades han cambiado drásticamente su forma de comunicarse y han generado nuevas actividades alrededor de esta +tecnología, los usuarios pueden generar aplicaciones que adicionan funcionalidades y servicios. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DEFINICION DE TRANSFERENICA TECNOLOGíA %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Tecnología} + +La tecnología es definida como el factor más significativo para mejorar la productividad, calidad y competitividad \cite{GC04} y puede verse como +un proceso de transformación de recursos que tiene como entrada recursos naturales, bienes, o preductos semi-manufacturados y como salida se obtienen +bienes consumibles de capital y semi-manufacturados. El \textit{Technology Atlas team} identifica cuatro componentes de la tecnología \cite{FBFP07}: + +\begin{itemize} + \item Techno-ware Relacionado con objetos: Herramientas, equipos, máquinas, vehículos, facilidades físicas, instrumentos, dispositivos y fábricas + \item Human-ware Relacionado con personas: Habilidades en conocimiento experimental, sabiduría y creatividad, experiencia, competencia, creatividad. + \item Info-ware Relacionado con la Información: Incluye todo tipo de documentación y datos acumulados relacionados con especificación de procesos, +procedimientos, diseños, teorías, y observaciones + \item orga-ware Relacionado con la Organización: Acuerdos y Alianzas necesarias para facilitar la integración de los componentes Técnico, Humano, y +de información. Involucra asignación, sistematización, organización, redes de comunicación. +\end{itemize} + +El uso efectivo de estos cuatro componentes requiere el cumplimiento de ciertas condiciones. El componente técnico requiere de personal con habilidades +específicas para poder ser utilizado. Para mejorar la eficiencia del sistema el componente humano necesita de adaptación y motivación. A medida que la +organización cambia para adaptarse a nuevas condiciones o requerimientos se debe actualizar el sector de la información. \textbf{No es posible realizar +operaciones de transformación ante la ausencia de uno de estos cuatro componentes} + +La interacción de estos cuatro componentes puedes ser resumida de la siguiente forma: + +\begin{itemize} + \item \textit{Tecnoware} constituye el núcleo de cualquier tecnología, es decir, una habilidad de transformación, y es desarrollada, instalada y operada +por \textit{humanware}. + \item \textit{Humanware} o las habilidades individuales representan el elemento clave de cualquier operación de transfomación guiada por el \textit{infoware} + \item \textit{Infoware} almacena conocimiento acumulado para ahorrar tiempo en el aprendizaje individual. Es generado y utilizado por \textit{humanware} +para los procesos de toma de decisiones y operaciones. + \item \textit{Orgaware}, o el marco de trabajo administrativo, adquiere y administra el tecnoware, humanware e infoware con el fin de realizar la operación. +Orgaware se compone de las actividades de planeación, organización, activación, motivación y control de operaciones. +\end{itemize} + + +La tecnología no esta asociada a un sistema socio-económico abstracto. La tecnología se encuentra fuertemente relacionada con un espectro amplio de las +necesidades humanas, si se dictan por las condiciones físicas existentes o por factores culturales derivados de las especificidades históricas de +diferentes grupos sociales \cite{KGSB95}. En resúmen, la tecnología esta compuesta de conocimiento, herramientas, técnicas y actividades utilizadas +para transformar las entradas de la organización en salidas. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DEFINICION DE TRANSFERENICA TECNOLÓGICA %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Definición} + +Odedra \cite{Mo94} define la transferencia tecnológica como el problema de transfencia de conocimiento +(o know-how) sobre un número de aspectos (que incluyen el conocimiento) sobre como funciona +un determinado sistema, como operarlo y desarrollar sus aplicaciones, como mantenerlo y si +es necesario, como producir sus componentes y montar un sistema similar. La transferencia +tecnológica se considera exitosa cuando los receptores de la tecnología asimilan los conceptos +anteriores para suplir sus necesidades locales. + +Según Jolly \cite{Jol77} La innovación tecnológica es entendida como un nuevo método, medio o capacidad del individuo para realizar una determinada actividad. El resultado de la transferencia tecnológica puede ser la aceptación de una práctica común en otros lugares, o la aplicación de una técnica +diseñada para otro uso en la salución de problemas locales, debe distinguirse del proceso general de difusión de tecnología: un movimiento no planeado de artículos sociales y tecnológicos de un lugar a otro sin ningún esfuerzo centrado en la transferencia. La transferencia tecnológica incluye la difusión de conocimiento científico y la preocupación por la transformación del conocimiento en innovaciones útiles. El conocimiento es lo que queda al final de un proceso documentado y difundido de forma apropiada. Para que la transferencia tecnológica sea exitosa es necesario transferir los componentes de la tecnología, es decir: Los conocimientos técnicos, las habilidades humanas, la información y la estructura de la organización. + +\subsection{Tipos de Transferencia Tecnológica} + +Mansfield clasifica la transferencia tecnológica en transferencia de material, diseño y capacidades, la transferencia de material no constituye una transfencia tecnológica real, ya que no genera el conocimiento necesario para transformarlos y generar nuevos productos que cumplan con las necesidades locales + +\begin{itemize} + \item Transferencia material: Artefactos tecnológicos: Materiales, productos finales, componentes, equipos + \item Transferenica de diseño: Diseños, proyectos, know-how para fabricar productos diseñados previamente. Los productos son copiados para producirlos +localmente. + \item Transferencia de Capacidades: Proporciona know-how y software no solo para fabricar componentes existentes, sino, innovar y adaptar tecnologías +existentes para producir nuevos productos. +\end{itemize} + +La transferencia de diseños permite adquirir mayor conocimiento sobre la tecnología transferida, sin embargo, es necesario que el pais receptor cuente con la plataforma tecnológica adecuada para absorver estos conocimientos, de lo contario no se generarán nuevos productos y las actividades se limitarán al ensamblaje de productos pre-manufacturados. La transferencia de capacidades es ideal, ya que proporciona las herramientas necesarias para que la transferencia sea exitosa, está asociada a una transferencia de conocimiento, lo cual es vital para entender plenamente la tecnología, mejorando las habilidades de los profesionales del receptor. + +Otra clasificación distingue entre Transferencia Vertical y Horizontal: + +\begin{itemize} + \item Transferencia Vertical: Transferencia de información técnica a diferentes niveles de un proceso innovativo determinado. Por ejemplo de +investigación básica a investigación aplicada, de investigación aplicada a desarrollo y de desarrollo a producción. es decir, una progresión +tecnológica desde la teoría al producto terminado. + \item Transferencia Horizontal: Cuando se utiliza en un lugar, organización o contexto y es transferida y utilizada en otro lugar. +\end{itemize} + +La transferencia vertical establece varios pasos en la transferencia, que pueden ser aplicados en diferentes niveles: Entre centros académicos, transferencia entre la academia y la empresa para generar aplicaciones, prototipos y producción en masa. La desconcexión entre la Universidad y la empresa en Colombia y en la mayoría de los países en desarrollo hace que los objetivos que persigue la Academia no están sintonizados con las necesidades de la industria y en muchas ocasiones los productos generados en la Academia nunca llegan a las industrias locales, ya sea porque no tienen la infraestructura tecnológica para hacerlo o porque la Universidad no proporciona el soporte necesario para que ese producto pueda ser utilizado en la práctica. + +\subsection{Canales Para la Transferencia de tecnología} + +Erdilec and Rapoport [45] clasifican los mecanismos en Formales: Acuerdos de licenciamiento, Inversión extranjera, compañías conjuntas, acuerdos de cooperación en investigación, arreglos de producción conjunta e Informales: No involucran acuerdos entre las partes y son difíciles de detectar y monitorear, por ejemplo, exportación de productos tecnológicos o bienes de capital, ingeniería inversa, intercambio de personal técnico y científico, conferencias de ciencia y tecnología, ferias y exposiciones, educación y entrenamiento realizado por extranjeros, visitas comerciales, literatura abierta (artículos, revistas, libros técnicos), espionaje industrial. Adicionalmente, existe una división basada en la naturaleza de la institución que proporciona los recursos para que se realice la transferencia, la institución puede ser de carácter: + +\begin{itemize} + \item \textit{Abierta} en donde la tecnología y el conocimiento són considerados bienes públicos, no existen restricciones para acceder a la información necesaria para adquirir, usar y transformar estos conocimientos en productos comerciales, y su éxito radica en obtener la máxima difusión posible para que los usuarios de este conocimiento mejoren el material existente y contribuyan con experiencias personale, + \item \textit{Cerrada} La tecnología y el conocimiento se genera para fines privados, la utilización de este conocimiento esta sometida a acuerdos comerciales. No es posible entender las bases de la tecnología, por lo que no se pueden generar productos derivados. +\end{itemize} + +Las actividades realizadas durante este estudio están enmarcadas dentro del concepto: \textit{El conocimiento es un Bien Común}, toda la documentación necesaria para reproducir, entrenar, entender y modificar los productos generados se encuentran disponibles en servidores públicos \cite{WSCC} \cite{CC} y se proporciona soporte a través de listas de discusión, adicionalmente se proporciona soporte comercial para permitir la producción de estas modificaciones. A continuación se realiza una descripción de los canales más utilizados para la transferencia de tecnología y conocimiento en países en vía de desarrollo (\cite{MO90} \cite{Mo94} \cite{MO91}) indicando en cada caso sus ventajes, limitaciones y desventajas. + +\subsubsection{Adquisición de IT} + +La adquisición de equipo ha sido uno de los mecanismos de transferencia más importantes para los países en desarrollo. Estos equipos +se entregan con el software requerido para su funcionamiento con lo que no es necesario que los usuarios generen aplicaciones, por lo que +solo adquieren el conocimiento necesario para utilizar estas máquinas, y por lo tanto no saben como funcionan. + +Otra forma de transferencia se presenta cuando una empresa vende una solución personalizada a las necesidades de los clientes. La +transferencia tecnológica se presenta en el proceso de personalización, esto, unido a otras habilidades en programación ayudan a elevar +el mercado de SW local. Sin embargo, en muchas ocasiones no se detectó ningún tipo de transferencia de knowhow en la adquisición de estas máquinas. + +Las grandes multinacionales como IBM, Microsoft, NCR dominan el mercado de Software y Hardware y hacen que sea imposible el ingreso de +pequeñas compañías locales, lo que se traduce en que el mantenimiento y servicios asociados al hardware, así como los ajustes de Software +sean realizados por los proveedores de las multinacionales y en muy pocos casos los usuarios de esta tecnología adquieren habilidades +para sostener el equipo. La transferencia se realiza a subsidiarias de las multinacionales, con lo que la transferencia es mínima, esto se +hace para que la dependencia no se pierda. + +En conclusión con la venta de equipos se transmite únicamente el conocimiento para operar, programar o mantener, sin embargo, +este conocimiento sobre el sistema puede ayudar a concientizarse sobre la tecnología e impulsar la formación de capital humano. + +La experiencia de países que lograron un rápido desarrollo económico e industrial muestra que la adquisición de una gran cantidad de +tecnología foránea jugó un papel importante en este proceso. Colombia ha realizado un proceso de transformación tecnológica pero no ha +diseñado políticas efectivas y eficientes para la transferencia de tecnologías de alto nivel +. + +\subsubsection{Educación y Entrenamiento} +Educar a las personas a través de cursos y entrenamiento en el país y enviándolas al extranjero para otros estudios es una forma de adquirir +know-how sobre nuevas tecnologías, o tecnologías que no se utilizan en el país de origen. Muchas instituciones ofrecen carreras en +Ingeniería Electrónica, Ciencias de la computación y afines, algunas de ellas utilizan modelos pedagógicos utilizados en países desarrollados, +los que no han sido adaptados plenamente a la infraestructura tecnológica local, y no es raro encontrar estudiantes que no están satisfechos +con su profesión al finalizar los cursos\cite{Mo94}. + +En muchas Universidades temas como Nanotecnología, Diseño de Circuitos integrados de muy alta integración (VLSI) hacen parte importante de las +actividades de investigación; la pertinencia de estos tópicos avanzados ante la situación tecnológica del país es discutible ya que muchos +estudiantes no aplicarán nunca estos conocimientos en el entorno local, por lo que la enseñanza de estos tópicos puede resultar una pérdida de +recursos. Es más, con los rápidos cambios en la industria electrónica estos conocimientos pueden resultar irrelevantes, aún si la +infraestructura del país se mejora. Es decir, es importante no dejarse llevar por el momento, o por la "fama" de un tópico de investigación +o de una tecnología novedosa, es necesario evaluar la pertinencia de los cursos que se dictan en el entorno tecnológico local, por supuesto, +es necesario que la academia impulse cambios en el sector, pero estos cambios deben ser consecuentes con el nivel tecnológico que posea el país. + +La transferencia tecnológica no ocurre cuando estudiantes formados en el exterior no pueden aplicar sus conocimientos en su país de origen, +por lo que es necesario crear políticas que definan que áreas de estudio son prioritarias para el país. + +Las multinacionales también ofrecen cursos de capacitación, sin embargo, se limitan al uso de sus productos, creando dependencia hacia +sus herramientas. Adicionalmente, existen centros privados de capacitación que ofrecen cursos para el manejo de paquetes y lenguajes de +programación, estos centros aprovechan la falta de centros de enseñanza tecnológica y personal calificado para cobrar altas sumas de dinero, +lo cual limita el acceso. Programas académicos inapropiados, acceso limitado a libros y computadores, falta de facilidades para capacitación, reduce la efectividad +de la educación y capacitación como canal para la transferencia tecnológica. + +\subsubsection{Asistencia Técnica} + +La ventaja de contratar consultores externos radica en el ahorro de tiempo y dinero, ya que, utilizar personal local implicaría un gran esfuerzo +y posiblemente se tendrían que asumir errores costosos en el proceso. Sin embargo, no es bueno confiar a consultores externos la responsabilidad +de construir habilidades locales, ya que reduce el desarrollo de estas habilidades, especialmente, la del personal encargado de manejar proyectos. +En algunas ocasiones los consultores no están familiarizados con las condiciones y requerimientos locales, con lo que diseñan soluciones que no se +ajustan perfectamente a las necesidades, lo que significa que el sistema es sub-utilizado y la transferencia de tecnología es poca. La falta de +personal calificado hace que los consultores se encarguen de todas las tareas del proyecto, lo que aumenta su carga de trabajo y disminuye la +posibilidad de entrenamiento de personal local\cite{Mo94}. + +En algunas ocaciones los consultores son representantes de grandes multimacionales y todas sus acciones están dirigidas a aumentar la dependencia +con los productos generados por dichas transnacionales y a ignorar de forma sistemática opciones que pueden ayudar a la transferencia de conocimiento, +llegando hasta el punto de influir en la formulación de políticas para transferencia tecnológica. Un ejemplo de este tipo de alianzas no convenientes +se presenta en la industria del Software dominada por Microsft. Microsoft firma acuerdos con centros educativos oficiales para la distribución de +sus productos con licencias a muy bajo costo, el estudiante se acostumbra a utilizarlas y cuando sea un profesional debe adquirirlas a un precio +elevado para poder realizar su actividad profesional con la única herramienta que conoce. + +\subsubsection{Licenciamiento} + +El licenciamiento es un canal que se utiliza para transferencia de know-how sobre productos o procesos, es aplicado de forma individual o en +combinación con otros instrumentos como investigación extranjera, importación de maquinaria o de técnicos. Sin embargo, no es efectivo si no +se acompaña de habilidades administrativas y de producción. Adicionalmente, es necesario contar con una infraestructura tecnológica adecuada, +capacidades locales de fabricación de hardware y software y políticas de gobierno adecuadas \cite{Mo94}. + +Un ejemplo de este tipo de práctica se presenta en el ensamble de dispositivos electrónicos, todos los componentes se importan completamente +terminados y el dispositivo final es ensamblado probado y se carga la configuración inical, no se producen actividades de ingeniería inversa con +lo que se transmite muy poco conocimiento. + + +Sin embargo, es necesario crear una confianza en los productos locales, el gobierno debe crear políticas de protección de los productos generados +localmente, países de latinoamerica aplican este tipo de protecciones y solo permiten la importación de productos que no se fabriquen en el país. +Esto aumenta la confianza en los productos generados localmente e impulsa el desarrollo industrial y la generación de empleo. + +\subsubsection{Inversión Extranjera Directa} + +La inversión directa de multinacionales es una forma de obtener tecnología externa. Esto asegura una rápida transferencia de información +tecnológica, pero no necesariamente del entendimiento o know-how. Lo que hace que la tecnología transferida a través de este canal sea mínima. +Las grandes multinacionales pueden tener cierto control político en los países en vía de desarrollo, hasta tal punto que son asesores de +instituciones encargadas de fijar políticas para la transferencia tecnológica \cite{Mo94}. + +El objetivo de la transferencia tecnológica debe ser el aumento de la auto-suficiencia en el pais receptor, unido a un uso compartido de +recursos y experiencia entre los países desarrollados y en vía de desarrollo. La compra de equipo o de software transfiere muy poco conocimiento +sobre la tecnología, el servicio post-venta y el mantenimiento es realizado por el proveedor. Por otro lado, las facilidades en educación y capacitación +son limitadas lo cual obstaculiza la formación de capital humano. La asistencia técnica utilizada para suplir la falta de personal especializado y +ayudar con el proceso de transferencia no ha sido muy efectiva. + + +\subsection{Conclusión} + +La efectividad de cada canal depende de la naturaleza de la tecnología que se va a adquirir, el tipo de organización y de las capacidades de absorción del recipiente. La tecnología es efectiva únicamente cuando la economía del país es capaz de utilizarla. Cuando se transfiere una tecnología se debe contar con el dinero para adquirirla y se deben generar las actividades necesarias para mejorar la plataforma tecnológica, incluyendo la educación y la capacitación, de tal forma que el país sea capaz de absorberla y generar nuevos productos que satisfagan necesidades locales. + +El éxito de la transferencia tecnológica no depende de un factor único, sino de la confluencia de multiples factores dentro y fuera de la institución académica. Las relaciones personales entre los agentes de transferencia tecnológica y la facultad, licencias corporativas, y las comunidades de investigación y de negocios son la clave de esfuerzos exitosos. En muchos casos, las Universidades han liderado el proceso de transferencia tecnológica a través de sus directivos, estos a través de incentivos crean una cultura académica que recompensa la transferencia tecnológica y el emprendimiento. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Modelo %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Modelo} + +Un programa de transferencia tecnológica bebe incluir mecanismos que unan de forma eficiente la fuente del conocimiento con la utilización del mismo. +Estos canales de comunicación son mecanismos de recursos humanos que pueden ser incorporados tanto en la fuente como en el destino, +el proceso de una efectiva transferencia tecnológica puede comenzar con potenciales usuarios en lugar de fuentes \cite{Jol77} +La figura \ref{tech_trans_model_global} muestra + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/transfer_model_global.png} \end{center} + \caption{Modelo del proceso de Transferencia de Tecnología} \label{tech_trans_model_global} +\end{figure} + + +\subsection{Los factores formales} + +\subsubsection{Documentación} +Es el formato, organización, o presentación de la tecnología que será transferida. El formato y el lenguaje se relacionan directamente con el entendimiento del material por parte del receptor. La información que no se entiende no se utiliza. Los científicos e ingenieros ocupan hasta 4 horas diarias leyendo artículos, hablando con sus pares o buscando información, mientras que los nuevos usuarios (por ejemplo, gobiernos locales, y grupos de ciudadanos) desean gastar menos tiempo en dar respuestas a sus preguntas. + + +\subsubsection{Distribución} +Constituye el canal físico a través del cual la tecnología fluye e involucra tanto el número de entradas y el fácil acceso al canal, así como el plan de distribución. knox 1973, dice: "Una medida de la efectividad del sistema de información tecnológica es al capacidad de permitir el contacto entre personas con necesidades y con posibles soluciones. Ames 1965, Encontró que los abstracts y los papers son la fuente de información más importante, mientras que las reuniones y conferencias el mejor vehículo para crear conciencia, la cual es indispensable para que el proceso de distribución sea exitoso, por lo que, el intercambio personal debe ser considerado como parte del proceso de distribución de tecnología. Este canal ayuda a eliminar retardos en la investigación, ya que permite determinar el estado del arte de una determinada actividad o área de trabajo. + + +\subsubsection{Organización} +La percepción del receptor de la organización. Schon 1967, caracteriza a una organización que es favorable a la transferencia tecnológica y utilización de conocimiento como aquella que vive en un estado de urgencia, donde los conflictos son resueltos por mandato, donde los recursos son enviados sin vacilar, y donde la incertidumbre se convierte en un riesgo. Stephenson, Ganz y Erickson 1974, reportan un estudio realizado sobre 109 científicos e ingenieros donde algunos de ellos sienten que una organización ocasionalmente puede actuar como una barrera a las nuevas ideas. + + +\subsubsection{Selección de Proyectos} + +Proceso de selección para proyectos de investigación y desarrollo realizado por el proveedor con ayuda del receptor. Es importante que la investigación comience como respuesta a una necesidad del cliente. + +La figura \ref{tech_trans_model} muestra + +\begin{figure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/transfer_model.png} \end{center} + \caption{Modelo del proceso de Transferencia de Tecnología Indicando La Composición de Los Canales Formales e Informales} \label{tech_trans_model} +\end{figure} + + +\subsection{Factores Informales} +Los factores informales son de naturaleza sociológica y/o comportamental, y contribuyen fuertemente al éxito de la utilización del conocimiento por una determinada organización. + +\subsubsection{Capacidad} +La capacidad del usuario para utilizar nuevas ideas que cubren un amplio espectro de rasgos que incluyen riesgo, riqueza, poder, educación, experiencia, edad, confianza en sí mismos. + +Atributos como: Atrevimiento, status profesional y educativo, domino, sociabilidad, no son considerados tan importantes frente a la autosuficiencia que es el más valorado. + + +\subsubsection{Enlace (contacto)} +Presencia y efectos de enlaces informales en la organización receptora. El enlace opera dentro de la organización receptora y exhibe características similares al supervisor, líder de opinión, innovador y previo conocedor de la innovación. + + +\subsubsection{Credibilidad} + +La credibilidad es una evaluación por parte del usuario, de la confiabilidad de la información. Es evaluada analizando la fuente y el canal del mensaje. La opinión cambia dependiendo de la fuente de la información, es decir, la credibilidad es influenciada por su fuente. + +\subsubsection{Recompensa} + +Reconocimiento del sistema social del cual hace parte un individuo ante un comportamiento innovador. + +\subsubsection{Disposición} + +La habilidad y/o deseo del individuo para aceptar un cambio en la organización de la cual es miembro. Así mismo es importante la capacidad de adopción de nuevas ideas, Gallup 1955 señaló que aunque una idea halla sido aceptada intelectualmente, toma un período de tiempo antes de ser incorporada en la forma de pensar. Ser consciente de la importancia de de una nueva idea no s suficiente para asegurar su uso; debe existir una disposición, un interés, una motivación personal para utilizar un mejor método, proceso o concepto. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Historia %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Transferenica Tecnológica en Latinoamérica \cite{UNE}} + +\subsection{Trasfondo histórico} + +Durante el período que va de los años 40 a la década de los 80, en América Latina y el Caribe se puso en práctica una política de +industrialización por sustitución de importaciones mediante modalidades de proteccionismo de la industria manufacturera local. +Con lo que se comenzó a importar los bienes de capital necesarios para la fabricación en el ámbito local, desarrollando +de esta forma a las industrias locales. Mientras tanto, en los países de donde provenían estos bienes, se transformaba el conocimiento +adquirido de la investigación, en nuevos productos, procesos y modelos de gestión más competitivos. Es decir, se importaron los equipos +para realizar la transformación industrial, pero no se generaron las bases científico-tecnológicas que se encargaran de generar nuevos +productos asociados a las materias primas proporcionadas por los recursos naturales locales, se descuidó el capital humano capaz de entender, +adaptar y llevar estos inventos a la sociedad, salvo en algunas disciplinas agrícolas donde la especificidad local obligó a la investigación. +Adicionalmente, no se generó demanda local que impulsara la producción de conocimiento, las nuevas empresas no contaban con departamentos de +Investigación y desarrollo (I+D) y los gobiernos no estimulaban la creación de centros de investigación asociados a este proceso de industrialización. + +Cuando los gobiernos de la región se dieron cuenta de esta situación crearon la Comisión para América Latina y el Caribe (CEPAL). A partir +de las décadas de los cincuentas y setentas comenzaron a crear políticas en las áreas científicas y tecnológicas, creando instituciones +destinadas al fomento de la ciencia y la tecnología. Muchos de estos esfuerzos fueron discontinuos y contradictorios, pero algunos siguieron +las pautas establecidas por la UNESCO y la OEA (basadas en "la idea de que la ciencia y la tecnología eran una usina de crecimiento, en un rico +suelo fertilizado por el deseo de la modernización y el desarrollo") exhibieron una continuidad notable. Esto unido al apoyo gubernamental y +el interés de las universidades fue clave para la formulación de políticas de apoyo a la ciencia y la tecnología. + +Gracias a estas políticas hubo un fuerte proceso de institucionalización de la investigación científica y de los mecanismos de desarrollo: +Sistemas de promoción del I+D, legislación en transferencia de tecnología, planificación de la ciencia, métodos de diagnóstico de recursos, +sistemas de fijación de prioridades tecnológicas, etc. A finales de los 50s y dyrante los 60s y 70s, estas actividades eran soportadas casi de +forma exclusiva por el estado (incluyendo las universidades públicas), estos esfuerzos no provocaron una dinámica sostenida de innovación en el +conocimiento y en la economía ya que en muchos sectores no se generó un vínculo sólido entre la producción y la investigación, esto debido a la +creación de dos modelos de investigación en ciencia y tecnología: +\begin{itemize} + \item Ciencia Académica: Basada en las universidades, es incorporada a la comunidad científica internacional, de quien recibe legitimidad, orientación, +organización. + \item Actividad Tecnológica: Sustentada por organismos sectoriales, legitimada por instituciones estatales, su objetivo es dar solución a problemas +prácticos y a la transferencia de tecnología al sector productivo. +\end{itemize} + +En los años 80 disminuyó la confianza de poder encontrar un camino hacia un desarrollo endógeno, lo que originó un giro hacia políticas de ajuste, +estabilización y apertura de la economía que buscaban vías alternas para llegar a la globalización. La apertura de la economía suponía un +abastecimiento de nuevos conocimientos por parte de las empresas locales para estar a tono con el estado internacional o la búsqueda de nuevos +nichos de mercado; por otro lado, la apertura forzaría una homogeneización tecnológica, por lo que el aumento de la competitividad se lograría +a través de la transferencia de productos externos y no la inventiva e innovación local. + +En los años 90 los países de la región realizan grandes compras a costa de su endeudamiento externo. La industria local se ve enfrentadas a +productos extranjeros baratos, lo que ocasiona el cierre de muchas industrias manufactureras y la transformación de muchas en importadores; +esta política desmantela el aparato productivo y no fomenta actividades de adaptación, mejora y creación de productos. La oferta tecnológica +proviene del exterior, se diluye el sistema nacional de ciencia y tecnología basado en el aumento de la oferta interna de conocimiento. +Las políticas públicas se reducen a la aceptación de normas de la Organización Mundial de Comercio (OMC) basadas en presiones de Estados +Unidos y la Unión Europea sobre patentes farmacéuticas, tecnologías agrícolas y de otros tipos. No es que no existan esfuerzos e interacciones tecnológicas entre la ciencia y la producción; el problema es que no constituyen un sistema autosostenido de relaciones dinámicas que marquen un rumbo claro a la investigación en ciencia y tecnología vinculado con las sociedades y las economías donde se desenvuelven. + +Según Gibbons y Schwartzman, la investigación científica se origina y justifica cada vez más en el contexto de aplicación del conocimiento, +es decir, en la posibilidad de su utilización. Por lo que los temas de investigación no son fijados por los científicos sino por redes formadas +por empresarios, ingenieros de planta e inversionistas. Lo que lleva a que las diferencias entre las dos formas de investigación disminuyan. +En tal sentido, no es seguro que la inserción en el comercio internacional de América Latina favorezca su posición en la producción de +conocimientos en ciencia y tecnología. + +La ciencia y la tecnología en la región presenta dos grandes probleams: a) su escasa magnitud; b) su desvinculación con la sociedad a +la que pertenece, con el agravante de la pérdida de legitimidad que se produjo en las últimas dos décadas, sustentada por una parte en +el Estado, y en su integración en una ciencia internacional fuertemente académica, por la otra. + +\subsection{Financiación} + +Según la Red de Indicadores de Ciencia y Tecnología (RYCIT), el gasto en actividades de ciencia y tecnología en los países latinoamericanos alcanza poco menos de los 8.000 millones de dólares anuales, lo cual representa el 2,3\% del gasto mundial en el sector. Mientras el PBI de Estados Unidos cuadruplica al de América Latina y el Caribe, su inversión en I+D es más de 20 veces mayor que la latinoamericana. Dicho de otro modo, el esfuerzo de los países de la región en ciencia y tecnología es inferior al que les correspondería realizar tomando en cuenta el valor del producto regional. + +Según la Organization for Economic Co-operation and Development (OCED) los países Latinoamericanos dedican en promedio algo más del 0,6\% de su Producto Interno Bruto a I+D. Esta inversión se concentra en Brasil, México y Argentina, en Colombia el gasto es del 0.18\% lo que contrasta fuertemente con el gasto militar de 3.4\%. En la Unión Europea, en cambio, el porcentaje alcanza el 1,7\% del PIB, en Estados Unidos alcanza el 2,8\%, Japón (3,13\%), Corea del Sur (2,52\%) y otros como China e India en los cuales, aunque la inversión es algo inferior, la tendencia de los últimos años hace pensar en un aumento progresivo de sus inversiones en I+D. El gasto en ciencia y tecnología como el recurso promedio que tienen los investigadores para llevar a cabo su tarea, en EEUU asciende a 171.000 dólares por investigador, y en el conjunto de países latinoamericanos a 59.000. + +Un rasgo característico de la investigación científica en América Latina es su gran dependencia del Estado, según un estudio de la OCED, en el plano estrictamente tecnológico, las estadísticas sobre patentes describen un panorama entre el norte y el sur similar a los datos del I+D: el número de solicitudes de patentes en EEUU es del orden de los 200.000 por año, más de 50.000 y de 40.000 en España y Canadá, respectivamente. En América Latina, sólo Brasil y México (pero ambos con marcados desniveles anuales) presentan cifras algo significativas: entre 6.000 y 10.000 patentes anuales. Aun así son valores marcadamente inferiores. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Obstaculo %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Obstáculos para una Transferencia Exitosa} + +La cantidad de conocimiento y tecnología transferida es afectada por políticas gubernamentales, la situación económica, facilidades de educación y capacitación, personal calificado, aspectos organizacionales y sociales, proveedores de tecnología e infraestructura tecnológica. El gobierno juega un papel importante en el proceso de transferencia tecnológica ya que puede invertir en la infraestructura para impulsar una determinada tecnología o colocar restricciones para des-estimular su uso. Estas políticas son dependientes de la situación económica del país y del entendimiento de la importancia de la transferencia por parte de de sus dirigentes. La falta de facilidades en educación y en capacitación obstaculizan el proceso de transferencia, limitando el acceso. La falta de estas habilidades indica que los canales de transferencia no son eficientes porque la infraestructura del país no lo permite. Las personas son las que finalmente absorben el know-how tecnológico, si no existe el suficiente personal disponible y dispuesto, el proceso de transferencia se detendrá. + +La administración a nivel de organización juega el papel más importante en el proceso de transferencia tecnológica. La resistencia o el +desconocimiento a la tecnología, la adquisición de tecnología por motivos particulares no contemplan la implementación y la capacitación. +Por esta razón, es necesario que los encargados de tomar las decisiones y trazar políticas, conozcan la tecnología, o que estén conscientes de +su importancia. La transferencia tecnológica debe ser un proceso de dos vías, por lo que es indispensable tener habilidades adecuadas en +investigación, capacidades organizacionales y de ingeniería para que estos conocimientos sean asimilados y utilizados en la solución de +problemas locales. Es necesario que la adquisición de tecnología obedezca a un plan y que esta tecnología supla una necesidad real, de +lo contrario los equipos adquiridos y la capacitación recibida no serán utilizados, por otro lado, la tecnología adquirida que no es +asimilada y transformada en herramienta para la solución de problemas locales aumenta el grado de dependencia, lo que representa justamente +lo contrario a lo que se debe buscar en una actividad de transferencia tecnológica. + +Los procesos de transferencia tecnológica son influenciados de forma directo o indirecta por las infraestructuras organizacionales y +tecnológicas de los países, los cuales, deben exceder sus capacidades para absorber la tecnología transferida. Esta transferencia es efectiva solo +si la economía en la cual es introducida es capaz de utilizarla. Si un país cuenta con los recursos económicos necesarios para adquirir la tecnología, +debe mejorar la infraestructura para soportarla, incluyendo la educación y las facilidades de entrenamiento, así como los enlaces de telecomunicaciones \cite{MO90}. + +La falta de facilidades de educación y capacitación afecta la transferencia del knowhow, obstaculizando el desarrollo de habilidades a través del proceso de aprendizaje. La carencia de estas facilidades limita la difusión del conocimiento; la pérdida de estas habilidades se pueden originar porque la transferencia no se realizó o porque la infraestructura no lo permite. + +Si no existen personas disponibles y dispuestas a absorber el knowhow el proceso de transferencia se detendrá. El proceso de transferencia +tecnológico también es influenciado por la falta de políticas claras en la Tecnología de la Información, y los planes de negocios estratégicos, +los cuales pueden identificar las necesidades que traerán beneficios a la nación o determinar lo que se puede lograr con los recursos disponibles. + +Algunas políticas regulatorias sobre procesos de adquisición de hardware y software que existen en varios países obstaculizan los procesos de +transferencia de tecnología. Al hacer convenios con multinacionales para suministro de tecnología, a menudo estas multinacionales no están +interesadas en difundir el conocimiento necesario para reproducir sus productos y el soporte se limita a tópicos relacionados con su manejo. +Ejemplos claros de esto se encuentran en el software propietario, los usuarios deben usar el programa como se les suministra y no tienen +acceso al código fuente, con lo que no pueden adquirir habilidades estudiando su estructura y no pueden hacer modificaciones para adaptarlo a +sus necesidades. Esto se traduce en una sub-utilización del producto y en el aumento de la dependencia del proveedor. + +Las tecnologías de la Información deben ser utilizadas como una facilidad en el proceso de educación y capacitación, es necesario tomar +conciencia de la importancia de la información a nivel organizacional y gubernamental. + +La gran ausente en las políticas Tecnológicas parece ser la sociedad. Nada permite suponer que el interés de los cultores del campo +se pretenda una democratización de la ciencia y la tecnología, una apropiación de su dinámica y de sus resultados por parte de la sociedad +en su conjunto. Llama la atención que, por una parte, no existan trabajos o programas que destaquen desde un punto de vista +crítico los impactos tecnológicos sobre la vida de la sociedad (calidad, tejido social, integración social, distribución de beneficios, etc.); +por otro lado, no se registran estudios o programas de formación destinados a plantear la cuestión de la divulgación científica y tecnológica +como procesos de apropiación simbólica por parte de los ciudadanos respecto de los contenidos de la ciencia y la tecnología. + + +\section{Recomendaciones Para una Transferencia Tecnológica Exitosa} +Estudios consultados \cite{MO90} \cite{IAI} \cite{MDAG99} \cite{DZSC+07} \cite{MTRR07} \cite{Mar04}, coinciden en que para dar solución a los problemas expuestos anteriormente se deben seguir las siguientes recomendaciones: + +\subsection{Recomendaciones para los generadores de políticas} +\begin{itemize} + + \item{Promover la Importancia de la Transferencia Tecnológica como Motor de Desarrollo Económico} + \begin{itemize} + \item Proporcionar educación en transferencia tecnológica y comercialización a las nuevas instituciones académicas. + \item Promover las asociaciones regionales de I+D. + \item Tomar conciencia que la innovación involucra el desarrollo científico y tecnológico a varios niveles, por diferentes medios y a través de un amplio rango de instituciones académicas. + \item Promover las actividades de Transferencia tecnológica que involucren transferencia de conocimiento que permita la creación de nuevos productos y servicios. Del mismo modo, desalentar la compra de equipo y software propietario como política para la transferencia tecnológica. + \end{itemize} + + \item{Fomentar la Generación de Empresas Locales de Base Tecnológica} + \begin{itemize} + \item Evaluar y abordar la transferencia de tecnología desde una perspectiva corporativa. + \item Revisión de la política gubernamental de apoyo a las pequeñas empresas. + \end{itemize} + + \item{Promover el Mejoramiento de la Plataforma Tecnológica} + \begin{itemize} + \item Desarrollar sistemas de medición para capturar de forma efectiva el valor de las actividades relacionadas con la innovación. + \item Crear un centro de intercambio de información para transferencia tecnológica y difundir la información de forma activa. + \end{itemize} + +\end{itemize} + +\subsection{Recomendaciones para la academia} + +\begin{itemize} + \item{Actualización Curricular} + \begin{itemize} + \item Innovación + \item Crear planes de transferencia de tecnología flexibles + \item hacer compromisos con el desarrollo económico. + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología. + \item Innovación curricular, actualización continua de profesionales. + \item Incentivar la formación de maestrías y doctorados nacionales acorde con una agenda de investigación. + \end{itemize} + + \item{Alianza con la industria} + \begin{itemize} + \item La Universidad debe desarrollar las habilidades y competencias que la empresa requiere. + \item Buscar alianzas industriales para lograr beneficios a largo-plazo. + \item Vinculación de miembros de la industria a centros de investigación para formar relaciones formales e informales. + \item Buscar tener fortalezas en áreas dominadas por las industrias locales + \item Promover y soportar la Transferencia de Tecnología + \item Fortalecer el espíritu empresarial para apoyar la comercialización + \item Montar laboratorios de pruebas e incentivar a los productores nacionales para que logren una calidad que cumpla con los estándares internacionales. + \end{itemize} + + \item{Promover y Soportar la Transferencia Tecnológica} + \begin{itemize} + \item Elevar la transferencia tecnológica a un nivel superior y promover la excelencia. + \item Concientizar a los creadores de políticas gubernamentales sobre la importancia de la transferencia tecnológica y las alianzas con la investigación industrial. + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología. + \end{itemize} + + \item{Búsqueda de Financiación para Investigación y Desarrollo} + \begin{itemize} + \item Buscar de forma agresiva fondos para la investigación. + \item Crear recursos empresariales en las instituciones académicas, y enlazarlos con actividades de transferencia tecnológica. + \item Aumentar las alianzas con fuentes de inversión de capital para nuevas empresas. + \item Creación de empresas como parte del proceso de transferencia tecnológica de la institución y de los compromisos con el desarrollo económico + \item Realizar seminarios y líneas de profundización de temas afines a la administración y la gerencia en empresas de base tecnológica. + \end{itemize} + +\end{itemize} + + +\subsection{Recomendaciones para el Gobierno} +\begin{itemize} + + \item{Promover la Relación Universidad-Empresa} + \begin{itemize} + \item Fomento a centros de investigación y productividad para fortalecer la relaciones universidad empresa. + \item Fomentar la colaboración Universidad-Empresa en I+D, mediante la financiación de becas de cooperación, centros de investigación e incentivos fiscales. + \item Crear estrategias para mejorar la relación Universidad - empresa, creando premios para casos exitosos de transferencia tecnológica. + \item Educar a las instituciones académicas sobre los recursos empresariales locales. + \item Trabajar con corporaciones y fundaciones para el fomento de patrocinios y participación en transferencia de tecnología, I+D y desarrollo empresarial. + \item Desarrollar o mejorar infraestructuras regionales para capturar y retener empresas creadas en las instituciones académicas. + \end{itemize} + + + \item{Formular políticas Para Incentivar Actividades de Transferencia Tecnológica} + \begin{itemize} + \item Fomentar en líderes universitarios el compromiso con el desarrollo económico. + \item Definir agendas de investigación acordes con las tendencias mundiales y desarrollar capacidades en el país. + \item Fomentar cooperación internacional e inversión extranjera con transferencia de tecnología. a nivel gubernamental, Apoyo del gobierno a personas que tienen un alto potencial de crear y desarrollar tecnología. + \item Mejorar la plataforma Tecnológica. + \end{itemize} + + + \item{Promover la Excelencia Académica y la Investigación} + \begin{itemize} + \item Promoción de las instituciones académicas como bienes económicos + \item Trabajar con las instituciones académicas para identificar sus competencias. + \item Proporcionar fondos para temas específicos de investigación en instituciones académicas. + \item Promover la Investigación y Desarrollo y la transferencia tecnológica + \item Promover la investigación, la colaboración, la transferencia tecnológica y el desarrollo empresarial. + \item Ayudar a las instituciones académicas a evaluar su impacto sobre las economías locales y difundir los resultados a las instituciones gubernamentales. + \end{itemize} + +\end{itemize} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% CONCLUSIONES %%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\section{Actividades Prioritarias Para Obtener Una Transferencia de Tecnología Exitosa} + +Las Anteriores recomendaciones coinciden en que para que se presente una Transferencia Tecnológica exitosa, es decir, para que los elementos técnicos, habilidades humanas, la documentación y la organización asociadas a una determinada tecnología, puedan ser asimilados por personal calificado (disponible y dispuesto) para posteriormente transformar estos conocimientos en la creación de nuevos productos o servicios que suplan necesidades locales es necesario: + +\textbf{Fomentar la Creación de Empresas de Base Tecnológica} El gobierno debe crear facilidades y créditos para que empresas tecnológicas con la capacidad de innovación puedan realizar su actividad comercial (productos o servicios) y de esta forma crear nuevos empleos, aumentar la demanda de servicios tecnológicos. Así mismo, las universidades deben crear empresas que comercialicen productos derivados de sus actividades de Investigación. + +\textbf{Promoción de la Transferencia Tecnológica} El gobierno y las Universidades deben centrar sus esfuerzos en identificar las necesidades de las empresas locales y cambiar sus prioridades para solucionarlas, las universidades deben realizar proyectos de aplicación que puedan ser utilizados por el sector productivo a corto o mediano plazo. Las políticas de gobierno deben desalentar la compra de equipo que solo transfiera conocimiento sobre su operación y no permita la creación de nuevos conocimientos a partir de ellos, asi mismo, debe formular políticas que protejan las empresas locales de base tecnológica impidiendo el ingreso de productos similares provenientes del mercado asiático premiando a las empresas locales que realicen productos innovadores ya sea con beneficios tributarios temporales o con la adjudiación de créditos condonables destinados al desarrollo de nuevos productos. Universidad, Gobierno e Industria deben trazar políticas que definan las áreas en las que se deben formar los profesionales en el exterior, las cuales deben estar en sintonía con el estado de la plataforma tecnológica y el sector productivo, estas políticas deben cambiar a medida que se mejora la plataforma tecnológica local y se presentan cambios en el entorno mundial. Se debe trabajar en la creación de una cultura de la Transferencia Tecnológica, resaltando su importancia para el desarrollo del país. + +\textbf{Promover la Excelencia Académica} Debe exisitir una evaluación continua de los planes académicos para que se adapten a las necesidades del sistema productivo local, proporcionando a sus profesionales las habilidades requeridas por la industria, en especial las requeridas para crear líderes emprendedores que puedan crear nuevas empresas y que sean conscientes de la importancia del aprendizaje continuo. Por otro lado, es necesaria la creación de maestrías y doctorados que sigan políticas nacionales encaminadas al desarrollo económico y crear mecanismos de medición que permitan comparar y clasificar las instituciones académicas según las competencias de las habilidades (liderazgo y emprendimiento) de sus egresados y de esta forma determinar que instituciones son merecedoras de créditos, becas, o financiación para desarrollar actividades. + +Los centro de educación de diferentes niveles deben trabajar de forma conjunta para definir los objetivos y habilidades que requiere el sector productivo a nivel de formación tecnológica y profesional. Esto con el fin de delimitar sus funciones para que no interfieran en el mercado laboral. En la actualidad estos limites no están definidos, esto debido a la falta de producción tecnológica del pais, somos un país consumidor de tecnología y productos manufacturaodos, y las funciones de compra de productos pueden ser realizadas por técnicos e ingenieros, adicionalmente la venta de estos productos tambien puede ser realizada por cualquier persona, razón por la cual lo ingenieros tienen problemas a la hora de conseguir empleo. Esta situación se vuelve crítica debido a la gran cantidad de programas de Ingeniería que se crearon en Colombia, solo en la Universidad Nacional de Colombia se gradúan cerca de 60 ingenieros electrónicos al año. + +"Para hacer esto posible se requiere una comisión de regulación de la educación superior que vele, especialmente, por la calidad de los diferentes programas. Ésta debe ser una comisión independiente y mixta con la participación del sector privado. Por otra parte, es menester tener en cuenta que el programa planteado requerirá un incremento sustancial de inversión en la oferta docente, tecnológica y de investigación'" \footnote{Publicado en el Espectador: 16 de julio 1999 `\textit{Urge elevar la competitividad} Santiago Montenegro} + +\textbf{Promover la Relación Universidad Empresa} El sector productivo debe ser el principal inversionista para las actividades de Transferenica Tecnológica e Investigación y Desarrollo, ya que es el directamente beneficiado con ellas. El gobierno debe desalentar las prácticas comerciales que no generan actividades de I+D, en especial las que solo comercializan productos manufacturados en países asiáticos ya que esto hace que la empresas no vean la necesidad de crear productos propios y por lo tanto no es necesario hacer inversión en Investigación y Desarrollo. La academia debe proporcionar a la industria herramientas que le permitan competir con productos provenientes del mercado asiático, es una realidad que a corto plazo no podemos competir con la industra manufacturera asiática, pero si podemos utilizarla para producir productos diseñados en el país, por Colombianos, para satisfacer necesidades locales. Se debe crear consciencia en la industria de las ventajas de tener productos diseñados localmente, resaltando los servicios adicionales que pieden generarse al personalisar estos productos y proporcionar servicios derivados de su uso. Adicionalmente, se deben crear espacios donde los empresarios participen en los procesos de toma de decisiones y creación de políticas gubernamentales sobre educación e Investigación y Desarrollo, para esto es vital determinar que acividades económicas contribuyen al desarrollo tecnológico, cuales son generadoras de conocimientos y de esta forma incentivar su práctica. Por otra parte, las Universidades deben continuar con sus labores de investigación en temas de actualidad y aumentar la visibilidad de la academia colombiana en el entorno centífico mundia, sin embargo, muchos de estos trabajo no se pueden aplicar a corto, mediano y algunos ni a muy largo plazo en Colombia debido al estado de la plataforma tecnológica actual. Los centros académicos deben trabajar en problemas del entorno local, que aunque no tienen reconocimiento a nivel internacional si refleja un grado de compromiso con el entorno social en donde ellas operan. + +\textbf{Alianzas Para Obtener y Compartir Recursos} +Como se mencionó anteriormente Colombia es el país de Sur-América que menos invierte en Investigación y Desarrollo, por esta razón es necesario crear alianzas estratégicas para compartir los escasos recursos disponibles, en la actualidad no existe una red nacional de Universidades que trabajen conjuntamente en temas tecnológicos, por eso vemos que muchas investigaciones se repiten y se compran costosos equipos que en muchos casos se sub-utilizan. En la actualidad el Servicio Nacional de Aprendizaje SENA posee una gran cantidad de recursos económicos, de infraestructura y de equipos, adicionalmente tiene una muy buena relación con pequeñas empresas y conoce las necesidades de este sector, la función del SENA es proporcionar formación a nivel técnico que soporte las actividades de las empresas Colombianas, sin embargo, los centros de educación superior no utilizan esta coyuntura para acercarse a la empresa y de esta forma obtener recursos necesarios para sus actividades en investigación. + + +\section{Actividades} +En la Figura \ref{thesis_flow} se hace un resúmen de las recomendaciones formuladas anteriormente para lograr una transferencia tecnológica exitosa y como estas están relacionadas con actividades requeridas para el mejoramiento de la plataforma tecnológica y la creación de una cultura de transferencia de tecnología en el área de Sistemas Embebidos. Área en la que (como veremos más adelante) el país puede competir a corto plazo con productos provenientes de paises industrializados. Adicionalmente, los sistemas embebidos cubren un amplio campo de aplicaciones comerciales y requieren de conocimientos y habilidades especiales. Estas habilidades deben ser desarrolladas por los centros de formación teniendo en mente la situación actual del país y la situación a la que se quiere llegar. + +\begin{sidewaysfigure}[ht] + \begin{center} \includegraphics[scale=.6]{./images/thesis_flow_diagram.png} \end{center} + \caption{esumén de las Actividades Realizadas Para Encontrar una Metodología para la Transferencia Tecnológica en Sistemas Embebidos} \label{thesis_flow} +\end{sidewaysfigure} + +Todas las actividades desarrolladas buscan la creación de conocimiento alrededor del tema de Transferencia Tecnológica en el área de Sistemas Embebidos (SE), se parte del concepto \textit{El Conocimiento como Bien Común} \cite{Ost00} \cite{EO92} \cite{EO90} \cite{AC09}, y por lo tanto, se deben crear mecanismos que permitan su distribución, organización, mejoramiento y actualización. Este trabajo representa la semilla de este recurso y es el fruto del trabajo de 5 años de estudio de metodologías de diseño, fabricación y producción, experimentación, establecimiento de relaciones de todo tipo para entender la dinámica de la industria Colombiana y mundial. Todo esto para identificar las habilidades con las que debe contar un profesional para que lidere proyectos innovadores y emprendedores que permitan la creación de empresas locales y de esta forma generar empleo y mejorar las condiciones de vida de la comunidad asociada a la Universidad Nacional de Colombia. Y adicionalmente, detectar las necesidades de la industria Colombiana y generar actividades para la transferencia de estos conocimientos. Las actividades se dividieron en los siguientes cuatro grupos: + + +\begin{itemize} + \item \textbf{Creación de Habilidades Necesarias Para una Transferenica Tecnológica Exitosa}: Aplicación del plan de estudios \textit{CDIO} \cite{WCI} a las asignaturas del área de Electrónica Digital, utilizando las habilidades que requiere la industra electrónica nacional. Para poder generar estas habilidades se requiere de una serie de conocimientos con los que no se contaba hasta el momento en la Concepción, Diseño e Implementación de Sistemas Embebidos, por lo que se realizó un estudio sobre metodologías de diseño, implementación y producción de sistemas digitales. El conocimiento y la experiencia adquirida se esta documentando en un servidor públio y hace parte del proyecto QI-Hardware \cite{QH}, esta información le permitirá a cualquier personal entender, usar y modificar la gran variedad de plataformas de referencia ya sea para adquirir o mejorar habilidades en la Concepción, Diseño e Implementación de SE o para crear nuevos dispositivos que satisfagan una determinada necesidad. En el capítulo \ref{ch:embedded} se realizará una descripción de las actividades realizadas y las plataformas diseñadas durante este estudio. En el capítulo \ref{ch:education} se hace una descripción del proceso que se llevó a cabo para la aplicación del plan de estudios \textit{CDIO} a las asignaturas del área de Electrónica Digital. + + \item \textbf{Creación de Empresas de Base Tecnológica}: La principal fuente de información sobre la dinámica de la industria electrónica Colombiana y el estado de la industria Electrónica mundial (la que se utilizó para determinar las necesidades de las empresas locales, y las habilidades que los prefesionales en el área deben poseer para suplirlas) fué la empresa Colombiana emQbit, esta empresa fue creada por un grupo de egresados de la Universidad Nacional de Colombia, los cuales con la asesoría del autor de este trabajo de investigación incursionaron en la concepción, diseño e Implementación de Sistemas Digitales, concirtiéndose en la primera y única empresa en Colombia que realiza el proceso completo del proceso de diseño de SE \cite{CC06}.\cite{emQ}. En el capítulo \ref{ch:embedded} se enumerarán las actividades realizadas con esta empresa. + + \item \textbf{Hardware Copyleft}: El movimiento de Software Libre y de Código Abierto (FOSS) es hoy en día la estructura auto-gobernada más exitosa, millones de personas alrededor del mundo trabajan de forma conjunta y distribuida en busca de un bien común: Generación y distribución de herramientas software, sistema operativo y todo tipo de aplicaciones incluyendo el código fuente bajo una licencia que permite su distribución y modificación. Este movimiento busca romper los grandes monopolios en la industria del Software, donde el usuario final no puede participar en el proceso de creación del mismo y debe pagar por aplicaciones que no se ajustan a sus necesidades, que presentan errores en su funcionamiento, acaptar todos estos problemas y pagar por actualizaciones. Adicionalmente, buscan difundir los conocimientos que un determinado programador adquirió para el desarrollo de una aplicación permitiendo el estudio del código fuente, creando listas de discusión donde se resuelven todo tipo de dudas y se planifica de forma conjunta el desarrollo de estas aplicaciones, desarrollando tutoriales y libros disponibles en línea. + +Este movimiento ha creado toda una serie de herramientas que compiten con las suministradas por multinacionales como Microsoft y Apple, dentro de las más destacables se encuentran: La \textit{cadena de herramientas de compilación GNU}, librerías, el sistema operativo \textit{Linux}, aplicaciones como el servidor web \textit{Apache}, el explorador \textit{Mozilla}, la suite ofimática \textit{OpenOffice} y distribuciones como \textit{Debian}, \textit{Ubuntu}, \textit{Suse}, \textit{Redhat}. Gracias a esto es, se dispone de una cantidad enorme de aplicaciones en diversos campos que pueden ser utilizadas para adquirir conocimientos y desarrollar aplicaciones en diferentes áreas. + +El resultado más notable, es la creación de un recurso de bien común: el conocimiento contenido en las herramientas y aplicaciones, la infra-estructura física y tecnológica para su distribución y difusión, y una comunidad que se encarga de contribuir, mejorar y administrar este recurso. Este recurso está basado en principios de libertad y de confianza, esto es, cualquier persona puede ser parte de la comunidad y participar en los procesos de toma de decisiones y creación de normas, y deben conocer de antemano las reglas de interacción entre los miembros y como sus acciones afectan a los otros miembros y al recurso. En el capítulo \ref{ch:common} estudiaremos con más detalle este movimiento. + +Este trabajo contribuye con la creación de un movimiento inspirado en el movimiento FOSS, pero dirigido al desarrollo de aplicaciones Hardware, esto es, Circuitos Integrados, Placas de Circuito Impreso, Dispositivos comercializables, programación y generación de bienes y servicios asociados a estos productos. En la actualidad existen varios proyectos que proporcionan los archivos de diseño para reproducir el componente hardware, sin embargo, no existe un consenso sobre las características que se deben cumplir para que sea considerado \textit{copyleft}, esta es una de los tópicos que se abordarán en el capítulo \ref{ch:common} + + +\end{itemize} diff --git a/course/.docs/book/thesis.aux b/course/.docs/book/thesis.aux new file mode 100644 index 0000000..9b9306e --- /dev/null +++ b/course/.docs/book/thesis.aux @@ -0,0 +1,79 @@ +\relax +\catcode`"\active +\catcode`<\active +\catcode`>\active +\@nameuse{es@quoting} +\bibstyle{unsrt} +\select@language{spanish} +\@writefile{toc}{\select@language{spanish}} +\@writefile{lof}{\select@language{spanish}} +\@writefile{lot}{\select@language{spanish}} +\citation{KAK01} +\citation{WM91} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduci\'on}{3}} +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {1.1}Visi\'on, Paradigmas, y Dificultades}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1.1}Futuro de los Sistemas Computacionales}{3}} +\citation{Oxygen} +\@writefile{toc}{\contentsline {subsubsection}{Computador Ubicuo}{4}} +\@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces Concepto de Computador Ubiquo.}}{4}} +\citation{WM91} +\citation{DS02} +\citation{MW93} +\citation{DS02} +\citation{DS02} +\citation{EA01} +\citation{WM91} +\citation{NRC01} +\citation{APaET03} +\@writefile{toc}{\contentsline {subsubsection}{Ambientes Inteligentes.}{5}} +\citation{DS02} +\@writefile{toc}{\contentsline {subsubsection}{Consecuencias de la aparici\'on de los sistemas de computaci\'on ubicua.}{6}} +\citation{Mok90} +\citation{Arr62} +\citation{Mar04} +\@writefile{toc}{\contentsline {section}{\numberline {1.2}Estado del Dise\~no Electr\'onico en Colombia}{7}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2.1}Apropiaci\'on de Conocimiento}{7}} +\citation{Mar04} +\citation{Tee81} +\citation{FW00} +\citation{Mar04} +\citation{ETPoSSI(09} +\citation{Vc08} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2.2}Situaci\'on de la Industria Electr\'onica en Colombia}{8}} +\citation{MTRR07} +\citation{DZSC+07} +\citation{MDAG99} +\citation{HSL+04} +\citation{MJF05} +\@writefile{toc}{\contentsline {subsubsection}{Tecnolog\IeC {\'\i }as de Informaci\'on y Comunicaci\'on}{10}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2.3}Estado de la Electr\'onica Digital en la Universidad Nacional de Colombia}{12}} +\@writefile{toc}{\contentsline {section}{\numberline {1.3}Descripci\'on de la T\'esis}{13}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.1}Objetivos e Hip\'otesis}{13}} +\@writefile{toc}{\contentsline {subsubsection}{Ojetivo Principal}{13}} +\@writefile{toc}{\contentsline {subsubsection}{Objetivos Secundarios}{13}} +\@writefile{toc}{\contentsline {subsubsection}{Hip\'otesis}{13}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.2}Aproximaciones}{14}} +\bibdata{biblio} +\bibcite{UNE}{1} +\bibcite{KAK01}{2} +\bibcite{WM91}{3} +\bibcite{Oxygen}{4} +\bibcite{DS02}{5} +\bibcite{MW93}{6} +\bibcite{EA01}{7} +\bibcite{NRC01}{8} +\bibcite{APaET03}{9} +\bibcite{Mok90}{10} +\bibcite{Arr62}{11} +\bibcite{Mar04}{12} +\bibcite{Tee81}{13} +\bibcite{FW00}{14} +\bibcite{ETPoSSI(09}{15} +\bibcite{Vc08}{16} +\bibcite{MTRR07}{17} +\bibcite{DZSC+07}{18} +\bibcite{MDAG99}{19} +\bibcite{HSL+04}{20} +\bibcite{MJF05}{21} diff --git a/course/.docs/book/thesis.bbl b/course/.docs/book/thesis.bbl new file mode 100644 index 0000000..8a06dd9 --- /dev/null +++ b/course/.docs/book/thesis.bbl @@ -0,0 +1,126 @@ +\begin{thebibliography}{10} + +\bibitem{UNE} +UNESCO-Uruguay. +\newblock Rasgos {P}rincipales de la {I}nstitucionalizaci\'on de la {C}iencia, + la {T}ecnolog\'{\i}a y la {I}nnovaci\'on en {A}m\'erica {L}atina y el + {C}aribe y {T}endencias de la {C}ooperaci\'on {I}nternacional. +\newblock {\em http://www.unesco.org.uy/}. + +\bibitem{KAK01} +{K. A. Kahng}. +\newblock Design {T}echnology {P}roductivity in the {DSM} {E}ra. +\newblock In {\em A{SP}-{DAC}}, 2001. + +\bibitem{WM91} +{Mark Weiser}. +\newblock The {C}omputer for the 21st {C}entury. +\newblock {\em http://www.ubiq.com/hy\'ertext/weiser/SciAmDraft3.html}. + +\bibitem{Oxygen} +MIT. +\newblock Proyecto {O}x\'{\i}geno. +\newblock http://oxygen.lcs.mit.edu/. + +\bibitem{DS02} +{D. Servant}. +\newblock Combining amorphous computing and reactive agent-based systems: a + paradigm for pervasive intelligence? +\newblock In {\em First international joint conference on {A}utonomous agents + and muktiagent systems: part 1}, 2002. + +\bibitem{MW93} +{M. Weiser}. +\newblock Some computer science issues in ubiquitous computing. +\newblock {\em Commun. ACM}, 1993. + +\bibitem{EA01} +{E. Arts}, {R. Harwing}, and {M. Schuurmans}. +\newblock {\em Ambient {I}ntelligence}, pages 235--250. +\newblock McGraw-Hill, 2001. + +\bibitem{NRC01} +{National Research Council}. +\newblock {\em Embedded {E}verywhere}. +\newblock National Academic Press, 2001. + +\bibitem{APaET03} +{A. Purhonen and E. Tuulari}. +\newblock {\em Ambient {I}ntelligence and the {D}evelopment of {E}mbedded + {S}ystem {S}oftware}, pages 51 -- 66. +\newblock Kluwer Academic Publishers, 2003. + +\bibitem{Mok90} +Joel Mokyr. +\newblock {\em The {L}ever of {R}iches, {T}echnological {C}reativity and + {E}conomic {P}rogress.} +\newblock Oxford University Press, 1990. + +\bibitem{Arr62} +Kenneth Arrow. +\newblock {\em Economic {W}elfare and the {A}llocation of {R}esources for + {I}nvention}. +\newblock Princeton University Press, 1962. + +\bibitem{Mar04} +H\'ector Mart\'{\i}nez. +\newblock Apropiaci\'on de conocimiento en {C}olombia. {E}l caso de los + contratos de importaci\'on de tecnolog\'{\i}a. +\newblock {\em Revista Cuadernos de Econom\'{\i}a}, 2004. + +\bibitem{Tee81} +D~Teece. +\newblock The {M}arket for {K}now-how. {T}echnology {T}ransfer: {N}ew {I}ssues, + {N}ew {A}nalysis. +\newblock {\em Special issue of the Annals of the American Academy of Political + and Social Science}, 1981. + +\bibitem{FW00} +Naushad Forbes and David Wield. +\newblock Managing {R}\&{D} in technology-followers. +\newblock {\em Research Policy}, September 2000. + +\bibitem{ETPoSSI(09} +{European Technology Platform on Smart Sistem Integration (EPoSS)}. +\newblock European {T}echnology {P}latform on {S}mart {S}ystems {I}ntegration. + {S}trategic {R}esearch {A}genda 2009. +\newblock 2009. + +\bibitem{Vc08} +{VDC corp.} +\newblock Embedded {S}oftware 2008 {M}arket {I}ntelligence {S}ystem. +\newblock Technical report, VDC Research Group, 2008. + +\bibitem{MTRR07} +{M. Tovar} and {R. Rodr\'{\i}guez}. +\newblock P{ROSPECTIVA} {Y} {VIGILANCIA} {TECNOL}\'{O}{GICA} {DE} {LA} + {ELECTR}\'{O}{NICA} {EN} {COLOMBIA}. +\newblock Master's thesis, Universidad Nacional de Colombia, 2007. + +\bibitem{DZSC+07} +{D Zuluaga}, {S Campos}, {M Tovar}, {R Rodr\'{\i}guez}, {J S\'anchez}, {A + Aguilera}, {L Land\'{\i}nez}, and {J Medina}. +\newblock Informe de {V}igilancia {T}ecnol\'ogica: {A}plicaciones de la + {E}lectr\'onica en el {S}ector {A}gr\'{\i}cola. +\newblock Technical report, COLCIENCIAS, 2007. + +\bibitem{MDAG99} +{M. Duque} and {A. Gauthier}. +\newblock Formaci\'on de {I}negnieros para la {I}nnovaci\'on y el {D}esarrollo + {T}ecnol\'ogico en {C}olombia. +\newblock {\em Revista de la Facultad de Minas - Universidad Nacional de + Colombia}, December 1999. + +\bibitem{HSL+04} +Gregory~N. Hearn, Lynette~E. Simpson, June Lennie, and Megan~P. Kimber. +\newblock I{CT}s and regional sustainability: {A} critique and a way forward. +\newblock {\em Community Informatics Research Network Conference and Colloquium + 2004: Sustainability and community technology}, 2004. + +\bibitem{MJF05} +{Mesa J. F.} and {Polo A. A.} +\newblock C{ONSTRUYENDO} {UN} {JINU} {DE} {LA} {INFORMACI}\'{O}{N}. +\newblock Master's thesis, PONTIFICIA UNIVERSIDAD JAVERIANA Facultad de + Ingenier\'{\i}a, February 2005. + +\end{thebibliography} diff --git a/course/.docs/book/thesis.blg b/course/.docs/book/thesis.blg new file mode 100644 index 0000000..bc40d8a --- /dev/null +++ b/course/.docs/book/thesis.blg @@ -0,0 +1,51 @@ +This is BibTeX, Version 0.99c (TeX Live 2009/Debian) +The top-level auxiliary file: thesis.aux +The style file: unsrt.bst +Database file #1: biblio.bib +Warning--empty year in UNE +Warning--empty year in WM91 +Warning--can't use both author and editor fields in EA01 +Warning--can't use both author and editor fields in APaET03 +Warning--empty journal in ETPoSSI(09 +You've used 21 entries, + 1791 wiz_defined-function locations, + 567 strings with 6808 characters, +and the built_in function-call counts, 3456 in all, are: += -- 285 +> -- 139 +< -- 2 ++ -- 58 +- -- 37 +* -- 131 +:= -- 586 +add.period$ -- 63 +call.type$ -- 21 +change.case$ -- 18 +chr.to.int$ -- 0 +cite$ -- 26 +duplicate$ -- 195 +empty$ -- 368 +format.name$ -- 37 +if$ -- 781 +int.to.chr$ -- 0 +int.to.str$ -- 21 +missing$ -- 21 +newline$ -- 108 +num.names$ -- 21 +pop$ -- 91 +preamble$ -- 1 +purify$ -- 0 +quote$ -- 0 +skip$ -- 83 +stack$ -- 0 +substring$ -- 56 +swap$ -- 38 +text.length$ -- 2 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 5 +while$ -- 25 +width$ -- 23 +write$ -- 214 +(There were 5 warnings) diff --git a/course/.docs/book/thesis.dvi b/course/.docs/book/thesis.dvi new file mode 100644 index 0000000000000000000000000000000000000000..b55ab57abfde9212d4ab3e32bb85c1be17f8dd8f GIT binary patch literal 77700 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 +Babel and hyphenation patterns for american, french, german, ngerman, b +ahasa, basque, bulgarian, catalan, croatian, czech, danish, dutch, esperanto, e +stonian, finnish, greek, icelandic, irish, italian, latin, magyar, norsk, polis +h, portuges, romanian, russian, serbian, slovak, slovene, spanish, swedish, tur +kish, ukrainian, nohyphenation, loaded. +\bibdata{biblio_EL} +No file biblio.bbl. +) +! Emergency stop. +<*> biblio.tex + +*** (job aborted, no legal \end found) + + +Here is how much of TeX's memory you used: + 6 strings out of 94500 + 122 string characters out of 1175788 + 48348 words of memory out of 1000000 + 3273 multiletter control sequences out of 10000+50000 + 3640 words of font info for 14 fonts, out of 500000 for 2000 + 580 hyphenation exceptions out of 8191 + 5i,0n,3p,37b,8s stack positions out of 1500i,500n,5000p,200000b,5000s +PDF statistics: + 0 PDF objects out of 300000 + 0 named destinations out of 131072 + 1 words of extra memory for PDF output out of 65536 +No pages of output. diff --git a/course/.docs/cambio_categoria/biblio.tex b/course/.docs/cambio_categoria/biblio.tex new file mode 100644 index 0000000..139597f --- /dev/null +++ b/course/.docs/cambio_categoria/biblio.tex @@ -0,0 +1,2 @@ + + diff --git a/course/.docs/cambio_categoria/biblio.tex.backup b/course/.docs/cambio_categoria/biblio.tex.backup new file mode 100644 index 0000000..139597f --- /dev/null +++ b/course/.docs/cambio_categoria/biblio.tex.backup @@ -0,0 +1,2 @@ + + diff --git a/course/.docs/cambio_categoria/biblio.tex~ b/course/.docs/cambio_categoria/biblio.tex~ new file mode 100644 index 0000000..8fb817c --- /dev/null +++ b/course/.docs/cambio_categoria/biblio.tex~ @@ -0,0 +1,2 @@ +\bibliography{biblio_EL} + diff --git a/course/.docs/cambio_categoria/biblio_EL.bib b/course/.docs/cambio_categoria/biblio_EL.bib new file mode 100644 index 0000000..0a3e50a --- /dev/null +++ b/course/.docs/cambio_categoria/biblio_EL.bib @@ -0,0 +1,190 @@ +@comment{This file has been generated by Pybliographer} + + +@Misc{LSC08, + Author = {{Lattice Semiconductor Corporation}}, + Title = {Lattice{M}ico32 {O}pen, {F}ree 32-{B}it {S}oft + {P}rocessor}, + HowPublished = {URL: + http://www.latticesemi.com/products/intellectualproperty/ipcores/mico32/index.cfm}, + year = 2008 +} + +@Misc{Wik, + Author = {Wikipedia}, + Title = {Wikipedia, the free encyclopedia}, + HowPublished = {http://en.wikipedia.org/} +} + +@Misc{LD02, + Author = {{L. Doolittle}}, + Title = {Building {L}inux for the nano{E}ngine}, + HowPublished = {http://recycle.lbl.gov/~ldoolitt/bse/}, + month = {26 } # jun, + year = 2002 +} + +@Misc{MLH98, + Author = {{Michael L. Haungs}}, + Title = {The {E}xecutable and {L}inking {F}ormat ({ELF})}, + HowPublished = {http://www.cs.ucdavis.edu/~haungs/paper/node1.html}, + month = {21 } # sep, + year = 1998 +} + +@Article{OPPS05, + Author = {{O. Pomerantz} and {P. Salzman} and {M. Burian}}, + Title = {The {L}inux {K}ernel {M}odule {P}rogramming {G}uide + ver 2.6.1}, + Journal = {The Linux Documentation Project http://www.tldp.org/}, + month = {26 } # may, + year = 2005 +} + +@Misc{entry-0, + Title = {An {I}ntroduction to the {L}inux {A}rchitecture}, + HowPublished = {http://wiki.cs.uiuc.edu/cs427/An+Introduction+to+the+Linux+Architecture} +} + +@Misc{CS04, + Author = {{C. S\'eveillac}}, + Title = {Build {Q}t/{E}mbedded and {O}pie on a {L}inux, x86 + architecture, for {ARM} target architecture.}, + HowPublished = {http://dudu.dyn.2-h.org/nist/qt-notes.php}, + month = {20 } # nov, + year = 2004 +} + +@Misc{Mo05, + Author = {{M. opdenacker}}, + Title = {Embedded {L}inux {K}ernel and driver development}, + HowPublished = {http://free-electrons.com}, + month = {14 } # aug, + year = 2005 +} + +@Misc{BG, + Author = {{Bill Gatliff}}, + Title = {Porting and {U}sing {N}ewlib in {E}mbedded {S}ystems}, + HowPublished = {http://venus.billgatliff.com/node/3} +} + +@Article{MB03, + Author = {{M. Barr}}, + Title = {How to {C}hoose a {R}eal-{T}ime {O}perating {S}ystem}, + Journal = {Embedded Systems Programming}, + month = jan, + year = 2003 +} + +@Misc{IBSS98, + Author = {{I. Bowman} and {S. Siddiqi} and {M. Tanuan}}, + Title = {Concrete {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://plg.uwaterloo.ca/~itbowman/CS746G/a2}, + month = {12 } # feb, + year = 1998 +} + +@Article{JT04, + Author = {{J. Turley}}, + Title = {Embedded systems survey: {O}perating systems up for + grabs}, + Journal = {Embedded Systems Programming}, + month = may, + year = 2004 +} + +@Book{JCAR05, + Author = {{J. Corbet} and {A. Rubini} and {G. Kroah-Hartman}}, + Title = {Linux {D}evice {D}rivers, {T}hird {E}dition}, + Publisher = {O'Reilly}, + year = 2005 +} + +@Misc{AO, + Author = {{Aleph One}}, + Title = {Porting the {L}inux {K}ernel to a {N}ew {ARM} + {P}latform}, + HowPublished = {http://www.aleph1.co.uk} +} + +@Book{CH02, + Author = {{Craig Hollabaugh.}}, + Title = {Embedded {L}inux: {H}ardware, {S}oftware, and + {I}nterfacing}, + Publisher = {Addison Wesley Professional.}, + month = {7 } # mar, + year = 2002 +} + +@Misc{VDC06, + Author = {{Venture Development Corp.}}, + Title = {Small teams dominate embedded software development}, + HowPublished = {http://www.linuxdevices.com/articles/AT7019328497.html}, + month = {1 } # jun, + year = 2006 +} + +@Article{JT05, + Author = {{J. Turley}}, + Title = {Five irreversible decisions}, + Journal = {Embedded Systems Programming}, + month = {27 } # jan, + year = 2005 +} + +@Misc{SR08, + Author = {{S. Rhoads}}, + Title = {Plasma - most {MIPS} {I}({TM}) opcodes}, + HowPublished = {URL: http://opencores.org/project,plasma}, + year = 2008 +} + +@Misc{A1, + Author = {{Aleph 1}}, + Title = {Building the {T}oolchain}, + HowPublished = {http://www.aleph1.co.uk/node/279} +} + +@Misc{Ale01, + Author = {Aleph1}, + Title = {Boot {L}oader {G}uide}, + HowPublished = {http://www.aleph1.co.uk/armlinux/docs/ARM + booting/t1.html}, + month = {7 } # sep, + year = 2001 +} + +@Misc{DK06, + Author = {{Dan Kegel}}, + Title = {Building and {T}esting gcc/glibc cross toolchains}, + HowPublished = {http://www.kegel.com/crosstool/}, + month = {20 } # feb, + year = 2006 +} + +@Misc{IB98, + Author = {{I. Bowman}}, + Title = {Conceptual {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://www.grad.math.uwaterloo.ca/~itbowman/CS746G/a1/}, + year = 1998 +} + +@Article{Lin05, + Author = {Linuxdevices}, + Title = {Embedded {L}inux market snapshot, 2005}, + Journal = {http://www.linuxdevices.com}, + month = {4 } # may, + year = 2005 +} + +@Article{CLSB05, + Author = {{C. Lanfear} and {S. Balacco} and {M. Volckmann}}, + Title = {The 2005 {E}mbedded {S}oftware {S}trategic {M}arket + {I}ntelligence {P}rogram}, + Journal = {Venture Development Corporation + http://www.vdc-corp.com}, + month = aug, + year = 2005 +} + diff --git a/course/.docs/cambio_categoria/biblio_EL.bib.bak b/course/.docs/cambio_categoria/biblio_EL.bib.bak new file mode 100644 index 0000000..0ecf5de --- /dev/null +++ b/course/.docs/cambio_categoria/biblio_EL.bib.bak @@ -0,0 +1,181 @@ +@comment{This file has been generated by Pybliographer} + + +@Misc{Wik, + Author = {Wikipedia}, + Title = {Wikipedia, the free encyclopedia}, + HowPublished = {http://en.wikipedia.org/} +} + +@Misc{LD02, + Author = {{L. Doolittle}}, + Title = {Building {L}inux for the nano{E}ngine}, + HowPublished = {http://recycle.lbl.gov/~ldoolitt/bse/}, + month = {26 } # jun, + year = 2002 +} + +@Misc{MLH98, + Author = {{Michael L. Haungs}}, + Title = {The {E}xecutable and {L}inking {F}ormat ({ELF})}, + HowPublished = {http://www.cs.ucdavis.edu/~haungs/paper/node1.html}, + month = {21 } # sep, + year = 1998 +} + +@Article{OPPS05, + Author = {{O. Pomerantz} and {P. Salzman} and {M. Burian}}, + Title = {The {L}inux {K}ernel {M}odule {P}rogramming {G}uide + ver 2.6.1}, + Journal = {The Linux Documentation Project http://www.tldp.org/}, + month = {26 } # may, + year = 2005 +} + +@Misc{entry-0, + Title = {An {I}ntroduction to the {L}inux {A}rchitecture}, + HowPublished = {http://wiki.cs.uiuc.edu/cs427/An+Introduction+to+the+Linux+Architecture} +} + +@Misc{CS04, + Author = {{C. S\'eveillac}}, + Title = {Build {Q}t/{E}mbedded and {O}pie on a {L}inux, x86 + architecture, for {ARM} target architecture.}, + HowPublished = {http://dudu.dyn.2-h.org/nist/qt-notes.php}, + month = {20 } # nov, + year = 2004 +} + +@Misc{Mo05, + Author = {{M. opdenacker}}, + Title = {Embedded {L}inux {K}ernel and driver development}, + HowPublished = {http://free-electrons.com}, + month = {14 } # aug, + year = 2005 +} + +@Misc{BG, + Author = {{Bill Gatliff}}, + Title = {Porting and {U}sing {N}ewlib in {E}mbedded {S}ystems}, + HowPublished = {http://venus.billgatliff.com/node/3} +} + +@Article{MB03, + Author = {{M. Barr}}, + Title = {How to {C}hoose a {R}eal-{T}ime {O}perating {S}ystem}, + Journal = {Embedded Systems Programming}, + month = jan, + year = 2003 +} + +@Misc{IBSS98, + Author = {{I. Bowman} and {S. Siddiqi} and {M. Tanuan}}, + Title = {Concrete {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://plg.uwaterloo.ca/~itbowman/CS746G/a2}, + month = {12 } # feb, + year = 1998 +} + +@Article{JT04, + Author = {{J. Turley}}, + Title = {Embedded systems survey: {O}perating systems up for + grabs}, + Journal = {Embedded Systems Programming}, + month = may, + year = 2004 +} + +@Book{JCAR05, + Author = {{J. Corbet} and {A. Rubini} and {G. Kroah-Hartman}}, + Title = {Linux {D}evice {D}rivers, {T}hird {E}dition}, + Publisher = {O'Reilly}, + year = 2005 +} + +@Misc{AO, + Author = {{Aleph One}}, + Title = {Porting the {L}inux {K}ernel to a {N}ew {ARM} + {P}latform}, + HowPublished = {http://www.aleph1.co.uk} +} + +@Book{CH02, + Author = {{Craig Hollabaugh.}}, + Title = {Embedded {L}inux: {H}ardware, {S}oftware, and + {I}nterfacing}, + Publisher = {Addison Wesley Professional.}, + month = {7 } # mar, + year = 2002 +} + +@Misc{VDC06, + Author = {{Venture Development Corp.}}, + Title = {Small teams dominate embedded software development}, + HowPublished = {http://www.linuxdevices.com/articles/AT7019328497.html}, + month = {1 } # jun, + year = 2006 +} + +@Article{JT05, + Author = {{J. Turley}}, + Title = {Five irreversible decisions}, + Journal = {Embedded Systems Programming}, + month = {27 } # jan, + year = 2005 +} + +@Misc{SR08, + Author = {{S. Rhoads}}, + Title = {Plasma - most {MIPS} {I}({TM}) opcodes}, + HowPublished = {URL: http://opencores.org/project,plasma}, + year = 2008 +} + +@Misc{A1, + Author = {{Aleph 1}}, + Title = {Building the {T}oolchain}, + HowPublished = {http://www.aleph1.co.uk/node/279} +} + +@Misc{Ale01, + Author = {Aleph1}, + Title = {Boot {L}oader {G}uide}, + HowPublished = {http://www.aleph1.co.uk/armlinux/docs/ARM + booting/t1.html}, + month = {7 } # sep, + year = 2001 +} + +@Misc{DK06, + Author = {{Dan Kegel}}, + Title = {Building and {T}esting gcc/glibc cross toolchains}, + HowPublished = {http://www.kegel.com/crosstool/}, + month = {20 } # feb, + year = 2006 +} + +@Misc{IB98, + Author = {{I. Bowman}}, + Title = {Conceptual {A}rchitecture of the {L}inux {K}ernel}, + HowPublished = {http://www.grad.math.uwaterloo.ca/~itbowman/CS746G/a1/}, + year = 1998 +} + +@Article{Lin05, + Author = {Linuxdevices}, + Title = {Embedded {L}inux market snapshot, 2005}, + Journal = {http://www.linuxdevices.com}, + month = {4 } # may, + year = 2005 +} + +@Article{CLSB05, + Author = {{C. Lanfear} and {S. Balacco} and {M. Volckmann}}, + Title = {The 2005 {E}mbedded {S}oftware {S}trategic {M}arket + {I}ntelligence {P}rogram}, + Journal = {Venture Development Corporation + http://www.vdc-corp.com}, + month = aug, + year = 2005 +} + diff --git a/course/.docs/cambio_categoria/chapter1.tex b/course/.docs/cambio_categoria/chapter1.tex new file mode 100644 index 0000000..d8bca0e --- /dev/null +++ b/course/.docs/cambio_categoria/chapter1.tex @@ -0,0 +1,666 @@ +\chapter{Diseño de Sistemas Embebidos} + +\section{Definición} + +Un Sistema Embebidos es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo el tamaño y costo del producto \cite{Wik} + +\section{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\section{Arquitectura} + +Una arquitectura típica para un Sistema Embebido se muestra en la Figura \ref{es_arch}; La cual integra un componente hardware, implementado ya sea en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + + +Podemos utilziar +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos (menos componentes y menos área de circuito impreso) \footnote{http://www.sharpsma.com, http://www.atmel.com, http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado SoC con la cantidad de periféricos requerida para una determinada aplicación, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha operación, en algunas ocaciones el periférico puede relizar funciones muy específicas de modo que no existe en el mercado, la solución es entonces implementar estos dispositivos en una FPGA, también se recomienda la utilización de FPGAs en sistemas que requieren una gran cantidad y variedad de periféricos ya que reduce la complejidad y costo del sistema. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más económica y flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la lngitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales . Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + + +\section{Metodología de Diseño} + +La Figura \ref{des_flow}, muestra un diagrama de flujo genérico para diseño para sistemas embebidos {\cite{Cor05}} + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido}\label{des_flow} +\end{figure} + + +El proceso comienza con la {\textit{especificaci\'on del sistema}}, en este punto se describe la funcionalidad y se definen las restricciones f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La especificaci\'on puede ser verificada a trav\'es de una serie de pasos de an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los resultados satisfacen las especificaciones. Desde el punto de vista de la re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de una librer\'{\i}a de algor\'{\i}tmos existentes. + +Una vez definidas las especificaciones del sistema se debe realizar un modelamiento que permita extraer de estas la funcionalidad. El modelamiento es crucial en el diseño ya que de \'el depende el paso existoso de la especificaci\'on a la implementaci\'on. Es importante definir que modelo matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de Eventos Discretos y Redes de Petri. Cada modelo posee propiedades matem\'aticas que pueden explotarse de forma eficiente para responder preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su {\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un dispositivo lógico programable. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan en SW y que tareas se implementan en HW recibe el nombre de {\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de restricciones econ\'omicas y temporales. + +Las tareas Software deben compartir los recursos que existan en el sistema (procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de {\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del sistema. + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas realimentaciones permiten depurar el resultado de pasos anteriores en el caso de no cumplirse las especificaciones iniciales + + +\section{Herramientas de Diseño Software} + +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsection{Componentes del \textit{GNU toolchain} } + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection\cite{Wik}} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. + +\subsubsection{Lenguajes} +GCC soporta los siguientes lenguajes: +\begin{itemize} + \item \textbf{ADA} + \item \textbf{C} + \item \textbf{C++} + \item \textbf{Fortran} + \item \textbf{Java} + \item \textbf{Objective-C} + \item \textbf{Objective-C++} +\end{itemize} + +\subsubsection{Arquitecturas} +\begin{itemize} + \item \textbf{Alpha} + \item \textbf{ARM} + \item \textbf{Atmel AVR} + \item \textbf{Blackfin} + \item \textbf{H8/300} + \item \textbf{System/370, System/390} + \item \textbf{IA-32 (x86) and x86-64} + \item \textbf{IA-64 i.e. the "Itanium"} + \item \textbf{Motorola 68000} + \item \textbf{Motorola 88000} + \item \textbf{MIPS} + \item \textbf{PA-RISC} + \item \textbf{PDP-11} + \item \textbf{PowerPC} + \item \textbf{SuperH} + \item \textbf{SPARC} + \item \textbf{VAX} + \item \textbf{Renesas R8C/M16C/M32C} + \item \textbf{MorphoSys} +\end{itemize} +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. Una consecuencia de esto se refleja en el número de desarrolladores en un grupo de trabajo, en la actualidad casi el 60\% de las empresas desarrolladoras de dispositivos embebidos tiene grupos con menos de 10 desarrolladores \ref{group}. + + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.2]{./images/vdc_embedded_dev_company_size} \end{center} + \caption{Número promedio de desarrolladores por compañía. Fuente Venture Development Corp}\label{group} +\end{figure} + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. A continuación se muestra un ejemplo de una sesión con gdb. + +\begin{lstlisting}[firstnumber=40] +GNU gdb Red Hat Linux (6.3.0.0-1.21rh) +Copyright 2004 Free Software Foundation, Inc. +GDB is free software, covered by the GNU General Public License, and you are +welcome to change it and/or distribute copies of it under certain conditions. +Type "show copying" to see the conditions. +There is absolutely no warranty for GDB. Type "show warranty" for details. +This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db +library "/lib/libthread_db.so.1". + +(gdb) run +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xc11000 +This program will demonstrate gdb + +Program received signal SIGSEGV, Segmentation fault. +0x08048428 in function_2 (x=24) at crash.c:22 +22 return *y; +(gdb) edit +(gdb) shell gcc crash.c -o crash -gstabs+ +(gdb) run +The program being debugged has been started already. +Start it from the beginning? (y or n) y +warning: cannot close "shared object read from target memory": File in wrong format +`/home/sam/programming/crash' has changed; re-reading symbols. +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xa3e000 +This program will demonstrate gdb +24 +Program exited normally. +(gdb) quit +\end{lstlisting} + + + +\subsubsection{C Libraries} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SECCION Obtención y utilización del GNU toolchain +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Desarrollo Software} + +El primer paso en nuestro estudio consiste en tener una cadena de herramientas funcional que soporte la familia de procesadores a utilizar. La arquitectura sobre la cual realizaremos nuestro estudio inicial es la ARM (Advanced Risc Machines), ya que la más utilizada en la actualidad por los diseñadores de sistemas embebidos (ver figura \ref{arch}) y se encuentran disponibles una gran variedad de herramientas para esta arquitectura. Sin embargo, lo contenido en esta sección es aplicable a cualquier familia de procesadores soportada por la cadena de herrmientas GNU. Existen dos formas de obtener la cadena de herramientas GNU: + +\begin{figure} + \begin{center} \includegraphics[scale=.8]{./images/embedded-processor-trends-sm} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{arch} +\end{figure} + +\begin{enumerate} + \item Utilizar una distribución precompilada: Esta es la via más rápida, sin embargo, hay que tener cuidado al momento de instalarlas, ya que debe hacerse en un directorio con el mismo \textit{path} con el que fueron creadas. por ejemplo \textit{/usr/local/gnutools}; si esto no se cumple, las herramientas no funcionarán de forma adecuada. + \item Utilizar un script de compilación: Existen disponibles en la red una serie de \textit{scripts} que permiten descargar, configurar, compilar e instalar la cadena de herramientas, la ventaja de utilizar este método es que es posible elegir las versiones de las herramientas instaladas, al igual que el directorio de instalación. En este estudio utilizaremos los \textit{scripts} creados por Dan Kegel \cite{DK06}. +\end{enumerate} + +\subsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente que implementa la funcionalidad de una tarea software utilizando un lenguaje de alto nivel como C o C++, hasta su programación en una memoria permanente en la plataforma física. Los pasos necesarios para crear un archivo que pueda ser programado en dicha memoria son: + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{toolchain_flow} +\end{figure} + + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de texto utilizando un lenguaje de alto nivel como C o C++. + + \item \textbf{Compilación:} Utilizando un compilador (GCC en nuestro caso) se crea un \textit{objeto} que contiene las instrucciones en \textit{lenguaje de máquina} del procesador a utilizar (uno diferente al que realiza la compilación que normalmente es de la familia x86); en este punto el compilador solo busca en los encabezados (\textit{headers}) la definición de una determinada función, esto es, la forma en que debe ser utilizada, el tipo de datos y el número de parámetros con que debe ser invocada, por ejemplo, la función \textit{printf} esta declarada en el archivo \textit{stdio.h} como: \textit{ int printf (const char *template, ...)}. Esta declaración es utilizada por el compilador para verificar el correcto uso de esta función. + + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con librerías precompiladas para el procesador de la plataforma, si una determinada función no es definida en ninguna de estas librerías, el \textit{enlazador} generará un error y no se generará el ejecutable. + \item Se definen las posiciónes físicas de las secciones que componen el archivo ejecutable (tipo ELF), esto se realiza a través de un link de enlazado en el que se define de forma explícita su localización. + \end{enumerate} + + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones (cuando no se cuenta con un sistema operativo) es necesario extraer las secciones del ejecutable que residen en los medios de almacenamiento no volátil, que como veremos más adelante representan el conjunto de instrucciones que debe ejecutar el procesador de la plataforma y las constantes del programa. Esto se realiza con la herramiento \textit{objcopy}, la cual, nos permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como S19 e Intel Hex. + + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie, USB, o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie, USB o un adaptador de red. + +\end{enumerate} + + +\subsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure} + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} se ve la asignación de esta variable. + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas (En Linux todas las variables no inicializadas, se inicializadan en cero): + +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +En el contenido de esta sección aparece la cadena de caracteres \textit{Printing \%d\\n}, es decir, los datos que no cambian durante la ejecución. + + +\subsection{Herramienta de compilación make} +Como pudo verse en la sección es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola, es necesario esribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico. Para realizar este proceso de forma automática se creó la herramienta \textit{make}, la cual recibe como entrada un archivo que normalmente tiene el nombre \textit{Makefile} o \textit{makefile} y determina que archivos han sido modificados desde la última compilación y ejecuta los comandos necesarios para recompilarlos. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente el compilador C (CC), el ensamblador (AS), el enlazador (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este ejemplo \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador C (CFLAGS) y al enlazador (LDFLAGS) y definen parámetros de comportamiento de estas herramientas. + +\begin{lstlisting} +CFLAGS =-mcpu=arm920t -I. -Wall +\end{lstlisting} + +El parámetro \textit{-mcpu} le indica al compilador C para arquitecturas \textit{ARM} que utilice la familia \textit{arm920}; el parámetro \textit{-I} le indica un directorio donde puede buscar los encabezados, en este caso el caracter "." le indica que busque en el mismo sitio donde se encuentran los archivos fuente; el parámetro \textit{-Wall} le indica que imprima todos los mensajes de errores y advertencias. + +\begin{lstlisting} +LDFLAGS =-L${libdir} -l gcc +\end{lstlisting} + +El parámetro \textit{-L} le indica al enlazador la ruta del directorio donde se encuentran las librerías, en este ejemplo apunta a la variable textit{libdir} que se encuentra declarado como \textit{\${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5}; el parámetro \textit{-l} le indica al enlazador que debe utilizar la librería \textit{gcc} que se encuentra en el directorio definido previamente. En realidad el archivo de la librería tienen el nombre \textit{libgcc.a}, pero como todas las librerías tienen el nombre \textit{libXXXX.a} se eliminan el encabezado y la extensión del archivo. + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} estos labels permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará el comando:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}} esto le indica a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}} o lo que es lo mismo: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. Para esto, \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} + +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{enlazador} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utiliza la dirección de memoria 0 como punto de entrada. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} para definir las posiciones de memoria de las secciones del ejecutable. + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. + + +\subsection{Archivo de enlace} + +Como vimos anteriormente, el enlazador o \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, adicionalmente, permite definir donde serán ubicados los diferentes segmentos del archivo ELF en un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria, lo que proporciona un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga del manejo de las diferentes secciones, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +\section{Herramientas hardware} +En esta subsección se realizará una breve descripción de los dispositivos semiconductores más utilizados para la implementación de dispositivos digitales, esto, con el fín de determinar el estado actual de la industria de los semiconductores y entender los componentes básicos con los que se pueden implementar dispositivos digitlaes modernos. + +\subsection{SoC} + +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. La arquitectura de estos SoC evoluciona muy rápido acomodándose a los requerimientos de nuevas aplicaciones, básicamente, los cambios se producen en la velocidad del procesador central y la adición de periféricos que permiten el control directo de nuevos periféricos, como por ejemplo, la adición de controladores de pantallas de cristal líquido o salidas de video. Dentro de estos periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, DDR, SD/MMC + \item Puertos USB host o device. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item Puertos SPI. + \item Puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \item Controlador de LCD. + \item Driver de video. + \item Tarjetas de sonido. + \end{itemize} + +\begin{figure} + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. Uno de los más importantes y que están presentes en todos los SoC actuales es el controlador de memorias, este periférico permite controlar los medios de almecenamiento que son vitales para la correcta oepración del dispositivo, a continuación se hace un breve recuento de las memorias disponibles para el desarrollo de aplicaciones embebidas. + +\subsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones de un ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto, la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +\subsubsection{memoria SDRAM} +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. + +\subsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo la información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido. Existen dos tipos de memoria las NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y pueden ser modificadas una vez sean instaladas en el circuito impreso. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los de las memorias RAM y que presentan un número finito de ciclos de borrado y exritura. + +\subsubsection{Memorias NOR} + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits almacenados pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que reduce el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes, se utilizan como memorias ROM. + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +\subsubsection{Memorias NAND} + +Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash y muestra sus aplicaciones típicas. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +Adicionalmente, se encuentran dispoibles las memorias DATAFLASH, estos dispositivos son básicamente una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. + + diff --git a/course/.docs/cambio_categoria/chapter1.tex.backup b/course/.docs/cambio_categoria/chapter1.tex.backup new file mode 100644 index 0000000..19a8d3b --- /dev/null +++ b/course/.docs/cambio_categoria/chapter1.tex.backup @@ -0,0 +1,658 @@ +\chapter{Diseño de Sistemas Embebidos} + +\section{Definición} + +Un Sistema Embebidos es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo el tamaño y costo del producto \cite{Wik} + +\section{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\section{Arquitectura} + +Una arquitectura típica para un Sistema Embebido se muestra en la Figura \ref{es_arch}; La cual integra un componente hardware, implementado ya sea en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos (menos componentes y menos área de circuito impreso) \footnote{http://www.sharpsma.com, http://www.atmel.com, http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado SoC con la cantidad de periféricos requerida para una determinada aplicación, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha operación, en algunas ocaciones el periférico puede relizar funciones muy específicas de modo que no existe en el mercado, la solución es entonces implementar estos dispositivos en una FPGA, también se recomienda la utilización de FPGAs en sistemas que requieren una gran cantidad y variedad de periféricos ya que reduce la complejidad y costo del sistema. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más económica y flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la lngitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales . Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + + +\section{Metodología de Diseño} + +La Figura \ref{des_flow}, muestra un diagrama de flujo genérico para diseño para sistemas embebidos {\cite{Cor05}} + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido}\label{des_flow} +\end{figure} + + +El proceso comienza con la {\textit{especificaci\'on del sistema}}, en este punto se describe la funcionalidad y se definen las restricciones f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La especificaci\'on puede ser verificada a trav\'es de una serie de pasos de an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los resultados satisfacen las especificaciones. Desde el punto de vista de la re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de una librer\'{\i}a de algor\'{\i}tmos existentes. + +Una vez definidas las especificaciones del sistema se debe realizar un modelamiento que permita extraer de estas la funcionalidad. El modelamiento es crucial en el diseño ya que de \'el depende el paso existoso de la especificaci\'on a la implementaci\'on. Es importante definir que modelo matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de Eventos Discretos y Redes de Petri. Cada modelo posee propiedades matem\'aticas que pueden explotarse de forma eficiente para responder preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su {\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un dispositivo lógico programable. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan en SW y que tareas se implementan en HW recibe el nombre de {\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de restricciones econ\'omicas y temporales. + +Las tareas Software deben compartir los recursos que existan en el sistema (procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de {\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del sistema. + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas realimentaciones permiten depurar el resultado de pasos anteriores en el caso de no cumplirse las especificaciones iniciales + + +\section{Herramientas de Diseño Software} + +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure} + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsection{Componentes del \textit{GNU toolchain} } + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection\cite{Wik}} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. + +\subsubsection{Lenguajes} +GCC soporta los siguientes lenguajes: +\begin{itemize} + \item \textbf{ADA} + \item \textbf{C} + \item \textbf{C++} + \item \textbf{Fortran} + \item \textbf{Java} + \item \textbf{Objective-C} + \item \textbf{Objective-C++} +\end{itemize} + +\subsubsection{Arquitecturas} +\begin{itemize} + \item \textbf{Alpha} + \item \textbf{ARM} + \item \textbf{Atmel AVR} + \item \textbf{Blackfin} + \item \textbf{H8/300} + \item \textbf{System/370, System/390} + \item \textbf{IA-32 (x86) and x86-64} + \item \textbf{IA-64 i.e. the "Itanium"} + \item \textbf{Motorola 68000} + \item \textbf{Motorola 88000} + \item \textbf{MIPS} + \item \textbf{PA-RISC} + \item \textbf{PDP-11} + \item \textbf{PowerPC} + \item \textbf{SuperH} + \item \textbf{SPARC} + \item \textbf{VAX} + \item \textbf{Renesas R8C/M16C/M32C} + \item \textbf{MorphoSys} +\end{itemize} +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. Una consecuencia de esto se refleja en el número de desarrolladores en un grupo de trabajo, en la actualidad casi el 60\% de las empresas desarrolladoras de dispositivos embebidos tiene grupos con menos de 10 desarrolladores \ref{group}. + + +\begin{figure} + \begin{center} \includegraphics[scale=.2]{./images/vdc_embedded_dev_company_size} \end{center} + \caption{Número promedio de desarrolladores por compañía. Fuente Venture Development Corp}\label{group} +\end{figure} + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. A continuación se muestra un ejemplo de una sesión con gdb. + +\footnotesize +\begin{lstlisting}[firstnumber=40] +GNU gdb Red Hat Linux (6.3.0.0-1.21rh) +Copyright 2004 Free Software Foundation, Inc. +GDB is free software, covered by the GNU General Public License, and you are +welcome to change it and/or distribute copies of it under certain conditions. +Type "show copying" to see the conditions. +There is absolutely no warranty for GDB. Type "show warranty" for details. +This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db +library "/lib/libthread_db.so.1". + +(gdb) run +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xc11000 +This program will demonstrate gdb + +Program received signal SIGSEGV, Segmentation fault. +0x08048428 in function_2 (x=24) at crash.c:22 +22 return *y; +(gdb) edit +(gdb) shell gcc crash.c -o crash -gstabs+ +(gdb) run +The program being debugged has been started already. +Start it from the beginning? (y or n) y +warning: cannot close "shared object read from target memory": File in wrong format +`/home/sam/programming/crash' has changed; re-reading symbols. +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xa3e000 +This program will demonstrate gdb +24 +Program exited normally. +(gdb) quit +\end{lstlisting} + + + +\subsubsection{C Libraries} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SECCION Obtención y utilización del GNU toolchain +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Desarrollo Software} + +El primer paso en nuestro estudio consiste en tener una cadena de herramientas funcional que soporte la familia de procesadores a utilizar. La arquitectura sobre la cual realizaremos nuestro estudio inicial es la ARM (Advanced Risc Machines), ya que la más utilizada en la actualidad por los diseñadores de sistemas embebidos (ver figura \ref{arch}) y se encuentran disponibles una gran variedad de herramientas para esta arquitectura. Sin embargo, lo contenido en esta sección es aplicable a cualquier familia de procesadores soportada por la cadena de herrmientas GNU. Existen dos formas de obtener la cadena de herramientas GNU: + +\begin{figure} + \begin{center} \includegraphics[scale=.8]{./images/embedded-processor-trends-sm} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{arch} +\end{figure} + +\begin{enumerate} + \item Utilizar una distribución precompilada: Esta es la via más rápida, sin embargo, hay que tener cuidado al momento de instalarlas, ya que debe hacerse en un directorio con el mismo \textit{path} con el que fueron creadas. por ejemplo \textit{/usr/local/gnutools}; si esto no se cumple, las herramientas no funcionarán de forma adecuada. + \item Utilizar un script de compilación: Existen disponibles en la red una serie de \textit{scripts} que permiten descargar, configurar, compilar e instalar la cadena de herramientas, la ventaja de utilizar este método es que es posible elegir las versiones de las herramientas instaladas, al igual que el directorio de instalación. En este estudio utilizaremos los \textit{scripts} creados por Dan Kegel \cite{DK06}. +\end{enumerate} + +\subsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente que implementa la funcionalidad de una tarea software utilizando un lenguaje de alto nivel como C o C++, hasta su programación en una memoria permanente en la plataforma física. Los pasos necesarios para crear un archivo que pueda ser programado en dicha memoria son: + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{toolchain_flow} +\end{figure} + + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de texto utilizando un lenguaje de alto nivel como C o C++. + + \item \textbf{Compilación:} Utilizando un compilador (GCC en nuestro caso) se crea un \textit{objeto} que contiene las instrucciones en \textit{lenguaje de máquina} del procesador a utilizar (uno diferente al que realiza la compilación que normalmente es de la familia x86); en este punto el compilador solo busca en los encabezados (\textit{headers}) la definición de una determinada función, esto es, la forma en que debe ser utilizada, el tipo de datos y el número de parámetros con que debe ser invocada, por ejemplo, la función \textit{printf} esta declarada en el archivo \textit{stdio.h} como: \textit{ int printf (const char *template, ...)}. Esta declaración es utilizada por el compilador para verificar el correcto uso de esta función. + + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con librerías precompiladas para el procesador de la plataforma, si una determinada función no es definida en ninguna de estas librerías, el \textit{enlazador} generará un error y no se generará el ejecutable. + \item Se definen las posiciónes físicas de las secciones que componen el archivo ejecutable (tipo ELF), esto se realiza a través de un link de enlazado en el que se define de forma explícita su localización. + \end{enumerate} + + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones (cuando no se cuenta con un sistema operativo) es necesario extraer las secciones del ejecutable que residen en los medios de almacenamiento no volátil, que como veremos más adelante representan el conjunto de instrucciones que debe ejecutar el procesador de la plataforma y las constantes del programa. Esto se realiza con la herramiento \textit{objcopy}, la cual, nos permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como S19 e Intel Hex. + + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie, USB, o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie, USB o un adaptador de red. + +\end{enumerate} + + +\subsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure} + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} se ve la asignación de esta variable. + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas (En Linux todas las variables no inicializadas, se inicializadan en cero): + +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +En el contenido de esta sección aparece la cadena de caracteres \textit{Printing \%d\\n}, es decir, los datos que no cambian durante la ejecución. + + +\subsection{Herramienta de compilación make} +Como pudo verse en la sección es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola, es necesario esribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico. Para realizar este proceso de forma automática se creó la herramienta \textit{make}, la cual recibe como entrada un archivo que normalmente tiene el nombre \textit{Makefile} o \textit{makefile} y determina que archivos han sido modificados desde la última compilación y ejecuta los comandos necesarios para recompilarlos. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente el compilador C (CC), el ensamblador (AS), el enlazador (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este ejemplo \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador C (CFLAGS) y al enlazador (LDFLAGS) y definen parámetros de comportamiento de estas herramientas. + +\begin{lstlisting} +CFLAGS =-mcpu=arm920t -I. -Wall +\end{lstlisting} + +El parámetro \textit{-mcpu} le indica al compilador C para arquitecturas \textit{ARM} que utilice la familia \textit{arm920}; el parámetro \textit{-I} le indica un directorio donde puede buscar los encabezados, en este caso el caracter "." le indica que busque en el mismo sitio donde se encuentran los archivos fuente; el parámetro \textit{-Wall} le indica que imprima todos los mensajes de errores y advertencias. + +\begin{lstlisting} +LDFLAGS =-L${libdir} -l gcc +\end{lstlisting} + +El parámetro \textit{-L} le indica al enlazador la ruta del directorio donde se encuentran las librerías, en este ejemplo apunta a la variable textit{libdir} que se encuentra declarado como \textit{\${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5}; el parámetro \textit{-l} le indica al enlazador que debe utilizar la librería \textit{gcc} que se encuentra en el directorio definido previamente. En realidad el archivo de la librería tienen el nombre \textit{libgcc.a}, pero como todas las librerías tienen el nombre \textit{libXXXX.a} se eliminan el encabezado y la extensión del archivo. + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} estos labels permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará el comando:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}} esto le indica a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}} o lo que es lo mismo: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. Para esto, \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} + +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{enlazador} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utiliza la dirección de memoria 0 como punto de entrada. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} para definir las posiciones de memoria de las secciones del ejecutable. + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. + + +\subsection{Archivo de enlace} + +Como vimos anteriormente, el enlazador o \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, adicionalmente, permite definir donde serán ubicados los diferentes segmentos del archivo ELF en un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria, lo que proporciona un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga del manejo de las diferentes secciones, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +\section{Herramientas hardware} +En esta subsección se realizará una breve descripción de los dispositivos semiconductores más utilizados para la implementación de dispositivos digitales, esto, con el fín de determinar el estado actual de la industria de los semiconductores y entender los componentes básicos con los que se pueden implementar dispositivos digitlaes modernos. + +\subsubsection{SoC} + +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. La arquitectura de estos SoC evoluciona muy rápido acomodándose a los requerimientos de nuevas aplicaciones, básicamente, los cambios se producen en la velocidad del procesador central y la adición de periféricos que permiten el control directo de nuevos periféricos, como por ejemplo, la adición de controladores de pantallas de cristal líquido o salidas de video. Dentro de estos periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, SD/MMC + \item Puerto USB 2.0 host. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item Puertos SPI. + \item Puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \item Controlador de LCD. + \item + \end{itemize} + +\begin{figure} + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. A continuación se realizará una descripción de los diferentes periféricos que se encuentran disponibles en este SoC, indicando los que fueron utilizados en la plataforma de desarrollo. + +\subsubsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones del ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. + +\subsubsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido; existen dos tipos de memoria las memorias NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y puedens er modificadas una vez instaladas en el circuito integrado. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los requeridos por las memorias RAM. + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits datos pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que permite reducir el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes se utilizan como memorias ROM. Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +Adicionalmente, se encuentran dispoibles las memorias DATAFLASH, estos dispositivos son básicamente una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. + diff --git a/course/.docs/cambio_categoria/chapter1.tex~ b/course/.docs/cambio_categoria/chapter1.tex~ new file mode 100644 index 0000000..6f85c39 --- /dev/null +++ b/course/.docs/cambio_categoria/chapter1.tex~ @@ -0,0 +1,512 @@ +\chapter{Conceptos Básicos de los Sistemas Embebidos} + +\section{Definición} + +Un Sistema Embebidos es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo el tamaño y costo del producto \cite{Wik} + +\section{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\section{Arquitectura} + +Una arquitectura típica para un Sistema Embebido se muestra en la Figura \ref{es_arch}; La cual integra un componente hardware, implementado ya sea en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos (menos componentes y menos área de circuito impreso) \footnote{http://www.sharpsma.com, http://www.atmel.com, http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado SoC con la cantidad de periféricos requerida para una determinada aplicación, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha operación, en algunas ocaciones el periférico puede relizar funciones muy específicas de modo que no existe en el mercado, la solución es entonces implementar estos dispositivos en una FPGA, también se recomienda la utilización de FPGAs en sistemas que requieren una gran cantidad y variedad de periféricos ya que reduce la complejidad y costo del sistema. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más económica y flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la lngitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales . Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + + + + +\section{Metodología de Diseño} + +La Figura \ref{des_flow}, muestra un diagrama de flujo de diseño genérico para sistemas +embebidos {\cite{Cor05}} + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido}\label{des_flow} +\end{figure} + + +El proceso comienza con la {\textit{especificaci\'on del sistema}}, en este +punto se describe la funcionalidad y se definen las restricciones +f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy +general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de +ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La +especificaci\'on puede ser verificada a trav\'es de una serie de pasos de +an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos +seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los +resultados satisfacen las especificaciones. Desde el punto de vista de la +re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de +una librer\'{\i}a de algor\'{\i}tmos existentes. + + + +Una vez definidas las especificaciones del sistema se debe realizar un +modelamiento que permita extraer de estas la funcionalidad. El modelamiento es +crucial en el diseño ya que de \'el depende el paso existoso de la +especificaci\'on a la implementaci\'on. Es importante definir que modelo +matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados +son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de +Eventos Discretos y Redes de Petri. Cada modelo posee propiedades +matem\'aticas que pueden explotarse de forma eficiente para responder +preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas +tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para +comprobar que cumple con las restricciones del sistema. + + + +Una vez se ha obtenido el modelo del sistema se procede a determinar su +{\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su +inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de +diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una +funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, +confiabilidad, viabilidad comercial. + + + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas +del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos +opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un sistema + digital dedicado. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser +implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en +tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la +generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan +en SW y que tareas se implementan en HW recibe el nombre de +{\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de +restricciones econ\'omicas y temporales. + + +Las tareas Software deben compartir los recursos que existan en el sistema +(procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden +de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de +{\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir +informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del +sistema. + + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto +las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso +recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del +sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para +verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas +realimentaciones permiten depurar el resultado de pasos anteriores en el caso +de no cumplirse las especificaciones iniciales + +\subsection{Herramientas Software de libre distribución \textit{GNU toolchain}} +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, +sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; +esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsection{Componentes del \textit{GNU toolchain} } + +\subsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsection{GNU Compiler Collection\cite{Wik}} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. + + +\subsubsection{Lenguajes} +GCC soporta los siguientes lenguajes: +\begin{itemize} + \item \textbf{ADA} + \item \textbf{C} + \item \textbf{C++} + \item \textbf{Fortran} + \item \textbf{Java} + \item \textbf{Objective-C} + \item \textbf{Objective-C++} +\end{itemize} + +\subsubsection{Arquitecturas} +\begin{itemize} + \item \textbf{Alpha} + \item \textbf{ARM} + \item \textbf{Atmel AVR} + \item \textbf{Blackfin} + \item \textbf{H8/300} + \item \textbf{System/370, System/390} + \item \textbf{IA-32 (x86) and x86-64} + \item \textbf{IA-64 i.e. the "Itanium"} + \item \textbf{Motorola 68000} + \item \textbf{Motorola 88000} + \item \textbf{MIPS} + \item \textbf{PA-RISC} + \item \textbf{PDP-11} + \item \textbf{PowerPC} + \item \textbf{SuperH} + \item \textbf{SPARC} + \item \textbf{VAX} + \item \textbf{Renesas R8C/M16C/M32C} + \item \textbf{MorphoSys} +\end{itemize} +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. Una consecuencia de esto se refleja en el número de desarrolladores en un grupo de trabajo, en la actualidad casi el 60\% de las empresas desarrolladoras de dispositivos embebidos tiene grupos con menos de 10 desarrolladores \ref{group}. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.2]{./images/vdc_embedded_dev_company_size} \end{center} + \caption{Número promedio de desarrolladores por compañía. Fuente Venture Development Corp}\label{group} +\end{figure} + +\subsection{GNU Debugger\cite{Wik}} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. A continuación se muestra un ejemplo de una sesión con gdb. + +\footnotesize +\begin{lstlisting}[firstnumber=40] +GNU gdb Red Hat Linux (6.3.0.0-1.21rh) +Copyright 2004 Free Software Foundation, Inc. +GDB is free software, covered by the GNU General Public License, and you are +welcome to change it and/or distribute copies of it under certain conditions. +Type "show copying" to see the conditions. +There is absolutely no warranty for GDB. Type "show warranty" for details. +This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db +library "/lib/libthread_db.so.1". + +(gdb) run +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xc11000 +This program will demonstrate gdb + +Program received signal SIGSEGV, Segmentation fault. +0x08048428 in function_2 (x=24) at crash.c:22 +22 return *y; +(gdb) edit +(gdb) shell gcc crash.c -o crash -gstabs+ +(gdb) run +The program being debugged has been started already. +Start it from the beginning? (y or n) y +warning: cannot close "shared object read from target memory": File in wrong format +`/home/sam/programming/crash' has changed; re-reading symbols. +Starting program: /home/sam/programming/crash +Reading symbols from shared object read from target memory...done. +Loaded system supplied DSO at 0xa3e000 +This program will demonstrate gdb +24 +Program exited normally. +(gdb) quit +\end{lstlisting} + + + +\subsection{C Libraries} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SECCION Obtención y utilización del GNU toolchain +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Obtención y utilización del \textit{GNU toolchain}} + +El primer paso en nuestro estudio consiste en tener una cadena de herramientas funcional que soporte la familia de procesadores a utilizar. La arquitectura sobre la cual realizaremos nuestra investigación es la ARM (Advanced Risc Machines), ya que un la más utilizada en la actualidad por los diseñadores de sistemas embebidos (ver figura \ref{arch}) y se encuentran disponibles una gran variedad de herramientas para esta arquitectura. Existen dos formas de obtener la cadena de herramientas GNU: + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/embedded-processor-trends-sm} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{arch} +\end{figure} + +\begin{enumerate} + \item Utilizar una distribución precompilada: Esta es la via más rápida, sin embargo, hay que tener cuidado al momento de instalarlas, ya que debe hacerse en un directorio con el mismo \textit{path} con el que fueron creadas. por ejemplo \textit{/usr/local/gnutools}; si esto no se cumple, las herramientas no funcionarán de forma adecuada. + \item Utilizar un script de compilación: Existen disponibles en la red una serie de \textit{scripts} que permiten descargar, configurar, compilar e instalar la cadena de herramientas, la ventaja de utilizar este método es que es posible elegir las versiones de las herramientas instaladas, al igual que el directorio de instalación. En este estudio utilizaremos los \textit{scripts} creados por Dan Kegel \cite{DK06}. +\end{enumerate} + +\subsection{Conceptos Previos} +Antes de hablar sobre el uso de las herramientas GNU hablaremos sobre varios conceptos que deben quedar claros; estos son: El flujo de diseño software, y el formato ELF. + +\subsubsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables. Como puede verse en la figura \ref{elf1} el formato ELF está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{elf1} +\end{figure} + + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto consideremos el siguiente código: + + +\begin{lstlisting} +#include + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + } + return 0; +} + +\end{lstlisting} + + +En el ejemplo observamos que tenemos dos variables, una sin inicializar (\textit{i}) y otra inicializada (\textit{j}); estas variables estarán en las secciones \textit{.bss} y \textit{.data} respectivamente, así mismo los caracteres ``Printing `` Estarán incluidos en la sección \textit{.rodata} ya que son datos que no cambian a lo largo de la ejecución del programa. Las instrucciones que forman el programa residen en la sección \textit{.text}. A continuación se muestra la información de este archivo una vez compilado, utilizando la herramienta \textit{objdump} de los utilitarios binarios \textit{binutils} y más específicamente el comando: + +\textit{objdump -h hello} + + +\begin{lstlisting} +hello: file format elf32-littlearm + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .interp 00000014 000080f4 000080f4 000000f4 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 1 .hash 00000050 00008108 00008108 00000108 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 2 .dynsym 000000f0 00008158 00008158 00000158 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .dynstr 0000008a 00008248 00008248 00000248 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 5 .init 00000010 000082f4 000082f4 000002f4 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 7 .text 0000017c 00008348 00008348 00000348 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 8 .fini 0000000c 000084c4 000084c4 000004c4 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 9 .rodata 00000010 000084d0 000084d0 000004d0 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 10 .eh_frame 00000004 000084e0 000084e0 000004e0 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 16 .data 0000000c 000105ac 000105ac 000005ac 2**2 + CONTENTS, ALLOC, LOAD, DATA + 17 .bss 00000004 000105b8 000105b8 000005b8 2**0 + ALLOC + 18 .comment 00000094 00000000 00000000 000005b8 2**0 + CONTENTS, READONLY +\end{lstlisting} +En el item 9, se observa la información correspondiente a la sección \textit{.rodata}, la primera columna corresponde al tamaño de la sección, en este caso 16 bytes, las columnas 2 y 3 corresponden a la dirección de ejecución (VMA) y a la dirección de carga (LMA) respectivamente. La columna 4 indica la dirección dentro del ejecutable donde se encuentra almacenada esta información, en este caso la \textit{0x000004d0}, utilizando la herramienta \textit{hexdump} podemos ver el contenido de esa dirección en el archivo ejecutable: + +\textit{hexdump -C hello | grep -i 000004d0} + +\begin{lstlisting} + 000004d0 50 72 69 6e 74 69 6e 67 20 25 64 0a 00 00 00 00 |Printing %d.....| +\end{lstlisting} + + +\subsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente de una aplicación hasta su implementación en la tarjeta de desarrollo. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite{Lin05} }\label{toolchain_flow} +\end{figure} + +A continuación se realiza una breve descripción de los pasos necesarios para generar un ejecutable para un sistema embebido: + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de archivos de texto. + \item \textbf{Compilación:} Utilizando el compilador gcc se compila el código fuente; vala la pena mencionar que en este punto el compilador solo busca en los encabezados (\textit{headers}) de las librerías la definición de una determinada función, como por ejemplo el \textit{printf} en el archivo \textit{stdio.h}. Como resultado de este paso se obtiene un archivo tipo objeto. + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con las librerías, si una determinada función no es edfinida por ninguna de las librerías pasadas como parámetro al linker, este generará un error y no se generará el ejecutable. + \item Se define la posiciónes físicas de las secciones del ejecutable tipo ELF, esto se realiza a través de un link de enlazado el cual define de forma explícita su localización. + \end{enumerate} + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones es necesario extraer únicamente las secciones que residen en los medios de almacenamiento no volátil y eliminar las demás secciones del ejecutable. Esto se realiza con la herramiento \textit{objcopy}, la cual, permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como por ejemplo S19 e Intel Hex. + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma de desarrollo: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie o un adaptador de red. + +\end{enumerate} + +\section{Makefile} +Como pudo verse en la sección es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola de comandos, es necesario esribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico. Para realizar este proceso de forma automática se creó la herramienta make, la cual recibe como entrada un archivo que normalmente recibe el nombre de \textit{Makefile} o \textit{makefile}. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente los compiladores de C (CC), de assembler (AS), el linker (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este caso \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al copmílador de C (CFLAGS) y al liniker (LDFLAGS) + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} estos labels permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta el comando: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará el comando:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}} esto le indica a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}} o lo que es lo mmismo: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} + +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{linker} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utilice 0 como símbolo para el inicio de ejecución. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. + + + diff --git a/course/.docs/cambio_categoria/chapter2.tex b/course/.docs/cambio_categoria/chapter2.tex new file mode 100644 index 0000000..fecc821 --- /dev/null +++ b/course/.docs/cambio_categoria/chapter2.tex @@ -0,0 +1,24 @@ +\chapter{Sistema en un Chip (SoC)} + +En esta sección estudiaremos la arquitectura básica de un SoC moderno, componentes, funcionamiento, programación y operación. Como se mencionó anteriormente, la tendencia actual de la industria de los semiconductores es integrar en un solo dispositivo las funcionalidades necesarias para la implementación de dispositivos digitales modernos. Esto es posibe gracias a los grandes avances en las técnicas de fabricación de circuitos integrados y a la demanda de nuevas características exigidas por los fabricantes de dispositivos digitales de consumo masivo como teléfonos celulares, PDAs, consolas de juegos y reproductores multimedia. Para utilizar estos avances tecnológicos es necesario conocer su arquitectura, principio de funcionamiento, programación e implementación, para esto, se estudiarán dos proyectos abiertos que implementan un SoC en un PLD utilizando lenguaje de descripción de hardware y herramientas GNU; proporcionan el código fuente, lo que permite un estudio profundo de su arquitectura. El proyecto \textit{Plasma} \cite{SR08} y el proyecto Mico32\cite{LSC08}. + + +\section{Arquitectura} + +Un SoC, integra un conjunto de periféricos, memorias y una o varias unidades de procesamiento (CPUs) en un solo chip, lo cual facilita el desarrollo de aplicaciones. Comercialmente encontramos una gran variedad de configuraciones CPU - periféricos, dependiendo de la aplicación; dentro de los más comunes se encuentran: controladores de memorias externas (NOR, NAND, SDRAM, DDR), puertos de comunicación (I2C, SPI), puerto de depuración (UART), timers, reloj de tiempo real, codecs de audio, controladores de LCD, controladores de red, controlador de puerto USB host, controlador para sensores de imágenes, etc. La figura \ref{min_soc_arch} muestra una arquitectura de un SoC sencillo con los componentes necesarios para implementar tareas simples. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/Computer-simple} \end{center} + \caption{Arquitectura mínima de un SoC}\label{min_soc_arch} +\end{figure} + +\subsubsection{Unidad de Procesamiento Central (CPU)} + +La unidad de procesamiento central (CPU), como su nombre lo indica, está encargada de centralizar las tareas del sistema coordinando las acciones de los periféricos. Puede ser vista como una máquina de estados programable que controla un camino de datos compuesto por bloques aritméticos, lógicos y un banco de registros. Cada CPU es capaz de realizar una serie de operaciones sobre variables almacenadas en el banco de registros, estas operaciones reciben el nombre de \textit{conjunto de instrucciones}. El programador utiliza estas instrucciones para hacer que la CPU realice una función específica, indicandole paso a paso donde debe leer la información, como procesarla y como entregar el resultado. A Esta función se le conoce con el nombre de programa o tarea Software. + + +\subsubsection{Periféricos} +Los periféricos proporcionan la comunicación con el exterior, permiten el ingreso, almacenamiento y procesamiento de la información + + diff --git a/course/.docs/cambio_categoria/chapter2.tex.backup b/course/.docs/cambio_categoria/chapter2.tex.backup new file mode 100644 index 0000000..0e9eb91 --- /dev/null +++ b/course/.docs/cambio_categoria/chapter2.tex.backup @@ -0,0 +1,16 @@ +\chapter{Sistema en un Chip (SoC)} + +En esta sección estudiaremos la arquitectura básica de un SoC moderno, componentes, funcionamiento, programación y operación. Como se mencionó anteriormente la tendencia actual de la industria de los semiconductores es integrar en un solo dispositivo las funcionalidades necesarias para la implementación de dispositivos digitales modernos. Esto es posibe gracias a los grandes avances en las técnicas de fabricación de circuitos integrados y a la demanda de nuevas características exigidas por los fabricantes de dispositivos digitales de consumo masivo como teléfonos celuulares, PDAs, consolas de juegos y reproductores multimedia. Para utilizar estos avances tecnológicos es necesario conocer su principio de funcionamiento, por este motivo, estudiaremos dos proyectos abiertos que implementan un SoC en una FPGA y proporcionan el código fuente, lo que permite estudiar y comprender su funcionamiento y de ser necesario hacer modificaciones. El proyecto \textit{Plasma} \cite{SR08} y el proyecto Mico32\cite{LSC08} serán utilizados como base de nuestro estudio. + + +\section{Arquitectura} + +Un SoC, integra un conjunto de periféricos, memorias y una o varias unidades de procesamiento (CPUs) en un solo chip, lo cual facilita el desarrollo, los periféricos varían dependiendo de la aplicación, dentro de los más comunes se encuentran: controladores de memorias externas (NOR, NAND, SDRAM, DDR), puertos de comunicación (I2C, SPI), puerto de depuración (UART), timers, reloj de tiempo real. Según la aplicación es común encontrar: codecs de audio, controladores de LCD, controladores de red, controlador de puerto USB host, controlador para sensores de imágenes, etc. + +La figura \ref{min_soc_arch} muestra una arquitectura mínima de un SoC, donde se muestra una interfaz sencilla entre la CPU y los periféricos (la cual varía entre fabricantes). + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/Computer-simple} \end{center} + \caption{Arquitectura mínima de un SoC}\label{min_soc_arch} +\end{figure} + diff --git a/course/.docs/cambio_categoria/chaptera.tex b/course/.docs/cambio_categoria/chaptera.tex new file mode 100644 index 0000000..c5395ef --- /dev/null +++ b/course/.docs/cambio_categoria/chaptera.tex @@ -0,0 +1,2245 @@ +\chapter{PLATAFORMA DE DESARROLLO ECBOT} + + +\section{Introducción} +En esta sección se realizará una explicación detallada del proceso de adaptación de Linux a la familia de plataformas ECB\_AT91, este proceso es aplicable a otros dispositivos que trabajen con procesadores soportados por la distribución de Linux. Adicionalmente, se explicará de forma detallada el funcionamiento de este sistema operativo, el proceso de arranque y su puesta en marcha, así como las principales distribuciones, aplicaciones y librerías disponibles para el desarrollo de aplicaciones. Esta y otra información recolectada durante más de tres años permite que la industria y la academia desarrollen aplicaciones comerciales utilizando herramientas de diseño modernas. + +\subsection{Contribuciones al desarrollo tecnológico en Colombia} + +Durante la realización de esta investigación se llevaron a cabo varias actividades, cuyo objetivo principal es contribuir al desarrollo tecnológico en Colombia, como se expuso anteriormente el país presenta serias dificultades en este campo y es deber de la comunidad académica nacional atacar los problemas locales. Por esta razón unoa de las matas del presente trabajo fué la creación de una plataforma hardware que permita implementar las diferentes modelos bio-inspirados. En la mayoría de estudios similares no se contempla la creación de estas plataformas ya que en los países donde se desarrollan la investigación existe una industria electrónica competitiva y que esta al tanto de los desarrollos tecnológicos a nivel mundial. Como se mencionó anteriormente este no es el caso de nuestro pais, en la mayoría de las industrias nacionales y en las facultades relacionadas con la electrónica se trabaja con tecnologías de hace 30 años (Familias 74 TTL y 40 CMOS) y se utilizan herramientas de programación de bajo nivel como el lenguaje ensamblador. + + A continuación se mestran una lista del trabajo realizado sobre algunas de las recomendaciones dadas por los estudios acerca del desarrollo tecnológico en Colombia; vale la pena anotar que no todas están dentro del alcance de este trabajo, se eligieron en las que se podía hacer un aporte significativo. + +\begin{enumerate} + + \item Realización de proyectos de aplicación: La primera decisión que se tomó en cuanto a la naturaleza de esta investigación fué la de generar una aplicación física real que validara los modelos propuestos, este trabajo no se limitará a realizar simulaciones, sino que se construirá una plataforma que sea tecnológicamente ``moderna'' y que esté al nivel de las plataformas utilizadas en estudios similares. Para esto se diseñó la primer \textit{Computadora en una sola placa} (SBC \footnote{Single Board Computer}) que utiliza un procesador de 32 Bits y utiliza Linux como sistema operativo. Adicionalmente, se crearon plataformas de desa + + \item Infraestructura institucional que impulse la actualización tecnológica en el sector mediante desarrollo de proyectos de tecnología de punta con una posible transferencia de tecnología: En las condiciones actuales no es posible que la industria electrónica del país se modernice por sí sola, es necesario que las Universidades doten al sistema productivo con profesionales que tengan habilidades especiales, siendo la más importante la capacidad de diseñar y construir dispositivos que puedan ser explotados comercialmente. En la actualidad, nuestros estudiantes se limitan a analizar y a simular la mayoría de los procesos, lo que es necesario pero no suficiente, el nivel de las implementaciones físicas que realizan en los últimos semestres de sus carreras es muy baja y un mínimo porcentaje llegan a un diseño de circuito Impreso. En la Sección \ref{academic} mostraremos los cambios introducidos en las asignaturas de la línea de Electrónica Digital y como estos generan las habilidades mencionadas anteriormente. + + \item El contacto con las empresas no debe ser encargada únicamente a los estudiantes, la Universidad debe desarrollar las competencias que la empresa requiere: Se realizó una investigación del estado actual de las empresas involucradas en el proceso de manufactura de dispositivos relacionados con la electrónica digital, se identificaron las empresas proveedoras de servicios con el fín de determinar que procesos se pueden realizar en el país, así mismo se identificaron algunas de las necesidades del sector productivo. En la sección \ref{industry} se muestra un ejemplo de creación de empresa con soporte de la Universidad, específicamente del presente trabajo. + + \item Interacción entre Universidades, Conviene que buena parte de los trabajos realizados en doctorado sean de investigación aplicada, orientadas a mejorar la productividad del sector empresarial: Es importante el dialogo continuo entre todas las Universidades del país y la divulgación de sus investigaciones, en muchas ocasiones los escasos recursos económicos son utilizados para repetir temas de investigación, o sus resultados no son dados a conocer. Adicionalmente, los programas académicos de programas curriculares equivalentes presentan diferentes enfoques y diferentes niveles de excelencia, lo que impide el conocimiento de los trabajos realizados. + + \item Innovación curricular, actualización continua de profesionales: Durante el último año se introdujeron cambios en los contenidos de las asignaturas del área de sistemas digitales, estos cambios tienen como objetivo crear una metodología de diseño unificada que pueda ser utilizada en los tres cursos, del mismo modo se realizó una actualización tecnológica en cuanto al software y al hardware utilizado en estos cursos, se eliminó el uso de tecnologías viejas y se abrió el paso a tecnologías y metodología de diseño que se utilizan en cursos similares en Universidades de paises desarrollados. + + + \item Necesidad de mejorar las competencias y habilidades generales de los ingenieros, (continuo aprendizaje) habilidad para innovar, investigar, desarrollar nueva tecnología: Se crearon alianzas con diferentes profesiones con el fín de crear condiciones de trabajo cercanas a las que se puedan encontrar en la industria, es importante para la situación del país que nuestros egresados sean capáces de crear nuevos productos que puedan satisfacer las necesidades de la industria local. Por esta razón durante este trabajo se dió un especial énfasis en el proceso de fabricación de dispositivos electrónicos. + +\end{enumerate} + + +\subsubsection{Contribuciones a Nivel Tecnológico y Académico} + + +\subsubsection{Métodos de arranque} + +Como es obvio todo SoC debe ser programado para que pueda ejecutar una determinada tarea; este programa debe estar almacenado en una memoria no volátil y debe estar en el formato requerido por el procesador. Normalmente los SoCs proporcionan varios caminos (habilitando diferentes periféricos) para hacer esto. Un programa de inicialización \textit{(boot program)} contenido en una pequeña ROM del SoC se encarga de configurar, y revisar ciertos periféricos en búsqueda de un ejecutable, una vez lo encuentra, lo copia a la memoria RAM interna y lo ejecuta desde allí. No sobra mencionar que este ejecutable debe estar enlazado de tal forma que todas las secciones se encuentren en el espacio de la memoria RAM interna (0x0 después del REMAP \footnote{Los procesadores ARM pueden intercambiar el sitio de la memoria RAM interna y la memoria no volátil}). El AT91RM9200 posee una memoria interna SRAM de 16 kbytes. Después del reset esta memoria esta disponible en la posición 0x200000, después del remap esta memoria se puede acceder en la posición 0x0. Algunos fabricantes, en la etapa de producción graban en las memorias no volátiles las apliacaciones definitivas, y soldan en la placa de circuito impreso los dispoditivos programados, esto es muy conveniente cuando se trabaja con grandes cantidades ya que ahorra tiempo en el montaje de los dispositivos. + +El programa de inicialización del AT91RM9200 (se ejecuta si el pin BMS se encuentra en un valor lógico alto) busca una secuencia de 8 vectores de excepción ARM válidos en la DataFlash conectada al puerto SPI, en una EEPROM conectada a la interfaz I2C o en una memoria de 8 bits conectada a la interfaz de bus externo (EBI), estos vectores deben ser instrucciones LDR o Bbranch, menos la sexta instrucción (posición 14 a 17) que contiene información sobre el tamaño de la imágen (en bytes) a descargar y el tipo de dispositivo DataFlash. Si la secuencia es encontrada, el código es almacenado en la memoria SRAM interna y se realiza un remap (con lo que la memoria interna SRAM es accesible en la posición 0x0 ver Figura \ref{soc_boot_remap}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_remap} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_remap} +\end{figure} + +Si no se encuentra la secuencia de vectores ARM, se inicializa un programa que configura el puerto serial de depuración (DBGU) y el puerto USB Device. Quedando en espera de la descarga de una aplicación a través del protocolo DFU (Digital Firmware Upgrade) por el puerto USB o con el protocolo XMODEM en el puerto DBGU. La figura \ref{soc_boot_proc} muestra el diagrama de flujo del programa de inicialización del SoC AT91RM9200 + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/soc_boot_proc} \end{center} + \caption{Diagrama de flujo del programa de inicialización del SoC AT91RM9200} \label{soc_boot_proc} +\end{figure} + +El programa descargado a la memoria SRAM interna debe ser capaz de programar una memoria no volátil (La Flash DataFlash SPI para el ECBOT), debe proporcionar un canal de comunicación que permita descargar ejecutables más grandes, y debe inicializar el controlador de memoria SDRAM para que almacene temporalmente el ejecutable a grabar, esto es necesario ya que la memoria interna del AT91RM9200 solo es de 16kBytes. Más adelante hablaremos detalladamente de la aplicación que realiza estas funciones. + + +\subsection{Interfaz JTAG} +A mediados de los 1970s, la estructura de pruebas para tarjetas de circuito impreso (PCB, Printed Circuit Boards) se basaba en el uso de la técnica ``bed-of-nails''. Este método hacia uso de un dispositivo que contenía una serie de puntos de prueba, que permitían el acceso a dispositivos en la tarjeta a través de puntos de prueba colocados en la capa de cobre, o en otros puntos de contacto convenientes. Las pruebas se realizaban en dos fases: La prueba del circuito apagado y la prueba del circuito funcionando. Con la aparición de los dispositivos de montaje superficial se empezó a colocar dispositivos en las dos caras de la tarjeta, debido a que las dimensiones de los dispositivos de montaje superficial son muy pequeñas, se disminuyó la distancia física entre las interconexiones, dificultando el proceso de pruebas. + +A mediados de los 1980s un grupo de ingenieros de pruebas miembros de compañías electrónicas Europeas se reunieron para examinar el problema y buscar posibles soluciones. Este grupo se autodenominó JETAG (Joint European Test Action Group). El método de solución propuesto por ellos estaba basado en el concepto de un registro de corrimiento serial colocado alrededor de la frontera dispositivo, de aquí el nombre ?Boundary Scan?. Después el grupo se asoció a compañías norteamericanas y la ``E'' de ``European'' desapareció del nombre de la organización convirtiéndose en JTAG (Join Test Action Group). + +\subsubsection{Arquitectura BOUNDARY SCAN} +A cada señal de entrada o salida se le adiciona un elemento de memoria multi-propósito llamado ``Boundary Scan Cell'' (BSC). Las celdas conectadas a los pines de entrada reciben el nombre de ``Celdas de entrada'', y las que están conectadas a los pines de salida ``Celdas de salida''. En la Figura \ref{jtag_basics} se muestra esta arquitectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/jtag_basics} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_basics} +\end{figure} + +Las BSC se configuran en un registro de corrimiento de entrada y salida paralela. Una carga paralela de los registros (captura) ocasiona que los valores de las señales aplicadas a los pines del dispositivo pasen a las celdas de entrada y que opcionalmente los valores de las señales internas del dispositivo pasen a las celdas de salida. Una descarga paralela (Actualización) ocasiona que los valores presentes en las celdas de salida pasen a los pines del dispositivo, y opcionalmente los valores almacenados en las celdas de entrada pasen al interior del dispositivo. + +Los datos pueden ser corridos a través del registro de corrimiento, de forma serial, empezando por un pin dedicado TDI (Test Data In) y terminando en un pin de salida dedicado llamado TDO (Test Data Out). La señal de reloj se proporciona por un pin externo TCLK (Test Clock) y el modo de operación se controla por la señal TMS (Test Mode Select). Los elementos del Boundary Scan no afectan el funcionamiento del dispositivo. Y son independientes del núcleo lógico del mismo. + +\subsubsection{Instrucciones JTAG} +El Standard IEEE 1149.1 describe tres instrucciones obligatorias: Bypass, Sample/Preload, y Extest \cite{TI96}. + +\begin{itemize} + \item \textbf{BYPASS} Esta instrucción permite que el chip permanezca en un modo funcional, hace que el registro de Bypass se coloque entre TDI y TDO; permitiendo la transferencia serial de datos a través del circuito integrado desde TDI hacia TDO sin afectar la operación. La codificación en binario para esta instrucción debe ser con todos los bits en uno. + + \item \textbf{SAMPLE/PRELOAD} Esta instrucción selecciona el registro Boundary-Scan para colocarse entre los terminales TDI y TDO. Durante esta instrucción, el registro Boundary-Scan puede ser accesado a través de la operación Data Scan, para tomar una muestra de los datos de entrada y salida del chip. Esta instrucción también se utiliza para precargar los datos de prueba en el registro Boundary-Scan antes de ejecutar la instrucción EXTEST. La codificación de esta instrucción la define el fabricante. + + \item \textbf{EXTEST} Esta instrucción coloca al circuito integrado en modo de test externo (pruebas de la interconexión) y conecta el regsitro Boundary-Scan entre TDI y TDO. Las señales que salen del circuito son cargadas en el registro boundary-scan en el flanco de bajada de TCK en el estado Capture-DR; las señales de entrada al dispositivo son cargadas al registro boundary-scan durante el flanco de bajada de TCK en el estado Update-DR (ver Figura \ref{jtag_sm}) . La codificación para esta instrucción está definida con todos los bits en cero. + + \item \textbf{INTEST} La instrucción opcional INTEST también selecciona el registro boundary-scan, pero es utilizado para capturar las señales que salen del núcleo lógico del dispositivo, y para aplicar valores connocidos a las señales de entrada del núcleo. La codificación para esta señal es asignada por el diseñador. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.8]{./images/jtag_sm} \end{center} + \caption{Arquitectura Boundary Scan} \label{jtag_sm} +\end{figure} + + + +\subsubsection{Depuración del core ARM \cite{DR05}} + +Todos los nucleos ARM7 y ARM9 poseen soporte de depuración en modo halt, lo que permite detener por competo el núcleo. Durante este estado es posible modificar y capturar las señales del núcleo, permitiendo cambiar y examinar el core y el estado del sistema. En este estado la fuente de reloj del core es el reloj de depuración (DCLK) que es generado por la lógica de depuración. Los núcleos ARM7 y ARM9 implementan un controlador compatible con JTAG, con dos cadena boundary-scan alrededor de las señales del core, una con las señales del core, para pruebas del dispositivo y la otra es un sub-set de la primera con señales importantes para la depuración. La Figura \ref{arm_scan1} muestra el orden de las señales en las cadenas para los núcleos ARM7TDMI y ARM9TDMI. Para popósitos de depuración es suficiente la cadena 1. Esta cadena puede ser utilizada en modo INTEST, permitiendo capturar las señales del core y aplicar vectores al mismo, o en modo EXTEST, permitiendo la salida y entrada de información hacia y desde exterior del core respectivamente. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan1} \end{center} + \caption{Cadena Boundary Scan 1} \label{arm_scan1} +\end{figure} +Las señales D[0:31] del ARM7TDMI están conectadas al bus de datos del núcleo y se utiliza para capturar instrucciones o lectura/escritura de información; la señal BREAKPT se utiliza para indicar que la instrucción debe ejecutarse a la velocidad del sistema, esto es, utilizando el reloj MCLK en lugar de DCLK. + +Las señales ID[0:31] del ARM9TDMI están conectadas al bus de instrucciones y se utilizan para capturar instrucciones, las señales DD[31:0] están conectadas al bus de dtaos bi-direccional y se utilizan para leer o escribir información. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/arm_scan2} \end{center} + \caption{Cadena Boundary Scan 2 (Embedded ICE)} \label{arm_scan2} +\end{figure} + +Los ARM7 y ARM9 poseen un módulo ICE (In Circuit Emulator) que reemplaza el microcontrolador con una variación que posee facilidades para la depuración hardware. El emulador es conectado a un computador que ejecuta el software de depuración. Esto permite realizar depuración activa y pasiva, dando un punto de vista no intrusivo del flujo del programa. La Figura \ref{arm_scan2} muestra la cadena scan ICE, que es la misma para los núcleos ARM7 y ARM9, esta formada por 32 bits de datos, 5 bits de direcciones y un flag para diferenciar entre lectura (nRW bajo) y escritura. Se puede acceder a las características ICE a través de registros, cuya dirección es colocada en el bus de direcciones. + +El proyecto OPENOCD (Open On-Chip Debugger \footnote{http://openocd.berlios.de/web/}) permite la programación de la memoria flash interna de algunos procesadores ARM7TDMI, y la depuración de procesadores ARM7 y ARM9 utilizndo el módulo ICE. Este proyecto se ha convertido en el más popular dentro del grupo de desarrolladores de sistemas Embebidos. En \cite{DR05} se puede encontrar el funcionamiento interno de esta herramienta. + +\subsubsection{Programación de memorias Flash} +Algunos SoC no poseen programas de inicialización que permitan la descarga de aplicaciones ya sea a las memorias externas o a la interna, una solución podría ser utilizar el protocolo JTAG para cargar las aplicaciones en la RAM interna, sin embargo, existen procesadore en los que no se conocen las espcificaciones del ICE y en en otros este módulo no existe. En estos casos se utiliza la interfaz JTAG en modo EXTEST para controlar directamente las memorias conectadas a los SoCs. El proyecto UrJTAG, \footnote{http://urjtag.sourceforge.net/} permite la programación de diversas memorias flash, utilizando los pines del dispositivo. UrJTAG permite la creación de diferentes interfaces para conectarse con las memorias, estas interfaces reciben el nombre de buses y pueden ser creadas e incluidas en el código original de forma fácil. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION LINUX +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{El sistema Operativo Linux} +\textit{Hello everybody out there using minix - +I'm doing a (free) operating system (just a hobby, won't be big and +professional like gnu) for 386(486) AT clones. +} + +Con este mail enviado al foro de discusión comp.os.minix, Linus Torvalds, un estudiante de la Universidad de Helsinki en Finlandia introduce Linux el 25 de Agosto de 1991. A principios de los 90, el sistema operativo Unix (desarrollado en \textit{The Bell Labs} a principios de los 60s), tenía una solida posición en el mercado de servidores, y estaba muy bien posicionado en las Universidades, por lo tanto, un gran número de estudiantes trabajaban a diario con él y muchos de ellos deseaban poder utilizarlo en sus computadores personales, sin embargo, Unix era un producto comercial muy costoso. La +figura \ref{linuxhistory} muestra el desarrollo previo a la creación de la primera versión de linux hasta el día de hoy. Una de las características más importantes de Linux es que desde su creación, fue pensado como un sistema operativo gratuito y de libre distribución. Esta característica ha permitido que programadores a lo largo del mundo puedan manipular el código fuente para eliminar errores y para aumentar sus capacidades. + +Sin embargo, el crédito de las que conocemos hoy (Debian, Ubuntu, Suse, etc) no solo se debe a Torvalds, ya que linux es solo el kernel del sistema operativo. En 1983, Richard Stallman funda en proyecto GNU, el cual proporciona una parte esencial de los sistemas linux. A principios de los 90s, GNU había producido una serie de herramientas como librerías, compiladores, editores de texto, Shells, etc. Estas herramientas fueron utilizadas por Torvalds para escribir el elemento que le hacía falta al proyecto GNU para completar su sistema operativo: el kernel. + +Desde el lanzamiento de la primera versión de linux, cientos, miles, cientos de miles y millones de programadores se han puesto en la tarea de convertir a linux en un sistema operativo robusto, amigable y actualizado; tan pronto como se desarrolla una nueva pieza de hardware existen cientos de programadores trabajando en crear el soporte para linux. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/linuxhistory} \end{center} + \caption{Linux: Historia Fuente.}\label{linuxhistory} +\end{figure} + +\subsubsection{Porqué Linux} +Existen varias motivaciones para escoger Linux frente a un sistema oeprativo tradicional para sistemas embebidos \cite{KYJM+08}: + +\begin{itemize} + \item \textbf{Calidad Y confiabilidad del código}: Aunque estas medidas son subjetivas, miden el nivel de confianza en el código, que compromete software como el kernel y las aplicacione proporcionadas por las distribuciones. + \item \textbf{Disponibilidad de Código:} Todo el código fuente de las aplicaciones, del sistema operativo y de las herramientas de compilación se encuentran disponibles sin ninguna restricción. Existen varios tipos de licencias: la GNU General Public License (GPL). BSD (Berkeley Software Distribution), la cual permite la distribución de binarios sin el código fuente. + \item \textbf{Soporte de Hardware:} Linux soporta una gran variedad de dispositivos y plataformas, a pesar de que muchos fabricantes no proporcionan soporte para Linux, la comunidad trabaja arduamente en incluir el nuevo hardware en las nuevas distribuciones de Linux. Linux en la actualidad se puede ejecutar en docenas de diferentes arquitecturas hardware, lo cual lo convierte en el Sistema Operativo más portable. + \item \textbf{Protocolos de Comunicación y estándares de Software:} Linux proporciona muchos protocolos de comunicación, lo que permite su fácil integración a marcos de trabajo ya existentes. + \item \textbf{Disponibilidad de Herramientas:} La variedad de herramientas disponibles para Linux lo hacen muy versátil. Existen grandes comunidades como SourceForge\footnote{http://www.sourceforge.net} o Freshmeat \footnote{http://www.freshmeat.net} que permiten a miles de desrroladores compartir sus trabajos y es posible que en ellas se encuentre una aplicación que cumpla con sus necesidades. + \item \textbf{Soporte de la Comunidad:} Esta es la principal fortaleza de Linux. Millones de usuarios alrededor del mundo pueden encontrar errores en alguna aplicación y desarrolladores miembros de la cumonidad (en algunos casos los creadores de las aplicaciones) arreglarán este problema y difundirán su solución. El mejor sitio para hacer esto son las listas de correo de soporte y desarroll. + \item \textbf{Licencia:} Al crear una aplicación bajo alguna de las licencias usuales en Linux, no implica perder la porpiedad intelectual ni los derechos de autor la misma. + \item \textbf{Independencia del vendedor:} No existe solo un distribuidor del sistema operativo GNU-Linux, ya que las licencias de Linux garantizan igualdad a los distribuidores. Algunos vendedores poporcionan aplicaciones adicionales que no son libres y pro lo tanto no se encuentran disponibles con otros vendedores. Esto debe tenerse en cuenta en el momento de elegir la distribución a utilizar. + \item \textbf{Costo:} Muchas de las herramientas de deasrrollo y componentes de Linux son gratuitos, y no requieren el pago por ser incluidos en productos comerciales. +\end{itemize} + + +\subsection{Arquitectura de Linux \cite{IBSS98} \cite{IB98}} + +Linux (Linus' Minix) es un clon del sistema operativo Unix para PC con procesador Intel 386. Linux toma dos características muy importantes de Unix: es un sistema multitarea y multiusuario, lo cual fue implementado posteriormente por los sistemas operativos Windows y MacOS. Con estas características es posible ejecutar tareas de forma independiente, y transparente para el/los usuarios. + +Linux está compuesto por cinco sub-módulos \cite{IB98}: El programador (Scheduler), el manejador de memoria, el sistema de archivos virtual, la interfaz de red y la comunicación entre procesos (IPC). Tal como se ilustra en la figura \ref{linux_kernel}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.55]{./images/kernel} \end{center} + \caption{Estructura del kernel de linux }\label{linux_kernel} +\end{figure} + +Como puede observarse en la figura \ref{linux_kernel} el kernel de linux posee sub-módulos que son independientes de la arquitectura y otros que deben ser escritos para el procesador utilizado, esto hace que Linux sea un sistema operativo portable. En la actualidad existe una gran variedad de arquitecturas soportadas por linux, entre las que se encuentran: + +alpha arm26 frv i386 m32r m68knommu parisc ppc64 sh sparc um x86\_64 +arm cris h8300 ia64 m68k mips ppc s390 sh64 sparc64 v850 + +Las funciones de estos componentes se describen a continuación \cite{IBSS98}: + +\subsubsection*{Programador de procesos (Scheduler)} + +Es el corazón del sistema operativo linux. Esta encargado de realizar las siguientes tareas: +\begin{itemize} +\item Permitir a los procesos hacer copias de si mismos. +\item Determinar que procesos pueden acceder a la CPU y efectuar la transferencia entre los procesos en ejecución. +\item Recibir interrupciones y llevarlas al subsistema del kernel adecuado. +\item Enviar señales a los procesos de usuario. +\item Manejar el timer físico. +\item Liberar los recursos de los procesos, cuando estos finalizan su ejecución. +\end{itemize} + +El programador de procesos proporciona dos interfaces: Una limitada para los procesos de usuario y una interfaz amplia para el resto del kernel. El scheduler de Linux utiliza una interrupción del timer que se presenta cada 10 ms, por lo tanto, el cambio de estado del programador se realiza cada 10 ms. Esto debe ser tenido en cuenta a la hora de realizar procesos que manejen dispositivos hardware veloces. Un proceso puede estar en uno de los siguientes estados: + +\begin{itemize} +\item En ejecución. +\item Retornando de un llamado de sistema. +\item Procesando una rutina de interrupción. +\item Procesando un llamado del sistema. +\item Listo. +\item En espera. +\end{itemize} + + +\subsubsection*{Manejador de Memoria} + + +En el momento en que se energiza la CPU, esta solo ve 1-MB de memoria física (Incluyendo las ROMs). El código de inicialización del Sistema Operativo debe activar el modo protegido del procesador, de tal forma que la memoria Extendida (incluyendo la memoria de los dispositivos) sea accesible. Finalmente el OS habilita la memoria virtual para permitir la ilusión de un espacio de memoria de 4 GB. El manejador de memoria proporciona los siguientes servicios (ver figuras \ref{kernel_mapping} y \ref{app_mapping}): +\begin{itemize} +\item \textbf{Gran espacio de memoria}. Los procesos usuario, pueden referenciar más memoria que la existente físicamente. +\item \textbf{Protección} La memoria de un proceso es privada y no puede ser leída o modificada por + otro proceso. Adicionalmente evita que los procesos sobreescriban datos de solo + lectura. +\item \textbf{Mapeo de memoria} Los usuarios pueden mapear un archivo en un área de memoria virtual + y accesar el archivo como una memoria. +\item \textbf{Acceso transparente a la memoria física} esto asegura un buen desempeño del sistema. +\item \textbf{Memoria compartida} +\end{itemize} + +Al igual que el programador el manejador de memoria proporciona dos diferentes niveles de acceso a memoria el nivel de usuario y el de kernel. + +\begin{itemize} +\item Nivel de Usuario + \begin{itemize} + \item \textit{malloc() / free()}. Asigna o libera memoria para que sea utilizada por un proceso. + \item \textit{mmap() / munmap() / msync() /mremap()} Mapea archivos en regiones de memoria virtual. + \item \textit{mprotect} Cambia la protección sobre una región de una memoria virtual. + \item \textit{mlock() / mlockall() / munlock() / munlockall()} Rutinas que permiten al super + usuario prevenir el intercambio de memoria. + \item \textit{swapon() / swapoff()} Rutinas que le permiten al super-usuario agregar o eliminar + archivos swap en el sistema. + \end{itemize} +\item Nivel de kernel + \begin{itemize} + \item \textit{kmalloc() / kfree()} Asigna o libera memoria para que sea utilizada por estructuras de + datos del kernel. + \item \textit{verify\_area()} Verifica que una región de la memoria de usuario ha sido mapeada con + los permisos necesarios. + + \item \textit{get\_free\_page() / free\_page()} Asigna y libera páginas de memoria física. + \end{itemize} +\end{itemize} + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/kernel_memory_mapping} \end{center} + \caption{Mapeo de memoria del Kernel.}\label{kernel_mapping} +\end{figure} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/application_memory_mapping1} \end{center} + \caption{Mapeo de memoria para una aplicación}\label{app_mapping} +\end{figure} + + +\subsubsection*{Comunicación Entre Procesos (IPC)} + +El mecanismo IPC de Linux posibilita la ejecución \textit{concurrente} de procesos, permitiendo compartir recursos, la sincronización e intercambio de datos entre ellos. Linux proporciona los siguientes mecanismos: + +\begin{itemize} +\item \textbf{Señales} Mensajes asíncronos enviados a los procesos. +\item \textbf{Listas de espera} Proporciona mecanismos para colocar a dormir a los procesos mientras + esperan que una operación se complete, o un recurso se libere. +\item \textbf{Bloqueo de archivos} Permite a un proceso declarar una región de un archivo como solo + lectura para los demás procesos. +\item \textbf{Conductos (pipe)} Permite transferencias bi-direccionales entre dos procesos. +\item \textbf{System V} + \begin{itemize} + \item \textbf{Semáforos} Una implementación del modelo clásico del semáforo. + \item \textbf{Lista de Mensajes} Secuencia de bytes, con un tipo asociado, los mensajes son + escritos a una lista de mensajes y pueden obtenerse leyendo esta lista. + \item \textbf{Memoria Compartida} Mecanismo por medio del cual varios procesos tienen acceso a la + misma región de memoria física. + \end{itemize} +\item \textbf{Sockets del dominio Unix} Mecanismo de transferencia de datos orientada a la conexión. +\end{itemize} + + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + +\subsubsection*{Sistema de archivo virtual} +El sistema de archivos de linux cumple con las siguientes tareas: + +\begin{itemize} +\item \textbf{Controlar múltiples dispositivos hardware} +\item \textbf{Manejar sistemas de archivos lógicos} +\item \textbf{Soporta diferentes formatos ejecutables} Por ejemplo a.out, ELF, java) +\item \textbf{Homogeneidad} Proporciona una interfaz común a todos los dispositivos lógicos o físicos. +\item \textbf{Desempeño} +\item \textbf{Seguridad} +\item \textbf{Confiabilidad} +\end{itemize} + +\subsubsection{Drivers de Dispositivos} +La capa manejador de dispositivos es responsable de presentar una interfaz común a todos los dispositivos físicos. El kernel de Linux tiene 3 tipos de controladores de dispositivo: Caracter (acceso secuencial), bloque (acceso en múltiplos de tamaño de bloque) y red. Ejemplos de controladores secuenciales son el modem, el mouse; ejemplos de controladores tipo bloque son los dispositivos de almacenamiento masivo como discos duros, memorias SD. Los manejadores de dispositivos soportan las operaciones de archivo, y pueden ser tratados como tal. + +\subsubsection{Sistema de Archivos lógico} +Aunque es posible acceder a dispositivos físicos a través de un archivo de dispositivo, es común acceder a dispositivos tipo bloque utilizando un sistema de arcvhivos lógico, el que puede ser montado en un punto del sistema de archivos virtual. + +Para dar soporte al sistema de archivos virtual, Linux utiliza el concepto de \textit{inodes}. Linux usa un inode para representar un archivo sobre un dispositivo tipo bloque. El inode es virtual en el sentido que contiene operaciones que son implementadas diferentemente dependiendo de el sistema lógico y del sistema físico donde reside el archivo. La interfaz inode hace que todos los archivos se vean igual a otros subsistemas Linux. El inode se utiliza como una posición de almacenamiento para la información relacionada con un archivo abierto en el disco. El inode almacena los buffers asociados, la longitud total del archivo en bloques, y el mapeo entre el offset del archivo y los bloques del dispositivo. + +\subsubsection{Módulos} + +La mayor funcionalidad del sistema de archivos virtual se encuentra disponible en la forma de módulos cargados dinámicamente. Esta cconfiguración dinámica permite a los usuarios de Linux compilar un kernel tan pequeño como sea posible, mientras permite cargar el manejador del dispositivo y módulos del sistema de archivos si solo son necesarios durante una sesión. Esto es útil en el caso de los dispositivos que se pueden conectar en caliente, como por ejemplo un scanner, si tenemos el manejador del scanner cragado aún sin que este este conectado a nuestro equipo se esta desperdiciando la memoria asociada a dicho controlador. + + +\subsubsection*{Interfaces de Red} + +Este sistema proporciona conectividad entre máquinas, y un modelo de comunicación por sockets. Se proporcionan dos modelos de implementación de sockets: BSD e INET. Además, proporciona dos protocolos de transporte con diferentes modelos de comunicación y calidad de servicio: El poco confiable protocolo UDP (\textit{User Datagram Protocol}) y el confiable TCP (\textit{Transmission Control Protocol}), este último garantiza el envío de los datos y que los paquetes serán entregados en el mismo orden en que fueron enviados. Se proporcionan tres tipos diferentes de conexión: SLIP (Serial), PLIP (paralela) y ethernet. + + +\section{Portando Linux a la plataforma ECBOT y ECB\_AT91} +Como vimos anteriormente el kernel de Linux es el corazón del sistema operativo GNU/Linux y es el encargado de manejar directamente el Hardware asociado a una determinada plataforma, por lo tanto, es necesario que este sea capáz de manejar todos los periféricos asociados a esta y proporcione caminos para controlarlos. En esta sección se describirá el proceso que debe realizarse para hacer que Linux se ejecute de forma correcta en una plataforma y que permita controlar sus diferentes componentes hardware (este proceso recibe el nombre de \textit{Porting}). + +\subsection{El Kernel de Linux} +El código fuente se encuentra dividido entre el código específico a una arquitectura y el código común. El código específico de cada arquitectura lo encontramos en los subdirectorios \textit{arch} y \textit{include/asm-xxx}, en ellos podemos encuentrar los archivos para las arquitecturas: alpha, blackfin, h8300, m68k, parisc, s390, sparc, v850, arm, cris, ia64, m68knommu, powerpc, sh, sparc64, x86, +avr32, frv, m32r, mips, ppc, sh64, um, xtensa. A continuación se listan los directorios que hacen parte sdel código fuente de Linux. + +\begin{lstlisting} +arch fs lib net block +usr include crypto ipc scripts +Documentation mm security drivers kernel +sound +\end{lstlisting} + +Dentro de cada arquitectura soportada por Linux (\textit{arch/xxx/}) encontramos los siguientes directorios: +\begin{itemize} + \item \textbf{kernel} Código del núcleo del kernel. + \item \textbf{mm} Código para el manejo de memoria. + \item \textbf{lib} Librería de funciones internas, optimizadas para la arquitectura (backtrace, memcpy, funciones I/O, bit-twiddling etc); + \item \textbf{nwfpe} Implementaciones de punto flotante. + \item \textbf{boot} Sition donde reside la imágen del kernel una vez compilado, este directorio contiene herramientas para generar imágenes comprimidas. + \item \textbf{tools} Contiene scripts para la autogeneración de archivos, también contiene el archivo \textit{mach-types} que contiene la lista de las máquinas (plataformas) registradas. + \item \textbf{configs} Contiene el archivo de configuración para cada plataforma. +\end{itemize} + +Si deseamos dar soporte a una determinada plataforma debemos trabajar en el directorio que contiene la arquitectura del procesador a utilizar, en nuestro caso trabajaremos con la arquitectura \textit{arm}. En el código fuente de Linux se encuentran muchas plataformas que utilizan las diferentes architecturas, los archivos de configuración de estas pueden ser utilizados para crear una propia. En nuestro caso tomamos como referenica la plataforma \textit{Atmel AT91RM9200-EK} diseñada por ATMEL. Los archivos de configuración de esta plataforma se encuentra en: \textit{arch/arm/mach-at91/board-ek.c}; dentro de la arquitectura arm existen varias sub-arquitecturas que corresponden a las diferentes familias de SoC; El AT91RM9200 hace parte de la familia de SoCs AT91 de ATMEL. + +Existen dos formas en las que podemos adaptar nuestra plataforma al kernel de Linux, la primera es utilizando un archivo de configuración de una plataforma existente, y la otra es registrar la nuestra. Cada plataforma es identificada por un \textit{machine ID}, el primero paso en el proceso de \textit{port} es obter un ID, lo cuál se puede hacer en línea: \textit{http://www.arm.linux.org.uk/developer/machines/}, mientras que se asigna un nuevo número puede asignarse uno que no este utilizado en el archivo: \textit{arch/arm/tools/mach-types}. La entrada correspondiente a la familia de plataformas ECBACT91 es: + +\begin{lstlisting} +ecbat91 MACH_ECBAT91 ECBAT91 1072 +\end{lstlisting} + +Con este ID (o uno temporal) se debe crear la siguiente entrada en el archivo \textit{/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig}: + +\begin{lstlisting} +config MACH_ECBAT91 + bool "emQbit ECB_AT91 SBC" + depends on ARCH_AT91RM9200 + help + Select this if you are using emQbit's ECB_AT91 board. + +\end{lstlisting} + +La que permite seleccionar nuestra plataforma desde el programa de configuración de Linux\footnote{este programa se ejecuta con el comando: \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}}(Ver Figura \ref{ecb_at91_linux_config}) + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45]{./images/ecb_at91_linux_config} \end{center} + \caption{Herramienta de configuración de Linux mostrando la plataforma ECB\_AT91}\label{ecb_at91_linux_config} +\end{figure} + +Al seleccionar nuestra plataforma el programa de configuración creará un archivo de configuración \textit{.config \footnote{los archivos que comienzan con ``.'' están ocultos}} localizado en la raíz del código fuente, este archivo refleja las selecciones realizadas para configurar la imagen del kernel; en este caso específico se agragará la línea: + +\begin{lstlisting} +CONFIG_MACH_ECBAT91=y +\end{lstlisting} + +Como veremos más adelante, la aplicación encargada de cargar la imágen del kernel de Linux le pasa a este el número de identificación de la plataforma, si este número no es el mismo que el kernel tiene registrado se generará un error, para evitar esto debemos incluir las siguientes líneas en el archivo \textit{arch/arm/boot/compressed/head-at91rm9200.S} + +\begin{lstlisting} + @ emQbit ECB_AT91 : 1072 + mov r3, #(MACH_TYPE_ECBAT91 & 0xff) + orr r3, r3, #(MACH_TYPE_ECBAT91 & 0xff00) + cmp r7, r3 + beq 99f +\end{lstlisting} + +El archivo \textit{/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile} contiene una relación entre la plataforma seleccionada y el archivo de compilación a utilizar, por lo que debemos incluir las siguientes líneas: + +\begin{lstlisting} +obj-$(CONFIG_MACH_ECBAT91) += board-ecbat91.o +\end{lstlisting} + +Con esto asignamos el archivo de configuración \textit{board-ecbat91.c} a la plataforma \textit{MACH\_ECBAT91}. + +\subsubsection{Archivo de configuración de la plataforma ECB\_AT91 } +En esta sección realizaremos una descripción del archivo de configuración de la familia de plataformas \textit{ECB\_AT91} (\textit{board-ecbat91.c}) y se hará una explicación de cada uno de los parámetros de este archivo. + +Como todo archivo escrito en C al comienzo se declaran los encabezados que contienen las funciones utilizadas, en nuestro caso: + +\begin{lstlisting}[numbers=left] +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "generic.h" +#include + +#include +\end{lstlisting} + +Cada arquitectura (CPU) posee un archivo donde se declaran los diferentes periféricos que pueden ser utilizados: \textit{arch/arm/mach-at91/at91rm9200\_devices.c} en el caso del procesador AT91RM9200; En él podemos encontrar soporte para: USB Host, USB Device, Ethernet, Compact Flash / PCMCIA, MMC / SD, NAND / SmartMedia, TWI (i2c), SPI, Timer/Counter blocks, RTC, Watchdog, SSC -- Synchronous Serial Controller, UART. Este archivo además proporciona funciones que permiten incluir y configurar los diferentes controladores asociados al SoC, adicionalmente realiza las operaciones necesarias para poder utilizarlo, como por ejemplo, definir que el control de un determinado pin este a cargo del periférico. + +El primer dispositivo declarado en el archivo de configuración es el puerto serial (UART), este puerto es vital ya que es el único medio de comunicación que tenemos con nuestra plataforma. + +\begin{lstlisting} +static struct at91_uart_config __initdata ecb_at91uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 0, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; +\end{lstlisting} + +Los parámetros de configuración de la \textit{UART} se declaran utilizando la estructura \textit{at91\_uart\_config} declarada en el archivo \textit{include/asm-arm/arch/board.h}, la variable \textit{console\_tty} define el número del dispositivo \textit{tty} asociado a la consola serial, \textit{ttyS0} en nuestro caso, la variable \textit{nr\_tty} define el número de interfaces seriales disponibles \footnote{El AT91RM9200 tiene 4 USARTS y una UART para depuración}, \textit{ttyS0} y \textit{ttyS1} en nuestro caso; \textit{tty\_map} realiza la correspondencia entre los dispositivos \textit{tty} y las UART disponibles en el SoC, para este ejemplo asocia \textit{ttyS0} a la \textit{UART4} y \textit{ttyS1} a la \textit{UART0} + +\begin{lstlisting} +static void __init ecb_at91map_io(void) +{ + /* Initialize processor: 18.432 MHz crystal */ + at91rm9200_initialize(18432000, AT91RM9200_PQFP); + + /* Setup the LEDs */ + at91_init_leds(AT91_PIN_PB20, AT91_PIN_PB20); + + /* Setup the serial ports and console */ + at91_init_serial(&ecb_at91uart_config); +} +\end{lstlisting} + +La función \textit{at91rm9200\_initialize} declarada en \textit{arch/arm/mach-at91/at91rm9200.c} se encarga, como su nombre lo indica, de inicializar el procesador AT91RM9200, específicamente se encarga de configurar, el reloj interno del procesador (con la función \textit{at91\_clock\_init}), registra los Osciladores configurables PCK0 a PCK3 (utilizando la función \textit{at91rm9200\_register\_clocks}) y finalmente habilita el soporte para los pines de entrada/salida de propósito general \textit{GPIOs} (utilizando la función \textit{at91\_gpio\_init}). Adicionalmente informa que se está utilizando el empaquetado TQFP208 (Este chip viene en dos versiones TQFP y BGA). + +Las plataforma que carecen de un dispositivo de visualización como una pantalla, reflejan la actividad de procesos importantes en el estado de diodos emisores de luz LEDs, Linux permite visualizar la actividad de la CPU y el estado de un timer interno (\textit{at91\_init\_leds( cpu\_led, timer\_led)}). Nuestra plataforma utiliza un LED conectado al pin PB20 para estas indicaciones. + +La función \textit{at91\_init\_serial(\&ecb\_at91uart\_config)}, como su nombre lo indica inicializa las interfaces seriales utilizando como configuración la estructura \textit{at91\_init\_serial} explicada anteriormente. + +\begin{lstlisting} +static void __init ecb_at91init_irq(void) +{ + at91rm9200_init_interrupts(NULL); +} +\end{lstlisting} + +La función \textit{at91rm9200\_init\_interrupts} inicializa el Controlador de Interrupciones del AT91RM9200 y permite que estas sean atendidas. + +\begin{lstlisting} +static struct at91_usbh_data __initdata ecb_at91usbh_data = { + .ports = 1, +}; +\end{lstlisting} + +La estructra \textit{at91\_usbh\_data} fija el número de puertos USB host a 1 (El encapsulado TQFP solo tiene un puerto USB host, la versión BGA tiene 2). + +\begin{lstlisting} +static struct at91_mmc_data __initdata ecb_at91mmc_data = { + .slot_b = 0, + .wire4 = 1, +}; +\end{lstlisting} + +El SoC AT91RM9200 puede manejar dos memorias SD, la variable \textit{slot\_b} determina cual se usa, el slot a en nuestro caso; la variable \textit{wire4} selecciona el número de líneas de datos entre 1 y 4 (\textit{wire4 = 1}). + +\begin{lstlisting} +#if defined(CONFIG_MTD_DATAFLASH) +static struct mtd_partition __initdata my_flash0_partitions[] = +{ + { + .name = "Darrel-loader", / 0x0 + .offset = 0, + .size = 12* 1056, // 12672 bytes + }, + { + .name = "uboot", // 0x3180 + .offset = MTDPART_OFS_NXTBLK, + .size = 118 * 1056, + }, + { + .name = "kernel", // 0x21840 + .offset = MTDPART_OFS_NXTBLK, + .size = 1534 * 1056, /* 1619904 bytes */ + }, + { + .name = "filesystem", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL, + } +}; + +static struct flash_platform_data __initdata my_flash0_platform = { + .name = "Removable flash card", + .parts = my_flash0_partitions, + .nr_parts = ARRAY_SIZE(my_flash0_partitions) +}; +#endif +\end{lstlisting} + +Muchos dispositivos flash están divididos en secciones que reciben el nombre de particiones, similares a las particiones encontradas en un disco duro. El subsistema MTD proporciona soporte para estas particiones Flash, si esta función es seleccionada con la herramienta de configuración del kernel (CONFIG\_MTD\_DATAFLASH = y). La familia de plataformas ECB\_AT91 tiene un dispositivo DataFlash serial de 16 Mbits (2Mbytes), en la que creamos 4 particiones, en las que se almacenarán el loader, el u-boot, la imagen del kernel, y el sistema de archivos (En el dispositivo flash actual no hay suficiente espacio para este último). Cada partición se define con una estructura \textit{mtd\_partition} formada por 3 variables: \textit{name}, \textit{offset} (Dirección inicial de la partición) y .\textit{size}. + +\begin{lstlisting} + +static struct spi_board_info __initdata ecb_at91spi_devices[] = { + { /* DataFlash chip */ + .modalias = "mtd_dataflash", + .chip_select = 0, + .max_speed_hz = 10 * 1000 * 1000, + .bus_num = 0, + .platform_data = &my_flash0_platform, + }, + { /* User accessable spi - cs1 (250KHz) */ + .modalias = "spi-cs1", + .chip_select = 1, + .max_speed_hz = 250 * 1000, + }, + { /* User accessable spi - cs2 (1MHz) */ + .modalias = "spi-cs2", + .chip_select = 2, + .max_speed_hz = 1 * 1000 * 1000, + }, + { /* User accessable spi - cs3 (10MHz) */ + .modalias = "spi-cs3", + .chip_select = 3, + .max_speed_hz = 10 * 1000 * 1000, + }, +}; +\end{lstlisting} + +La estructura \textit{spi\_board\_info} define los dispositivos SPI conectados al SoC, esta formada por la variable \textit{modalias}, \textit{chip\_select} y \textit{max\_speed\_hz}. Nuestro dispositivo DataFlash se controla utilizando un puerto SPI, por esto se define la variable \textit{platform\_data = \&my\_flash0\_platform} + +\begin{lstlisting} +static void __init ecb_at91board_init(void) +{ + /* Serial */ + at91_add_device_serial(); + + /* USB Host */ + at91_add_device_usbh(&ecb_at91usbh_data); + + /* I2C */ + at91_add_device_i2c(NULL, 0); + + /* MMC */ + at91_add_device_mmc(0, &ecb_at91mmc_data); + + /* SPI */ + at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices)); + + /* Programmable Clock 1*/ + at91_set_B_periph(AT91_PIN_PA4, 0); +} +\end{lstlisting} + +Una vez configurados los periféricos utilizados en la plataforma debemos agregar estos dispositos, con las funciones correspondientes \textit{at91\_add\_device\_(serial, usbh, i2c, mmc, spi) } estas funciones hacen un llamado a la función \textit{platform\_device\_register} la que adiciona el dispositivo a nivel de plataforma. + +\begin{lstlisting} +MACHINE_START(ECBAT91, "emQbit's ECB_AT91") + /* Maintainer: emQbit.com */ + .phys_io = AT91_BASE_SYS, + .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, + .boot_params = AT91_SDRAM_BASE + 0x100, + .timer = &at91rm9200_timer, + .map_io = ecb_at91map_io, + .init_irq = ecb_at91init_irq, + .init_machine = ecb_at91board_init, +MACHINE_END\end{lstlisting} + +\subsubsection{Archivo de Configuración del kernel} +Finalmente debemos incluir un archivo de configuración para el kernel (\textit{arch/arm/configs/ecbat91\_defconfig}) el cual contiene la configuración inicial que cnfigura de forma correcta todos los periféricos de la plataforma. + +\subsection{Imagen del kernel} +En esta sección se realizará una descripción de los pasos necesarios para compilar la imágen del kernel de Linux para la familia de plataforma ECB\_AT91; después, se realizará un análisis de la imagen, indicando su composición. + +\subsubsection{Compilación de la Imágen del kernel} +En la sección anetrior vimos como dar soporte a nuestra plataforma, en esta sección describiremos el proceso de creación de la imágen del kernel. El primer paso obvio es obtener la imágen del kernel, la que obtenemos del sitio oficial \textit{ftp.kernel.org} + +\begin{lstlisting} +wget http://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.4.tar.bz2 +tar xjf linux-2.6.24.4.tar.bz2 +cd linux-2.6.24.4 +\end{lstlisting} + +A continuación descargargamos un parche que mantienen los desarrolladores de la familia de SoCs de ATMEL, este parche modifica algunos archivos de la distribución oficial de Linux para dar sopote completo y actualizado a los procesadores ATMEL. + +\begin{lstlisting} +wget http://maxim.org.za/AT91RM9200/2.6/2.6.24-at91.patch.gz +zcat 2.6.24-at91.patch.gz | patch -p1 +\end{lstlisting} + +Los cambios que se deben realizar en el código fuente, mencionados anteriormente fueron enviados a los encargados de mantener estas actualizaciones, por lo que no es necesario modificarlos para dar soporte a la familia de plataformas ECB\_AT91. + +Finalmente debemos compilar el kernel utilizando la cadena de herramientas GNU, el resultado de este tipo de compilaciones son ejecutables para una arquitectura ARM, este proceso recibe el nombre de compilación cruzada, debido a que da como resultado archivos que se ejecutan en una arquitectura diferente (ARM) a la que realizó el proceso de compilación (X86 en nuestro caso). Lo primero que debemos hacer es hacer visibles los ejecutables de la cadena de herramientas, esto se hace adicionando la ruta donde se encuentran instalados a la variable de entorno \textit{PATH}. + +\begin{lstlisting} +export export PATH=$PATH:/home/at91/arm-2007q1/bin/ +alias crossmake='make ARCH=arm CROSS_COMPILE=arm-none-eabi-' +\end{lstlisting} + +El alias \textit{crossmake} hace que cada vez que se escriba esta palabra el sistema lo reemplaze por \textit{make ARCH=arm CROSS\_COMPILE=arm-none-eabi-}, lo que ahorra tiempo al momento de pasar los parámetros a la herramienta make; estos parámetros son: + +\begin{enumerate} + \item \textit{ARCH=arm} Define la arquitectura \textit{arm}. + \item \textit{CROSS\_COMPILE=arm-none-eabi-} Indica que se realizará una compilación cruzada y que los ejecutables de la cadena de herramientas (\textit{gcc, c++, ld, objcopy, etc}) comienzan con el prefijo \textit{arm-none-eabi-} (por lo que el nombre del ejecutable del compilador de c es arm-none-eabi-gcc) +\end{enumerate} + +Una vez declaradas estas variables de entorno debemos generar el archivo oculto \textit{.config} \footnote{este archivo es utilizado por las herramientas de compilación para determinar que soporte fué incluido en el kernel} ejecutando el siguiente comando: + +\begin{lstlisting} + crossmake ecbat91_defconfig + o + make ARCH=arm CROSS_COMPILE=arm-none-eabi- ecbat91_defconfig +\end{lstlisting} + +A continuación se muestra una sección de este archivo: +\begin{lstlisting} +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.24.4 +# Sat Jul 25 11:39:07 2009 +# +CONFIG_ARM=y +..... +# +# AT91RM9200 Board Type +# +CONFIG_MACH_ECBAT91=y +..... +CONFIG_AEABI=y +..... +\end{lstlisting} + +Finalmente damos incio al proceso de compilación: + +\begin{lstlisting} + crossmake -j2 (o make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j2) +\end{lstlisting} + +Si no ocurre ningún error, al finalizar debemos observar lo siguiente: + +\begin{lstlisting} + LD vmlinux + SYSMAP System.map + SYSMAP .tmp_System.map + OBJCOPY arch/arm/boot/Image + Building modules, stage 2. + MODPOST 1 modules + Kernel: arch/arm/boot/Image is ready + AS arch/arm/boot/compressed/head.o + CC drivers/scsi/scsi_wait_scan.mod.o + GZIP arch/arm/boot/compressed/piggy.gz + LD [M] drivers/scsi/scsi_wait_scan.ko + CC arch/arm/boot/compressed/misc.o + AS arch/arm/boot/compressed/head-at91rm9200.o + AS arch/arm/boot/compressed/piggy.o + LD arch/arm/boot/compressed/vmlinux + OBJCOPY arch/arm/boot/zImage + Kernel: arch/arm/boot/zImage is ready +\end{lstlisting} + +y el contenido de los siguientes ditrectorios debe ser algo como: + +\begin{lstlisting} +$ ls arch/arm/boot/ +bootp compressed Image install.sh Makefile zImage + +$ ls vmlinux* +vmlinux vmlinux.o +\end{lstlisting} + +\subsubsection{Componentes de la Imágen del kernel} + +Como nuestro insterés en este punto es entender la estructura de la imágen del kernel podemos indicarle a nuestra herramienta de compilación que nos muestre más información del proceso, ejecutando el comando: + + +\begin{lstlisting} + crossmake -j2 V=1 +\end{lstlisting} + +Al finalizar el proceso de compilación obtenemos: + +\begin{lstlisting} +arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds + arch/arm/kernel/head.o arch/arm/kernel/init_task.o \ + init/built-in.o \ +--start-group \ + usr/built-in.o arch/arm/kernel/built-in.o \ + arch/arm/mm/built-in.o arch/arm/common/built-in.o \ + arch/arm/mach-at91/built-in.o arch/arm/nwfpe/built-in.o \ + kernel/built-in.o mm/built-in.o \ + fs/built-in.o ipc/built-in.o \ + security/built-in.o crypto/built-in.o \ + block/built-in.o arch/arm/lib/lib.a \ + lib/lib.a arch/arm/lib/built-in.o \ + lib/built-in.o drivers/built-in.o \ + sound/built-in.o net/built-in.o \ +--end-group \ +.tmp_kallsyms2.o + +\end{lstlisting} + + +En la primera línea de el listado anterior (\textit{arm-none-eabi-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds}) se realiza el proceso de enlace del archivo \textit{vmlinux}, utilizando el script de enlace \textit{vmlinux.lds}, incluyendo los objetos (archivos \textit{.o} indicados en la lista. Nótese que el primer archivo enlazado es \textit{head.o}, el cual se genera a partir de \textit{arch/arm/kernel/head.S}, y contiene rutinas de inicialización del kernel. Este proceso se explicará detalladamente más adelante. El siguiente objeto es \textit{init\_task.o}, el cual establece estructuras de datos e hilos que utilizará el kernel. A continuación se enlazan una serie de objetos con el nombre \textit{built-in.o}, la ruta del archivo indica la función que realiza el objeto, por ejemplo el objeto \textit{arch/arm/mm/built-in.o} realiza operaciones de manejo de memoria específicas a la arquitectura arm. En la Figura \ref{vmlinux_contents} se muestran los componentes de la imágen vmlinux y un tamaño de una compilación en particular que nos da una idea de la relación de tamaños. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/vmlinux_contents} \end{center} + \caption{Componentes de la Imagén del kernel de Linux vmlinux}\label{vmlinux_contents} +\end{figure} + +A continuación se realiza la descripción de los componentes de la imágen del kernel \textit{vmlinux}\cite{CH06} + + +\begin{enumerate} +\item \textbf{arch/arm/kernel/head.o} Código de inicialización del kernel dependiente de la arquitectura. +\item \textbf{init\_task.o} Hilos y estructuras inicialies utilizadas por el kernel. +\item \textbf{init/built-in.o} Código de inicialización del kernel. +\item \textbf{usr/built-in.o} Imágen interna \textit{initramfs}. +\item \textbf{arch/arm/kernel/built-in.o} Código del kernel específico de la arquitectura. +\item \textbf{arch/arm/mm/built-in.o} Código de manejo de memoria específico de la arquitectura. +\item \textbf{arch/arm/common/built-in.o} Código genérico especifico de la arquitectura. +\item \textbf{arch/arm/mach-at91/built-in.o} Código de inicialización específico de la plataforma. +\item \textbf{arch/arm/nwfpe/built-in.o} Emulación de punto flotánte específico de la arquitectura. +\item \textbf{kernel/built-in.o} Código de componentes comúnes del kernel. +\item \textbf{mm/built-in.o} Código de componentes comúnes de manejo de memoria. +\item \textbf{ipc/built-in.o} Comunicación Interproceso. +\item \textbf{security/built-in.o} Componentes de seguridad de Linux. +\item \textbf{lib/lib.a} Diferentes funciones auxiliares. +\item \textbf{arch/arm/lib/lib.a} Diferentes funciones auxiliares, específico de la aquitectura. +\item \textbf{lib/built-in.o} Funciones auxiliares comunes del kernel. +\item \textbf{drivers/built-in.o} Drivers internos o drivers no cargables. +\item \textbf{sound/built-in.o} Drivers de sonido. +\item \textbf{net/built-in.o} Red de Linux. +\item \textbf{.tmp\_kallsyms2.o} Tabla de símbolos. +\end{enumerate} + + +La imágen \textit{vmlinux} generada tiene un tamaño relativamente grande lo que la hace inconveniente para ser almacenada en un dispositivo Flash, por esta razón se acostrumbra comprimirla. A continuación describiremos el proceso que se realiza para crear una imágen compatible con \textit{u-boot}, el cargador de Linux más utilizado para las plataformas embebidas. El primer paso para es reducir el tamaño del ejecutable ELF \textit{vmlinux} es eliminar la información de depuración (notas y comentarios). + +\begin{lstlisting} +$ crossmake -j3 vmlinux (4.4MBytes) +$ arm-none-eabi-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin (3.4MBytes) +$ gzip -c -9 linux.bin > linux.bin.gz (1.6M) +\end{lstlisting} + +A continuación se comprime el archivo resultante utilizando la herramienta \textit{gzip}, como resultado obtenemos un archivo de 1.6M, la tercera parte del archivo original. + +\section{Inicialización del kernel} +Como se mencionó anteriormente, el SoC AT91RM9200, posee un programa residente en una pequeña ROM interna que revisa los controladores de memorias flash en busca de un programa válido. En la familia de plataforma ECB\_AT91 se utiliza la memoria DataFlash para almacenar: el bootloader, el loader de Linux (u-boot) y la imagen del kernel. La Figura \ref{boot_process} indica la secuencia de ejecución de aplicaciones cuando se energiza nuestra plataforma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/boot_process} \end{center} + \caption{Flujo de ejecución en la inicialización de plataforma ECB\_AT91}\label{boot_process} +\end{figure} + +La primera aplicación en ejecutarse es el loader de Darrel \footnote{Originalmente creado por Darrel Harmon: http://dlharmon.com/}. Debido a que la RAM interna del AT91RM9200 es de tan solo 16kBytes, es necesario utilizar otra aplicación para poder cargar el loader de Linux U-boot en la memoria SDRAM externa (con capacida de de 32Mbytes). Recordemos que incialmente el SoC no posee ninguna aplicación válida en la memoria DataFlash, por lo que el programa interno de inicialización dara comienzo a una comunicación Xmodem, para que se descargue una aplicación a la memoria RAM interna utilizando el puerto de depuración serial a una velocidad de 115200 baudios. + + +\subsection{Darrel's Loader} +Esta aplicación permite configurar la memoria externa SDRAM, configurar el puerto serie, implementar un protocolo xmodem que permita transferir aplicaciones a la memoria SDRAM, controlar la memoria DataFlash y almacenar aplicaciones en ella. El loader de Darrel está basado en u-boot, es una versión reducida de este y permite únicamente las operaciones mencioandas anteriormente, lo que resulta en un archivo adecuado para ser almacenado en la memoria RAM interna (9.3 kBytes). + +Es interesante analizar esta aplicación, ya que esta se ejecuta sin ningún soporte de sistema operativo, lo que lo hace interesante para plataformas en las que no se puede ejecutar Linux. Su código fuente lo podemos descargar utilizando el siguiente comando: + +\begin{lstlisting} +$svn co http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/darrell-loader/ +\end{lstlisting} + +La estructura del código fuente se muestra en el siguiente listado: +\begin{lstlisting} +|-- include +| |-- asm +| | |-- arch +| | |-- proc +| | `-- proc-armv +| `-- linux +| |-- byteorder +| `-- mtd +`-- src +\end{lstlisting} + +Antes de estudiar el código fuente demos un vistazo al archivo \textit{Makefile} para ver el proceso de compilación. De ella podemos extraer las partes más interesantes: Los objetos que hacen parte del ejecutable, el proceso de enlazado, y la creación del archivo a descargar en la plataforma: + +\begin{lstlisting} +AOBJS = src/start.o //ASSEMBLER OBJECTS +COBJS = src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +LDSCRIPT := u-boot.lds +LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) +OBJCFLAGS += --gap-fill=0xff +TEXT_BASE = 0x00000000 + +loader: $(AOBJS) $(COBJS) $(LDSCRIPT) + $(LD) $(LDFLAGS) $(AOBJS) $(COBJS) \ + --start-group $(PLATFORM_LIBS) --end-group \ + -Map loader.map -o loader + +loader.bin: loader + $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ +\end{lstlisting} + +Como podemos observar, esta aplicación esta compuesta por el código en ensamblador \textit{src/start.S} y el código en C \textit{src/board.c src/serial.c src/xmodem.c src/dataflash.c src/div0.c src/interrupts.c}. Para generar el ejecutable \textit{loader} (en formato ELF), encadenamos los objetos AOBJS y COBJS utilizando el script de enlazado \textit{u-boot.lds}. A continuación se muestra el comando ejecutado por las herramientas de compilación al crear el ejecutable \textit{loader} + +\begin{lstlisting} +arm-elf-ld -Bstatic -T u-boot.lds -Ttext 0x00000000 +src/start.o src/board.o src/serial.o src/xmodem.o src/dataflash.o src/div0.o src/interrupts.o +--start-group +--no-warn-mismatch -L /home/at91/gnutools/arm-elf/bin/../lib/gcc-lib/arm-elf/3.2.1 -lgcc +--end-group -Map loader.map +-o loader +\end{lstlisting} + + +A continuación se muestra el contenido del archivo \textit{u-boot.lds} +\begin{lstlisting} + OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + . = ALIGN(4); + .text : + { + src/start.o (.text) + *(.text) + } + + . = ALIGN(4); + .rodata : { *(.rodata) } + + . = ALIGN(4); + .data : { *(.data) } + + . = ALIGN(4); + .got : { *(.got) } + + . = ALIGN(4); + __bss_start = .; + .bss : { *(.bss) } + _end = .; +} +\end{lstlisting} + +Este archivo indica que la primera dirección del ejecutable es la 0x0 y que la primera instrucción en ejecutarse (definida por \textit{ENTRY}) se encuentra en el símbolo \textit{\_start} definida en el archivo \textit{start.S}; por otro lado, este script de enlazado nos informa que las secciones \textit{.text} \textit{.rodata} \textit{.data} \textit{.got} y \textit{.bss} serán incluidas en el ejecutable y se encuentran en la misma región de memoria (lo que era de esperarse ya que solo tenemos la memoria interna RAM). + +\subsubsection{crt0.S (startup.S)} +Cuando se crea un ejecutable para ser utilizado en una plataforma específica, es necesario incluir el archivo \textit{crt0.S (C runtime startup code)}. Este archivo contiene el punto de entrada \textit{\_start} y está encargado de las siguientes funciones: + +\begin{enumerate} + \item Inicilización de las pilas (\textit{stacks}). + \item Copiar el contenido de la sección \textit{.data} (datos inicializados) de la memoria no volátil. + \item Inicializar la sección \textit{.bss} + \item Hacer el llamado al punto de entrada \textit{main} ( \textit{start\_armboot} para el Darrel's loader) +\end{enumerate} + +Y esta compuesto por: +\begin{enumerate} +\item \textbf{\_vectors} Tabla de vectores de excepciones. Deben estar colocados en la dirección 0x0000. +\item \textbf{reset\_handler} Esta función maneja el reset , y es el punto de entrada principal de un ejecutable. Realiza operaciones de inicialización específica de la arquitectura. +\item \textbf{undef\_handler} Es el manejador de las instrucciones no definidas. +\item \textbf{swi\_handler} Manejador de las interrupciones software. +\item \textbf{pabort\_handler} Manejador de las excepciones \textit{prefetch abort}. +\item \textbf{dabort\_handler} Manejador de las excepciones \textit{data abort}. +\item \textbf{irq\_handler} Manejador de las IRQ (Interrupt Request). +\item \textbf{fiq\_handler} Manejador de las FIQ (Fast Iterrupt Request). +\end{enumerate} + +El archivo \textit{crt0.S} es escrito en languaje ensamblador, y es fuertemente dependiente de la arquitectura, solo programadores expertos con un muy buen conocimiento de la arquitectura podrían escribirlo; sin embargo, los fabricantes proporcionan ejemplos de este tipo de archivos para que pueden ser utilizados sin tener que estudiar profundamente la arquitectura y el lenguaje ensamblador de la misma. + +Una vez se han ejecutado las operaciones mendionadas anteriormente se hace un llamado al punto de entrada \textit{start\_armboot} (\textit{ldr pc,\_start\_armboot}) + +\subsubsection{serial.c, xmpdem.c, dataflash.c, div0.c, interrupts.c} +A continuación se realiza una descripción de los archivos que hacen parte del loader de Darrel: +\begin{itemize} + \item \textbf{serial.c}: Inicializa y configura el puerto serial de depuración (DBGU) a uan velocidad ed 115200 baudios, 8 bits de datos, paridad, par. Adicionalmente proporciona las funciones: + \begin{itemize} + \item \textit{putc}: Transmite un caracter por la interfaz serial de depuración. + \item \textit{puts}: Transmite una cadena de caracteres. + \item \textit{getc}: Recibe un caracter por la interfaz serial de depuración. + \end{itemize} + \item \textbf{xmodem.c}: Implementa la recepción serial utilizando elprotocolo xmodem. + \item \textbf{dataflash.c}: Inicializa el puerto SPI, y proporciona funciones de alto nivel para la escritura de la DataFlash. + \begin{itemize} + \item \textit{write\_dataflash(addr\_dest, addr\_src, size)} + \end{itemize} + + \item \textbf{div0.c}: Remplazo (dummy) del manejador división por cero de GNU/Linux. + \item \textbf{interrupts.c}: Proporciona funciones para el manejo de interrupciones e implementación de retardos. +\end{itemize} + +\subsubsection{board.c} +El archivo \textit{board.c} proporciona el punto de entrada \textit{start\_armboot} y realiza las siguientes operaciones: + +\begin{itemize} + \item Configuración del Controlador de manejo de potencia (PMC). + \item Hace un llamado a la incialización del puerto serie de depuración \textit{serial\_init()} + \item Configura la SDRAM externa \textit{try\_configure\_sdram} + \item Despliega un menú de funciones. + \item Realiza las operaciones del menú. +\end{itemize} + +Una vez se carga el archivo loader.bin, el que resulta de quitarle al archivo ELF la información de depuración y notas: + +\begin{lstlisting} +/home/at91/gnutools/arm-elf/bin/arm-elf-objcopy --gap-fill=0xff -O binary loader loader.bin +\end{lstlisting} + +El programa desplegará el siguiente menú: + +\begin{lstlisting} +Darrell's loader - Thanks to the u-boot project +Version 1.0. Build Jul 29 2007 12:04:04 +RAM:32MB + +1: Upload Darrell's loader to Dataflash +2: Upload u-boot to Dataflash +3: Upload Kernel to Dataflash +4: Start u-boot +5: Upload Filesystem image +6: Memory test +\end{lstlisting} + +La opción 1. del menú permite almacenar el archivo \textit{loader.bin} en la memoria DataFlash, una vez hecho esto, el programa de inicialización almacenado en la memoria ROM interna lo ejecutará cada vez que se reinicie la plataforma. + +Las opciones 2 y 3 son similares a la 1, solo que se cargan las aplicaciones en diferentes direcciones de memoria, observemos el código fuente que implementa estas opciones: + +\begin{lstlisting} + else if(key == '2'){ + puts("Please transfer u-boot.bin via Xmodem\n\0"); + len = rxmodem((char *)0x20000000); + AT91F_DataflashInit (); + dataflash_print_info (); + if(write_dataflash(DATAFLASH_UBOOT_BASE, 0x20000000, len)) + puts("Dataflash write successful\n"); + dispmenu = 1; + } +\end{lstlisting} + +Aca vemos como si se elije la opción 2, se despliega un mensaje indicandole al usuario que transmita el archivo \textit{u-boot.bin} utilizando el protocolo xmodem, después se ejecuta la función rxmodem la que recibe los datos por el serial y lo almacena en la SDRAM externa (dirección 0x20000000) y finalmente se almacena esta información en la dirección \textit{DATAFLASH\_UBOOT\_BASE}. + +La opción 4. del menú transfiere la ejecución +\begin{lstlisting} + else if(key == '4' || ((scans > 300000) && autoboot)){ + if(AT91F_DataflashInit ()){ + dataflash_print_info (); + if(read_dataflash(DATAFLASH_UBOOT_BASE, 0x1C000, (char *)0x20700000)){ + puts("Dataflash read successful: Starting U-boot\n"); + asm("ldr pc, =0x20700000"); + } + } + } +\end{lstlisting} +En esta opción se copian 0x1C000 bytes del contenido de la memoria DataFlash comenzando en la posición \textit{DATAFLASH\_UBOOT\_BASE} a la dirección de memoria 0x20700000 (SDRAM externa) y luego se carga el contador de programa con la dirección 0x20700000, con lo que se inicia la ejecución del programa almacenado en la DataFlash, es importante hacer notar que el programa debe ser enlazado para que las secciones estén en la posición de memoria donde serán ejecutadas (0x20700000), no en la dirección donde son almacenadas. + +\subsection{U-boot} +La opción número 4 del menú copia el programa u-boot almacenado en la DataFlash a la memoria SDRAM y comienza su ejecución, en esta sección se realizará una descrición del loader u-boot. + +U-boot es un \textit{bootloader} que permite cargar archivos utilizando una gran variedad de periféricos como: Puerto serie, Memoria SD, Memorias Flash Paraleas, seriales, NAND. NOR, Ethernet. Es capáz de iniciar una variedad de tipos de archivos, además de un formato especial propio; este último almacena información sobre el tipo de sistema operativo, la dirección de carga, el punto de entrada, verificación de integridad via CRC, tipos de compresión, y textos descriptivos. La siguiente información es desplegada cuando \textit{u-boot} se inicializa una imagen del kernel de linux. + +\begin{lstlisting} +## Booting image at c0021840 ... + Image Name: Linux Kernel Image + Image Type: ARM Linux Kernel Image (gzip compressed) + Data Size: 1550369 Bytes = 1.5 MB + Load Address: 20008000 + Entry Point: 20008000 + Verifying Checksum ... OK + Uncompressing Kernel Image ... OK +\end{lstlisting} + +Para crear una imágen con el formato \textit{U-boot} basta con ejecutar el siguiente comando: +\begin{lstlisting} +$ mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -n "Linux Kernel Image" \ +-d linux.bin.gz ecb_at91.img +\end{lstlisting} + +Acá definimos \textit{ARM} como arquitectura, \textit{linux} como sistema operativo, \textit{Kernel} como el tipo de imágen, \textit{gzip} el método de compresión, \textit{0x20008000} la dirección de carga y punto de entrada (son iguales para kernels superiores al 2.3.X) \textit{Linux Kernel Image} el nombre de la imágen \textit{linux.bin.gz} el archivo de entrada y \textit{ecb\_at91.img} el archivo de salida. Esta información es almacenada en el encabezado de la imágen y puede ser leido utilizando el comando: + +\begin{lstlisting} +$mkimage -l /home/at91/binaries/ecb_at91.img + +Image Name: Linux Kernel Image +Created: Fri Jun 26 09:26:03 2009 +Image Type: ARM Linux Kernel Image (gzip compressed) +Data Size: 1550369 Bytes = 1514.03 kB = 1.48 MB +Load Address: 0x20008000 +Entry Point: 0x20008000 +\end{lstlisting} + +El siguiente listado muestra la estructura del envabezado definida por \textit{u-boot}, en ella podemos obervar sus componentes y el tamaño de cada uno de ellos. + +\begin{lstlisting} +typedef struct image_header { + uint32_t ih_magic; /* Image Header Magic Number */ + uint32_t ih_hcrc; /* Image Header CRC Checksum */ + uint32_t ih_time; /* Image Creation Timestamp */ + uint32_t ih_size; /* Image Data Size */ + uint32_t ih_load; /* Data Load Address */ + uint32_t ih_ep; /* Entry Point Address */ + uint32_t ih_dcrc; /* Image Data CRC Checksum */ + uint8_t ih_os; /* Operating System */ + uint8_t ih_arch; /* CPU architecture */ + uint8_t ih_type; /* Image Type */ + uint8_t ih_comp; /* Compression Type */ + uint8_t ih_name[IH_NMLEN]; /* Image Name */ +} image_header_t; +\end{lstlisting} + + +\subsection{Portando U-boot a la familia de plataformas ECB\_AT91} +Es necesario modificar varios archivos para que \textit{u-boot} soporte la familia de plataformas ECB\_AT91: + +\subsubsection{Makefile} +Se le debe indicar a las herramientas de compilación la nueva plataforma, adicionando las siguientes líneas. + +\begin{lstlisting} +ecb_at91_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t ecb_at91 NULL at91rm9200 +\end{lstlisting} + +\subsubsection{MAKEALL} +Se debe agregar la siguiente entrada en el archivo MAKEALL: +\begin{lstlisting} + LIST_ARM9=" \ + ----- + at91rm9200dk cmc_pu2 ecb_at91 +\end{lstlisting} + +\subsubsection{board/ecb\_at91/Makefile} +En el directorio \textit{board/ecb\_at91} se alojan los archivos que dan soporte a la nueva arquitectura, el archivo de reglas de Configuración se muestra a continuación: + +\begin{lstlisting} + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).a + +COBJS := $(BOARD).o at45.o flash.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +clean: + rm -f $(SOBJS) $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak .depend + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk +sinclude $(obj).depend +\end{lstlisting} + +Este es el formato utilizado para todas las plataformas, la parte importante se encuentra en la definición de la variable \textit{COBJS}; en la que se incluyen los archivos \textit{ecb\_at91.o}: archivo de la plataforma \textit{at45.0}: soporte a las memorias DataFlash AT45 y \textit{flash.o}: soporte genérico para dispositivos flash\footnote{Estos archivos pueden ser descargados de: http://svn.arhuaco.org/svn/src/emqbit/ECB\_AT91\_V2/u-boot/u-boot-1.1.6-ecbat91.patch}. + +\subsubsection{board/ecb\_at91/board.c} +Este archivo contiene toda la configuración específica de la plataforma, y como se puede ver en el siguiente listado, fija el número de la plataforma a: MACH\_TYPE\_ECBAT91 (1072 definida en \textit{include/asm-arm/mach-types.h}) y los parámetros del boot en: \textit{PHYS\_SDRAM + 0x100;} (PHYS\_SDRAM = 0x20000000 está definido en \textit{include/configs/ecb\_at91.h}). Adicionalmente, inicializa la SDRAM, la interfaz de red y la memoria DataFlash. + +\begin{lstlisting} +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Miscelaneous platform dependant initialisations + */ + +void lowlevel_init(void) +{ + /* Required by assembly functions - do nothing */ +} + +int board_init (void) +{ + /* Enable Ctrlc */ + console_init_f (); + + /* arch number of ECB_AT91 board */ + gd->bd->bi_arch_number = MACH_TYPE_ECBAT91; + + /* adress of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + + return 0; +} + +int dram_init (void) +{ + gd->bd->bi_dram[0].start = PHYS_SDRAM; + gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; + return 0; +} + +#ifdef CONFIG_DRIVER_ETHER +#if (CONFIG_COMMANDS & CFG_CMD_NET) + +/* + * Name: + * at91rm9200_GetPhyInterface + * Description: + * Initialise the interface functions to the PHY + * Arguments: + * None + * Return value: + * None + */ + +void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops) +{ + p_phyops->Init = lxt972_InitPhy; + p_phyops->IsPhyConnected = lxt972_IsPhyConnected; + p_phyops->GetLinkSpeed = lxt972_GetLinkSpeed; + p_phyops->AutoNegotiate = lxt972_AutoNegotiate; +} + +#endif /* CONFIG_COMMANDS & CFG_CMD_NET */ +#endif /* CONFIG_DRIVER_ETHER */ + +#ifdef CONFIG_HAS_DATAFLASH +#include + +void AT91F_DataflashMapInit(void) +{ + static int cs[][CFG_MAX_DATAFLASH_BANKS] = { + /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, + }; + + static dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { + /*define the dataflash offsets*/ + {DATAFLASH_LOADER_BASE /* 0 */, DATAFLASH_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "Darrell loader"}, + {DATAFLASH_UBOOT_BASE, DATAFLASH_ENV_UBOOT_BASE - 1, + FLAG_PROTECT_SET, "U-boot"}, + {DATAFLASH_ENV_UBOOT_BASE, DATAFLASH_KERNEL_BASE - 1, + FLAG_PROTECT_CLEAR, "Environment"}, + {DATAFLASH_KERNEL_BASE, DATAFLASH_FILESYSTEM_BASE - 1, + FLAG_PROTECT_CLEAR, "Kernel"}, + {DATAFLASH_FILESYSTEM_BASE, 0x1fffff, FLAG_PROTECT_SET, "Filesystem"}, + }; + + AT91F_MapInit (cs, area_list); +} + +#endif +\end{lstlisting} + + +\subsubsection{include/configs/ecb\_at91.h} +Este archivo contiene variables que son utilizadas para la inicialización de la plataforma, algunas de estas ellas definen el valor de registros de configuración de periféricos como: El controlador del reloj del sistema, controlador de memorias SDRAM y memorias Flash. + +A continuación se muestra un segmento de este archivo, en el que se define la arquitectura: + +\begin{lstlisting} + +/* ARM asynchronous clock */ +#define AT91C_MAIN_CLOCK 180000000 +#define AT91C_MASTER_CLOCK 60000000 + +#define AT91_SLOW_CLOCK 32768 /* slow clock */ + +#define CONFIG_ARM920T 1 /* This is an ARM920T Core */ +#define CONFIG_AT91RM9200 1 /* It's an Atmel AT91RM9200 SoC */ +#define CONFIG_ECB_AT91 1 /* on an AT91RM9200DK Board */ +#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ +#define USE_920T_MMU 1 + +#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG 1 + +#ifndef CONFIG_SKIP_LOWLEVEL_INIT +#define CFG_LONGHELP +\end{lstlisting} + +Este archivo también incluye el valor predeterminado de las variables de entorno utilizadas por \textit{u-boot}: + +\begin{lstlisting} +#define CONFIG_BOOTARGS "mem=32M root=/dev/mmcblk0p1 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1" +#define CONFIG_ETHADDR 00:00:00:00:00:5b +#define CONFIG_NETMASK 255.255.255.0 +#define CONFIG_IPADDR 192.168.0.135 +#define CONFIG_SERVERIP 192.168.0.128 +#define CONFIG_BOOTDELAY 2 +#define CONFIG_BOOTCOMMAND "bootm C0021840" +#define CONFIG_BOOTFILE "ecb_at91.img" +#define CONFIG_ROOTPATH "/home/at91/rootfs" +#define CONFIG_LOADADDR 0x20200000 +\end{lstlisting} + +La variable \textit{bootargs} son parámetros pasados al kernel en su inicialización, y en este ejemplo fija la memoria RAM en 32 Mbytes, indica que el sistema de archivos se encuentra en el dispositivo \textit{/dev/mmcblk0p1} y utiliza el sistema de archivos \textit{ext3}, la consola es el dispositivo serial \textit{/dev/ttyS0} configurado a una velocidad de 115200 baudios, bit de paridad y 8 bits de datos y que debe esperar 1 segundo para montar el sistema de archivos. + +Las variables \textit{ethaddr, netmask, ipaddr, serverip} configuran la interfaz de red y las direcciones IP de la plataforma y de un servidor de donde puede descargarse la imágen del kernel. La variable \textit{bootdelay} fija el número de segundos que esperará u-boot para ejecutar el comando almacenado en \textit{bootcmd}, este conteo puede detenerse para interactuar con u-boot. El comando \textit{bootm C0021840 (bootcmd)} es utilizado para iniciar la imágen almacenada en la dirección de memoria 0xC0021840 (dirección donde almacena el loader de Darrel la imágen del kernel), \textit{bootm} utiliza la información almacenada en el encabezado de la imágen para utilizar el método de descompresión adecuado, almacenarlo en la dirección requerida y pasarle los parámetros almacenados en \textit{bootcmd}. + +\begin{lstlisting} +#define CONFIG_COMMANDS \ + ((CONFIG_CMD_DFL | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_DHCP ) & \ + ~(CFG_CMD_BDI | CFG_CMD_FPGA | CFG_CMD_MISC)) + +/* Remember that you must have the same mapping in the Darrell loader */ +#define NB_DATAFLASH_AREA 5 /* protected areas (4 + u-boot env) */ +#define DATAFLASH_MAX_PAGESIZE 1056 +#define DATAFLASH_LOADER_BASE (0*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_UBOOT_BASE (12*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_ENV_UBOOT_BASE (122*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_KERNEL_BASE (130*DATAFLASH_MAX_PAGESIZE) +#define DATAFLASH_FILESYSTEM_BASE (1664*DATAFLASH_MAX_PAGESIZE) + +\end{lstlisting} + +\subsubsection{Compilación de U-boot en la familia de plataformas ECB\_AT91} +A continuación se indican los pasos necesarios para generar el archivo \textit{u-boot.bin} que será almacenado en la memoria DataFlash por el loader de Darrel. + +El primer paso es obviamente descargar el código fuente de la versión 1.1.6 de \textit{http://sourceforge.net/projects/u-boot/}, después debemos descargar el patch que da soporte a la familia de plataformas ECB\_AT91: + +\begin{lstlisting} +$ wget http://svn.arhuaco.org/svn/src/emqbit/ECB_AT91_V2/u-boot/u-boot-1.1.6-ecbat91.patch +$ tar xjf u-boot-1.1.6.tar.bz2 +$ cd u-boot-1.1.6 +\end{lstlisting} + +Aplicamos el patch + +\begin{lstlisting} +$ cat ../u-boot-1.1.6-ecbat91.patch | patch -p1 +\end{lstlisting} + +Configuramos y generamos las herramientas utilizadas por \textit{u-boot} (entre ellas \textit{mkimage}). + +\begin{lstlisting} +$ make ecb_at91_config + Configuring for ecb_at91 board... (Este es un comentario) +$ make tools +\end{lstlisting} + +Por último compilamos \textit{u-boot}: + +\begin{lstlisting} +$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- +o +crossmake (si el alias crossmake está definido) +\end{lstlisting} + +Si el proceso se siguió correctamente y no se presentan errores al final del proceso obtenemos el mensaje: +\begin{lstlisting} + arm-none-eabi-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec + arm-none-eabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin +\end{lstlisting} +Lo que nos indica que se generó exitosamente el archivo \textit{u-boot.bin}, que puede ser descargado utilizando la opción 2 del menú del loader de Darrel (\textit{Upload u-boot to Dataflash}) y el protocolo xmodem. + +Podemos verificar que el archivo fué generado y almacenado en la Dataflash podemos ejecutar la opción número 4 del menú del loader de Darrel (\textit{Start u-boot}), como se mencionó anteriormente esta opción copia el archivo \textit{u-boot} desde la DataFlash a la memoria SDRAM y es ejecutado desde alli, con lo que se desplegará el siguiente mensaje: + +\begin{lstlisting} +Dataflash read successful: Starting U-boot +U-Boot 1.1.6 (Jul 29 2007 - 12:12:38) + +DRAM: 32 MB +Atmel: Flash: 0 kB +DataFlash:AT45DB161 +Nb pages: 4096 +Page Size: 528 +Size= 2162688 bytes +Logical address: 0xC0000000 +Area 0: C0000000 to C000317F (RO) Darrell loader +Area 1: C0003180 to C001F73F (RO) U-boot +Area 2: C001F740 to C002183F Environment +Area 3: C0021840 to C01ACFFF Kernel +Area 4: C01AD000 to C020FFFF (RO) Filesystem +In: serial +Out: serial +Err: serial +PHY not connected!! +Hit any key to stop autoboot: 2 +\end{lstlisting} + +Si se presiona cualquier tecla antes de que el contador llegue a \textit{0}, podemos interactuar con \textit{u-boot}, si ejecutamos el comando \textit{print} (Despliega en pantalla las variables de entorno definidas): + +\begin{lstlisting} +bootcmd=bootm C0021840 +bootdelay=2 +baudrate=115200 +ethaddr=00:00:00:00:00:5b +ipaddr=192.168.0.135 +serverip=192.168.0.128 +rootpath="/home/at91/rootfs" +netmask=255.255.255.0 +bootfile="ecb_at91.img" +loadaddr=0x20200000 +bootargs=mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1 +stdin=serial +stdout=serial +stderr=serial +Environment size: 345/8188 +\end{lstlisting} + +Podemos cambiar el valor predeterminado de la variable \textit{bootdelay} a \textit{1}: +\begin{lstlisting} +ecb_at91> setenv bootdelay 1 +\end{lstlisting} + +Y almacenamos los cambios realizados en una sección de la flash reservada para este fin con el comando: +\begin{lstlisting} +ecb_at91> save +Saving Environment to dataflash... +\end{lstlisting}s + +Podemos generar una nueva variable de entorno, almacenarla en la DataFlash +\begin{lstlisting} + +ecb_at91> setenv nfsargs=mem=32M console=ttyS0,115200n8 root=/dev/nfs nfsroot=192.168.0.128:/home +/at91/rootfs,timeo=200,retrans=500 ip=:::::eth0:on + +ecb_at91> save +\end{lstlisting} + + +\subsection{Almacenamiento de la imágen del kernel} +Una vez creada la imágen del kernel (\textit{ecb\_at91.img}) con el formato de \textit{U-boot} debemos probar su correcto funcionamiento; esto lo podemos hacer de dos formas: Almacenandola directamente en una memoria no volátil o cargándola en la memoria RAM y ejecutándola desde allí. + +\subsubsection{Almacenamiento en la memoria DataFlash} +Cuando almacenamos la imágen del kernel de Linux a un medio de almacenamiento no volátil, debemos tener presente que los ciclos de borrado y escritura de este toman un tiempo mucho mayor que en el caso de las memorias no volátiles, por esto, se recomienda esta opción cuando ya se cuente con una imágen estable o cuando no existan otros medios (como en el caso de la plataforma ECBOT). + +Inicialmente debemos ejecutar el loader de Darrel, esto se hace presionando el pulsador de \textit{Reset} disponible en todas las plataformas de la familia \textit{ECB\_AT91}. Inmediatamente después de observar el menú del loader debemos oprimir cualquier tecla para interrumpir la ejecución automática del \textit{u-boot}. + +Seleccionando la opción del menú: \textit{3: Upload linux to Dataflash}, podemos iniciar la transferencia de la imágen a la memoria SDRAM de nuestra plataforma: + +\begin{lstlisting} +Please transfer linux via Xmodem +Receiving Xmodem transfer +\end{lstlisting} + +Cuando aparezca este mensaje se debe transmitir el archivo \textit{ecb\_at91.img} utilizando el protocolo xmodem. Unos minutos después la transferencia finaliza, sin embargo, debemos esperar a que la información sea almacenada en la memoria DataFlash, mientras se completa la escritura la consola no mostrará ninguna actividad, eso es normal y no se debe reiniciar la board. Una vez finalizada la escritura observaremos el mensaje: +\begin{lstlisting} +%%%%%%%%%%%%%%%%%%%%% +\end{lstlisting} + +\subsubsection{Almacenamiento en la memoria RAM} +El proceso de grabación en la memoria DataFlash puede tomar alrededor de 6 minutos, lo que no lo hace conveniente cuando se está tratando de crear una imagen propia o se están realizando cambios a la misma. Cuando necesitamos modificar esta imágen ya sea porque queremos hacerlo nosotros mismos o porque deseamos una versión de kernel más moderna, es preferible utilizar un método de transferencia más rápido. + +La plataforma \textit{ECB\_AT91} posee una interfaz de red que puede ser controlada por \textit{u-boot}. Utilizando el protocolo \textit{tftp} \textit{U-boot} puede descargar la imágen desde un servidor a la memoria SDRAM y ejecutarla desde allí, ese proceso se realiza en segundos, facilitando de esta forma el proceso de desarrollo. A continuación se desciben los pasos que deben seguirse para realizar esta operación: + +Primero debemos instalar y configurar el servidor \textit{tftp} en el computador donde se tiene las herramientas de desarrollo: + +\begin{lstlisting} +$ aptitude install tftpd tftp. +\end{lstlisting} + +Se debe agregar la siguiente línea al archivo \textit{/etc/inetd.conf} +\begin{lstlisting} +tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp +\end{lstlisting} + +Debe asegurarse que el protocolo \textit{tftp} utiliza el puerto \textit{UDP} 69 + +\begin{lstlisting} +$ cat /etc/services | grep tftp +tftp 69/udp +\end{lstlisting} + +Ahora creamos el directorio \textit{/srv/tftp}\footnote{Este directorio tiene restricciones de seguridad, debe contactarse con el administrador de su equipo para permitir el acceso a él} y colocamos la imagen en él: +\begin{lstlisting} +$ mkdir /srv/tftp/ +$ chown myuser. /srv/tftp/ +$ cp ecb_at91.img /srv/tftp/ +\end{lstlisting} + +Para verificar la correcta configuración del servidor, podemos utilizar un cliente \textit{tftp}: + +\begin{lstlisting} +$ cd /tmp/ +$ tftp localhost # from the server +tftp> get ecb_at91.img +Received 1319525 bytes in 0.2 seconds +tftp> quit +\end{lstlisting} + +Ahora se deben configurar algunas variables de entorno en nuestra plataforma para indicarle a \textit{u-boot} la dirección \textit{IP}, el nombre y la ubicación de la imágen del kernel. Estas variables deben ser modificadas para que contengan los siguientes valores: + +\begin{lstlisting} +loadaddr=0x20200000 +bootdelay=1 +bootfile="ecb_at91.img" +fileaddr=20200000 +gatewayip=192.168.0.1 +netmask=255.255.255.0 +serverip=192.168.0.128 +\end{lstlisting} + +Estas variables fijan la dirección \textit{IP} de: la plataforma a \textit{192.168.0.2}, del gateway a \textit{192.168.0.1}, la del servidor \textit{tftp} a \textit{192.168.0.128\footnote{Dirección IP del PC donde están las herramientas de desarrollo}}. Adicionalmente define el nombre de la imágen del kernel a \textit{ecb\_at91.img}. Una vez configurado \textit{U-boot} podemos descargar la imágen a la dirección de memoria \textit{0x20200000}: + +\begin{lstlisting} +ecb_at91 >tftp +TFTP from server 192.168.0.1; our IP address is 192.168.0.2 +Filename 'ecb_at91.img'. +Load address: 0x20200000 +Loading: ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################ +done +Bytes transferred = 1409031 (158007 hex) +ecb_at91 > +\end{lstlisting} + + + +\subsection{Inicialización del Kernel} +En general los cargadores de Linux como el \textit{u-boot} realizan las siguientes funciones: + +\begin{itemize} +\item \textbf{Configurar e inicializar la RAM} +\item \textbf{Inicializar un puerto serial} +\item \textbf{Detectar el tipo de máquina:} El boot loader debe proporcionar un valor \textit{MACH\_TYPE\_XXX} al kernel, como vimos anteriormente tanto \textit{u-boot} como \textit{Linux} fijan este valor a 1072. +\item Configurar la \textit{kernel tagged list}: El boot loader debe crear e inicializar una estructura llamada \textit{kernel tagged list}, al cual comienza con \textit{ATAG\_CORE} y finaliza con \textit{ATAG\_NONE}. El tag \textit{ATAG\_CORE} puede o no estar desocupado, si se encuentra desocupado debe fijar el campo \textit{size} en '2'. El campo \textit{size} del tag \textit{ATAG\_NONE} debe fijarse en 0. Se pueden definir cualquier número de tags, pero se deben definir por lo menos el tamaño y la localización de la memoria del sistema, y la localización del sistema de archivos. Esta \textit{tagged list} debe ser almacenada en RAM, en una región que no pueda ser modificada por el descompresor del kernel o por el programa \textit{initrd}. Se recomienda colocarlo en los primeros 16kBytes de la RAM. + +\item Hacer un llamado a la imágen del kernel: Existen dos formas de hacer este llamado, directamente desde la flash o en en cualquier posición de la RAM. Los dos métodos deben cumplir las siguientes condiciones: + \begin{itemize} + \item Desactiva los dispositivos que tienen capacidad de DMA, de tal forma que la memoria no se corrompa. + \item Fijar los registros de la CPU: \textit{r0 = 0}, \textit{r1 = típo de máquina}, \textit{r2 = dirección física de la \textit{tagged list} en RAM.} + \item Modo de la CPU: Deshabilitar todas las interrupcione (IRQs y FIQs) y colocar a la CPU en modo SVC + \item Caches, MMU: Debe estar desactivada la MMU, La cache de instrucciónes puede estar activada o desactivada, la cache de datos debe estar desactivada. + \end{itemize} +\end{itemize} + + +\subsubsection{Llamado a la Imágen del kernel} + +Como mencionamos anteriormente, \textit{u-boot} ejecuta las instrucciones almacenadas en la variable de entorno \textit{bootcmd}; que para la familia de plataformas ECB\_AT91 almacena el comando \textit{bootm C0021840}, esta instrucción le indica a \textit{u-boot} que ejecute el comando \textit{bootm} con una imágen almacenada en la posición de memoria \textit{0xC0021840}, en la que (como mencionamos anteriormente (Figura \ref{boot_process})) se almacena la imágen del kernel. El código que implementa el comando \textit{bootm} se encuentra en el archivo \textit{common/cmd\_bootm.c}; analizando este archivo podemos descubrir el proceso que realiza \textit{u-boot} al hacer el llamado a la imágen del kernel (la que almacenamos utilizando la opción 3 del loader de Darrel). La función \textit{do\_bootm} realiza las siguientes operaciones: + +\begin{itemize} + \item Verificar la existencia de un número mágico en los primeros 4 bytes de la imágen (0x27051956). Si no se encuentra este número se desplegará el mensaje: \textit{Bad Magic Number} + \item Verifica la integridad del encabezado de la imágen. De no pasar esta prueba se mostrará el mensaje: \textit{Bad Header Checksum}. + \item Imprime el encabezado de la imágen, aparecerá algo como: + \item Cálcula el CRC del archivo almacenado y lo compara con el almacenado en la cabecera de la imágen. Si no se supera esta prueba, se desplegará el mensaje: \textit{Bad Data CRC} + \item Comprueba que la arquitectura está soportada por \textit{u-boot}. + \item Descomprime la imágen almacenada en la dirección \textit{load\_address} (la cual se pasa como parámetro en el momento de la creación de la imágen). + \item Transferir el control a Linux en la función \textit{do\_bootm\_linux}\textit{U-boot es un loader que permite trabajar con: LYNXOS, RTEMS, VXWORKS, QNX, ARTOS, NETBSD} +\end{itemize} + +La función \textit{do\_bootm\_linux} hace el llamado a la imagen del kernel utilizando el siguiente comando: +\begin{lstlisting} +(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); +\end{lstlisting} + +en donde: +\begin{itemize} + \item \textit{kbd} Información de la plataforma de desarrollo: +% \begin{itemize}\item + \begin{lstlisting} +typedef struct bd_info { + int bi_baudrate; /* serial baudrate */ + unsigned long bi_ip_addr; /* IP Address */ + unsigned char bi_enetaddr[6]; /* Ethernet adress */ + struct environment_s *bi_env; + ulong bi_arch_number; /* id for this board */ + ulong bi_boot_params; /* boot params */ + struct /* RAM configuration */ + { + ulong start; + ulong size; + } bi_dram[CONFIG_NR_DRAM_BANKS]; +} bd_t; \end{itemize} + \end{lstlisting} +% \end{itemize} + \item \textit{initrd\_start} - \textit{initrd\_end}: Linux permite que el sistema de archivos sea almacenado en la memoria RAM, el sistema es almacenado en algún medio no volátil y después es descomprimido en la RAM, esto acelera la ejecución ya que como se mencionó anteriormente, el acceso a las memorias volátiles es mucho menor. \textit{initrd\_start} - \textit{initrd\_end} indican el inicio y fin de este archivo + \item \textit{cmd\_start} - \textit{cmd\_end}: Posición de memoria donde se almacenan los parámetros pasados al kernel (\textit{mem=32M root=/dev/mmcblk0p2 rootfstype=ext3 console=ttyS0,115200n8 rootdelay=1}) +\end{itemize} +En este punto termina el trabajo de \textit{u-boot} y el control es pasado al kernel. Como pudimos darnos cuenta lo más atractivo de \textit{u-boot} es su capacidad para manejar diferentes dispositivos de almacenamiento no volátiles como Memorias Flash, memorias SD y su capacidad para manejar interfaces de red y permitir utilizarlas para al carga de imágenes del kernel. + +\subsubsection{Punto de Entrada del Kernel \textit{head.o}} +Como puede verse en \ref{vmlinux_contents} el primer archivo encadenado en la imágen del kernel es \textit{arch/arm/kernel/head.o}, y corresponde al punto de entrada del kernel de Linux, este archivo ejecuta las siguientes funciones: + +\begin{enumerate} + \item Verificar que la arquitectura y el procesador sean válidos. Si el procesador no es válido se generará un error y en la consola aparecerá una ``\textit{p}'', si la plataforma no corresponde se genera un error y se imprimirá una ``\textit{a}'' en la consola. + \item Se genera una estructura de datos (\textit{page table}) que almacena el mapeo entre las direcciones de memoria virtual y la memoria física. Antes de pasar el control al kernel, el procesador corre un un modo \textit{real}, en el que las direcciones corresponden a direcciones reales de los dispositivos conectados físicamente al procesador. + \item Activa la unidad de manejo de memoria (MMU) del procesador. Cuando se activa la MMU el esquema de memoria físico se remplaza por un direccionamiento virtual determinado por los desarrolladores del kernel. + \item Establece un limitado mecanismo de detección y reporte de errores. + \item Hace un llamado a la función \textit{start\_kernel} en \textit{init/main.c} +\end{enumerate} + + +\begin{lstlisting} + setup_arch(&command_line); + setup_command_line(command_line); + sched_init(); + preempt_disable(); + page_alloc_init(); + console_init(); + mem_init(); + kmem_cache_init(); + setup_per_cpu_pageset(); + numa_policy_init(); + calibrate_delay(); + pidmap_init(); + pgtable_cache_init(); + prio_tree_init(); + anon_vma_init(); + fork_init(num_physpages); + proc_caches_init(); + buffer_init(); + unnamed_dev_init(); + key_init(); + security_init(); + vfs_caches_init(num_physpages); + radix_tree_init(); + signals_init(); + + page_writeback_init(); + proc_root_init(); + cgroup_init(); + cpuset_init(); + taskstats_init_early(); + delayacct_init(); + acpi_early_init(); + schedule(); + preempt_disable(); +\end{lstlisting} + + +En los últimos pasos en el proceso de arranque de Linux, se libera la memoria que será utilizada por los procesos de inicialización, abre un dispositivo que permita la interacción con el usuario \textit{/dev/console} (consola serial en nuestro caso) y ejecuta el primer proceso en espacio de usuario \textit{init}. El siguiente listado muestra el código que implementa esta última fase del proceso de arranque. + +\begin{lstlisting} + static int noinline init_post(void) +{ + free_initmem(); + unlock_kernel(); + mark_rodata_ro(); + system_state = SYSTEM_RUNNING; + numa_default_policy(); + + if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) + printk(KERN_WARNING "Warning: unable to open an initial console.\n"); + + (void) sys_dup(0); + (void) sys_dup(0); + + if (ramdisk_execute_command) { + run_init_process(ramdisk_execute_command); + printk(KERN_WARNING "Failed to execute %s\n", + ramdisk_execute_command); + } + + /* + * We try each of these until one succeeds. + * + * The Bourne shell can be used instead of init if we are + * trying to recover a really broken machine. + */ + if (execute_command) { + run_init_process(execute_command); + printk(KERN_WARNING "Failed to execute %s. Attempting " + "defaults...\n", execute_command); + } + run_init_process("/sbin/init"); + run_init_process("/etc/init"); + run_init_process("/bin/init"); + run_init_process("/bin/sh"); + + panic("No init found. Try passing init= option to kernel."); +} +\end{lstlisting} + +Como podemos obsever el último páso consiste en el llamado a un archivo en espacio de usuario llamado \textit{init} o \textit{sh}, en la siguiente subsección se describirá las acciones que se realizan cuando se ejecuta este archivo. De no encontrarse se desplegará el mensaje \textit{No init found. Try passing init= option to kernel.} y la plataforma pasará a un estado de inactividad. + +\section{Inicialización del Sistema} +En esta sección describiremos el proceso de inicialización de la plataforma embebida, en la sección anterior se estudió la inicialización del kernel de Linux. En esta sección se realizará una descripción del sistema de archivos que contiene aplicaciones que Linux requiere para inicializar servicios como los de red y la consola, cargar drivers (\textit{módulos}) de dispositivos y montar sistemas de archivos adicionales. + +\subsection{Sistema de Archivos} +Anteriormente hemos hecho referencia a la localización de la raíz del sistema de archivos (\textit{root}), e indicamos que está se encuentra en una determinada memoria no volátil, estamos indicando donde se encuentra el nivel más alto del sistema de archivos, el cual se denota como \textit{``/''}. Existen varias opciones entre las que se encuentran: +\begin{itemize} + \item \textbf{Second Extended File System (ext2)} : Este sistema de archivos utiliza bloques como unidad de almacenamiento básico, inodes como medio para mentener un seguimiento de archivos y objetos de sistema, grupos de bloques para dividir lógicamente el disco en secciones más menejables, directorios para proporcionar una organización jerárquica de archivos, bloques y mapas de bits (\textit{bitmap}) de bloques e inodes para mantener un seguimiento de bloques e inodes asignados, y superbloques para definir los parámetros del sistema de archivos y su estado general. Adicionalmente posee la capacidad de crear enlaces simbólicos, un tipo especial de archivo que contiene la referencia a otro archivo o directorio. + + + \item \textbf{Third Extended File System (ext3)}: \textit{ext3} es una extensión del sistema de archivos \textit{ext2} con capacidades de \textit{journaling}. El \textit{Journaling} es utilizado para seguir cambios de archivos y tiene como propósito asegurar que las transacciones sean procesadas de forma adecuada; adicionalmente permite arreglar daños en el sistema de archivos originados por una falla en la fuente de alimentación de la plataforma. + + \item \textbf{ReiserFS}: Este sistema de archivos al igual que \textit{ext3} utiliza \textit{journaling}. Fué creado con el fín de aumentar el desempeño frente al sistema \textit{ext2}, es un sistema eficiente en espacio, y mejora el manejo de grandes directorios. + + \item \textbf{Journalling FIle FLash System 2 (JFFS2)}: Sistema creado para trabajar con dispositivos Flash, los cuales son utilizados ampliamente en aplicaciones embebidas. + + \item \textbf{Compresed ROM file system (cramfs)}: Sistema de solo lectura, es utilizado cuando se dispone de una pequeña memoria flash NOR. El máximo tamaño de cramfs es de 256MB. Los archivos en este sistema de archivos se encuentran comprimidos. + + \item \textbf{Network File System}: Permite montar particiones de disco o directorios de sistemas remotos como un sistema de archivos local, esto permite compartir recursos como unidades de CDs, DVDs u otro medio de almacenamiento masivo. Por otro lado, reduce el tiempo de desarrollo ya que no es necesario transferir archivos entre el sitio donde se encuentran las herramientas de desarrollo y la plataforma. + + \item \textbf{Pseudo File System} Este sistema de archivos es utilizado por Linux para representar el estado actual del kernel. Este sistema de archivos está montado en el directorio \textit{/proc}, y dentro de él podemos encontrar información detallada del hardware del sistema. Adicionalmente algunos archivos pueden ser manipulados para informar al kernel cambios en la configuración. Este sistema de archivos es virtual y es constantemente actualizado por el kernel. Los archivos \textit{/proc/cpuinfo}, \textit{/proc/interrupt}, \textit{/proc/devices}, \textit{/proc/mounts} Proporcionan información sobre los dispositivos Hardware de la plataforma +\end{itemize} + + +\subsubsection{Estructura del Sistema de Archivos} +Todas las distribuciones de linux se basan en el standard \textit{Filesystem Hierarchy Standard \footnote{}} utilizado en los sistemas operativos UNIX. Este standard permite que los programas y los usuarios conozcan de antemano la localización de los archivos instalados. Los siguientes directorios o links simbólicos son de uso obligatorio: + +\begin{enumerate} + + \item \textbf{bin} Ejecutables esenciales. + \item \textbf{boot} Archivos estáticos del boot loader. + \item \textbf{dev} Archivos de dispositivos. + \item \textbf{etc} Configuración específica del host. + \item \textbf{lib} Librerías esenciales y módulos de kernel. + \item \textbf{media} Punto de montaje para sispositivos removibles. + \item \textbf{mnt} Punto de montaje temporal. + \item \textbf{opt} + \item \textbf{sbin} Ejecutables esenciales del sistema. + \item \textbf{srv} Datos de servicios suministrados por el sistema. + \item \textbf{tmp} Archivos temporales. + \item \textbf{usr} Segunda jerarquía. + \item \textbf{var} Datos variables. +\end{enumerate} + +\subsection{Primer Programa en Espacio de Usuario \textit{init}} + +Como vimos anteriormente, la primera aplicación en espacio de usuario que ejecuta el kernel es \textit{/sbin/init}, todos los procesos que no sean del kernel son generados de forma directa o indirecta por él y es responsable de la inicialización de los scripts y terminales. Su papel más importante es generar procesos adicionales bajo la dirección de un archivo de configración especial \textit{/etc/inittab} + +\subsubsection{Modos de operación} +Existen dos modos de operación en Linux: Modo usuario simple y Multi-usuario, en el primero solo se activa una línea de comandos y el único usuario que puede utilizarla es el super-usuario \textit{root}; es utilizado para sistemas en mantenimiento y normalmente se le asigna el nivel de ejecución 1. En este nivel de ejecución, no existen procesos demonios\footnote{Proceso que se ejecuta de forma discreta sin intervención del usuario y es activado por la ocurrencia de una condición específica} en ejecución, y la interfaz de red no está configurada\cite{JF}. + +El modo multi-usuario es el modo normal de ejecución del sistema Linux, cuando Linux inicia en este modo se ejecutan los siguientes procesos: + +\begin{itemize} +\item Se revisa el estado del sistema de archivos con \textit{fsck}. +\item Se monta en sistema de archivos. +\item \textit{init} analiza el archivo \textit{/etc/inittab} y + \begin{itemize} + \item Determina el nivel de ejecución + \item Ejecuta los scripts asociados con este nivel de ejecución. + \end{itemize} +\item Inicializa los demonios. +\item Permite el acceso a usuarios. +\end{itemize} + +\subsubsection{Niveles de ejecución} +Un nivel de ejecución puede entenderse como un estado del sistema Hoy día, la mayoría de las distribuciones utilizan los siguientes niveles de ejecución\cite{JF}: +\begin{enumerate} + \item 0. Cierre o detención del sistema (\textit{halt}). + \item 1. Modo usuario simple para configuración del sistema y mantenimiento. + \item 2. Modo multi-usuario sin red remota. + \item 3. Modo multi-usuario con red. Este es el modo de operación normal de un usuario de un sistema sin capacidades gráficas. + \item 4. No utilizado - Definido por el usuario. + \item 5. Modo multi-usuario con interfáz gráfica. + \item 6. Re-inicialización del sistema (\textit{reboot}). +\end{enumerate} + +El nivel de ejecución pude ser cambiado por el super-usuario (\textit{root}) en cualquier momento utilizando el comando \textit{init n}, donde \textit{n} es el nivel de ejecución deseado. + +\subsubsection{El Archivo \textit{/etc/inittab}} +Como se mencionó anteriormente el programa \textit{init} está encargado de montar el sistema de archivos y de analizar el archivo \textit{/etc/inittab}. Este archivo contiene: + +\begin{itemize} + \item Una entrada para el nivel de ejecución por defecto. Nivel de ejecución en que inicia el sistema a menos que especifique otra cosa en el boot loader. + \item Entradas que deben ser ejecutadas en todos o en un específico nivel de ejecución, su sintáxis es: + \textit{id:runlevels:action:process [arguments]} + \begin{itemize} + \item \textit{id} Cualquier cosa. + \item \textit{runlevels} Puede ser un número o lista de números de 0 a 6. + \item \textit{action} Acción a tomar: + \begin{itemize} + \item \textit{respawn} El proceso debe ser re-iniciado una vez finalice. + \item \textit{wait start} Ejecuta el proceso cuando se ingresa al nivel de ejecución y espera por su terminación. + \item \textit{bootwait} El proceso debe ser ejecutado durante la incialización del sistema. + \item \textit{initdefault} Especifica el nivel de ejecución al que se ingresa después de la inicialización del sistema. + \item \textit{sysinit} El proceso debe ejecutarse durante la inicialización del sistema. Debe ejecutarse antes de cualquier entrada \textit{boot} o \textit{bootinit} + \end{itemize} + \item \textit{process} Programa o script a ser ejecutado. + \end{itemize} +\end{itemize} +En el siguiente listado se muestra un archivo \textit{inittab} típico: + +\begin{lstlisting} +# The default runlevel. +id:5:initdefault: + +# Boot-time system configuration/initialization script. +# This is run first except when booting in emergency (-b) mode. +si::sysinit:/etc/init.d/rcS + +# What to do in single-user mode. +~~:S:wait:/sbin/sulogin + +# /etc/init.d executes the S and K scripts upon change +# of runlevel. + +l0:0:wait:/etc/init.d/rc 0 +l1:1:wait:/etc/init.d/rc 1 +l2:2:wait:/etc/init.d/rc 2 +l3:3:wait:/etc/init.d/rc 3 +l4:4:wait:/etc/init.d/rc 4 +l5:5:wait:/etc/init.d/rc 5 +l6:6:wait:/etc/init.d/rc 6 +# Normally not reached, but fallthrough in case of emergency. +z6:6:respawn:/sbin/sulogin +S:2345:respawn:/sbin/getty 115200 ttyS0 +# /sbin/getty invocations for the runlevels. + +1:2345:respawn:/sbin/getty 38400 tty1 +\end{lstlisting} + +En este archivo se define el nivel de ejecución 5 como el nivel por defecto. El primer script en ejecutarse es \textit{/etc/init.d/rcS} (ya que su acción es del tipo \textit{sysinit}). Luego se ingresa al nivel de ejecución 5 y se ejecuta el script \textit{/etc/init.d/rc} pasándole el argumento ``5'' y espera hasta que el script se complete. \textit{/etc/init.d/rc} ejecuta los scripts localizados en directorios individuales para cada nivel: \textit{/etc/rcX.d} (X un entero de 0 a 6); el nombre de los archivos localizados en estos directorios deben comenzar con el caracter ``\textbf{S}'' (para iniciar procesos) o ``\textbf{K}'' (para ``matar'' procesos), y dos caracteres numéricos: \textit{S[0-9][0-9]}, \textit{S[0-9][0-9]}. Un script típico de inicialización del demonio del servidor web \textit{cherokee} se muestra en el siguiente listado (\textit{/etc/rc5.d/S91cherokee}): + +\begin{lstlisting} +#!/bin/sh +DAEMON=/usr/sbin/cherokee +CONFIG=/etc/cherokee/cherokee.conf +PIDFILE=/var/run/cherokee.pid +NAME="cherokee" +DESC="Cherokee http server" + +test -r /etc/default/cherokee && . /etc/default/cherokee +test -x "$DAEMON" || exit 0 +test ! -r "$CONFIG" && exit 0 + +case "$1" in + start) + echo "Starting $DESC: " + start-stop-daemon --oknodo -S -x $DAEMON -- -b -C $CONFIG + ;; + + stop) + echo "Stopping $DESC:" + start-stop-daemon -K -p $PIDFILE + ;; + + restart) + $0 stop >/dev/null 2>&1 + $0 start + ;; + + *) + echo "Usage: $0 {start|stop|restart}" + exit 0 + ;; +esac +\end{lstlisting} + +Como podemos ver existen tres parámetros que podemos pasar al script: \textit{start}, \textit{stop} y \textit{restart}, cuyas acciones son iniciar, detener y reiniciar el demonio respectivamente. El directorio \textit{/etc/init.d} contiene todos los scripts utilizados en los diferentes niveles de ejecución, el nombre de ellos en este directorio no incluyen los caracteres \textit{S[0-9][0-9]} o \textit{K[0-9][0-9]}. + +La línea \textit{S:2345:respawn:/sbin/getty 115200 ttyS0} inicia una consola por el puerto serial \textit{/dev/ttyS0} con una velocidad de 9200 baudios, cuando el nivel de ejecucion sea 2, 3, 4 o 5. Finalmente se crea una terminal virtual para los niveles de ejecución multi-usuario. + +Cuando el super-usuario cambia el nivel de ejecución con el comando \textit{init}, los procesos únicos al nievel anterior son terminados y los procesos únicos del nuevo nivel son iniciados. + +\subsection{Distribuciones Linux} +Aunque es posible construir el sistema de atchivos nosotros mismos, no es nada práctico ya que es una tarea tediosa que requiere cierto nivel de experiencia. En la actualidad, existen varias distribuciones que realizan estas tareas por nosotros, dentro de las más utilizadas se encuentran: + +\subsubsection{Busybox} +Diseñado para optimizar el tamaño y rendimiento de aplicaciones embebidas, BusyBox \footnote{http://www.busybox.net/} combina en un solo ejecutable más de 70 utilidades estándares UNIX, en sus versiones ligeras. BusyBox es considerada la navaja suiza de los sistema embebidos, dado que permite sustituir la gran mayoría de utilidades que se suelen localizar en los paquetes GNU fileutils, shellutils, findutils, textutils, modutils, grep, gzip, tar, etc. + +Busybox hace parte de la mayoría de distribuciones de Linux para sistemas embebidos y en la actualidad proporciona las siguientes funciones: + +\textit{ +addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bunzip2, busybox, bzcat, cal, cat, chgrp, +chmod, chown, chroot, chvt, clear, cmp, cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, +deluser, df, dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, egrep, env, expr, +false, fbset, fdflush, fdisk, fgrep, find, fold, free, freeramdisk, fsck.minix, ftpget, ftpput, getopt, +getty, grep, gunzip, gzip, halt, head, hexdump, hostid, hostname, httpd, hwclock, id, ifconfig, ifdown, +ifup, init, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall, klogd, last, length, linuxrc, ln, +loadfont, loadkmap, logger, login, logname, logread, losetup, ls, makedevs, md5sum, mesg, mkdir, mkfifo, +mkfs.minix, mknod, mkswap, mktemp, more, mount, mt, mv, nameif, nc, netstat, nslookup, od, openvt, passwd, + patch, pidof, ping, ping6, pivot\_root, poweroff, printf, ps, pwd, rdate, readlink, realpath, reboot, + renice, reset, rm, rmdir, route, rpm, rpm2cpio, run-parts, sed, setkeycodes, sh, sha1sum, sleep, sort, + start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync, syslogd, tail, tar, tee, telnet, + telnetd, test, tftp, time, top, touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname, + uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode, vi, vlock, watch, watchdog, wc, +wget, which, who, whoami, xargs, yes, zcat}. + +\subsubsection{Buildroot} +Buildroot\footnote{http://buildroot.uclibc.org/} Es un grupo de \textit{Makefiles} y \textit{patches} que facilita la generación de la cadena de herramientas y el sistema de archivos para un sistema embebido que usa Linux. Posee una interfaz que permite realizar de forma fácil la configuración; utiliza busybox para generar la utilidades básicas de Linux y permite adaptar software adicional de forma fácil \footnote{http://buildroot.uclibc.org/buildroot.html\#add\_software}. + +\subsubsection{Openembedded} +Al igual que Buildroot, el proyecto openembedded proporciona un entorno que permite generar la cadena de herramientas y el sistema de atchivos para un sistema embebido, utiliza busybox y permite la creación de archivos que permiten compilar software que no se incluya en la distribución original. Adicionalmente openembedded crea archivos de instalación con un formato derivado del proyecto \textit{handhelds} \footnote{http://handhelds.org} \textit{ipk}, lo que permite la instalación de paquetes de forma similar a la distribución debian. + +La información necesaria para generar una distribución utilizando las herramientas de Openembedded se encuentra en http://www.emqbit.com/mediawiki/index.php/Main\_Page/ecb\_at91/OE. + +\section{Módulos del kernel} +Los módulos son pequeñas piezas de código que pueden ser cargadas y descargadas en el kernel en el momento que sea necesario. Ellos extienden la funcionalidad del kernel, sin la necesidad de reiniciar el sistema y recompilar el kernel. Por ejemplo, un tipo de módulo es el controlador de dispositivo, el cual permite al kernel acceder a un dispositivo hardware conectado al sistema. Este tipo de módulos serán estudiados en esta sección. + +Existen tres tipos de dispositivos en Linux \cite{JCAR05}: + +\begin{itemize} +\item Tipo Caracter: Puede accederse de forma similar a un archivo; este tipo de dispositivos permite por lo menos las operaciones \textit{open}, \textit{close}, \textit{read}. Ejemplos de este tipo de dispositivo son el puerto serie (\textit{/dev/ttyS0}) y la consola (\textit{/dev/console}) +\item Tipo Bloque: Este tipo de dispositivo puede hospedar un sistema de archivos; normalmente realiza operaciónes de bloques de datos únicamente; un ejemplo de este tipo de dispositivo es el disco duro (\textit{/dev/hda}). +\item Red: Toda transacción de red se realiza a través de una interfaz, esto es, un dispositivo hardware (\textit{/dev/eth0}) o software (\textit{loopback}) capaz de intercambiar datos con otros hosts. +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/kernel_module} \end{center} + \caption{ Interacción entre el área de usuario y el driver del dispositivo. Fuente: \cite{Mo05}}\label{kernel_module} +\end{figure} + + +\subsection{Ejemplo de un driver tipo caracter} + +Recuerde que una aplicación en el área de usario, no puede acceder directamente al área del kernel; los dispositivos se acceden a través de archivos de dispositivos, localizados en \textit{/dev} (ver figura \ref{kernel_module}), A continuación se muestra la salida del comando \textit{ls -l /dev/} + +\begin{lstlisting} +brw-rw---- 1 root disk 3, 0 Nov 27 hda +brw-rw---- 1 root disk 3, 1 Nov 27 hda1 +brw-rw---- 1 root disk 3, 2 Nov 27 hda2 +crw-rw---- 1 root uucp 4, 64 Nov 27 ttyS0 +crw-rw---- 1 root uucp 4, 65 Nov 27 ttyS1 +\end{lstlisting} + + +Los archivos tipo caracter están identificados por una \textit{``c''} en la primera columna, mientras que los dispositivos tipo bloque por una \textit{``b''}. Podemos observar que existen dos números (5ta y 6ta columna) que identifican al driver, el número de la 5ta columna recibe el nombre de \textit{major number} y el de la sexta \textit{minor number}; estos números son utilizados por el sistema operativo para determinar el dispositivo y el driver que deben ser accesados ante una solicitud a nivel de usuario. + +El \textit{major number} identifica la clase o grupo del dispositivo, mientras que el \textit{minor number} se utiliza para identificar sub-dispositivos (Ver Figura \ref{major}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.5]{./images/major} \end{center} + \caption{ \textit{major} y \textit{minor} footnote{http://uw713doc.sco.com/en/HDK\_concepts/ddT\_majmin.html} }\label{kernel_module} +\end{figure} + +El kernel de linux permite que los drivers compartan el número mayor, como el caso del disco duro, hda posee dos particiones hda1 y hda2, las cuales son manejadas por el mismo driver, pero se asigna un número menor único a cada una; lo mismo sucede con el puerto serie. + +\subsubsection{Implementación del driver de un LED} +A continuación se realizará la descripción de un driver tipo caracter para un dispositivo muy sencillo, un LED \cite{OPPS05}. Este ejemplo fue implementado en un procesador PXA255 de Intel y realiza las siguientes operaciones: + +\begin{itemize} +\item \textit{init}: Se ejecuta cuando se carga el módulo, el LED se apagará. +\item \textit{close}: Se ejecuta cuando se descarga el módulo, el LED se encenderá. +\item \textit{open}: Se ejecuta cuando se realiza una operación de lectura o escritura al dispositivo. +\end{itemize} + +Existen dos funciones que deben estar presentes en todo tipo de módulo, estas son: \textit{module\_init} y \textit{module\_exit} las cuales se ejecutan cuando se carga y descarga el módulo respectivamente. + +\begin{lstlisting}[firstnumber=40] +struct file_operations fops = { + .open = device_open, + .release = device_release, +}; + +static int __init blink_init(void) +{ + printk(KERN_INFO "BLINK module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + printk(KERN_ALERT "Registering char device failed + with %d\n", Major); + return Major; + } + + printk(KERN_ALERT "I was assigned major number %d. + To talk to\n", Major); + printk(KERN_ALERT "the driver, create a dev file + with\n"); + printk(KERN_ALERT "'mknod /dev/%s c %d 0'.\n", + DEVICE_NAME, Major); + + pxa_gpio_mode(GPIO_LED_MD); + pxa_gpio_mode(GPIO_LED_OFF); /* Turn LED OFF*/ + + return 0; +} + + +static void __exit blink_exit(void) +{ + int ret; + + ret = unregister_chrdev(Major, DEVICE_NAME); + if ( ret < 0 ) + printk( KERN_ALERT "Error in unregister_chrdev: + %d\n", ret ); + printk( KERN_INFO "BLINK driver is down...\n" ); +} + + +module_init(blink_init); +module_exit(blink_exit); + + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Carlos Camargo UNAL"); +MODULE_DESCRIPTION("BLINKER LED driver"); +MODULE_VERSION("1:0.1"); +\end{lstlisting} \normalsize + +Las funciones \textit{module\_init} \textit{module\_exit} deben ser declaradas como \textit{static} ya que no serán visibles fuera del archivo. Como puede observarse en la línea 83 se hace la definición de las funciones que deben ejecutarse al cargar y descargar el módulo en nuestro caso \textit{blink\_init} y \textit{blink\_exit} respectivamente. La información sobre el módulo aparece en las líneas 87-90. + +En la línea 40 se define la estructura de operaciones de archivo del módulo; cada campo de la estructura corresponde a la dirección de una función definida por el driver para manejar una solicitud determinada. En nuestro caso solo existe una función \textit{open}, la cual será definida más adelante. + +Como se puede ver en la figura \ref{kernel_module} es necesario que el kernel sepa que driver está encargado del dispositivo, esto es, el \textit{major number} del driver que lo maneja; por esto, lo primero que se debe hacer es obtener este número. En la función \textit{blink\_init} (línea 49) podemos observar la forma en que se realiza el registro de nuestro dispositivo. La función \textit{register\_chrdev} retorna el número mayor asignado de forma dinámica, esto es recomendable ya que si se fijara un número de forma arbitaria, podría causar conflictos con otros dispositivos. De esta forma, al cargar el módulo con el comando: \textit{insmod blinker.ko}, el LED se apagará y aparecerá el siguiente mensaje en la consola: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK module is Up. +I was assigned major number 253. To talk to +the driver, create a dev file with +'mknod /dev/blink c 253 0'. +\end{lstlisting} + +Con lo anterior, nuestro dispositivo es registrado y se le asigna el número 253 como \textit{major number}, en el archivo \textit{/proc/devices} aparecen los dispositivos que actualmente están siendo utilizados por el kernel, este archivo debe contener una entrada para blink de la forma: \textit{253 blink}. + +En la función \textit{blink\_exit} se realiza la liberación del dispositivo ( la función \textit{unregister\_chrdev}, línea 75), la cual se ejecuta cuando se lanza el comando: \textit{rmmod blinker.ko}, el que a su vez hace que se encienda el LED y se imprima en la consola el mensaje: + +\footnotesize +\begin{lstlisting}[numbers=none] +BLINK driver is down... +\end{lstlisting} + +Como se mencionó anteriormente es posible manejar un archivo tipo caracter como si fuera un archivo de texto, por lo tanto, es posible adicionar funciones a las acciones de abrir, cerrar, escribir en o leer del dispositivo. + +\begin{lstlisting}[firstnumber=20, numbers=right] +static int device_open(struct inode *inode, \ + struct file *file) +{ + unsigned int i; + printk( KERN_INFO "Open BLINKER\n" ); + if (is_device_open) + return -EBUSY; + + is_device_open = 1; + + for( i=0; i<5; i++ ){ + pxa_gpio_mode(GPIO_LED_ON); + mdelay(0x0080); + pxa_gpio_mode(GPIO_LED_OFF); + mdelay(0x0080); + } + + try_module_get(THIS_MODULE); + return SUCCESS; +} +\end{lstlisting} + +Esta sección de código se ejecuta cada vez que el archivo de dispositivo /dev/blink es abierto, esto sucede en operaciones de lectura o escritura. Es decir si se utilizan los siguientes comandos: + +\begin{lstlisting}[numbers=none] +more /dev/blink +cat file > /dev/blink +cp file /dev/blink +\end{lstlisting} + +Con cada uno de estos comandos el LED se encenderá y apagará y en la consola se despliega el mensaje: + +\begin{lstlisting}[numbers=none] +Open BLINKER +Close BLINKER +\end{lstlisting} + +\section{Interfaz con Periféricos dedicados} +Es común que algunas aplicaciones requieran ciertos periféricos especiales que les permitan cumplir las restricciones temporales, es decir, es necesario crear tareas Hardware que ayuden a las tareas software a cumplir con las restricciones de diseño. Para esto es necesario implementar algunas funciones en periféricos externos al procesador. Si la tarea no se encuentra implementada en un dispositivo comercial es necesario implementarlas en un Dispositivo Lógico Programable (PLD) o en un Circuito Integrado de Aplicación Específica (ASIC). + +En esta sección realizaremos una explicación detallada del proceso de comunicación entre el procesador y un periférico implementado en una FPGA. + +\subsection{Comunicación Procesador - Periférico} +La figura \ref{computer_arch} muestra una arquitectura básica para la comunicación de tareas Hardware - Software; en ella podemos observar que el procesador maneja tres buses: +\begin{itemize} +\item Bus de Datos: Bus bidireccional por donde se realiza el intercambio de información. +\item Bus de Direcciones: Bis controlado por el procesador y es utilizado para direccionar un determinado periférico o una detrminada funcionalidad del mismo. +\item Bus de control: Señales necesarias para indicarle a los periféricos el tipo de comunicación (Lectura o escritura). +\end{itemize} + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/computer-simple} \end{center} + \caption{Arquitectura básica Hardware/Software}\label{computer_arch} +\end{figure} + +Todos los periféricos que requieren intercambio de información con el procesador comparten el mismo bus de datos, por lo que es necesario que mientras el procesador no se comunique con ellos permanezcan en estadp de alta impedancia, esto es necesario para evitar corto - circuitos originados por diferentes niveles lógicos en el bus. Por lo tanto, las comunicaciones siempre son iniciadas por el procesador y se selecciona uno y solo un periférico. El decodificador de direcciones es el encargado de habilitar un determinado periférico ante una solicitud del procesador (mediante una dirección de memoria), esto lo hace activando la señal \textit{CSX}, cuando esta señal se encuentra en estado lógico alto el periférico coloca su bus de datos en alta impedancia, si se encuentra en estado lógico bajo el periférica escribe o lee el bus de datos, dependiendo de la activación de las señales del bus de control RD y WR. + +El decodificador de direcciones, como su nombre lo indica utiliza como entradas el bus de direcciones y activa solo una señal de selección de Chip (\textit{CSx}), basándose en un rango de direcciones asignado a cada periférico, este rango de direcciones no debe traslaparse para asegurar que solo un chip es seleccionado. Este rango de direcciones que se asigna a cada dispositivo que puede ser accesado por la unidad de procesamiento recibe el nombre de \textit{mapa de memoria} y puede ser único para cada plataforma. + +Cuando la unidad de procesamiento necesite comunicarse con un determinado periférico, colocará en el bus de direcciones una valor que se encuentre en el rango de direcciones asignado para ese periférico, esto hace que el decodificador de direcciones active la señal de selección adecuada para informarle al periférico que el procesador va a iniciar una transferencia de información. La Figura \ref{rd_wr_timing} muestra el diagrama de tiempos para un ciclo de lectura y escritura del procesador. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/rd_wr_waveform} \end{center} + \caption{Ciclo de lectura y escritura para la arquitectura de la Figura \ref{computer_arch}}\label{rd_wr_timing} +\end{figure} + +De lo anterior podemos concluir que un periférico es visto por el procesador como una posición de memoria más y las transacciones las inicia únicamente el procesador. + +\subsubsection{Implementación de Periféricos en una FPGA} +Es importante tener en cuenta los siguientes items cuando se implemente una tarea Hardware en una FPGA: +\begin{itemize} + \item La frecuencia del reloj de la FPGA es mucho mayor que la de las señales del bus de control, por lo que es necesario asegurarse que cada vez que el procesador realiza una solicitud de lectura o escritura, la señal de activación cambia del estado lógico alto al bajo; si solo se tiene en cuenta el estado bajo de la señal \textit{CSX} el periférico puede ejecutar la tarea varias veces en el mismo ciclo de activación, lo que puede llevar a resultados incorrectos. + \item La fase de los relojes del procesador y la FPGA no es la misma, por lo que es necesario sincronizar las señales del procesador con el reloj de la FPGA; si esto no se hace las señales fuera de fase pueden originar un estado de metaestabilidad en los Flip-Flops internos y por lo tanto el mal-funcionamiento del sistema. + \item El bus de datos es bidireccional, por lo que es necesario que la FPGA lo coloque en alta impedancia cuando no se esté habilitando un periférico. + \item La FPGA no permite implementar buffers tri-estado internamente por lo que es necesario separar los buses de entrada y salida a cada periférico. El bus de entrada es común a todos los periféricos mientra que es necesario utilizar un esquema de multiplexación entre los buses de salida. +\end{itemize} + +La figura \ref{sw_hw_fpga_arch} muestra el diagrama de bloques de la interfaz necesaria para poder comunicar un grupo de periféricos o tareas Hardware con el bus de datos, dirección y control de un procesador. El bloque \textit{SYNC} se encarga de sincronizar las señales provenientes de la FPGA con el reloj interno de la misma. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/sw_hw_fpga_arch} \end{center} + \caption{Diagrama de Bloques para la comunicación de tareas HW-SW \ref{computer_arch}}\label{sw_hw_fpga_arch} +\end{figure} + + El módulo \textit{Write Pulse generator} genera un pulso cuando las señales \textit{sncs} y \textit{snwe} son activadas como se indica en la figura \ref{cs_we_pulse}. El decodificador de direcciones selecciona un determinado periférico dependiendo del rango especificado para cado uno. Como mencionamos anteriormente, las FPGAs no permiten implementar buffers tri-estado internamente , por lo que cada periférico debe tener un bus de entrada y uno de salida de datos, los buses de entrada de datos son comunes, mientras que los de salida deben ser manejados por un dispositivo de salida, el cual puede ser un multiplexor controlado por el decodificador de direcciones o una compuerta OR, para este último caso es necesario que los periféricos coloquen el bus de datos en ``0'' cuando no estén seleccionados. Finalmente es necesario colocar un buffer tri-estado en los pines de la FPGA, este buffer está controlado por las señales \textit{nwe, noe, ncs} y solo se activa cuando \textit{nwe = 1, noe = 0, ncs = 0}, es decir, cuando se selecciona el rango de memoria de la FPGA y el procesador inicia una operación de lectura. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/cs_we_pulse} \end{center} + \caption{Generación del pulso de escritura}\label{cs_we_pulse} +\end{figure} + +\subsubsection{Programa en Espacio de Usuario para la comunicación} +El kernel de Linux proporciona una interfaz que permite a una aplicación \textit{mapear} un archivo en memoria, lo que hace que exista una correspondencia uno a uno entre las direcciones de memoria y el contenido del archivo. Linux implementa la llamada de sistema \textit{mmap()} para \textit{mapear} objetos en memoria.\cite{RL07} + +\begin{lstlisting} + #include + + void * mmap (void *addr, + size_t len, + int prot, + int flags, + int fd, + off_t offset); +\end{lstlisting} + + +Un llamado a \textit{mmap()} le pide al kernel hacer un mapeo en la memoria de \textit{len} bytes del objeto representado por el descriptor de archivo \textit{fd}, comenzando a \textit{offset} bytes dentro del archivo. Si se especifica \textit{addr}, se utiliza este valor como la dirección inicial en la memoria. Los permisos de acceso son determinados por \textit{prot}; PROT\_READ habilita la lectura, PROT\_WRITE habilita escritura y PROT\_EXEC habilita la ejecución. El argumento \textit{flasgs} describe el tipo de mapeo, y algunos elementos de su comportamiento y puede tomar los valores: + +\begin{itemize} + \item MAP\_FIXED: hace que \textit{addr} sea un requerimiento, si el kernel es incapaz de hacer el mapeo en esta dirección el llamado falla, si los parámetros de dirección y longitud traslapan un mapeo existente se descartan las áreas que se traslapan y se remplazan por el nuevo mapeo. + \item MAP\_PRIVATE: Establece que el mapeo no es compartido. Los cambios realizados a la memoria por este proceso no se reflejan en el archivo actual o en el mapeo de los otros procesos. + \item MAP\_SHARED: Comparte el mapeo con otros procesos que usan el mismo archivo. Escribir en el mapeo equivale a escribir en el archivo. +\end{itemize} + +A continuación se lista un ejemplo de la utilización del llamado \textit{mmap} + +\begin{lstlisting} +#define MAP_SIZE 0x2000000l // ECBOT USE A11 to A25 +#define MAP_MASK (MAP_SIZE - 1) + + int fd; + unsigned long i, j; + void *base; + volatile unsigned short *virt_addr; + + io_map(0xFFFFFF7C); // Configure CS3 as 16 bit Memory and 0 Wait States + off_t address = 0x40000000; // CS3 Base Address + + if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1){ + printf ("Cannot open /dev/mem.\n"); + return -1; + } + printf ("/dev/mem opened.\n"); + + base = mmap (0, MAP_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, address); + if (base == (void *) -1){ + printf ("Cannot mmap.\n"); + return -1; + } + printf ("Memory mapped at address %p.\n", base); + + virt_addr = base; + +\end{lstlisting} + +En este ejemplo utilizamos el llamado \textit{mmap} para hacer un mapeo de la dirección de memoria correspondiente al CS3 (0x40000000). El descriptor del archvio utilizado es el dispositivo \textit{/dev/mem} el cual permite operaciones de lectura y escritura a la memoria virtual. Adicionalmente permitimos operaciones de lectura/escritura (PROT\_READ | PROT\_WRITE) y permitimos el acceso a otros proceso. Finalmente podemos usar la variable \textit{virt\_addres} para escribir en cualquier posición de memoria desde \textit{0x40000000} hasta \textit{0x40000000 + MAP\_SIZE}. El siguiente listado muestra un ejemplo de la forma de hacer estas operaciones. + +\begin{lstlisting} + printf("Writing Memory..\n"); + for (i = 0 ; i <32; i++){ + virt_addr[i<<10] = i*3; // ECBOT use A11 to A25 + } + + printf("Reading Memory..\n"); + for (i = 0 ; i < 32; i++) + { + j = virt_addr[i<<10]; + printf("%X = %X\n", i, j ); + } + if (munmap (base, MAP_SIZE) == -1) + { + printf ("Cannot munmap.\n"); + return -1; + } +\end{lstlisting} + +\subsection{Comunicación Periférico - Procesador} + +Cuando un periférico requiere atención por parte de la CPU debido a que terminó de realizar un proceso o porque requiere nuevas instrucciones para seguir operando, o un evento originado por un usuario necesita ser atendido, se debe iniciar un proceso para que la unidad de procesamiento se comunique con él. Como se mencionó anteriormente la unidad de procesamiento está encargada de forma exclusiva de iniciar las operaciones de lectura/ecritura con los periféricos, por esta razón, el periférico utiliza una señal (IRQ) para informarle al procesador que requiere ser atendido. Algunas arquitecturas poseen un mecanismo que permite el acceso a la memoria por parte de los periféricos sin utilizar el procesador, esto permite que periféricos de diferentes velocidades se comuniquen sin someter al procesador a una carga excesiva. En esta sección hablaremos de la forma de definir las interrupciones en un driver de Linux. + +\subsubsection{Manejo de Interrupciones} +A continuación se describirá la forma de manejar las interrupciones utilizando un driver de Linux. Analicemos la función \textit{qem\_init} + +\begin{lstlisting} + static int __init qem_init(void) +{ + int res; + printk(KERN_INFO "FPGA module is Up.\n"); + + Major = register_chrdev(0, DEVICE_NAME, &fops); + + if (Major < 0) { + return Major; + } + + /* Set up the FGPA irq line */ + at91_set_gpio_input(FPGA_IRQ_PIN, 0); + at91_set_deglitch(FPGA_IRQ_PIN, 1); + + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); + + set_irq_type(FPGA_IRQ, IRQT_RISING); + + ioaddress = ioremap(FPGA_BASE, 0x4000); + + return 0; +} + +\end{lstlisting} + +Esta rutina es similar a la presentada anteriormente, solo se agrega un par de comandos para definir un pin del procesador como entrada, para poder utilizarlo como señal IRQ, en la línea: + +\begin{lstlisting} + res = request_irq(FPGA_IRQ_PIN, irq_handler, IRQF_DISABLED, "FPGA - IRQ", NULL); +request_irq (int irq, handler, irqflags, devname, dev_id); +\end{lstlisting} + +Se hace un llamado a la función \textit{request\_irq} que asigna recursos a la interrupción, habilita el manejador y la línea de interrupción. En nuestro caso define el pin \textit{FPGA\_IRQ\_PIN} como la línea de interrupción, la rutina \textit{irq\_handler} será ejecutada cuando se presente una interrupción, el flag \textit{IRQF\_DISABLED} deshabilita las interrupciones locales mientras se procesa, el nombre del dispositivo que realiza la interrupción es \textit{FPGA - IRQ}. + +La función \textit{ioremap(offset, size)}, una secuencia de operaciones que permiten que la memoria de la CPU se pueda acceder con las funciones \textit{readb/readw/readl/writeb/writew/write}, utilizando la variable \textit{ioaddress}. Finalmente se define el tipo de interrupción del pin \textit{FPGA\_IRQ\_PIN} como \textit{IRQT\_RISING}. + +La función que se ejecuta cuando se presenta la interrupción, se define en el siguiente listado: + +\begin{lstlisting} +irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + if(irq_enabled) + { + interrupt_counter++; + printk(KERN_INFO "interrupt_counter=%d\n",interrupt_counter); + printk("\n kernel: IREG_LP:%X \n", readb( &ioaddress[0x40] ) ); + wake_up_interruptible(&wq); + } + return IRQ_HANDLED; +} +\end{lstlisting} + +Cada vez que se produce una interrupción y si la variable global \textit{irq\_enabled} es igual a 1, se aumenta en 1 el valor de \textit{interrupt\_counter}, se imprime su valor y el de un registro interno del periférico. + +En este driver utilizaremos la función \textit{device\_read} para enviar información a un programa en espacio de usuario. +\begin{lstlisting} +static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ + char *buffer, /* buffer to fill with data */ + size_t count, /* length of the buffer */ + loff_t * offset) +{ + if(irq_enabled){ + wait_event_interruptible(wq, interrupt_counter!=0); + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + interrupt_counter=0; + } + else{ + interrupt_counter = -1; + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + } + return sizeof(interrupt_counter); +} + +\end{lstlisting} + +Cuando se realice una operación de lectura desde espacio de usuario, el proceso quedará bloqueado por la función \textit{wait\_event\_interruptible} hasta que la rutina de atención a la interrupción ejecute la función \textit{wake\_up\_interruptible}, pero es necesario que se cumpla la condición evaluada por \textit{wait\_event\_interruptible} para que se ejecute la tarea. Para este ejemplo: + +\begin{lstlisting} + wait\_event\_interruptible(wq, interrupt\_counter!=0); +\end{lstlisting} + +Por lo que \textit{irq\_handler} debe hacer: + +\begin{lstlisting} + interrupt_counter++; + wake_up_interruptible(&wq); +\end{lstlisting} + +Si no se hace esto el proceso nunca se despertará y el proceso de lectura quedará bloqueado. + +En la línea: + +\begin{lstlisting} + copy_to_user ( buffer, &interrupt_counter, sizeof(interrupt_counter) ); + copy_to_user ( to, from, long n); +\end{lstlisting} + +Se utiliza la función \textit{copy\_to\_user} para intercambiar información con el programa que se ejecuta en espacio de usuario. En este caso se copia a \textit{char *buffer}, la variable \textit{interrupt\_counter}. Existe una función análoga que recibe información proveniente del espacio de usuario \textit{copy\_from\_user} En la Figura \ref{copy_to_from_user} se muestran estas operaciones. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/copy_to_from_user} \end{center} + \caption{Intercambio de información entre los espacios de kernel y usuario\label{copy_to_from_user}} +\end{figure} + +En la función \textit{qem\_exit} se liberan los recursos de la interrupción y la variable \textit{ioaddress}. + +\begin{lstlisting} +static void __exit qem_exit(void) +{ + int ret; + /*Tho order for free_irq, iounmap & unregister is very important */ + free_irq(FPGA_IRQ_PIN, NULL); + iounmap(ioaddress); + unregister_chrdev(Major, DEVICE_NAME); + + printk(KERN_INFO "FPGA driver is down...\n"); +} +\end{lstlisting} + + +Finalmente el programa en espacion de usuario es: + +\begin{lstlisting} + int main(void) { + + int fileNum, bytes; + char data[40]; + + fileNum = open("/dev/fpga", O_RDWR); + if (fileNum < 0) { + printf(" Unable to open file\n"); + exit(1); + } + + printf(" Opened device\n"); + + bytes = read(fileNum, data, sizeof(data)); + + if (bytes > 0) + printf("%x\n", data); + + close(fileNum); + + return (0); +} +\end{lstlisting} + +En este programa se abre el dispositivo \textit{/dev/fpga} que corresponde a nuestro driver y se utiliza la función \textit{read} para leer la información suministrada por el driver. \ No newline at end of file diff --git a/course/.docs/cambio_categoria/embedded.kilepr b/course/.docs/cambio_categoria/embedded.kilepr new file mode 100644 index 0000000..7a8ecd3 --- /dev/null +++ b/course/.docs/cambio_categoria/embedded.kilepr @@ -0,0 +1,159 @@ +[General] +def_graphic_ext=eps +img_extIsRegExp=false +img_extensions=.eps .jpg .jpeg .png .pdf .ps .fig .gif +kileprversion=2 +kileversion=2.0.85 +lastDocument=chapter2.tex +masterDocument= +name=embedded +pkg_extIsRegExp=false +pkg_extensions=.cls .sty .bbx .cbx .lbx +src_extIsRegExp=false +src_extensions=.tex .ltx .latex .dtx .ins + +[Tools] +MakeIndex= +QuickBuild= + +[document-settings,item:chapter1.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[document-settings,item:chapter2.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[document-settings,item:embedded.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[document-settings,item:embedded_book.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[document-settings,item:introduction.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[document-settings,item:title.tex] +Bookmarks= +Encoding=ISO-8859-3 +Highlighting=LaTeX +Indentation Mode= +Mode=LaTeX +ReadWrite=true + +[item:chapter1.tex] +archive=true +column=0 +encoding=ISO-8859-3 +highlight=LaTeX +line=665 +mode=LaTeX +open=true +order=3 + +[item:chapter2.tex] +archive=true +column=9 +encoding=ISO-8859-3 +highlight=LaTeX +line=5 +mode=LaTeX +open=true +order=5 + +[item:embedded.kilepr] +archive=true +column=1 +encoding= +highlight= +line=0 +mode= +open=false +order=-1 + +[item:embedded.tex] +archive=true +column=7 +encoding=ISO-8859-3 +highlight=LaTeX +line=29 +mode=LaTeX +open=true +order=0 + +[item:embedded_book.tex] +archive=true +column=21 +encoding=ISO-8859-3 +highlight=LaTeX +line=50 +mode=LaTeX +open=true +order=1 + +[item:introduction.tex] +archive=true +column=89 +encoding=ISO-8859-3 +highlight=LaTeX +line=20 +mode=LaTeX +open=true +order=2 + +[item:title.tex] +archive=true +column=29 +encoding=ISO-8859-3 +highlight=LaTeX +line=18 +mode=LaTeX +open=true +order=4 + +[view-settings,view=0,item:chapter1.tex] +CursorColumn=0 +CursorLine=665 + +[view-settings,view=0,item:chapter2.tex] +CursorColumn=9 +CursorLine=5 + +[view-settings,view=0,item:embedded.tex] +CursorColumn=7 +CursorLine=29 + +[view-settings,view=0,item:embedded_book.tex] +CursorColumn=21 +CursorLine=50 + +[view-settings,view=0,item:introduction.tex] +CursorColumn=89 +CursorLine=20 + +[view-settings,view=0,item:title.tex] +CursorColumn=29 +CursorLine=18 diff --git a/course/.docs/cambio_categoria/embedded.tex b/course/.docs/cambio_categoria/embedded.tex new file mode 100644 index 0000000..baf688d --- /dev/null +++ b/course/.docs/cambio_categoria/embedded.tex @@ -0,0 +1,647 @@ +\chapter{Sistemas Embebidos} +\label{ch:embedded} + +\section{Introducción} +Uno de los objetivos de este trabajo, es la creación de una plataforma Embebida que permita la apropiación de nuevas herramientas y metodologías de diseño. +El mercado de los sistemas embebidos continúa en aumento y su campo de acción se ha extendido en casi todas las actividades humanas. +Según BBC, inc. \footnote{http://www.bccresearch.com/} el mercado para el software embebido puede crecer de \$1.6 billones a \$3.5 billones en 2009, +con una tasa de crecimiemto anual (AAGR) del 16\%, mientras la tasa de crecimiento para las tarjetas embebidas es del 10\%. (Favor ver Figura \ref{GESM}). + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/embedded_system_market} \end{center} +% \includegraphics[scale=.6]{./images/glob-emb-software-rev-regio} \end{center} + \caption{Mercado Global de Sistemas Embebidos 2003-2009. Fuente: BCC Inc.} \label{GESM} +\end{figure} + +Esto unido a: el gran nivel de integración obtenido por la industria de los semiconductores en los \textit{SOC}, la disponibilidad de herramientas software +de desarrollo gratuitas (compiladores, simuladores, librerías, Sistemas Operativos) abre grandes posibilidades comerciales para paises en vía de +desarrollo ya que no son necesarias grandes inversiones de capital para la implementación de estos sistemas. + +Más de un billón de dispositivos embebidos fueron vendidos en el 2004, según \textit{Venture Development Corporation (VDC)}. De acuerdo con VDC +el porcentaje de dispositivos basados en Sistemas Operativos comerciales tiende a disminuir callendo del 43.1\% en 2001 a 37.1\% en 2004, esta tendencia +se debe al aumento de complejidad de los dispositivos y a las necesidades de conexión (tales como Ethernet, bluetooth, WiFi, etc); además, la +caida de precios del hardware, elimina la necesidad de eficiencia en el manejo de recursos proporcionada por muchos productos comerciales. Otro factor +es el deseo de utilizar el mismo Sistema Operativo para varios proyectos. + +Recientes investigaciones de VDC sugieren que entre el 13 y el 15\% de los desarrolladores utilizan linux como su sistema operativo principal, y se espera +que esta cifra aumente al madurar la tecnología y el soporte de los recursos de la comunidad aumenten. La figura \ref{os_trends} muestra una encuenta +realizada a 932 desarrolladores de todo el mundo por \textit{linuxdevices} \footnote{http://www.linuxdevices.com} + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/embedded_OS_sourcing_trends} \end{center} + \caption{Preferencia de Sistema Operativo para Sistemas Embebidos 2003-2007. Fuente: linuxdevices.} \label{os_trends} +\end{figure} + +La elección de Linux como herramienta de desarrollo esta fuertemente influenciada por su caracter libre, la gran disponibilidad de herramientas de +desarrollo, aplicaciones, librerías y la posibilidad de modificar o adaptar código ya existente. + +El corazón de todo sistema embebido es su procesador, en la actualidad existen diversos fabricantes que ponen a disposición de los desarrolladores +\textit{System On Chip} (SOC) que incluyen una gran variedad de periféricos que incluyen dispositivos de comunicación (UARTs, USB, Ethernet), +interface con el humano (Controladores de: LCD, tarjetas de sonido, dispositivos touch screen), almacenamiento (memorias: RAM, SDRAM, SD, MMC). +Al incluir la mayoría de los periféricos en el mismo Chip se reduce el espacio de la placa de circuito impreso (PCB) y se reduce la posibilidad de +errores debido a interconexión y contrario a lo que se podría esperar, el costo de este SOC es muy bajo (en comparación con el costo de cada periférico +por separado). La figura \ref{cpu_trends} muestra la preferencia de los desarrolladores encuestados por \textit{linuxdevices}. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/embedded_processor_preference_history} \end{center} + \caption{Preferencia de CPU para Sistemas Embebidos 2004-2007. Fuente: linuxdevices.} \label{cpu_trends} +\end{figure} + +Como puede verse en la Figura \ref{cpu_trends} existe una clara preferencia entre los procesadores x86 y los procesadores ARM, siendo estos últimos +los más populares en dispositivos de consumo como PDAs, Routers, teléfonos celulares, consolas de juego portátiles.\ref{cpu_trends} + +\section{Definición} +Un Sistema Embebido es un sistema de propósito específico en el cual, el computador es encapsulado completamente por el dispositivo que el controla. +A diferencia de los computadores de propósito general, un Sistema Embebido realiza tareas pre-definidas, lo cual permite su optimización, reduciendo +el tamaño y costo del producto \cite{Wik} + +\subsection{Características} + +\begin{itemize} + \item Los sistemas embebidos son diseñados para una aplicación + espec\'{\i}fica, es decir, estos sistemas realizan un grupo de funciones + previamente definidasm y una vez el sistema es diseñado, no se puede cambiar + su funcionalidad. Por ejemplo, el control de un asensor siempre realizar\'a + las mismas acciones durante su vida \'util. + \item Debido a su interacción con el entorno los ES deben cumplir + esctríctamente restricciones temporales. El t\'ermino {\textit{Sistemas + de Tiempo Real}} es utilizado para enfatizar este aspecto. + \item Los Sistemas Embebidos son heterog\'eneos, es decir, est\'an + compuestos por componentes Hardware y Software. Los componentes Hardware, + como ASICs y Dispositivos L\'ogicos Programables (PLD) proporcionan la + velocidad de ejecuci\'on y el cosumo de potencia necesarios en algunas + aplicaciones. + \item Los Sitemas Embebidos tienen grandes requerimientos en t\'erminos de + confiabilidad. Errores en aplicaciones como la aviaci\'on y el + automovilismo, pueden tener consecuencias desastrosas. +\end{itemize} + +\subsection{Arquitectura} + +En la Figura \ref{es_arch} se muestra la arquitectura típica de un Sistema Embebido. La cual integra un componente hardware, implementado ya sea +en un PLD (CPLD, FPGA) o en un ASIC, conocido con el nombre de periféricos y un componente software (procesador o DSP) capáz de ejecutar software, +la parte del procesador está dividida en la CPU (En algunos casos posee una caché) y las unidades de Memoria. + + +\begin{figure} + \begin{center} \includegraphics[scale=.6]{./images/ES_Architecture} \end{center} + \caption{Arquitectura de un Sistema Embebido}\label{es_arch} +\end{figure} + +Al momento de diseñar un Sistema Embebido encontramos las siguientes opciones: +\begin{itemize} +\item Componente HW y SW Integrado en un dispositivo semiconductor (SoC): En la actualidad existen muchas compañías que fabrican procesadores de 32 bits +integrados a una gran variedad de periféricos, lo cual simplifica el diseño y reduce costos. \footnote{http://www.sharpsma.com, http://www.atmel.com, +http://www.cirrus.com, http://www.samsung.com, http://www.freescale.com, etc}. Este tipo de implementación es muy popular en los dispositivos de consumo +masivo (Reproductores de MP3, consolas de juego, etc), debido a los grandes niveles de producción (del orden de millones de unidades) resulta más económico +contar con un dispositivo que integre el mayor número de funcionalidades, esto disminuye el costo de componentes y reduce el área de circuito impreso. + +\item Componente SW en un SoC y componente HW en una FPGA: Cuando no existen en el mercado un SoC con la cantidad de periféricos requerida para una +determinada aplicación, o con una funcionalidad específica, es necesario recurrir a la utilización de dispositivos comerciales que implementen dicha +operación, en algunas ocaciones el periférico puede relizar funciones poco comúnes y no se proporciona comercialmente, la solución es entonces, implementar estas funcionalidades en una FPGA; también se recomienda la utilización de FPGAs en sistemas que requieren la utilización de la misma funcionalidad un gran número de veces (Puertos seriales, Pines de Entrada/Salida). Esta decisión esta atada al nivel de producción, ya que al incluir una FPGA aumenta el costo global del proyecto. + +\item Componente SW y HW en una FPGA: Esta es tal vez la opción más flexible, pero la de menor desempeño, ya que al utilizar los recursos lógicos de la FPGA para la implementación del procesador (softcore) la longitud de los caminos de interconexión entre los bloques lógicos aumentan el retardo de las señales, lo cual disminuye la máxima velocidad de funcionamiento. Los procesadores \textit{softcore} más populares en la actualidad son: + + \begin{itemize} + \item Microblaze y Picoblaze de Xilinx\footnote{http://www.xilinx.com} + \item Leon de Gaisler Research \footnote{http://www.gaisler.com/} + \item LatticeMico32 de Lattice Semiconductors\footnote{http://www.latticesemi.com} + \item OpenRisc \footnote{http://www.opencores.com} + \end{itemize} + +\end{itemize} + +\section{Metodología de Diseño} + +El proceso de diseño de un Sistema Embebido comienza con la {\textit{especificaci\'on del sistema}}, (ver Figura \ref{des_flow}), en este +punto se describe la funcionalidad y se definen las restricciones +f\'{\i}sicas, el\'ectricas y econ\'omicas. Esta especificaci\'on debe ser muy +general y no deben existir dependencias (tecnol\'ogicas, metodol\'ogicas) de +ning\'un tipo, se suele utilizar lenguajes de alto nivel, como UML, C++. La +especificaci\'on puede ser verificada a trav\'es de una serie de pasos de +an\'alisis cuyo objetivo es determinar la validez de los algor\'{\i}tmos +seleccionados, por ejemplo, determinar si el algoritmo siempre termina, los +resultados satisfacen las especificaciones. Desde el punto de vista de la +re-utilizaci\'on, algunas partes del funcionamiento global deben tomarse de +una librer\'{\i}a de algor\'{\i}tmos existentes. + +\begin{figure} + \begin{center} \includegraphics[scale=.55]{./images/design_flow} \end{center} + \caption{Flujo de Diseño de un Sistema Embebido \cite{Cor05}}\label{des_flow} +\end{figure} + + +Una vez definidas las especificaciones del sistema se debe realizar un +modelamiento que permita extraer de estas la funcionalidad. El modelamiento es +crucial en el diseño ya que de \'el depende el paso existoso de la +especificaci\'on a la implementaci\'on. Es importante definir que modelo +matem\'atico debe soportar el entorno de diseño. Los modelos m\'as utilizados +son: M\'aquinas de estados finitos, diagramas de flujos de datos, Sistemad de +Eventos Discretos y Redes de Petri. Cada modelo posee propiedades +matem\'aticas que pueden explotarse de forma eficiente para responder +preguntas sobre la funcionalidad del sistema sin llevar a cabo dispendiosas +tareas de verificaci\'on. \ Todo modelo obtenido debe ser verificado para +comprobar que cumple con las restricciones del sistema. + +Una vez se ha obtenido el modelo del sistema se procede a determinar su +{\textit{arquitectura}}, esto es, el n\'umero y tipo de componentes y su +inter-conexi\'on. Este paso no es m\'as que una exploraci\'on del espacio de +diseño en b\'usqueda de soluciones que permitan la implementaci\'on de una +funcionalidad dada, y puede realizarse con varios criterios en mente: Costos, +confiabilidad, viabilidad comercial. + +Utilizando como base la arquitectura obtenida en el paso anterior las tareas +del modelo del sistemas son mapeadas dentro de los componentes. Esto es, +asignaci\'on de funciones a los componentes de la arquitectura. Existen dos +opciones a la hora de implementar las tareas o procesos: +\begin{enumerate} + \item Implementaci\'on Software: La tarea se va a ejecutar en un procesador. + \item Implementaci\'on Hardware: La tarea se va a ejecutar en un sistema + digital dedicado. +\end{enumerate} + +Para cumplir las especificaciones del sistema algunas tareas deben ser +implementadas en Hardware, esto con el f\'{\i}n de no ocupar al procesador en +tareas c\'{\i}clicas, un ejemplo t\'{\i}pico de estas tareas es la +generaci\'on de bases de tiempos. La decisi\'on de que tareas se implementan +en SW y que tareas se implementan en HW recibe el nombre de +{\textit{particionamiento}}, esta selecci\'on es fuertemente dependiente de +restricciones econ\'omicas y temporales. + + +Las tareas Software deben compartir los recursos que existan en el sistema +(procesador y memoria), por lo tanto se deben hacer decisiones sobre el orden +de ejecuci\'on y la prioridad de estas. Este proceso recibe el nombre de +{\textit{planificaci\'on}}. En este punto del diseño el modelo debe incluir +informaci\'on sobre el mapeo, el particionamiento y la planificaci\'on del +sistema. + + +Las siguientes fases corresponden a la implementaci\'on del modelo, para esto +las tareas hardware deben ser llevadas al dispositivo elegido (ASIC o FPGA) y +se debe obtener el $''$ejecutable$''$ de las tareas software, este proceso +recibe el nombre de {\textit{s\'{\i}ntesis}} HW y SW respectivamente, as\'{\i} +mismo se deben sintetizar los mecanismos de comunicaci\'on. + + +El proceso de prototipado consiste en la realizaci\'on f\'{\i}sica del +sistema, finalmente el sistema f\'{\i}sico debe someterse a pruebas para +verificar que se cumplen con las especificaciones iniciales. + +Como puede verse en el flujo de diseño existen realimentaciones, estas +realimentaciones permiten depurar el resultado de pasos anteriores en el caso +de no cumplirse con las especificaciones iniciales. + + +\section{Herramientas Software de libre distribución \textit{GNU toolchain}} +En el mercado existe una gran variedad de herramientas de desarrollo para Sistemas Embebidos, +sin embargo, en este estudio nos centraremos en el uso de las herramientas de libre distribución; +esta elección se debe a que la mayoría de los productos comerciales utilizan el toolchain de GNU\footnote{http://www.gnu.org} internamente y proporcionan un entorno gráfico para su fácil manejo. Otro factor considerado a la hora de realizar nuestra elección es el económico, ya que la mayoría de los productos comerciales son costosos y poseen soporte limitado. Por otro lado, el toolchain de GNU es utilizado ampliamente en el medio de los diseñadores de sistemas embebidos y se encuentra un gran soporte en múltiples foros de discusión (ver Figura \ref{tools}). + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.7]{./images/embedded-linux-tool-trends-sm} \end{center} + \caption{Tendencia de utilización de herramientas de desarrollo}\label{tools} +\end{figure} + +\subsubsection{GNU binutils\cite{A1}} +Son una colección de utilidades para archivos binarios y estan compuestas por: + +\begin{itemize} + \item \textbf{addr2line} Convierte direcciones de un programa en nombres de archivos y números de línea. Dada una dirección y un ejecutable, usa la información de depuración en el ejecutabe para determinar que nombre de atchivo y número de lpinea está asociado con la dirección dada. + \item \textbf{ar} Esta utilidad crea, modifica y extrae desde ficheros. Un fichero es una colección de otros archivos en una estructura que hace posible obtener los archivos individuales miembros del archivo. + \item \textbf{as} Utilidad que compila la salida del compilador de C (GCC). + \item \textbf{c++filt} Este program realiza un mapeo inverso: Decodifica nombres de bajo-nivel en nombres a nivel de usuario, de tal forma que el linker pueda mantener estas funciones sobrecargadas (overloaded) ``from clashing''. + \item \textbf{gasp} GNU Assembler Macro Preprocessor + \item \textbf{ld} El \textit{linker} GNU combina un número de objetos y ficheros, re-localiza sus datos y los relaciona con referencias. Normalmente el último paso en la construcción de un nuevo programa compilado es el llamado a ld. + \item \textbf{nm} Realiza un listado de símbolos de archivos tipo objeto. + \item \textbf{objcopy} Copia los contenidos de un archivo tipo objeto a otro. \textit{objcopy} utiliza la librería GNU BFD para leer y escribir el archivo tipo objeto. Permite esccribibr el archivo destino en un formato diferente al del archivo fuente. + \item \textbf{objdump} Despliega información sobre archivos tipo objeto. + \item \textbf{ranlib} Genera un índice de contenidos de un fichero, y lo almacena en él. + \item \textbf{readelf} Interpreta encabezados de un archivo ELF. + \item \textbf{size} Lista el tamaño de las secciones y el tamaño total de un archivo tipo objeto. + \item \textbf{strings} Imprime las secuencias de caracteres imprimibles de almenos 4 caracteres de longitud. + \item \textbf{strip} Elimina todos los símbolos de un archivo tipo objeto. + +\end{itemize} + +\subsubsection{GNU Compiler Collection} +El \textit{GNU Compiler Collection} normalmente llamado GCC, es un grupo de compiladores de lenguajes de programación producido por el proyecto GNU. Es el compilador standard para el software libre de los sistemas operativos basados en Unix y algunos propietarios como Mac OS de Apple. Soporta los siguientes lenguajes: ADA, C, C++, Fortran, Java, Objective-C, Objective-C++ para las arquitecturas: Alpha, ARM, Atmel AVR, Blackfin, H8/300, System/370, System/390, IA-32 (x86) and x86-64, IA-64 i.e. the "Itanium", Motorola 68000, Motorola 88000, MIPS, PA-RISC, PDP-11, PowerPC, SuperH, SPARC, VAX, Renesas R8C/M16C/M32C, MorphoSys. + +Como puede verse GCC soporta una gran cantidad de lenguajes de programación, sin embargo, en el presente estudio solo lo utilizaremos como herramienta de compilación para C y C++. Una característica de resaltar de GCC es la gran cantidad de plataformas que soporta, esto lo hace una herramienta Universal para el desarrollo de sistemas embebidos, el código escrito en una plataforma (en un lenguaje de alto nivel) puede ser implementado en otra sin mayores cambios, esto elimina la dependencia entre el código fuente y el HW\footnote{Esto recibe el nombre de re-utilización de código}, lo cual no ocurre al utilizar lenguaje ensamblador. + +Por otro lado, el tiempo requerido para realizar aplicaciones utilizando C o C++ disminuye, ya que no es necesario aprender las instrucciones en assembler de una plataforma determinada; además, la disponibilidad de librerías de múltiples propósitos reduce aún más los tiempos de desarrollo, permitiendo de esta forma tener bajos tiempos \textit{time to market} y reducir de forma considerable el costo del desarrollo. + +\subsubsection{GNU Debugger} +El depurador oficial de GNU (GDB), es un depurador que al igual que GCC tiene soporte para múltiples lenguajes y plataformas. GDB permite al usuario monitorear y modificar las variables internas del programa y hacer llamado a funciones de forma independiente a la ejecución normal del mismo. Además, permite establecer sesiones remotas utilizando el puerto serie o TCP/IP. Aunque GDB no posee una interfaz gráfica, se han desarrollado varios front-ends como DDD o GDB/Insight. + +\subsubsection{Librerías C} +Adicionalmente es necesario contar con una librería que proporcione las librerías standard de C: stdio, stdlib, math; las más utilizadas en sistemas embebidos son: + +\begin{itemize} + \item \textbf{glibc\footnote{http://www.gnu.org/software/libc/}} Es la librería C oficial del proyecto GNU. Uno de los inconvenientes al trabajar con esta librería en sistemas embebidos es que genera ejecutables de mayor tamaño que los generados a partir de otras librerías, lo cual no la hace muy atractiva para este tipo de aplicaciones. + \item \textbf{uClibc\footnote{http://uclibc.org/}} Es una librería diseñada especialmente para sistemas embebidos, es mucho más pequeña que \textbf{glibc}. + \item \textbf{newlib\footnote{http://sources.redhat.com/newlib/}} Al igual que \textbf{uClibc}, está diseñada para sistemas embebidos. El típico ``Hello, world!'' ocupa menos de 30k en un entorno basado en newlib, mientras que en uno basado en glibc, puede ocupar 380k \cite{BG}. + \item \textbf{diet libc\footnote{http://www.fefe.de/dietlibc/}} Es una versión de \textit{libc} optimizada en tamaño, puede ser utilizada para crear ejecutables estáticamente enlazados para linux en plataformas alpha, arm, hppa, ia64, i386, mips, s390, sparc, sparc64, ppc y x86\_64. +\end{itemize} + + +\subsection{Flujo de diseño software} + +En la figura \ref{toolchain_flow} se ilustra la secuencia de pasos que se realizan desde la creación de un archivo de texto que posee el código fuente de una aplicación hasta su implementación en la tarjeta de desarrollo. + + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.6]{./images/SW_design_flow} \end{center} + \caption{Flujo de diseño SW utilizando la cadena de herramientas GNU}\label{toolchain_flow} +\end{figure} + +A continuación se realiza una breve descripción de los pasos necesarios para generar un ejecutable para un sistema embebido: + +\begin{enumerate} + \item \textbf{Escritura del código fuente:} Creación del código fuente en cualquier editor de archivos de texto. + \item \textbf{Compilación:} Utilizando el compilador gcc se compila el código fuente; vala la pena mencionar que en este punto el compilador solo busca en los encabezados (\textit{headers}) de las librerías la definición de una determinada función, como por ejemplo el \textit{printf} en el archivo \textit{stdio.h}. Como resultado de este paso se obtiene un archivo tipo objeto. + \item \textbf{Enlazado:} En esta etapa se realizan dos tareas: + \begin{enumerate} + \item Se enlazan los archivos tipo objeto del proyecto, junto con las librerías, si una determinada función no es edfinida por ninguna de las librerías pasadas como parámetro al linker, este generará un error y no se generará el ejecutable. + \item Se define la posiciónes físicas de las secciones del ejecutable tipo ELF, esto se realiza a través de un link de enlazado el cual define de forma explícita su localización. + \end{enumerate} + \item \textbf{Extracción del archivo de programación} En algunas aplicaciones es necesario extraer únicamente las secciones que residen en los medios de almacenamiento no volátil y eliminar las demás secciones del ejecutable. Esto se realiza con la herramiento \textit{objcopy}, la cual, permite generar archivos en la mayoría de los formatos soportados por los programadores de memorias y procesadores, como por ejemplo S19 e Intel Hex. + \item \textbf{Descarga del programa a la plataforma}. Dependiendo de la plataforma existen varios métodos para descargar el archivo de programación a la memoria de la plataforma de desarrollo: + \begin{enumerate} + \item Utilizando un \textit{loader}: El \textit{loader} es una aplicación que reside en un medio de almacenamiento no volátil y permite la descarga de archivos utilizando el puerto serie o una interfaz de red. + \item Utilizando el puerto JTAG: El puerto JTAG (Joint Test Action Group) proporciona una interfaz capaz de controlar los registros internos del procesador, y de esta forma, acceder a las memorias de la plataforma y ejecutar un programa residente en una determinada posición de memoria. + \end{enumerate} + + \item \textbf{Depuración} Una vez se descarga la aplicación a la plataforma es necesario someterla a una serie de pruebas con el fín de probar su correcto funcionamiento. Esto se puede realizar con el depurador GNU (GDB) y una interfaz de comunicación que puede ser un puerto serie o un adaptador de red. + +\end{enumerate} + + +\subsubsection{Make} +Como vimoas anteriormente es necesario realizar una serie de pasos para poder descargar una aplicación a una plataforma embebida. Debido a que las herramientas GNU solo poseen entrada por consola de comandos, es necesario escribir una serie de comandos cada vez que se realiza un cambio en el código fuente, lo cual resulta poco práctico durante la etapa de desarrollo. Para realizar este proceso de forma automática, se creó la herramienta make, la cual recibe como entrada un archivo que normalmente recibe el nombre de \textit{Makefile} o \textit{makefile}. La herramienta make ejecuta los comandos necesarios para realizar la compilación, depuración, o programación, indicados en el archivo \textit{Makefile} o \textit{makefile}. Un ejemplo de este tipo de archivo se muestra a continuación: + +\begin{lstlisting}[numbers=left] +SHELL = /bin/sh + +basetoolsdir = /home/at91/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu +bindir = ${basetoolsdir}/bin +libdir = ${basetoolsdir}/lib/gcc/arm-softfloat-linux-gnu/3.4.5 + +CC = arm-softfloat-linux-gnu-gcc +AS = arm-softfloat-linux-gnu-as +LD = arm-softfloat-linux-gnu-ld +OBJCOPY = arm-softfloat-linux-gnu-objcopy + +CFLAGS =-mcpu=arm920t -I. -Wall +LDFLAGS =-L${libdir} -l gcc + +OBJS = \ + main.o \ + debug_io.o \ + at91rm9200_lowlevel.o \ + p_string.o + +ASFILES = arm_init.o + +LIBS=${libdir}/ + +all: hello_world + +hello_world: ${OBJS} ${ASFILES} ${LIBS} + ${LD} -e 0 -o hello_world.elf -T linker.cfg ${ASFILES} ${OBJS} ${LDFLAGS} + ${OBJCOPY} -O binary hello_world.elf hello_world.bin + +clean: + rm -f *.o *~ hello_world.* + +PREPROCESS.c = $(CC) $(CPPFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI + +%.pp : %.c FORCE + $(PREPROCESS.c) $< > $@ +\end{lstlisting} + +En las líneas 3-5 se definen algunas variables globales que serán utilizadas a lo largo del archivo; en las líneas 7 - 10 se definen las herramientas de compilación a utilizar, específicamente los compiladores de C (CC), de assembler (AS), el linker (LD) y la utilidad objcopy. A partir de la línea 15 se definen los objetos que forman parte del proyecto, en este caso: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o y p\_string.o}; en la línea 21 se definen los archivos en assembler que contiene el proyecto, para este caso \textit{arm\_init.o}. Las líneas 12 y 13 definen dos variables especiales que se pasan directamente al compilador de C (CFLAGS) y al liniker (LDFLAGS) + + +En las líneas 25, 27 y 31 aparecen unas etiquetas de la forma: \textit{nombre:} esta es la forma de definir reglas y permiten ejecutar de forma independiente el conjunto de instrucciones asociadas a ellas, por ejemplo, si se ejecuta el comando: +\\ \bigskip +\textit{make clean}\\ \bigskip +make ejecutará:\\ \bigskip +\textit{rm -f *.o *~ hello\_world.*} + +Observemos los comandos asociados a la etiqueta \textit{hello\_world:} En la misma línea aparecen \textit{\${OBJS} \${ASFILES} \${LIBS}}, estos reciben el nombre de dependencias y le indican a la herramienta \textit{make} que antes de ejecutar los comandos asociados a este label, debe realizar las acciones necesarias para generar \textit{\${OBJS} \${ASFILES} \${LIBS}}, esto es: \textit{main.o, debug\_io.o, at91rm9200\_lowlevel.o, p\_string.o, arm\_init.o y libgcc.a}. \textit{make} tiene predefinidas una serie de reglas para compilar los archivos .c la regla es de la forma: + +\begin{lstlisting} +.c.o: + $(CC) $(CFLAGS) -c $< +.c: + $(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@ + +\end{lstlisting} + +Lo cual le indica a la herramienta make que para generar un archivo \textit{.o} a partir de uno \textit{.c} es necesario ejecutar \textit{\$(CC) \$(CFLAGS) -c \$<}; de aqui la importancia de definir bien la variable de entorno \textit{CC} cuando trabajamos con compiladores cruzados\footnote{Un compilador cruzado genera código para una plataforma diferente en la que se está ejecutando, por ejemplo, genera ejecutables para ARM pero se ejecuta en un x86}. Hasta este punto al ejecutar el comando: \textit{make hello\_world}, \textit{make} realizaría las siguientes operaciones: \\ + +\begin{lstlisting} +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o main.o main.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o debug_io.o debug_io.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o at91rm9200_lowlevel.o + at91rm9200_lowlevel.c +arm-softfloat-linux-gnu-gcc -mcpu=arm920t -I. -Wall -c -o p_string.o p_string.c +arm-softfloat-linux-gnu-as -o arm_init.o arm_init.s +\end{lstlisting} + +En las líneas 28 se realiza el proceso de enlazado; al \textit{linker} se le pasan los parámetros: +\begin{itemize} + \item \textbf{-e 0}: Punto de entrada , utilice 0 como símbolo para el inicio de ejecución. + \item \textbf{-o hello\_world.elf}: Nombre del archivo de salida \textit{hello\_world} + \item \textbf{-T linker.cfg}: Utilice el archivo de enlace \textit{linker.cfg} + \item \textbf{\${ASFILES} \${OBJS} \${LDFLAGS}}: Lista de objetos y librerías para crear el ejecutable. +\end{itemize} + +En la línea 29 se utiliza la herramienta \textit{objcopy} para generar un archivo binario (\textit{-O binary}) con la información necesaria para cargar en una memoria no volátil. Esto se explicará con mayor detalle más adelante. + +\subsubsection{El formato \textbf{ELF}} + +El formato ELF (\textit{Executable and Linkable Format}) Es un stándard para objetos, librerías y ejecutables y es el formato que genera las herramientas GNU. Como puede verse en la figura \ref{elf1} está compuesto por varias secciones (\textit{link view}) o segmentos (\textit{execution view}). Si un programador está interesado en obtener información de secciones sobre tablas de símbolos, código ejecutable específico o información de enlazado dinámico debe utilizar \textit{link view}. Pero si busca información sobre segmentos, como por ejemplo, la localización de los segmentos \textit{text} o \textit{data} debe utilizar \textit{execution view}. El encabezado describe el layout del archivo, proporcionando información de la forma de acceder a las secciones \cite{MLH98}. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.4]{./images/ELF_Link_exec1} \end{center} + \caption{Formato ELF}\label{elf1} +\end{figure} + +Las secciones pueden almacenar código ejecutable, datos, información de enlazado dinámico, datos de depuración, tablas de símbolos,comentarios, tablas de strings, y notas. Las secciones más importantes son las siguientes: + +\begin{itemize} + \item \textbf{.bss} Datos no inicializados. (RAM) + \item \textbf{.comment} Información de la versión. + \item \textbf{.data y .data1} Datos inicializados. (RAM) + \item \textbf{.debug} Información para depuración simbólica. + \item \textbf{.dynamic} Información sobre enlace dinámico + \item \textbf{.dynstr} Strings necesarios para el enlacedinámico + \item \textbf{.dynsym} Tabla de símbolos utilizada para enlace dinámico. + \item \textbf{.fini} Código de terminación de proceso. + \item \textbf{.init} Código de inicialización de proceso. + \item \textbf{.line} Información de número de línea para depuración simbólica. + \item \textbf{.rodata y .rodta1} Datos de solo-lectura (ROM) + \item \textbf{.shstrtab} Nombres de secciones. + \item \textbf{.symtab} Tabla de símbolos. + \item \textbf{.text} Instrucciones ejecutables (ROM) +\end{itemize} + +Para aclarar un poco este concepto, escribamos una aplicación sencilla: + +\begin{lstlisting} +#include + +int global; +int global_1 = 1; + +int main(void) +{ + int i; // Variable no inicializada + int j = 2; // Variable inicializada + for(i=0; i<10; i++){ + printf("Printing %d\n", i*j); // Caracteres constantes + j = j + 1; + global = i; + global_1 = i+j; + } + return 0; +} +\end{lstlisting} + +Generemos el objeto compilándolo con el siguiente comando: +\textit{arm-none-eabi-gcc -c hello.c} + +Examinemos que tipo de secciones tiene este ejecutable +\textit{arm-none-eabi-readelf -S hello.o} + +\begin{lstlisting} +Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [ 0] NULL 00000000 000000 000000 00 0 0 0 + [ 1] .text PROGBITS 00000000 000034 00009c 00 AX 0 0 4 + [ 2] .rel.text REL 00000000 000484 000020 08 9 1 4 + [ 3] .data PROGBITS 00000000 0000d0 000004 00 WA 0 0 4 + [ 4] .bss NOBITS 00000000 0000d4 000000 00 WA 0 0 1 + [ 5] .rodata PROGBITS 00000000 0000d4 000010 00 A 0 0 4 + [ 6] .comment PROGBITS 00000000 0000e4 00004d 00 0 0 1 + [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 000131 00002e 00 0 0 1 + [ 8] .shstrtab STRTAB 00000000 00015f 000051 00 0 0 1 + [ 9] .symtab SYMTAB 00000000 000368 0000f0 10 10 11 4 + [10] .strtab STRTAB 00000000 000458 00002b 00 0 0 1 +Key to Flags: + W (write), A (alloc), X (execute), M (merge), S (strings) + I (info), L (link order), G (group), x (unknown) + O (extra OS processing required) o (OS specific), p (processor specific) +\end{lstlisting} + +La sección \textit{.text}, como se dijo anteriormente contiene las instrucciones ejecutables, por esta razón se marca como ejecutable \textit{``X''} en la columna \textit{Flg}. Es posible ver las instrucciones que se ejecutan en esta sección: + +\textit{arm-none-eabi-objdump -d -j .text hello.o} + +\begin{lstlisting} +00000000
: + 0: e92d4800 stmdb sp!, {fp, lr} + 4: e28db004 add fp, sp, #4 ; 0x4 + 8: e24dd008 sub sp, sp, #8 ; 0x8 + c: e3a03002 mov r3, #2 ; 0x2 + 10: e50b3008 str r3, [fp, #-8] + 14: e3a03000 mov r3, #0 ; 0x0 + 18: e50b300c str r3, [fp, #-12] + 1c: ea000013 b 70 + 20: e51b200c ldr r2, [fp, #-12] + 24: e51b3008 ldr r3, [fp, #-8] + 28: e0030392 mul r3, r2, r3 + 2c: e59f005c ldr r0, [pc, #92] ; 90 <.text+0x90> + 30: e1a01003 mov r1, r3 + 34: ebfffffe bl 0 + 38: e51b3008 ldr r3, [fp, #-8] + 3c: e2833001 add r3, r3, #1 ; 0x1 + 40: e50b3008 str r3, [fp, #-8] + 44: e59f2048 ldr r2, [pc, #72] ; 94 <.text+0x94> + 48: e51b300c ldr r3, [fp, #-12] + 4c: e5823000 str r3, [r2] + 50: e51b200c ldr r2, [fp, #-12] + 54: e51b3008 ldr r3, [fp, #-8] + 58: e0822003 add r2, r2, r3 + 5c: e59f3034 ldr r3, [pc, #52] ; 98 <.text+0x98> + 60: e5832000 str r2, [r3] + 64: e51b300c ldr r3, [fp, #-12] + 68: e2833001 add r3, r3, #1 ; 0x1 + 6c: e50b300c str r3, [fp, #-12] + 70: e51b300c ldr r3, [fp, #-12] + 74: e3530009 cmp r3, #9 ; 0x9 + 78: daffffe8 ble 20 + 7c: e3a03000 mov r3, #0 ; 0x0 + 80: e1a00003 mov r0, r3 + 84: e24bd004 sub sp, fp, #4 ; 0x4 + 88: e8bd4800 ldmia sp!, {fp, lr} + 8c: e12fff1e bx lr +\end{lstlisting} + +La sección \textit{.data} mantiene las variables inicializadas, y contiene: + +\textit{arm-none-eabi-objdump -d -j .data hello.o} + +\begin{lstlisting} +00000000 : + 0: 01 00 00 00 +\end{lstlisting} + +Como vemos, la sección \textit{.data} contiene \'unicamente el valor de inicializaci\'on de la variable \textit{global\_1} (1) y no muestra informació\'on acerca de la variable \textit{j}, esto se debe a que la informaci\'on est\'a en el \textit{stack} del proceso. Si observamos el contenido de la sección \textit{.text} observamos que esta variable es asignada en tiempo de ejecución, en la línea \textit{0c:} + +\begin{lstlisting} +0c: e3a03002 mov r3, #2 ; 0x2 +10: e50b3008 str r3, [fp, #-8] +\end{lstlisting} + +se ve la asignación de esta variable. + + +La sección \textit{.bss} mantiene la informaci\'on de las variables no incializadas: +\textit{arm-none-eabi-objdump -d -j .bss hello} + +\begin{lstlisting} +000145c4 : + 145c4: 00000000 +\end{lstlisting} + +En Linux todas las variables no inicializadas, se inicializadan en cero. + +La sección \textit{.rodata} mantiene los datos que no cambian durante la ejecución del programa, es decir, de solo lectura, si examinamos esta sección obtenemos: + +\textit{hexdump -C hello.o | grep -i 000000d0} (la sección \textit{.rodata} comienza en la posición de memoria 0xd4) + + +\begin{lstlisting} +000000d0 01 00 00 00 50 72 69 6e 74 69 6e 67 20 25 64 0a |....Printing %d.| +000000e0 00 00 00 00 00 47 43 43 3a 20 28 43 6f 64 65 53 |.....GCC: (CodeS| +\end{lstlisting} + +Observamos que en el archivo se almacena la cadena de caracteres \textit{Printing \%d\\n} la cual no se modifica durante la ejecución del programa. + +\subsubsection{Linker Script} +Como vimos anteriormente, el \textit{linker} es el encargado de agrupar todos los archivos objeto \textit{.o}, y las librerías necesarias para crear el ejecutable, este \textit{linker} permite definir donde serán ubicados los diferentes segmentos del archivo ELF, por medio de un archivo de enlace \textit{linker script}. De esta forma podemos ajustar el ejecutable a plataformas con diferentes configuraciones de memoria.Esto brinda un grado mayor de flexibilidaad de la cadena de herramientas GNU. Cuando se dispone de un sistema operativo como Linux no es necesario definir este archivo, ya que el sistema operativo se encarga de guardar las secciones en el lugar indicado, sin embargo, es necesario tenerlo presente ya que como veremos más adelante existe un momento en el que el sistema operativo no ha sido cargado en la plataforma y las aplicaciones que se ejecuten deben proporcionar esta información. A continuación se muestra un ejemplo de este archivo: + +\begin{lstlisting} + /* identify the Entry Point (_vec_reset is defined in file crt.s) */ +ENTRY(_vec_reset) + +/* specify the memory areas */ +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ + ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ +} + +/* define a global symbol _stack_end */ +_stack_end = 0x20FFFC; + +/* now define the output sections */ +SECTIONS +{ + . = 0; /* set location counter to address zero */ + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ +\end{lstlisting} + +En las primeras líneas del archivo aparece la declaración de las memorias de la plataforma, en este ejemplo tenemos una memoria RAM de 64kB que comienza en la posición de memoria 0x00200000 y una memoria flash de 256k que comienza en la posición 0x0. A continuacion se definen las secciones y el lugar donde serán almacenadas; En este caso, las secciones \textit{.text} (código ejecutable) y \textit{.rodata} (datos de solo lectura) se almacenan en una memoria no volátil la flash. Cuando el sistema sea energizado el procesador ejecutará el código almacenado en su memoria no volátil. Las secciones \textit{.data} (variables inicializadas) y \textit{.bss} (variables no inicializadas) se almacenarán en la memoria volátil RAM, ya que el acceso a las memorias no volátiles son más lentas y tienen ciclos de lectura/escritura finitos. + +En algunos SoCs no se dispone de una memoria no volátil, por lo que es necesario que la aplicación sea cargada por completo en la RAM. Algunos desarrolladores prefieren almacenar y ejecutar sus aplicaciones en las memorias volátiles durante la etapa de desarrollo, debido a que la programación de las memorias no volátiles toman mucho más tiempo. Obviamente una vez finalizada la etapa de desarrollo las aplicaciones deben ser almacenadas en memorias no volátiles. + +\section{Herramientas hardware} +En esta subsección se realizará una breve descripción de los dispositivos semiconductores más utilizados para la implementación de dispositivos digitales. + +\subsubsection{SoC} +La Figura \ref{at91rm} muestra la arquitectura de un SoC actual, específicamente del AT91RM920 de Atmel. En este diagrama podemos observar el núcleo central un procesador ARM920T de 180MHz y los periféricos asociados a él. En la actualidad podemos encontrar una gran variedad de SoC diseñados para diferentes aplicaciones: Multimedia, Comunicaciones, Asistentes Digitales; los periféricos incluidos en cada SoC buscan minimizar el número de componentes externos, y de esta forma reducir los costos. Este SoC en particular fué uno de los primeros que diseño ATMEL y está enfocado a tareas en las que se requiere una conexión de red. Dentro de los periféricos encontramos: + \begin{itemize} + \item Controlador para memorias: NAND flash, DataFlash, SDRAM, SD/MMC + \item Puerto USB 2.0 host. + \item Puerto I2C + \item Interfaz Ethernet 10/100. + \item Interfaz high speed USB 2.0 + \item 4 Puertos SPI. + \item 2 puertos seriales (RS232). + \item Soporte JTAG. + \item Interfáz de Bus externo (EBI). + \end{itemize} + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.7]{./images/at91rm9200} \end{center} + \caption{SoC AT91RM9200 fuente: Hoja de Especificaciones AT91RM9200, ATMEL} \label{at91rm} +\end{figure} + +Existen una serie de periféricos que son indispensables en todo Sistema Embebido, los cuales facilitan la programación de aplicaciones y la depuración de las mismas. A continuación se realizará una descripción de los diferentes periféricos que se encuentran disponibles en este SoC, indicando los que fueron utilizados en la plataforma de desarrollo. + +\subsubsection{Memorias Volátiles} + +Como se estudió anteriormente existen secciones del ejecutable que deben ser almacenadas en memorias volátiles o en memorias no volátiles. Debido a esto la mayoría de los SoC incluyen periféricos dedicados a controlar diferentes tipos de memoria, las memorias volátiles son utilizadas como memoria de acceso aleatorio (RAM) gracias a su bajo tiempo de accesso y al ilimitado número de ciclos de lectura/escritura. + +El tipo de memoria más utilizado en los sistemas embebidos actuales es la memoria SDRAM; la cual está organizada como una matriz de celdas, con un número de bits dedicados al direccionamiento de las filas y un número dedicado a direccionar columnas (ver Figura \ref{sdram_basics}). + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/sdram_basics} \end{center} + \caption{Diagrama de Bloques de una memoria SDRAM fuente: Hoja de Especificaciones MT48LC16M16, Micron Technology} \label{sdram_basics} +\end{figure} + +Un ejemplo simplificado de una operación de lectura es el siguiente: Una posición de memoria se determina colocando la dirección de la fila y la de la columna en las líneas de dirección de fila y columna respectivamente, un tiempo después el dato almacenado aparecerá en el bus de datos. El procesador coloca la dirección de la fila en el bus de direcciones y después activa la señal \textit{RAS} (Row Access Strobe). Después de un retardo de tiempo predeterminado para permitir que el circuito de la SDRAM capture la dirección de la fila, el procesador coloca la dirección de la columna en el bus de direcciones y activa la señal \textit{CAS} (Column Access Strobe). Una celda de memoria SDRAM esta compuesta por un transistor y un condensador; el transistor suministra la carga y el condensador almacena el estado de cada celda, esta carga en el condensador desaparece con el tiempo, razón por la cual es necesario recargar estos condensadores periódicamente, este proceso recibe el nombre de \textit{Refresco}. Un ciclo de refresco es un ciclo especial en el que no se escribe ni se lee información, solo se recargan los condensadores para mantener la información. El periférico que controla la SDRAM está encargado de garantizar los ciclos de refresco de acuerdo con los requerimientos de la SDRAM \cite{CH06}. + +\subsubsection{Memorias No Volátiles} +La memorias no volátiles almacenan por largos períodos de tiempo información necesaria para la operación de un Sistema Embebido, pueden ser vistos como discos duros de estado sólido; existen dos tipos de memoria las memorias NOR y las NAND; las dos poseen la capacidad de ser escritas y borradas utilizando control de software, con lo que no es necesario utilizar programadores externos y puedens er modificadas una vez instaladas en el circuito integrado. Una desventaja de estas memorias es que los tiempos de escritura y borrado son muy largos en comparación con los requeridos por las memorias RAM. + +Las memorias NOR poseen buses de datos y dirección, con lo que es posible acceder de forma fácil a cada byte almacenado en ella. Los bits datos pueden ser cambiados de 0 a 1 utilizando el control de software un byte a la vez, sin embargo, para cambiar un bit de 1 a 0 es necesario borrar una serie de unidades de borrado que reciben el nombre de bloques, lo que permite reducir el tiempo de borrado de la memoria. Debido a que el borrado y escritura de una memoria ROM se puede realizar utilizando el control software (ver Figura \ref{nor_prog}) no es necesario contar con un periférico especializado para su manejo. + +\begin{figure}[H] + \begin{center} \includegraphics[scale=.6]{./images/nor_prog} \end{center} + \caption{Ciclos de escritura y borrado de una memoria flash NOR} \label{nor_prog} +\end{figure} + +Las memorias NOR son utilizadas en aplicaciones donde se necesiten altas velocidades de lectura y baja densidad, debido a que los tiempos de escritura y lectura son muy grandes se utilizan como memorias ROM. Las memorias NAND disminuyen los tiempos de escritura y aumentan la capacidad de almacenamiento, ideales para aplicaciones donde se requiera almacenamiento de información. Adicionalmente las memorias NAND consumen menos potencia que las memorias NAND, por esta razón este tipo de memorias son utilizadas en casi todos los dispositivos de almacenamiento modernos como las memorias SD y las memorias USB, los cuales integran una memoria NAND con un circuito encargado de controlarlas e implementar el protocolo de comunicación. A diferencia de las flash tipo NOR, los dispositivos NAND se acceden de forma serial utilizando interfaces complejas; su operación se asemeja a un disco duro tradicional. Se accede a la información utilizando bloques (más pequeños que los bloques NOR). Los ciclos de escritura de las flash NAND son mayores en un orden de magnitud que los de las memorias NOR. + +Un problema al momento de trabajar con las memorias tipo NAND es que requieren el uso de un \textit{manejo de bloques defectuosos}, esto es necesario ya que las celdas de memoria pueden dañarse de forma espontánea durante la operación normal. Debido a esto se debe tener un determinado número de bloques que se encargen de almacenar tablas de mapeo para manejar los bloques defectuosos; o puede hacerse un chequeo en cada inicialización del sistema de toda la RAM para actualizar esta lista de sectores defectuosos. El algoritmo de ECC (Error-Correcting Code) debe ser capáz de corregir errores tan pequeños como un bit de cada 2048 bits, hasta 22 bits de cada 2048. Este algorítmo es capaz de detectar bloques defectuosos en la fase de programacíón comparando la información almacenada con la que debe ser almacenada (verificación), si encuentra un error marca el bloque como defectuoso y utiliza un bloque sin defactos para almacenar la información. + +La tabla \ref{flash_comp} resume las principales características de los diferentes tipos de memoria flash. + +\begin{center} + \begin{table}[ht] + \begin{tabular}{|l|c|c|c|} + \hline + & \textbf{SLC NAND} & \textbf{MLC NAND} & MLC NOR \\ \hline + Densidad & 512Mbits - 4GBits & 1Gbits - 16GBits & 16MBits - 1GBit \\ \hline + Velocidad de Lectura & 24MB/s & 18.6MB/s & 103MB/s \\ \hline + Velocidad de escritura& 8 MB/s & 2.4MB/s & 0,47MB/s \\ \hline + Tiempo de borrado & 2ms & 2ms & 900ms \\ \hline + Interfaz & Acceso Indirecto & Acceso Indirecto & Acceso Aleatorio\\ \hline + Aplicación & Almacenamiento & Almacenamiento & Solo lectura \\ \hline + \end{tabular} + \caption{Cuadro de comparación de las memorias flash NAND y NOR} \label{flash_comp} + \end{table} +\end{center} + +Adicionalmente, se encuentran dispoibles las memorias DATAFLASH, estos dispositivos son básicamente una memoria flash tipo NOR con una interfaz SPI, permite una velocidad de lectura de hasta 66MHz utilizando solamente 4 pines para la comunicación con el procesador. + diff --git a/course/.docs/cambio_categoria/embedded_book.aux b/course/.docs/cambio_categoria/embedded_book.aux new file mode 100644 index 0000000..5e4c9df --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.aux @@ -0,0 +1,21 @@ +\relax +\catcode`"\active +\catcode`<\active +\catcode`>\active +\@nameuse{es@quoting} +\bibstyle{unsrt} +\select@language{spanish} +\@writefile{toc}{\select@language{spanish}} +\@writefile{lof}{\select@language{spanish}} +\@writefile{lot}{\select@language{spanish}} +\citation{SR08} +\citation{LSC08} +\bibdata{biblio_EL} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Sistema en un Chip (SoC)}{3}} +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {1.1}Arquitectura}{3}} +\@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces Arquitectura m\IeC {\'\i }nima de un SoC}}{4}} +\newlabel{min_soc_arch}{{1.1}{4}} +\bibcite{SR08}{1} +\bibcite{LSC08}{2} diff --git a/course/.docs/cambio_categoria/embedded_book.bbl b/course/.docs/cambio_categoria/embedded_book.bbl new file mode 100644 index 0000000..7950bdc --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.bbl @@ -0,0 +1,15 @@ +\begin{thebibliography}{1} + +\bibitem{SR08} +{S. Rhoads}. +\newblock Plasma - most {MIPS} {I}({TM}) opcodes. +\newblock URL: http://opencores.org/project,plasma, 2008. + +\bibitem{LSC08} +{Lattice Semiconductor Corporation}. +\newblock Lattice{M}ico32 {O}pen, {F}ree 32-{B}it {S}oft {P}rocessor. +\newblock URL: + http://www.latticesemi.com/products/intellectualproperty/ipcores/mico32/inde% +x.cfm, 2008. + +\end{thebibliography} diff --git a/course/.docs/cambio_categoria/embedded_book.blg b/course/.docs/cambio_categoria/embedded_book.blg new file mode 100644 index 0000000..86eff19 --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.blg @@ -0,0 +1,45 @@ +This is BibTeX, Version 0.99c (TeX Live 2009/Debian) +The top-level auxiliary file: embedded_book.aux +The style file: unsrt.bst +Database file #1: biblio_EL.bib +You've used 2 entries, + 1791 wiz_defined-function locations, + 456 strings with 3823 characters, +and the built_in function-call counts, 278 in all, are: += -- 22 +> -- 8 +< -- 0 ++ -- 4 +- -- 2 +* -- 4 +:= -- 49 +add.period$ -- 6 +call.type$ -- 2 +change.case$ -- 2 +chr.to.int$ -- 0 +cite$ -- 2 +duplicate$ -- 10 +empty$ -- 37 +format.name$ -- 2 +if$ -- 63 +int.to.chr$ -- 0 +int.to.str$ -- 2 +missing$ -- 0 +newline$ -- 13 +num.names$ -- 2 +pop$ -- 12 +preamble$ -- 1 +purify$ -- 0 +quote$ -- 0 +skip$ -- 6 +stack$ -- 0 +substring$ -- 0 +swap$ -- 2 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 2 +width$ -- 3 +write$ -- 22 diff --git a/course/.docs/cambio_categoria/embedded_book.dvi b/course/.docs/cambio_categoria/embedded_book.dvi new file mode 100644 index 0000000000000000000000000000000000000000..5c922ef157ad8e6693ce1bf234f33295d02071b6 GIT binary patch literal 171828 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 sS%#HdJdh^-w` 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 DU{C;> literal 0 HcmV?d00001 diff --git a/course/.docs/cambio_categoria/embedded_book.log b/course/.docs/cambio_categoria/embedded_book.log new file mode 100644 index 0000000..e18eaba --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.log @@ -0,0 +1,380 @@ +This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2010.5.7) 11 SEP 2010 21:52 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**embedded_book.tex +(./embedded_book.tex +LaTeX2e <2009/09/24> +Babel and hyphenation patterns for english, usenglishmax, dumylang, noh +yphenation, loaded. +(/usr/share/texmf-texlive/tex/latex/base/report.cls +Document Class: report 2007/10/19 v1.4h Standard LaTeX document class +(/usr/share/texmf-texlive/tex/latex/base/size10.clo +File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@chapter=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texmf-texlive/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package +) +(/usr/share/texmf-texlive/tex/latex/base/inputenc.sty +Package: inputenc 2008/03/30 v1.1d Input encoding file +\inpenc@prehook=\toks14 +\inpenc@posthook=\toks15 + +(/usr/share/texmf-texlive/tex/latex/base/latin1.def +File: latin1.def 2008/03/30 v1.1d Input encoding file +)) +(/usr/share/texmf-texlive/tex/generic/babel/babel.sty +Package: babel 2008/07/06 v3.8l The Babel package + +(/usr/share/texmf-texlive/tex/generic/babel/spanish.ldf +Language: spanish.ldf 2009/01/02 v5.0h Spanish support from the babel system + +(/usr/share/texmf-texlive/tex/generic/babel/babel.def +File: babel.def 2008/07/06 v3.8l Babel common definitions +\babel@savecnt=\count88 +\U@D=\dimen103 +) + +Package babel Warning: No hyphenation patterns were loaded for +(babel) the language `Spanish' +(babel) I will use the patterns loaded for \language=0 instead. + +\l@spanish = a dialect from \language0 +\es@datefmt=\count89 +\es@quottoks=\toks16 +\es@quotdepth=\count90 +Package babel Info: Making " an active character on input line 492. +Package babel Info: Making . an active character on input line 585. +Package babel Info: Making < an active character on input line 630. +Package babel Info: Making > an active character on input line 630. +)) (/usr/share/texmf-texlive/tex/latex/graphics/graphicx.sty +Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-texlive/tex/latex/graphics/keyval.sty +Package: keyval 1999/03/16 v1.13 key=value parser (DPC) +\KV@toks@=\toks17 +) +(/usr/share/texmf-texlive/tex/latex/graphics/graphics.sty +Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-texlive/tex/latex/graphics/trig.sty +Package: trig 1999/03/16 v1.09 sin cos tan (DPC) +) +(/etc/texmf/tex/latex/config/graphics.cfg +File: graphics.cfg 2009/08/28 v1.8 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 91. + +(/usr/share/texmf-texlive/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2009/08/25 v0.04m Graphics/color for pdfTeX +\Gread@gobject=\count91 +)) +\Gin@req@height=\dimen104 +\Gin@req@width=\dimen105 +) +(/usr/share/texmf-texlive/tex/latex/psnfss/times.sty +Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) +) +(/usr/share/texmf-texlive/tex/latex/colortbl/colortbl.sty +Package: colortbl 2001/02/13 v0.1j Color table columns (DPC) + +(/usr/share/texmf-texlive/tex/latex/tools/array.sty +Package: array 2008/09/09 v2.4c Tabular extension package (FMi) +\col@sep=\dimen106 +\extrarowheight=\dimen107 +\NC@list=\toks18 +\extratabsurround=\skip43 +\backup@length=\skip44 +) +(/usr/share/texmf-texlive/tex/latex/graphics/color.sty +Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) + +(/etc/texmf/tex/latex/config/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: pdftex.def on input line 130. +) +\everycr=\toks19 +\minrowclearance=\skip45 +) +(/usr/share/texmf-texlive/tex/latex/tools/multicol.sty +Package: multicol 2008/12/05 v1.6h multicolumn formatting (FMi) +\c@tracingmulticols=\count92 +\mult@box=\box26 +\multicol@leftmargin=\dimen108 +\c@unbalance=\count93 +\c@collectmore=\count94 +\doublecol@number=\count95 +\multicoltolerance=\count96 +\multicolpretolerance=\count97 +\full@width=\dimen109 +\page@free=\dimen110 +\premulticols=\dimen111 +\postmulticols=\dimen112 +\multicolsep=\skip46 +\multicolbaselineskip=\skip47 +\partial@page=\box27 +\last@line=\box28 +\mult@rightbox=\box29 +\mult@grightbox=\box30 +\mult@gfirstbox=\box31 +\mult@firstbox=\box32 +\@tempa=\box33 +\@tempa=\box34 +\@tempa=\box35 +\@tempa=\box36 +\@tempa=\box37 +\@tempa=\box38 +\@tempa=\box39 +\@tempa=\box40 +\@tempa=\box41 +\@tempa=\box42 +\@tempa=\box43 +\@tempa=\box44 +\@tempa=\box45 +\@tempa=\box46 +\@tempa=\box47 +\@tempa=\box48 +\@tempa=\box49 +\c@columnbadness=\count98 +\c@finalcolumnbadness=\count99 +\last@try=\dimen113 +\multicolovershoot=\dimen114 +\multicolundershoot=\dimen115 +\mult@nat@firstbox=\box50 +\colbreak@box=\box51 +) +(/usr/share/texmf-texlive/tex/latex/multirow/multirow.sty +\bigstrutjot=\dimen116 +) +(/usr/share/texmf-texlive/tex/latex/pdfpages/pdfpages.sty +Package: pdfpages 2009/02/07 v0.4g Insert pages of external PDF documents (AM) + +(/usr/share/texmf-texlive/tex/latex/base/ifthen.sty +Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) +) +(/usr/share/texmf-texlive/tex/latex/tools/calc.sty +Package: calc 2007/08/22 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count100 +\calc@Bcount=\count101 +\calc@Adimen=\dimen117 +\calc@Bdimen=\dimen118 +\calc@Askip=\skip48 +\calc@Bskip=\skip49 +LaTeX Info: Redefining \setlength on input line 76. +LaTeX Info: Redefining \addtolength on input line 77. +\calc@Ccount=\count102 +\calc@Cskip=\skip50 +) +(/usr/share/texmf-texlive/tex/latex/eso-pic/eso-pic.sty +Package: eso-pic 2006/07/14 v1.1d eso-pic (RN) + +(/usr/share/texmf-texlive/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texmf-texlive/tex/latex/pdfpages/pppdftex.def +File: pppdftex.def 2009/02/07 v0.4g Pdfpages driver for pdfTeX (AM) +) +\AM@pagebox=\box52 +\AM@toc@title=\toks20 +\c@AM@survey=\count103 +\AM@templatesizebox=\box53 +) +(/usr/share/texmf-texlive/tex/latex/graphics/lscape.sty +Package: lscape 2000/10/22 v3.01 Landscape Pages (DPC) +) +(/usr/share/texmf-texlive/tex/latex/listings/listings.sty +\lst@mode=\count104 +\lst@gtempboxa=\box54 +\lst@token=\toks21 +\lst@length=\count105 +\lst@currlwidth=\dimen119 +\lst@column=\count106 +\lst@pos=\count107 +\lst@lostspace=\dimen120 +\lst@width=\dimen121 +\lst@newlines=\count108 +\lst@lineno=\count109 +\lst@maxwidth=\dimen122 + +(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2007/02/22 1.4 (Carsten Heinz) +\c@lstnumber=\count110 +\lst@skipnumbers=\count111 +\lst@framebox=\box55 +) +(/usr/share/texmf-texlive/tex/latex/listings/listings.cfg +File: listings.cfg 2007/02/22 1.4 listings configuration +)) +Package: listings 2007/02/22 1.4 (Carsten Heinz) + +(/usr/share/texmf-texlive/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2004/09/05 1.3 listings language file +) +(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2007/02/22 1.4 (Carsten Heinz) +) +(/usr/share/texmf-texlive/tex/latex/tools/longtable.sty +Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC) +\LTleft=\skip51 +\LTright=\skip52 +\LTpre=\skip53 +\LTpost=\skip54 +\LTchunksize=\count112 +\LTcapwidth=\dimen123 +\LT@head=\box56 +\LT@firsthead=\box57 +\LT@foot=\box58 +\LT@lastfoot=\box59 +\LT@cols=\count113 +\LT@rows=\count114 +\c@LT@tables=\count115 +\c@LT@chunks=\count116 +\LT@p@ftn=\toks22 +) (./embedded_book.aux) +\openout1 = `embedded_book.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 44. +LaTeX Font Info: ... okay on input line 44. +LaTeX Font Info: Try loading font information for OT1+ptm on input line 44. + +(/usr/share/texmf-texlive/tex/latex/psnfss/ot1ptm.fd +File: ot1ptm.fd 2001/06/04 font definitions for OT1/ptm. +) +(/usr/share/texmf/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count117 +\scratchdimen=\dimen124 +\scratchbox=\box60 +\nofMPsegments=\count118 +\nofMParguments=\count119 +\everyMPshowfont=\toks23 +\MPscratchCnt=\count120 +\MPscratchDim=\dimen125 +\MPnumerator=\count121 +\everyMPtoPDFconversion=\toks24 +) ABD: EveryShipout initializing macros +\c@lstlisting=\count122 + (./title.tex +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 11. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +Underfull \hbox (badness 10000) in paragraph at lines 16--20 + + [] + +LaTeX Font Info: Try loading font information for OMS+ptm on input line 23. +(/usr/share/texmf-texlive/tex/latex/psnfss/omsptm.fd +File: omsptm.fd +) +LaTeX Font Info: Font shape `OMS/ptm/m/n' in size <10> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 23. +LaTeX Font Info: Try loading font information for OT1+pcr on input line 24. + +(/usr/share/texmf-texlive/tex/latex/psnfss/ot1pcr.fd +File: ot1pcr.fd 2001/06/04 font definitions for OT1/pcr. +) +Underfull \hbox (badness 10000) in paragraph at lines 23--25 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 26--30 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 31--34 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 35--36 + + [] + +[1]) +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <24.88> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 47. + (./embedded_book.toc +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <10> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 2. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 3. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 3. +) +\tf@toc=\write3 +\openout3 = `embedded_book.toc'. + + (./chapter2.tex [2 + +] +Cap\'{\i }tulo 1. +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <20.74> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 1. + +Overfull \hbox (2.1569pt too wide) in paragraph at lines 3--4 +[]\OT1/ptm/m/n/10 En es-ta sec-ci[]on es-tu-di-are-mos la ar-qui-tec-tura b[]as +ica de un SoC mod-er-no, com-po-nentes, fun-cionamien- + [] + +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <14.4> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 6. +<./images/Computer-simple.png, id=15, 488.57532pt x 328.22626pt> +File: ./images/Computer-simple.png Graphic file (type png) + +) (./embedded_book.bbl [3 + +] [4 <./images/Computer-simple.png (PNG copy)>]) [5 + +] (./embedded_book.aux) ) +Here is how much of TeX's memory you used: + 4384 strings out of 495061 + 58680 string characters out of 1182622 + 142655 words of memory out of 3000000 + 7487 multiletter control sequences out of 15000+50000 + 24721 words of font info for 48 fonts, out of 3000000 for 9000 + 28 hyphenation exceptions out of 8191 + 34i,8n,49p,1030b,263s stack positions out of 5000i,500n,10000p,200000b,50000s +{/usr/share/texmf-texlive/fonts/enc/dvips/base/8r.enc} + +Output written on embedded_book.pdf (6 pages, 104382 bytes). +PDF statistics: + 47 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 500000) + 6 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/course/.docs/cambio_categoria/embedded_book.pdf b/course/.docs/cambio_categoria/embedded_book.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ccffd3ff714c6d506befdae32eba3e8ec2da0226 GIT binary patch literal 104382 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

F{Aupvj?s90^K{td{tzO8)tbbGz5`n^cL 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�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 z

66x9{=EyBl( z3w*}^1f0wT>amxc+pLLS*w1ijrn{r3)f5S>=AOh)#;wXLw+OiUNrl(69J|P9s;rla z92T8OcI0DCS{;5$gj&X=exWkDuGkgYr;gl*+?CD@NqbQHlJEt z{be1I^4kZRbYj8M`Z1m6C-%tC_b&_A@@_a(5>XbLz7V1TuR??!f5?o zT|aS0SkPh9_1h)Uj$JbiRvYW_#KBC*Md6dq%T1L-+~??JjlTVxgI$mp%(0Rk)U!2s z+2w<*g{|ht>5lIo+p8xx^B+yymdRaH76Lyv#xjbq%9dQ7Rfd#bEt2DoyDN!R1}470 zLW`U9j^jBcqcDJdnNyIvTc)f#`=ZXqc->?AsAtKr%4V>8hlq=eaOPMhTnsD?Mz>nI zN4=`{EMnXaG)j?cyBXk_zxn-wtx>dqp@aAcX$KJ3OCpmVRWGt6bFV+HIeEjXL=KsI zLHC^x0Ol=1Qv!%9QlE`KOVP~hB0M_U07WmB<=Zi@HrK6PA4Kyktv zQ-|!YaVkv@%UbF~TW|AosS)V@5XdTnEskqg(hHQq!7~yJ9lATwE2j>Qgwj!cIjUxo z1QoY|$BXOKa`w6y+}50sqlC_B4(y?9Ighne@AwF=Uay}O=kRMV(Kr*Fwxt}rd(*B< zt0?JZQ>K19zXv)p>(|(z+EUN5f1#B4Q}-*PU7DfZsy{GhIMu zCp*+Hs(C!aT5qV>OlNT1ZGJ9&y8hsdd^|Co%IX}Eh@iJ@*wkB^9b$=D4p$X~*iW%g z#_7Owh8mrD#0*em?sSRBHWbx-$vWMdDs(lQ)b%l2E`Nn@iDa4iKl{o|jQ^)b{;#z) zQ8O14XDdfn2j{yxKU#FZbFbsc<^4C2&roV1VxfRmE{YdMJ$b+|4O={WU%VX!rGaiRL# z_xMV$G5aDZe_{PU%k!BS|01D(Up@Ta=+D9ScaZ;@j4^Wk{p4T3pZRO{{$G!;0se<* zoEl|6RTVSLWf*di3DRs|JbkoV&=vQfdd$qYvG1mgn1#bcUF&c5x_>UiCh%-g-(l+KXIYgJl1zW3AS2>}@E8Ik6JbMum_v4ea^+obO~1{&@%C(ey`G+U?O{`? z5vb&c1i8eR@u3J3fii`gk&r+_8TQ-T#w@=xgNfA&VNn8quVVly_J$V}6{Jk_gdrnl zT81Aj2P2WQG{*X=+A=AO3|jGR9xOabFo?Ncab&4ikxo$w6BvtxK(bjI(cUW&tltQ^ zIGJerh#0CDItG|YQ6xb(NK6T_qBPKxIra>tw7^u7qQ0@5kCW4hKw;f+TN<}bd_N=r> z2(FThk*Z=&cst1RE=<2rDo`>B1>!pmG(HJ$Kzh*W&+&J1 zcG*87bI}t}sBOlu9ZDMfLpUw`D&0L>N4jmj&1y_f~sSLXSPZ`a7GJAVUYJ%43 zF7GlI54+&_^TnS*Qw|sQ$D5jqwbW}(w}O}Mp6qQUMANVJudO)nJ(8?;S`4MXZDhmL zpIFH3giKbjylQ`xtnI2;aM7GUl(eI6=3z$|aQx9d5$hUws`DPuT|c{R*wA(vl-UDW zQ`Hy}lHOPtwrMYQ&84#1+#kPMk9au<@&_<1v>FV@Pj@u!y;t;*tlPlWE&2wO{%L(k zomegX)o{DkT8RN)(ncK~HD4u@Dk;*{X*(8nx98OP%ro{}l8(c@0jEk2nhcQgXE70=Ya_Et0dr@lC- z%3u;?O#HU1c!^~i6>~hy2uO{ydNR*lt~GbHwQHfInxS2Ve$T{Bf6sS!ee{0^8~-fE z_}hBqe})YqB~@_|wJ+FE(PH|VRsCDs;3A~s`szM@;l@{2pM&imxbX!d|8Ka#`BmHh z18x|*+1i@9GMHF7o7jE@oH=?qyZ$SD`~?>O3LpP0bot-#!OH%3#Q0jwVf+HLzuoy4 z_+VoCzqVtksKG%kxygaCJ%FNuv%(knn<~YqzPCG6;L#Z_DxCBPUtl>B*M>j4jKdEy4 z^wKQ#2IMf+*3r<1n>&K`z-F0j%v%F(F4cPh%!x3j6?Wy0%+*;z?iS<&=o zT1gqnndceldC8RpHkO4JhPE(?qqOc5)sk}1qqI`fijp#uRPx}_WrrmNJm8q#h7rea z;681yZ7;V_wAR26726=;HxXJ-co=|IhtKq95;M07ph zVNol{(P3V}#WDq3LBiS?yLR?d43uhMWu4p8O2c8o#Y@Fu4$;M%DPfXjqN9}Wq?96h{c44bDAGiYYG~aH?--5p5xizw=Sck|R zfm4^J(|R>u&nF z<+r@j%nXDXu^cw>C$+2^+;2F3u_A{H>DI$I@B8W zOi+^Rdp*6B2r9IFRM7Yw3aol|w^CLLip)1|odH;)HzwGrTk!zZU7Xulo5Yb-+3$JK zc-(_mzDutRSCDp*$FdvN4}K$TFPmF06#@^JXMw>nKI`j~LGfGXp1bd|js)p@{R9+; zngo;Vi%d@Xx%ud=kOvYjjT3&?Vd*P*B3gLC|cdRl)KDuh|ksa+)qOM2kvF)oLlF|qe~j5dv^3c z5}Be+T588-M#^SXO1bP7x7D29=_E7DFC5C$5<_v<)C3#R}&~tT=0b)!tZZ4(# zCAg3e{d~|ekOD5oY=X8>L`3Z!%;(uS_&>D0KiFc~);j0Ga?+S6y<9vgtRvFobqHw~ z2pYSl>0e4JdT+ft`-Q_EO9j5YW#b)2v7U8S;rnG1?ORs9^0?UTZ5R#FIwNS>Gg)r% zs@Ct^-^K?YshDa4Fzd|XQ^o?gEq<`)(*yDFeM|XwCH$YwqyJM0msgP%Q;_|y63+4O zEBIG>B^?(V)7Jt&+ZUJS{L3r*-^~C2xq@?jRn-4b!5y8g?9BePX8)Jk@1GpGOpO1m zWBGf{=4AV)n$5(*`t@u6P0{B1Y9{_)bABIQRWAZ@jA*rDT^dMu=FH3xtjwkk^PjO3 zh%y*fcr1`3F)Z9J;hFnc($-?icHza&WggmT#ZB3E8w+CeY}DuOE0lIPsrUG{`4`QA z?)1Q2H6mR3MoGmzvDt0YNVxNt|&&~{6)@j>>OVYZ1;LHrje1_KFb!|O3K6z0H$0^_e82~odED9W9>5`M!b2f?*4>Lz_9 zK?5~0CPp=s3)O{3M0z1sr38I;%pgytA-)WbBn8APx=d}52@_#NWwqqfpBS*BhC!JH zz=|r(A>$4MIUo@X&$i9WUE8udWW-Ar9yZ|OA`|msuoZCb;DDLiltrv;?T`TCNZ{>Q#G1wsR(!|NVuhRiM4Fl07GRk}3YQEb z#10b&g(kZ3dxy<)NyiySxj|yZ{aM5U1T{dINgn&Np=cq96H!o+pBCJZ3MoTcNQ~17 zj4&$_vR^dg@Lu@>n3|M4OL!2(m;z~GAMRT)Yalkv4VWoE8N^cwx<9A5d z9maQ*Kc5bsk66Bg&oG}&j!&Pe{90(=2Q zTAcoeCl!5JF;x)3IN|u6Zd~4)&2t{>A!`O`r)s~8F;MNMWeYi!y+7bhI~L-t6%uRm zoNF(kcTh^#P3+JAXcX3}E^;JL z5x6O2Wmuh0Biwcb%$cW4If@H=3nfgeJmw}L9qT3xU0eli-gMrM(!oyQdh^vDmtWGH zGRnQmtavPR3g0w#nK9vxtsT}|dqwE2y+Ma>^tUq)i#(Ln2RIRKKmzwTyZ)Z;8VsLv z_ds{kSJr5G2)ATQ8tU)|{ctB3&sw@0j9eaD@`Rf&NPhb^e`CDOERG)a-bG!t?bG=(HJ--`WL%F_Yon-Dm zEpl6U)GEN?8NJpPgmz*!P3T`GXTKr>c3#Qge`yg+t!uNR+w)pCFq-OCxcmB8wWSIU z*{lS07G$NUnuPKhAbHj)9f&7fVQh@0?dYhZv(>S)=!+xca+=JZsyCKyXa1r8DX?`o zScGuwIcb69uLd7owIP|jT!cSlQR_>!b!P7*>>y?>{iO3a8>M{J`{U-*-)qD3olfgx zIZsbPBvo@)+^_hsTBnF%I+d8*^JBR#bjnT`*m|A!-A2WTl{G;+k zSBF)TA;HD|#i9V^ugUsHWHB!w3pLApi@aNMni#-)R9-F8(4Ie9bc)*d4PrX#eMt5e z`WoZ!&XT}XZ``LX380(P7}YFKs%HeM>PZ3B0v@A6zNZBg`=m>!_H`$z9%-A|zi>VG z^R7^FpB8oIcVmTCd+-`1SH7$)4?a9?*>fFt-7a<$MXBG<5?St}x%x0R7)o3fxtzFC zIo}jZ+)kVeiUpnKcv-7uklP%`!^?Wa$<~CudS{h8s9l43==rabtarUza+H*ElM+|5 zeC>{xa}C9pz`fRv7jK{C9K88iq^cNXNg)~9eSbK0xQTZ-`Ynp;o#xl-xIJQ-bz?Hy zSttDcYp%XX#v zMZ`0w(Y#Sbd^QtD0;_{VRSwI!EL`aw-gy=FYr>t*iY)u_GoYbh&N|=vv(BB35F!8Kfq@9p`H>0}ZnfMeA7>sh$Ka-G zfhgaz()M$nMcvp0i>g?_=;Hb57C9{Mi^O131^}d0v(oF|k(~ct{Qs{I?*ED8$cam< z$*cbt$@vfM%`Z{N7s+A!nx=Aoi5oe%{(m4joL^nX|3Gq#T)vu{RxUPnMy{3&#zrPK zF1AK4e;qk97&{x8nAw_{yZ-IS`LCWTgPoPV+yAEz`WFTI*NN=^X=3=|Y+v~%f9FA8 zP8ugwU9J4CQ83x1qHv=ey}f>DGL_I+I> z3KDdLMG~Y>3}&1 zWv_16M&GwMD4?nzc}zHvkVieVJt9Etn}BQH_0SN!0-(bP0tG~{!&8u8Vtm5S8H@)Z zLZE&mu%D13f4%~&`vF4!IQ`(B%_AMH32rhBjfKK zgRi~4E(swEI`F{2A_RJQ4FQ+aJ*Qyr>8C-pwTM>&twsTbpJTu=fgyyC>wkRT5xDG- z5Zds16>amjLJA?8BY>Yh0S#+jzdi?!pq&8=giBj21CN3rmXIOBoxtvdKDPLDn7c$| zfe(OE=BFNo{eX}`0D2IB?)DQf_|YK_I6wjfY~5}BNaZ6$q$`*h0D5mW1VX@pfS3h( z-(*58cng4qY!4*b1Pp}rKw^h{62J6pmlFjdOeKVH^FsAcOueNe!D&GF1f9F~Lg`2Z z@*&>NRtUI@l;e%!frJO+qkb&N0$~s^Ty6P6#2M;X9A7QLejI=ZU3|)a3Ka|d_Hu1L zNR>U{{Onc%h@S9T#xq{K`w>3omss|ne|kN~5-}j$fjm3&bqdn^10w}qiwG<6^8)}x zYXq3x0l92JP#!-qdf$JT>URr-0gj&Pk`J~FQwmxbJGL4NFsfc-kU2Rp1gnS%L=riw3 z+-_?1$M;(5&<=mq_wFGd^O1+6SC+?Eg$)HFTD>bFNG{b+I9tB9`1Fi5QBHRK8%?yG zl5=c{H+*@U>VhojJ8U~&oTbG^>Q0feuOJe~5#CNySkvoCc;9}{ohSmsY}L24;@qG3 zk>%VD7U^96XScxz1KWatky?|cJU8jM$yQBSCSx!vk3vN5PJiS*bU+~2rhXVqgnz?xFjvBo^*JQfchoRiBWl8cm*oNtPZQM7u{ z`7%91Uq&pcIo(p9sov4#$JWr$H*0Nbk z;pkEL-O!s5n>dxHJEs+m;Si%o;4NazdIPLkQu$HMKW)k!SQc%tq*HWT@b(+=PH%Ro z_#U5C@hPtZBXXNqBan!XjFSL~WwCAdO*iwR1=Ql5`+OVOl_0HaK|j3S=k6WH2rF6@ zifV+{?4f?rofZh|o{6kzsN6Gb2o!Q{Wg&1GJna=dZ_{ua_9WUWkO@5Cd#gn3iC5uZ zT>zIBVfL!=XH++g`HUg5Z3?kQ_X9vTdtTb@Ij&5T$;rCO2$k=pCD`~0Z|D}&dCK{I zR01oGmSk*TqRRS*`d?<}N3%o2JFAogIDZ5q=VkxYX+-YKV%V{4iCIMr`JiS}D?(Kmo|8jd1mS^Fli#InC{?v|c)gw&k zQ@ zv&5jpC&tL-`!bDj*zv;0nv!H`cM%2@~ zAkh~*h>8fJr}DB3-{j~>eri3KbraAGt#Y>Vq5E11H@u!Tgd~B5z)pt|74fCfg2wLM z6v&o-=uYx~TD9SK2r@tztm$admyeAp@D8}oM zK|YaP`@6Vz*NpCpinN|~ojt+dOWtev39H|JHwqgwO+F4 zsnNcDDv+m{R>)qUx z`Hol#hGVJ5It1hOf;Lek#XpVv;h)yb^RwB2cCzsUIYB+pG6M^P=5`8lNUgsV_VLlS zyJpEya==m7y*3A2-bC`Fuq`TYY=aXEAsF8R_71mu73r`h7=HyW zz&7{VTWx!i&CS><&FtLo^#ddMK*qJJ+iDB>M_jm40Z)nWEgl^7@+LjZCAQHj4+z3BknJrA!40l&& zCgKm-s;K#|RAj%YLh>kckrwGYxc)mmPYy>k5lKs-UopT2ryKt9MugsHEM#ijS#u>uC$R7PRg$8B_h!PGwZTF8>eT1dl5J?p?{2FVIgQJK z-D^14AtkxSX6Tk8HuW#`fnyjSDR$SZ?CcAY3isAs#@SnW6bz# z=eaxW|ClpwAN8_^VqC};TQ1gw87=Y3ys^?zmg~0qy98y* z`k8E1#JU?d2BK=BA6IyKsx0KliN5|?ya}&Tt5TYN&~WtDd4*xnn=?yEMA3JbWc6Us zgucxaGn00tiR=%{AO)IUH+%Emm`I~cM^2}-y5+slgpHTKpHJ=hrF(LRR&$Mo4%y7F z^HbZ}BXf_lHd`#5Lf?6m@0$M8%+-zN#>&g#tMFr&G3VXtc#Z2Zy8vbAoMH^V0`0ge zlbnvvuk}|gLSX>Xhn_BNt&~UjLd~4h8J>JOJ0ZWUA}kNQ+m3C+Nrf6@{>&J%`WBW z?#?rBl=cAGK&i@n3Iw%>C{o9lP}9GqIZ0;V=l821uV_|`J-W0fJ5kh!%U?O_u^}CS z(Tn>la@Fg`@Ul=wOX+3p&ylq2w<4i?moQUuM~y>3tGGH@ge>Wy8lJx@zOS?xC{ER| z?yqj|#J)XcXMgHBED}#oT{C5}n5FTUmx!B8Qmiyt?dR$gb%4-aO^SGkTS*eZ`n#rG z%?P{pY;Lnw>#Jj(m{1r&TiG|Fg`~{17NYu}8psFNP*g&!SZ~!aNblT{Og&D#2s%Of zCHamBVB*Z_`aSn@S&?NnCmhfyiut1=PE zJRG;aZQ8CPt)bxz`n8sfH9wihuA{k>tqWb|CC3ukgbumw>fM~Bv#ojy1?^vVwYDc; ztbdf1hIUszG}>}r8H3MLy|h=3W31r5D`xX{?x}}0d@)z$rXVfFO~^6uSRVmoPWO7( z2}bozE)KzOlTJ%hm3@_Yh)2tEBj9!XdBmrFQ{R#o5<9b$tO@zMsDyM zaV}(CQx0o0%uL7RsZE^9v>ws*$b3T|@e0@{aB)9QyweeitS~xeHeEOn)GT$%?q4k3 z$FmoA@FP=zCXTvOnRbL)W1%RG!_=P0NkyC8z>J=7%!(giNv9bu!_r&6d-k|sK_w

Ifgzqn;iakQY^py4TC!_}1F4K#r_ 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�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

%XLsYu?sZl#IuW~Oth+>d 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 YAxljeY3M*1rQNt=wXYdvFEm{L3OL_h6#xJL literal 0 HcmV?d00001 diff --git a/course/.docs/cambio_categoria/src/hello.c b/course/.docs/cambio_categoria/src/hello.c new file mode 100644 index 0000000..bfb2ba2 --- /dev/null +++ b/course/.docs/cambio_categoria/src/hello.c @@ -0,0 +1,17 @@ +#include + +int global; +int global_1 =7; + +int main(void) +{ + int local_i; // Variable no inicializada + int local_j = 8; // Variable inicializada + for(local_i=0; local_i<10; local_i++){ + printf("Printing %d\n", local_i*local_j); // Caracteres constantes + local_j = local_j + 1; + global = local_i; + global_1 = local_i+local_j; + } + return 0; +} diff --git a/course/.docs/cambio_categoria/src/hello.o b/course/.docs/cambio_categoria/src/hello.o new file mode 100644 index 0000000000000000000000000000000000000000..9e4fcfbdf6564669569efb771ffa02663d727546 GIT binary patch literal 1188 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 literal 0 HcmV?d00001 diff --git a/course/.docs/cambio_categoria/title.tex b/course/.docs/cambio_categoria/title.tex new file mode 100644 index 0000000..caf8cff --- /dev/null +++ b/course/.docs/cambio_categoria/title.tex @@ -0,0 +1,41 @@ +% Title Page +\title{Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño \\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + UNIVERSIDAD NACIONAL DE COLOMBIA\\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + } +\author{Carlos Iván Camargo Bareño} + +\maketitle + +\newpage +\thispagestyle{empty} +\parindent0pt +{\scshape Informe Final}\\ +Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño\\ +\textsc{Author:} C.~Camargo\\ +\textsc{e-mail:} cicamargoba@unal.edu.co\\ + +\vfill + +Copyright \copyright 2004, 2005\ Universidad Nacional de Colombia\\ +\texttt{http://www.unal.edu.co}\\ + +Permission is granted to copy, distribute and/or modify this document +under the terms of the \textsc{gnu} Free Documentation License, version +1.2, with no invariant sections, no front-cover texts, and no back-cover +texts. A copy of the license is included in the end.\\ + +This document 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.\\ + +Published by the Universidad Nacional de Colombia\\ + + +\newpage +\normalsize + +\thispagestyle{empty} \ No newline at end of file diff --git a/course/.docs/cambio_categoria/title.tex.backup b/course/.docs/cambio_categoria/title.tex.backup new file mode 100644 index 0000000..757b2b3 --- /dev/null +++ b/course/.docs/cambio_categoria/title.tex.backup @@ -0,0 +1,41 @@ +% Title Page +\title{UNIVERSIDAD NACIONAL DE COLOMBIA\\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + Proyecto de Investigación:\\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño} +\author{Carlos Iván Camargo Bareño} + +\maketitle + +\newpage +\thispagestyle{empty} +\parindent0pt +{\scshape Informe Final}\\ +Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño\\ +\textsc{Author:} C.~Camargo\\ +\textsc{e-mail:} cicamargoba@unal.edu.co\\ + +\vfill + +Copyright \copyright 2004, 2005\ Universidad Nacional de Colombia\\ +\texttt{http://www.unal.edu.co}\\ + +Permission is granted to copy, distribute and/or modify this document +under the terms of the \textsc{gnu} Free Documentation License, version +1.2, with no invariant sections, no front-cover texts, and no back-cover +texts. A copy of the license is included in the end.\\ + +This document 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.\\ + +Published by the Universidad Nacional de Colombia\\ + + +\newpage +\normalsize + +\thispagestyle{empty} \ No newline at end of file diff --git a/course/.docs/cambio_categoria/title.tex~ b/course/.docs/cambio_categoria/title.tex~ new file mode 100644 index 0000000..757b2b3 --- /dev/null +++ b/course/.docs/cambio_categoria/title.tex~ @@ -0,0 +1,41 @@ +% Title Page +\title{UNIVERSIDAD NACIONAL DE COLOMBIA\\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + Proyecto de Investigación:\\ + \bigskip \bigskip \bigskip + \bigskip \bigskip \bigskip + Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño} +\author{Carlos Iván Camargo Bareño} + +\maketitle + +\newpage +\thispagestyle{empty} +\parindent0pt +{\scshape Informe Final}\\ +Sistemas Embebidos: Teoría, Implementación y Metodologías de Diseño\\ +\textsc{Author:} C.~Camargo\\ +\textsc{e-mail:} cicamargoba@unal.edu.co\\ + +\vfill + +Copyright \copyright 2004, 2005\ Universidad Nacional de Colombia\\ +\texttt{http://www.unal.edu.co}\\ + +Permission is granted to copy, distribute and/or modify this document +under the terms of the \textsc{gnu} Free Documentation License, version +1.2, with no invariant sections, no front-cover texts, and no back-cover +texts. A copy of the license is included in the end.\\ + +This document 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.\\ + +Published by the Universidad Nacional de Colombia\\ + + +\newpage +\normalsize + +\thispagestyle{empty} \ No newline at end of file diff --git a/lua/examples/Makefile b/lua/examples/Makefile index ccb926c..a5c8eb7 100644 --- a/lua/examples/Makefile +++ b/lua/examples/Makefile @@ -1,4 +1,4 @@ -DIRS = lua_blink_led lua_calls_C1 lua_calls_C2 lua_calls_C3 lua_calls_C4 lua_calls_C5 +DIRS = lua_blink_led lua_calls_C1 lua_calls_C2 lua_calls_C3 lua_calls_C5 all: for n in $(DIRS); do $(MAKE) -C $$n || exit 1; done diff --git a/lua/examples/lua_blink_led/Makefile b/lua/examples/lua_blink_led/Makefile index 23c88e6..25c4f11 100644 --- a/lua/examples/lua_blink_led/Makefile +++ b/lua/examples/lua_blink_led/Makefile @@ -19,7 +19,6 @@ $(TARGET): $(COMMON_OBJECTS) .c.o: $(CC) -c $(CCFLAGS) $< -o $@ - upload: $(TARGET) scp $(TARGET).so test_gpio.lua $(NANO_PATH) diff --git a/lua/examples/lua_calls_C1/top1.lua b/lua/examples/lua_calls_C1/top1.lua index f7b5444a1b116149376a9308c24e8ccc0513e89d..5e66165250345fddaab835bd44e08c90114811f6 100644 GIT binary patch literal 104 zcmXBKF%H8Z3;@8LS2$im7V?6qL#IB&0#i^)OpN(|D|No>6hHLl5Ib3c12F85Fa(|Q vJ*zTcRyo@wbY1IZ9t*c7xVboN<{Xk(sl#u729GaW2k5*Y5j-JE;^nu$2g4yg literal 5636 zcmb7IUu;`f8ULJ{whjd9riHnXiJM}UAj(zq2Q)?>oY+p9k)|QZ9@xvBV>^i}JGShb zDM27i8m2y!I-oslTEzO$qDoY2x~CzntU_!OJONKg6H)}4#KVNzX#*sxncwf6d+eKk z)%cRn-}%n>=X~G!f6tFn6QiL}NDNpK7IIsMM20|PpB6b1k*OiE<*@Y0%C4ONW)HDD+3G=lyNsEr(G`yqtP;^U(2pC9()$Ra z0ZRM(puhDK0{e-9anV14?J<7(XPg`Z=1X9#%=IXceL-N3j{@eyJcGdY*e?W*kpcG8 zCkdZpK(G+)TcGS)LIf>64$8439G3@;cLIC_{A1v0-woOY`!^`}{Y8-ZpTJ9p@%Nzd z1Xzx>*6)-*?2=Q{w0{i#|4#jY{ST>+B$FUr@c&ox0ePOh4>sseS!PEA*#F;FCH->> zlcXoJWBISykU&?#pE|lGDzFHP{9=y12 zW+lyHx{&{V4s148$t~ooUasQKSJK5CtmaFo-?#SZ=iO;vJ5fkitGTKameZwjZVASv zBFf|^n#NLI_MnoVTgYVGs#7gF{p2z%ok2uiZUqs}XVYGqfr^{cMR%@Rb*o;wLMh4+ zEM;YEVtgdw4#1MYQQ`XC{YM#Rr2eJ!8p>uaM)G+~^)|J)P{+Vc%rDN(TRwg0(>Cco zyMAf2w`cohYrAo`HzIG|?v}T1M?taL)l{a=b4uq`D^`2Ce);gXdOQAO(;eDbnn#6?Q~;>Yk8#1KRKw!Drw?jVk>+l(n%TdPaQ$VN=!C*mj{ zl6a&WG>&+5EXga3C0e^ww^6?t&cwbPNyw#08}^o|SkK0DT=$V^?Pqn7)ho1V?})ud zoA!=VS3{DF)uQe4waAqGyAeOp6RpTuzn!yaBUW2i?QDeCW4fI+IBXJG!))8+V z@zxQq%CQeQGOxb1R^PH;naer&J%ae@Gg|ve{T%$$FJlUK-0=Oc*RO}yt{jHm5ajJ* zA7}qvhhA80)rXJj&#fQtZ8wItqO}+5Pr_e0d_%Q&GyG1BewY(ZDfrgo!`KV^`dF_g zVb5`6yeo*u*!N%(8hgqO(3kD|YK`xm+ueb&Z8VO>Fxet6hNo0qv}H^pC$Iju(f`=P zM&t?I&v($ztv*(Ih^J>|+hROj5{*Ry{88{G4nrBwMy=I9924ZQXU-Rtj-K;dhYp_0 znX0!uKQG)G?3wXYZ`Gd7RXvex$y>}8C^$`;hP{<%)C0rv%e zkEP7)pVXJJMB*vCZ*20JuiAsopfj+eW(YNd|96e{Gt6UiVQE=H47(jWfPao{JoNKp zEH;p5*q2z=F&-%Q56{{`_J02yC^zRQn%Woq_V<;kN~gM7^wM+URK1F(i>AaQf`^5Z zU0q5S^BHj#)73@A!bnrEA`Uvlc|KRE=1WUE7#Ffiu0V5f)M4eQ1Hm~zJ~e~(mglPC zs8h?Sl+?lCFl5AE0aiCJGYx z#S|@3kM~PrAIkJYU_EgP$U7;^yq6Mfl-VwQ8GRRJ-ZQD!2_ex&*~m$m?;?

>JKi z;tI+JjQ$cTj2`cD#5kS%V9s}JD@{GFdEyzP1Zw=%0(x8nMCN9|=)Hgnwu?PN%FrR& zC>x+2mkT#%0G(J$(EWhOIaZLCf#BU<}H^JDviW>T*-X`=m577H%K<_&At{>3u zuL63!>)eE%=`)C$@$s(gw;SP|_a5}lQo#q>Fvhz;qsKk<;Q{Ub4tfx&Jk*^SlfnjX zz{K!-RM1}&p!aN(Y03VKx{ombjObbD86T`OKK>RcpF#N|^nzgY?xWI_DK9|p9t%F0 z@!`nprix0R*7 zDqCl*<$pPHZ4oU0i;`|K@3k_~{{p__>R)Qcb5yub1mpQN_+UJ5Q?93l@~<;NC4l+AtBXzkJ(M^; z9Jvs_cK->=J4+mt@%;Mk19b^B_qkA8M9Iwfh1yQY$v}glwhkEtZ^oN%15beu zz6~S-`lrxVHX!F)!6JBbH{|Ro?$ZAOc%Di6ZJzAS_@q*JIuX#$mfVFxX)axG)%D9w zFRuu$SLH&^%VnK`Z}txe1#UjOLT*U(%R+X!SX`CT+{IkRL;c`4Oc<%jq-sPrYB)A& z%B>dFy-&61zc?V9^XalP&_C2K#nr_8@)FWZes6O4{CL7-)^t-Xxr^zgYymGHQ_~j` zspK=$DfGhRcZSDO&3BXLdxZaR(tOScypY7>t=9;?T&RbR-H$8kPJ6%;%MJ(rL&%P2 a4;VM!L-v2);hV^#pI_X49&Gf3%Kre5ePcEN diff --git a/lua/examples/lua_calls_C5/Makefile b/lua/examples/lua_calls_C5/Makefile index 156a832..328594d 100644 --- a/lua/examples/lua_calls_C5/Makefile +++ b/lua/examples/lua_calls_C5/Makefile @@ -1,5 +1,5 @@ CC = mipsel-openwrt-linux-gcc -CXX = mipsel-openwrt-linux-g++ +CXX = mipsel-openwrt-linux-g++ OPENWRT_BUILD_DIR = /home/cain/Embedded/ingenic/sakc/build/openwrt-xburst/staging_dir/target-mipsel_uClibc-0.9.30.1 INCLUDE = -I. -I$(OPENWRT_BUILD_DIR)/usr/include/ WARNINGS = -Wcast-align -Wpacked -Wpadded -Wall @@ -7,13 +7,17 @@ CCFLAGS = ${INCLUDE} ${DEBUG} ${WARNINGS} -std=c99 -fPIC LDFLAGS = -L$(OPENWRT_BUILD_DIR)/usr/lib -llua -ldl DEBUG = -O3 -g0 NANO_PATH = root@192.168.254.101: -TARGET = mylib +TARGET = wrap -$(TARGET): - $(CC) $(CCFLAGS) $(LDFLAGS) -shared liba.c liba_wrapper.c -o $(TARGET).so +COMMON_SOURCES = liba.c liba_wrapper.c +COMMON_OBJECTS = $(COMMON_SOURCES:.c=.o) + + +$(TARGET): $(COMMON_OBJECTS) + $(CC) $(CCFLAGS) $(LDFLAGS) -shared $(COMMON_OBJECTS) -o $(TARGET).so .c.o: - $(CC) -c $(CCFLAGS) -o $@ + $(CC) -c $(CCFLAGS) $< -o $@ upload: $(TARGET) scp $(TARGET).so test.lua $(NANO_PATH) diff --git a/lua/examples/lua_calls_C5/liba_wrapper.c b/lua/examples/lua_calls_C5/liba_wrapper.c index 4e049e2..361c1cf 100644 --- a/lua/examples/lua_calls_C5/liba_wrapper.c +++ b/lua/examples/lua_calls_C5/liba_wrapper.c @@ -113,7 +113,7 @@ static const struct luaL_reg functions[] = { //This is the init function that will be called when you require 'mylib' -int luaopen_mylib(lua_State *L) { +int luaopen_wrap(lua_State *L) { luaL_newmetatable(L, metaname); @@ -126,6 +126,6 @@ int luaopen_mylib(lua_State *L) { luaL_newmetatable(L,metaname); return 1; } - luaL_register(L, "mylib", functions); + luaL_register(L, "wrap", functions); return 1; } diff --git a/lua/examples/lua_calls_C5/test.lua b/lua/examples/lua_calls_C5/test.lua index 0ef8318..be9d167 100644 --- a/lua/examples/lua_calls_C5/test.lua +++ b/lua/examples/lua_calls_C5/test.lua @@ -1,16 +1,16 @@ package.cpath = "./?.so" -require "mylib" +require "wrap" --test1 -mylib.lib_a_f_1() +wrap.lib_a_f_1() --test2 -assert(6==mylib.lib_a_f_2(2,3)) +assert(6==wrap.lib_a_f_2(2,3)) --test3 -assert(5==mylib.lib_a_f_3("hello")) +assert(5==wrap.lib_a_f_3("hello")) --test4 : use userdata to pass structure -t=mylib.point_new(3,6) +t=wrap.point_new(3,6) assert(18 == mylib.lib_a_f_4(t)) --test5, return userdata -t=mylib.lib_a_f_5() -assert(600 == mylib.lib_a_f_4(t)) -assert(mylib.point_geta(t) == 20) -assert(mylib.point_getb(t) == 30) +t=wrap.lib_a_f_5() +assert(600 == wrap.lib_a_f_4(t)) +assert(wrap.point_geta(t) == 20) +assert(wrap.point_getb(t) == 30)

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

RFZc6f_1a609}%9!z|B?yaD*D$ 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 ICQI@E01Jo1F8}}l literal 0 HcmV?d00001 diff --git a/course/.docs/cambio_categoria/embedded_book.tex b/course/.docs/cambio_categoria/embedded_book.tex new file mode 100644 index 0000000..ce11838 --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.tex @@ -0,0 +1,61 @@ +\documentclass[]{report} + + +\usepackage{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[spanish]{babel} + +% \usepackage{pgf} +\usepackage{graphicx} +\usepackage{times} +\usepackage{colortbl} + +\usepackage{multicol} +\usepackage{multirow} + +\usepackage{pdfpages} +\usepackage{lscape} + +\usepackage{graphicx, color} + +\usepackage{listings} +\lstset{language=C} +% \lstset{ basicstyle=\small, keywordstyle=\color{blue}\bfseries, identifierstyle=, commentstyle=\color{gray}, showstringspaces=false, keywordstyle=\color{blue}, morekeywords={one,three,five}} +\lstset{backgroundcolor=\color{gray},frame=single,emph={EMPTY},emphstyle=\color{white}, showstringspaces=false,commentstyle=\itshape, morekeywords={printf}, tabsize=2, fontadjust=true, basicstyle=\scriptsize} +%\lstset{framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{black}, backgroundcolor=\color[gray]{.9}} +\lstset{backgroundcolor=\color[gray]{.8}} + + + +\pagestyle{myheadings} +\markboth{Codiseño y Sistemas Embebidos}{Universidad Nacional de Colombia} + +\usepackage{longtable} + +\parindent 1cm +\parskip 0.2cm +\topmargin 0.2cm +\oddsidemargin 1cm +\evensidemargin 0.5cm +\textwidth 15cm +\textheight 21cm + + +\begin{document} +\bibliographystyle{unsrt} +\input title +\tableofcontents + +\parindent=1cm + +% \input introduction + +2010/8/12 Oscar Javier Fajardo Ruiz +Nuestra idea es el ecualizador + +% % \input chapter1 + \input chapter2 + +\bibliography{biblio_EL} + +\end{document} \ No newline at end of file diff --git a/course/.docs/cambio_categoria/embedded_book.tex.backup b/course/.docs/cambio_categoria/embedded_book.tex.backup new file mode 100644 index 0000000..cc472dd --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.tex.backup @@ -0,0 +1,57 @@ +\documentclass[]{report} + + +\usepackage{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[spanish]{babel} + +% \usepackage{pgf} +\usepackage{graphicx} +\usepackage{times} +\usepackage{colortbl} + +\usepackage{multicol} +\usepackage{multirow} + +\usepackage{pdfpages} +\usepackage{lscape} + +\usepackage{graphicx, color} + +\usepackage{listings} +\lstset{language=C} +% \lstset{ basicstyle=\small, keywordstyle=\color{blue}\bfseries, identifierstyle=, commentstyle=\color{gray}, showstringspaces=false, keywordstyle=\color{blue}, morekeywords={one,three,five}} +\lstset{backgroundcolor=\color{gray},frame=single,emph={EMPTY},emphstyle=\color{white}, showstringspaces=false,commentstyle=\itshape, morekeywords={printf}, tabsize=2, fontadjust=true, basicstyle=\scriptsize} +%\lstset{framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{black}, backgroundcolor=\color[gray]{.9}} +\lstset{backgroundcolor=\color[gray]{.8}} + + + +\pagestyle{myheadings} +\markboth{Codiseño y Sistemas Embebidos}{Universidad Nacional de Colombia} + +\usepackage{longtable} + +\parindent 1cm +\parskip 0.2cm +\topmargin 0.2cm +\oddsidemargin 1cm +\evensidemargin 0.5cm +\textwidth 15cm +\textheight 21cm + + +\begin{document} +\bibliographystyle{unsrt} +\input title +\tableofcontents + +\parindent=1cm + +% \input introduction +% \input chapter1 + \input chapter2 + +\bibliography{biblio_EL} + +\end{document} \ No newline at end of file diff --git a/course/.docs/cambio_categoria/embedded_book.toc b/course/.docs/cambio_categoria/embedded_book.toc new file mode 100644 index 0000000..ba1a8cb --- /dev/null +++ b/course/.docs/cambio_categoria/embedded_book.toc @@ -0,0 +1,3 @@ +\select@language {spanish} +\contentsline {chapter}{\numberline {1}Sistema en un Chip (SoC)}{3} +\contentsline {section}{\numberline {1.1}Arquitectura}{3} diff --git a/course/.docs/cambio_categoria/introduction.tex b/course/.docs/cambio_categoria/introduction.tex new file mode 100644 index 0000000..2820ab0 --- /dev/null +++ b/course/.docs/cambio_categoria/introduction.tex @@ -0,0 +1,47 @@ +\chapter{Introducción} + +La industria de los semiconductores ha crecido velozmente durante los últimos años, su campo de acción se ha extendido a casi todas las actividades del ser humano (Entretenimiento, salud, seguridad, transporte, educación, etc); los tiempos de los procesos de diseño son cada vez mas cortos, lo cual require herramientas Hardware, Software y metodologías de diseño que ayuden a cumplir con las exigencias impuestas al sistema. + +Esta \textit{invasión} digital ha sido posible gracias a la industria de los semiconductores y a las empresas desarrolladoras de software, las primeras haciendo uso de un altísimo grado de integración ponen a disposición de los diseñadores \textit{Systems On Chip} (SoC) en los cuales se integran procesadores de 32 bits con una gran variedad de periféricos tales como: Controladores de dispositivos de red (cableada e inalámbricos), controladores de video, procesadores aritméticos, controladores de memorias (Flash, SDRAM, DDR, USB, SD), codecs de audio, controladores de touch screen, etc; lo cual permite la implementación de aplicaciones completas dentro de uno de estos SoCs. + +Por otro lado, las empresas desarrolladoras de SW crean herramientas de programación que permiten manejar toda la capacidad de estos SoCs. colocando a disposición de los diseñadores: compiladores, simuladores, emuladores, librerías, Sistemas Operativos y drivers. Lo cual permite realizar desarrollos complejos en tiempos cortos. + +En la actualidad existe un gran número de sistemas operativos (OS) disponibles tanto comerciales como \textit{open source}. La figura \ref{os} muestra la utilización actual de OS comerciales en aplicaciones embebidas; si sumamos los sistemas operativos basados en linux se obtiene un valor del 19.3 \% lo cual hace ganador al sistema operativo de libre distribución \cite{CLSB05}. La figura \ref{os2} muestra un cuadro comparativo de la utilización de herramientas comerciales y linux; de nuevo se observa que linux es el preferido por los diseñadores. Este resultado es interesante ya que uno de los supuestos puntos débiles del software de libre distribución es el soporte, lo cual no lo hace tan agradable a la hora de realizar aplicaciones comerciales, sin embargo, esto es solo un mito, ya que gracias a que el código fuente está disponible, es posible comprender perfectamente su funcionamiento, lo cual no sucede con el software comercial; además, existen muchos foros de diseñadores y desarrolladores que se encargan de responder las inquietudes, estos foros almacenan todos los mensajes recibidos e incluyen herramientas de búsqueda para poder consultarlos, por regla general de estos foros, se debe buscar primero en estos archivos históricos, muy seguramente alguien más preguntó lo mismo antes que nosotros. + + +El caracter gratutito de las herramientas de libre distribución no significa, ni mucho menos, mala calidad, todo lo contrario, existen muchas personas que escudriñan su código fuente en búsqueda de posibles errores, y realizan cambios con el fín de eliminarlo; por lo tanto, se cuenta con miles de personas que están constantemente depurando y perfeccionando una determinada aplicación; esto no ocurre con el software comercial, normalmente el soporte hay que pagarlo y las perosnas involucradas en el desarrollo no son tantas como las que tienen acceso al código fuente del software libre. Por esta razón empresas como PALM, han dejado de lado productos propietarios como el PALM OS para utilizar linux, SUN Microsystems, liberó el código fuente de su sistema operativo Solaris, ya que no era comparable con linux y está en el proceso de liberar uno de sus procesadores. + +\begin{figure} + \begin{center} \includegraphics[scale=.45, angle=90]{./images/Current_OS} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente \cite{JT04}.}\label{os} +\end{figure} + +\begin{figure} + \begin{center} \includegraphics[scale=1]{./images/OS_embedded} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente http://www.linuxdevices.com/articles/AT7070519787.html.}\label{os2} +\end{figure} + + +De lo anterior se deduce que el mundo de los sistemas digitales ha cambiado en forma considerable, y que en la actualidad existen grandes facilidades para el desarrollo de productos de forma rápida y económica \footnote{En la actualidad cerca del 60\% de los ingenieros trabajan en compañías con menos de 10 desarrolladores de SW \cite{VDC06}}. Desafortunadamente estas tendencias no se han aplicado aún en Colombia; existen varias razones para esto: + +\begin{enumerate} +\item Desactualización de los programas acedémicos: En muchas de las Universidades de Colombia se utilizan tecnologías obsoletas que impiden la aplicación de metodologías de diseño modernas además de impedir el desarrollo de aplicaciones comerciales, un ejemplo de este tipo de tecnologías es la lógica TTL (74XX) y sus equivalentes en CMOS. Aunque vale la pena aclarar que este tipo de tecnología es útil a la hora de enseñar conceptos básicos, no puede ser utilizada como única herramienta de implementación. Un ejemplo de desactualización de metodologías de diseño lo encontramos en las herramientas de programación para microcontroladores, una gran cantidad de Universidades utilizan lenguaje ensamblador, lo cual impide la re-utilización de código y crea dependencias con el HW utilizado. + +\item Falta de interés de la Industria: Un gran porcentaje de la industria Colombiana es consumidora de tecnología, es decir, no generan sus propias soluciones, no cuentan con departamentos de Investigación y Desarrollo; esto se debe a la falta de confianza en los productos nacionales y en algunos casos a la inexistencia de producción nacional. Por otro lado, la cooperación entre la Universidad y la industria es muy reducida, debido a falta de políticas en las Universidades que regulen esta actividad y a la poca inversión por parte de las empresas. + +\item Políticas del Estado: Casi la totalidad de estos nuevos dispositivos semiconductores deben ser importados, ya que en Colombia no existen distribuidores, por lo tanto, es necesario pagar una serie de impuestos que no desalientan su utilización, estos impuestos están por el orden del 26\% del valor del producto. Por otro lado la apertura económica permite que ingresen productos a bajo precio, con los que no pueden competir los pocos productos desarrollados en el pais, eso sumado a la falta de protección por parte de las políticas estatales condena a los desarrolladores de estos sistemas a la quiebra económica. + +\end{enumerate} + +Este proyecto resume el trabajo realizado durante los últimos cuatro años en el área de la electrónica digital y más exactamente en el estudio de las metodologías de diseño modernas con aplicaciones comerciales y es presentado para cumplir parcialmente los requisitos de cambio de categoría de profesor asistente a asociado. El presente informe está dividido de la siguiente forma: + + +\begin{itemize} +\item En el capítulo 1 se realiza una breve descripción de los sistemas embebidos, se enumeran sus características, aplicaciones y se hace una descripción de las herramientas HW y SW necesarias para el diseño de los mismos. En los capítulos siguientes se desarrollan casos de estudio encaminados a la comprensión de estos sistemas: +\item En el capítulo dos se trabaja con una plataforma comercial de bajo costo: El GameBoy de Nintendo, (gracias a los elevados volúmenes de producción el costo de este dispositivo es bajo alrededor de 40 USD) esta plataforma nos permite desarrollar conceptos básicos como la compilación cruzada, la interfaz HW-SW y los sistemas operativos. +\item En el capítulo tres se muestra la implementación de la primera plataforma de desarrollo para sistemas embebidos diseñada en la Universidad Nacional, a pesar de ser muy sencilla permite dar un gran paso en el proceso de fabricación de este tipo de dispositivos. +\item En el capítulo cuatro se realiza la implementción de una plataforma de desarrollo que utiliza el sistema operativo linux sobre un arreglo de compuertas programable en campo (FPGA) y se muestran los resultados de una aplicación en el área del Hardware Reconfigurable. +\item El capítulo cinco es una guía de adaptación del sistema operativo linux para una arquitectura ARM. +\end{itemize} + +Por último se muestra como algunos de los resultados de este estudio han sido introducidos a los cursos del área de los sistemas digitales en la Universidad Nacional de Colombia y como se ha realizado su difusión en otras Universidades de Colombia. \ No newline at end of file diff --git a/course/.docs/cambio_categoria/introduction.tex.backup b/course/.docs/cambio_categoria/introduction.tex.backup new file mode 100644 index 0000000..26639ca --- /dev/null +++ b/course/.docs/cambio_categoria/introduction.tex.backup @@ -0,0 +1,47 @@ +\chapter{Introducción} + +La industria de los semiconductores ha crecido velozmente durante los últimos años, su campo de acción se ha extendido a casi todas las actividades del ser humano (Entretenimiento, salud, seguridad, transporte, educación, etc); los tiempos de los procesos de diseño son cada vez mas cortos, lo cual require herramientas Hardware, Software y metodologías de diseño que ayuden a cumplir con las exigencias impuestas al sistema. + +Esta \textit{invasión} digital ha sido posible gracias a la industria de los semiconductores y a las empresas desarrolladoras de software, las primeras haciendo uso de un altísimo grado de integración ponen a disposición de los diseñadores \textit{Systems On Chip} (SoC) en los cuales se integran procesadores de 32 bits con una gran variedad de periféricos tales como: Controladores de dispositivos de red (cableada e inalámbricos), controladores de video, procesadores aritméticos, controladores de memorias (Flash, SDRAM, DDR, USB, SD), codecs de audio, controladores de touch screen, etc; lo cual permite la implementación de aplicaciones completas dentro de uno de estos SoCs. + +Por otro lado, las empresas desarrolladoras de SW crean herramientas de programación que permiten manejar toda la capacidad de estos SoCs. colocando a disposición de los diseñadores: compiladores, simuladores, emuladores, librerías, Sistemas Operativos y drivers. Lo cual permite realizar desarrollos complejos en tiempos cortos. + +En la actualidad existe un gran número de sistemas operativos (OS) disponibles tanto comerciales como \textit{open source}. La figura \ref{os} muestra la utilización actual de OS comerciales en aplicaciones embebidas; si sumamos los sistemas operativos basados en linux se obtiene un valor del 19.3 \% lo cual hace ganador al sistema operativo de libre distribución \cite{CLSB05}. La figura \ref{os2} muestra un cuadro comparativo de la utilización de herramientas comerciales y linux; de nuevo se observa que linux es el preferido por los diseñadores. Este resultado es interesante ya que uno de los supuestos puntos débiles del software de libre distribución es el soporte, lo cual no lo hace tan agradable a la hora de realizar aplicaciones comerciales, sin embargo, esto es solo un mito, ya que gracias a que el código fuente está disponible, es posible comprender perfectamente su funcionamiento, lo cual no sucede con el software comercial; además, existen muchos foros de diseñadores y desarrolladores que se encargan de responder las inquietudes, estos foros almacenan todos los mensajes recibidos e incluyen herramientas de búsqueda para poder consultarlos, por regla general de estos foros, se debe buscar primero en estos archivos históricos, muy seguramente alguien más preguntó lo mismo antes que nosotros. + + +El caracter gratutito de las herramientas de libre distribución no significa, ni mucho menos, mala calidad, todo lo contrario, existen muchas personas que escudriñan su código fuente en búsqueda de posibles errores, y realizan cambios con el fín de eliminarlo; por lo tanto, se cuenta con miles de personas que están constantemente depurando y perfeccionando una determinada aplicación; esto no ocurre con el software comercial, normalmente el soporte hay que pagarlo y las perosnas involucradas en el desarrollo no son tantas como las que tienen acceso al código fuente del software libre. Por esta razón empresas como PALM, han dejado de lado productos propietarios como el PALM OS para utilizar linux, SUN Microsystems, liberó el código fuente de su sistema operativo Solaris, ya que no era comparable con linux y está en el proceso de liberar uno de sus procesadores. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45, angle=90]{./images/Current_OS} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente \cite{JT04}.}\label{os} +\end{figure} + +\begin{figure} + \begin{center} \includegraphics[scale=1]{./images/OS_embedded} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente http://www.linuxdevices.com/articles/AT7070519787.html.}\label{os2} +\end{figure} + + +De lo anterior se deduce que el mundo de los sistemas digitales ha cambiado en forma considerable, y que en la actualidad existen grandes facilidades para el desarrollo de productos de forma rápida y económica \footnote{En la actualidad cerca del 60\% de los ingenieros trabajan en compañías con menos de 10 desarrolladores de SW \cite{VDC06}}. Desafortunadamente estas tendencias no se han aplicado aún en Colombia; existen varias razones para esto: + +\begin{enumerate} +\item Desactualización de los programas acedémicos: En muchas de las Universidades de Colombia se utilizan tecnologías obsoletas que impiden la aplicación de metodologías de diseño modernas además de impedir el desarrollo de aplicaciones comerciales, un ejemplo de este tipo de tecnologías es la lógica TTL (74XX) y sus equivalentes en CMOS. Aunque vale la pena aclarar que este tipo de tecnología es útil a la hora de enseñar conceptos básicos, no puede ser utilizada como única herramienta de implementación. Un ejemplo de desactualización de metodologías de diseño lo encontramos en las herramientas de programación para microcontroladores, una gran cantidad de Universidades utilizan lenguaje ensamblador, lo cual impide la re-utilización de código y crea dependencias con el HW utilizado. + +\item Falta de interés de la Industria: Un gran porcentaje de la industria Colombiana es consumidora de tecnología, es decir, no generan sus propias soluciones, no cuentan con departamentos de Investigación y Desarrollo; esto se debe a la falta de confianza en los productos nacionales y en algunos casos a la inexistencia de producción nacional. Por otro lado, la cooperación entre la Universidad y la industria es muy reducida, debido a falta de políticas en las Universidades que regulen esta actividad y a la poca inversión por parte de las empresas. + +\item Políticas del Estado: Casi la totalidad de estos nuevos dispositivos semiconductores deben ser importados, ya que en Colombia no existen distribuidores, por lo tanto, es necesario pagar una serie de impuestos que no desalientan su utilización, estos impuestos están por el orden del 26\% del valor del producto. Por otro lado la apertura económica permite que ingresen productos a bajo precio, con los que no pueden competir los pocos productos desarrollados en el pais, eso sumado a la falta de protección por parte de las políticas estatales condena a los desarrolladores de estos sistemas a la quiebra económica. + +\end{enumerate} + +Este proyecto resume el trabajo realizado durante los últimos cuatro años en el área de la electrónica digital y más exactamente en el estudio de las metodologías de diseño modernas con aplicaciones comerciales y es presentado para cumplir parcialmente los requisitos de cambio de categoría de profesor asistente a asociado. El presente informe está dividido de la siguiente forma: + + +\begin{itemize} +\item En el capítulo 1 se realiza una breve descripción de los sistemas embebidos, se enumeran sus características, aplicaciones y se hace una descripción de las herramientas HW y SW necesarias para el diseño de los mismos. En los capítulos siguientes se desarrollan casos de estudio encaminados a la comprensión de estos sistemas: +\item En el capítulo dos se trabaja con una plataforma comercial de bajo costo: El GameBoy de Nintendo, (gracias a los elevados volúmenes de producción el costo de este dispositivo es bajo alrededor de 40 USD) esta plataforma nos permite desarrollar conceptos básicos como la compilación cruzada, la interfaz HW-SW y los sistemas operativos. +\item En el capítulo tres se muestra la implementación de la primera plataforma de desarrollo para sistemas embebidos diseñada en la Universidad Nacional, a pesar de ser muy sencilla permite dar un gran paso en el proceso de fabricación de este tipo de dispositivos. +\item En el capítulo cuatro se realiza la implementción de una plataforma de desarrollo que utiliza el sistema operativo linux sobre un arreglo de compuertas programable en campo (FPGA) y se muestran los resultados de una aplicación en el área del Hardware Reconfigurable. +\item El capítulo cinco es una guía de adaptación del sistema operativo linux para una arquitectura ARM. +\end{itemize} + +Por último se muestra como algunos de los resultados de este estudio han sido introducidos a los cursos del área de los sistemas digitales en la Universidad Nacional de Colombia y como se ha realizado su difusión en otras Universidades de Colombia. \ No newline at end of file diff --git a/course/.docs/cambio_categoria/introduction.tex~ b/course/.docs/cambio_categoria/introduction.tex~ new file mode 100644 index 0000000..26639ca --- /dev/null +++ b/course/.docs/cambio_categoria/introduction.tex~ @@ -0,0 +1,47 @@ +\chapter{Introducción} + +La industria de los semiconductores ha crecido velozmente durante los últimos años, su campo de acción se ha extendido a casi todas las actividades del ser humano (Entretenimiento, salud, seguridad, transporte, educación, etc); los tiempos de los procesos de diseño son cada vez mas cortos, lo cual require herramientas Hardware, Software y metodologías de diseño que ayuden a cumplir con las exigencias impuestas al sistema. + +Esta \textit{invasión} digital ha sido posible gracias a la industria de los semiconductores y a las empresas desarrolladoras de software, las primeras haciendo uso de un altísimo grado de integración ponen a disposición de los diseñadores \textit{Systems On Chip} (SoC) en los cuales se integran procesadores de 32 bits con una gran variedad de periféricos tales como: Controladores de dispositivos de red (cableada e inalámbricos), controladores de video, procesadores aritméticos, controladores de memorias (Flash, SDRAM, DDR, USB, SD), codecs de audio, controladores de touch screen, etc; lo cual permite la implementación de aplicaciones completas dentro de uno de estos SoCs. + +Por otro lado, las empresas desarrolladoras de SW crean herramientas de programación que permiten manejar toda la capacidad de estos SoCs. colocando a disposición de los diseñadores: compiladores, simuladores, emuladores, librerías, Sistemas Operativos y drivers. Lo cual permite realizar desarrollos complejos en tiempos cortos. + +En la actualidad existe un gran número de sistemas operativos (OS) disponibles tanto comerciales como \textit{open source}. La figura \ref{os} muestra la utilización actual de OS comerciales en aplicaciones embebidas; si sumamos los sistemas operativos basados en linux se obtiene un valor del 19.3 \% lo cual hace ganador al sistema operativo de libre distribución \cite{CLSB05}. La figura \ref{os2} muestra un cuadro comparativo de la utilización de herramientas comerciales y linux; de nuevo se observa que linux es el preferido por los diseñadores. Este resultado es interesante ya que uno de los supuestos puntos débiles del software de libre distribución es el soporte, lo cual no lo hace tan agradable a la hora de realizar aplicaciones comerciales, sin embargo, esto es solo un mito, ya que gracias a que el código fuente está disponible, es posible comprender perfectamente su funcionamiento, lo cual no sucede con el software comercial; además, existen muchos foros de diseñadores y desarrolladores que se encargan de responder las inquietudes, estos foros almacenan todos los mensajes recibidos e incluyen herramientas de búsqueda para poder consultarlos, por regla general de estos foros, se debe buscar primero en estos archivos históricos, muy seguramente alguien más preguntó lo mismo antes que nosotros. + + +El caracter gratutito de las herramientas de libre distribución no significa, ni mucho menos, mala calidad, todo lo contrario, existen muchas personas que escudriñan su código fuente en búsqueda de posibles errores, y realizan cambios con el fín de eliminarlo; por lo tanto, se cuenta con miles de personas que están constantemente depurando y perfeccionando una determinada aplicación; esto no ocurre con el software comercial, normalmente el soporte hay que pagarlo y las perosnas involucradas en el desarrollo no son tantas como las que tienen acceso al código fuente del software libre. Por esta razón empresas como PALM, han dejado de lado productos propietarios como el PALM OS para utilizar linux, SUN Microsystems, liberó el código fuente de su sistema operativo Solaris, ya que no era comparable con linux y está en el proceso de liberar uno de sus procesadores. + +\begin{figure}[h] + \begin{center} \includegraphics[scale=.45, angle=90]{./images/Current_OS} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente \cite{JT04}.}\label{os} +\end{figure} + +\begin{figure} + \begin{center} \includegraphics[scale=1]{./images/OS_embedded} \end{center} + \caption{Utilización actual de OS para aplicaciones embebidas: Fuente http://www.linuxdevices.com/articles/AT7070519787.html.}\label{os2} +\end{figure} + + +De lo anterior se deduce que el mundo de los sistemas digitales ha cambiado en forma considerable, y que en la actualidad existen grandes facilidades para el desarrollo de productos de forma rápida y económica \footnote{En la actualidad cerca del 60\% de los ingenieros trabajan en compañías con menos de 10 desarrolladores de SW \cite{VDC06}}. Desafortunadamente estas tendencias no se han aplicado aún en Colombia; existen varias razones para esto: + +\begin{enumerate} +\item Desactualización de los programas acedémicos: En muchas de las Universidades de Colombia se utilizan tecnologías obsoletas que impiden la aplicación de metodologías de diseño modernas además de impedir el desarrollo de aplicaciones comerciales, un ejemplo de este tipo de tecnologías es la lógica TTL (74XX) y sus equivalentes en CMOS. Aunque vale la pena aclarar que este tipo de tecnología es útil a la hora de enseñar conceptos básicos, no puede ser utilizada como única herramienta de implementación. Un ejemplo de desactualización de metodologías de diseño lo encontramos en las herramientas de programación para microcontroladores, una gran cantidad de Universidades utilizan lenguaje ensamblador, lo cual impide la re-utilización de código y crea dependencias con el HW utilizado. + +\item Falta de interés de la Industria: Un gran porcentaje de la industria Colombiana es consumidora de tecnología, es decir, no generan sus propias soluciones, no cuentan con departamentos de Investigación y Desarrollo; esto se debe a la falta de confianza en los productos nacionales y en algunos casos a la inexistencia de producción nacional. Por otro lado, la cooperación entre la Universidad y la industria es muy reducida, debido a falta de políticas en las Universidades que regulen esta actividad y a la poca inversión por parte de las empresas. + +\item Políticas del Estado: Casi la totalidad de estos nuevos dispositivos semiconductores deben ser importados, ya que en Colombia no existen distribuidores, por lo tanto, es necesario pagar una serie de impuestos que no desalientan su utilización, estos impuestos están por el orden del 26\% del valor del producto. Por otro lado la apertura económica permite que ingresen productos a bajo precio, con los que no pueden competir los pocos productos desarrollados en el pais, eso sumado a la falta de protección por parte de las políticas estatales condena a los desarrolladores de estos sistemas a la quiebra económica. + +\end{enumerate} + +Este proyecto resume el trabajo realizado durante los últimos cuatro años en el área de la electrónica digital y más exactamente en el estudio de las metodologías de diseño modernas con aplicaciones comerciales y es presentado para cumplir parcialmente los requisitos de cambio de categoría de profesor asistente a asociado. El presente informe está dividido de la siguiente forma: + + +\begin{itemize} +\item En el capítulo 1 se realiza una breve descripción de los sistemas embebidos, se enumeran sus características, aplicaciones y se hace una descripción de las herramientas HW y SW necesarias para el diseño de los mismos. En los capítulos siguientes se desarrollan casos de estudio encaminados a la comprensión de estos sistemas: +\item En el capítulo dos se trabaja con una plataforma comercial de bajo costo: El GameBoy de Nintendo, (gracias a los elevados volúmenes de producción el costo de este dispositivo es bajo alrededor de 40 USD) esta plataforma nos permite desarrollar conceptos básicos como la compilación cruzada, la interfaz HW-SW y los sistemas operativos. +\item En el capítulo tres se muestra la implementación de la primera plataforma de desarrollo para sistemas embebidos diseñada en la Universidad Nacional, a pesar de ser muy sencilla permite dar un gran paso en el proceso de fabricación de este tipo de dispositivos. +\item En el capítulo cuatro se realiza la implementción de una plataforma de desarrollo que utiliza el sistema operativo linux sobre un arreglo de compuertas programable en campo (FPGA) y se muestran los resultados de una aplicación en el área del Hardware Reconfigurable. +\item El capítulo cinco es una guía de adaptación del sistema operativo linux para una arquitectura ARM. +\end{itemize} + +Por último se muestra como algunos de los resultados de este estudio han sido introducidos a los cursos del área de los sistemas digitales en la Universidad Nacional de Colombia y como se ha realizado su difusión en otras Universidades de Colombia. \ No newline at end of file diff --git a/course/.docs/cambio_categoria/main.aux b/course/.docs/cambio_categoria/main.aux new file mode 100644 index 0000000..e6bdb42 --- /dev/null +++ b/course/.docs/cambio_categoria/main.aux @@ -0,0 +1,79 @@ +\relax +\catcode`.\active +\catcode`\.=12 +\catcode`"\active +\catcode`<\active +\catcode`>\active +\es@quoting +\bibstyle{unsrt} +\select@language{spanish} +\@writefile{toc}{\select@language{spanish}} +\@writefile{lof}{\select@language{spanish}} +\@writefile{lot}{\select@language{spanish}} +\citation{A1} +\citation{Wik} +\citation{Wik} +\citation{CLSB05} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introducci\'on}{3}} +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\citation{JT04} +\citation{VDC06} +\@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces Utilizaci\'on actual de OS para aplicaciones embebidas: Fuente \cite {JT04}.}}{4}} +\newlabel{os}{{1.1}{4}} +\@writefile{lof}{\contentsline {figure}{\numberline {1.2}{\ignorespaces Utilizaci\'on actual de OS para aplicaciones embebidas: Fuente http://www.linuxdevices.com/articles/AT7070519787.html.}}{5}} +\newlabel{os2}{{1.2}{5}} +\citation{Wik} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Conceptos B\'asicos de los Sistemas Embebidos}{7}} +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Definici\'on}{7}} +\@writefile{toc}{\contentsline {section}{\numberline {2.2}Caracter\IeC {\'\i }sticas}{7}} +\@writefile{toc}{\contentsline {section}{\numberline {2.3}Arquitectura}{7}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Arquitectura de un Sistema Embebido}}{8}} +\newlabel{es_arch}{{2.1}{8}} +\citation{Cor05} +\@writefile{toc}{\contentsline {section}{\numberline {2.4}Metodolog\IeC {\'\i }a de Dise\~no}{9}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Flujo de Dise\~no de un Sistema Embebido}}{10}} +\newlabel{des_flow}{{2.2}{10}} +\citation{A1} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.1}Herramientas Software de libre distribuci\'on \textit {GNU toolchain}}{11}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Tendencia de utilizaci\'on de herramientas de desarrollo}}{11}} +\newlabel{tools}{{2.3}{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.2}Componentes del \textit {GNU toolchain} }{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.3}GNU binutils\cite {A1}}{11}} +\citation{Wik} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.4}GNU Compiler Collection\cite {Wik}}{12}} +\@writefile{toc}{\contentsline {subsubsection}{Lenguajes}{12}} +\@writefile{toc}{\contentsline {subsubsection}{Arquitecturas}{13}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces N\'umero promedio de desarrolladores por compa\~n\IeC {\'\i }a. Fuente Venture Development Corp}}{14}} +\newlabel{group}{{2.4}{14}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.5}GNU Debugger}{14}} +\citation{BG} +\citation{Lin05} +\citation{DK06} +\citation{MLH98} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.6}C Libraries}{15}} +\@writefile{toc}{\contentsline {section}{\numberline {2.5}Obtenci\'on y utilizaci\'on del \textit {GNU toolchain}}{15}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.5.1}Conceptos Previos}{15}} +\citation{Lin05} +\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite {Lin05} }}{16}} +\newlabel{arch}{{2.5}{16}} +\@writefile{toc}{\contentsline {subsubsection}{El formato \textbf {ELF}}{16}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite {Lin05} }}{16}} +\newlabel{elf1}{{2.6}{16}} +\citation{Lin05} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.5.2}Flujo de dise\~no software}{18}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.7}{\ignorespaces Tendencia del mercado de procesadores para sistemas embebidos. Fuente:\cite {Lin05} }}{18}} +\newlabel{toolchain_flow}{{2.7}{18}} +\@writefile{toc}{\contentsline {section}{\numberline {2.6}Makefile}{19}} +\bibdata{biblio_EL} +\bibcite{A1}{1} +\bibcite{Wik}{2} +\bibcite{CLSB05}{3} +\bibcite{JT04}{4} +\bibcite{VDC06}{5} +\bibcite{BG}{6} +\bibcite{Lin05}{7} +\bibcite{DK06}{8} +\bibcite{MLH98}{9} diff --git a/course/.docs/cambio_categoria/main.bbl b/course/.docs/cambio_categoria/main.bbl new file mode 100644 index 0000000..1bae820 --- /dev/null +++ b/course/.docs/cambio_categoria/main.bbl @@ -0,0 +1,51 @@ +\begin{thebibliography}{1} + +\bibitem{A1} +{Aleph 1}. +\newblock Building the {T}oolchain. +\newblock http://www.aleph1.co.uk/node/279. + +\bibitem{Wik} +Wikipedia. +\newblock Wikipedia, the free encyclopedia. +\newblock http://en.wikipedia.org/. + +\bibitem{CLSB05} +{C. Lanfear}, {S. Balacco}, and {M. Volckmann}. +\newblock The 2005 {E}mbedded {S}oftware {S}trategic {M}arket {I}ntelligence + {P}rogram. +\newblock {\em Venture Development Corporation http://www.vdc-corp.com}, August + 2005. + +\bibitem{JT04} +{J. Turley}. +\newblock Embedded systems survey: {O}perating systems up for grabs. +\newblock {\em Embedded Systems Programming}, May 2004. + +\bibitem{VDC06} +{Venture Development Corp.} +\newblock Small teams dominate embedded software development. +\newblock http://www.linuxdevices.com/articles/AT7019328497.html, 1 June 2006. + +\bibitem{BG} +{Bill Gatliff}. +\newblock Porting and {U}sing {N}ewlib in {E}mbedded {S}ystems. +\newblock http://venus.billgatliff.com/node/3. + +\bibitem{Lin05} +Linuxdevices. +\newblock Embedded {L}inux market snapshot, 2005. +\newblock {\em http://www.linuxdevices.com}, 4 May 2005. + +\bibitem{DK06} +{Dan Kegel}. +\newblock Building and {T}esting gcc/glibc cross toolchains. +\newblock http://www.kegel.com/crosstool/, 20 February 2006. + +\bibitem{MLH98} +{Michael L. Haungs}. +\newblock The {E}xecutable and {L}inking {F}ormat ({ELF}). +\newblock http://www.cs.ucdavis.edu/~haungs/paper/node1.html, 21 September + 1998. + +\end{thebibliography} diff --git a/course/.docs/cambio_categoria/main.blg b/course/.docs/cambio_categoria/main.blg new file mode 100644 index 0000000..49280bf --- /dev/null +++ b/course/.docs/cambio_categoria/main.blg @@ -0,0 +1,47 @@ +This is BibTeX, Version 0.99c (Web2C 7.5.4) +The top-level auxiliary file: main.aux +The style file: unsrt.bst +Database file #1: biblio_EL.bib +Warning--I didn't find a database entry for "Cor05" +You've used 9 entries, + 1791 wiz_defined-function locations, + 500 strings with 4568 characters, +and the built_in function-call counts, 1212 in all, are: += -- 97 +> -- 43 +< -- 0 ++ -- 20 +- -- 11 +* -- 31 +:= -- 204 +add.period$ -- 27 +call.type$ -- 9 +change.case$ -- 9 +chr.to.int$ -- 0 +cite$ -- 9 +duplicate$ -- 54 +empty$ -- 151 +format.name$ -- 11 +if$ -- 274 +int.to.chr$ -- 0 +int.to.str$ -- 9 +missing$ -- 3 +newline$ -- 48 +num.names$ -- 9 +pop$ -- 42 +preamble$ -- 1 +purify$ -- 0 +quote$ -- 0 +skip$ -- 33 +stack$ -- 0 +substring$ -- 0 +swap$ -- 9 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 9 +width$ -- 10 +write$ -- 89 +(There was 1 warning) diff --git a/course/.docs/cambio_categoria/main.log b/course/.docs/cambio_categoria/main.log new file mode 100644 index 0000000..6588ac3 --- /dev/null +++ b/course/.docs/cambio_categoria/main.log @@ -0,0 +1,475 @@ +This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.4.27) 16 JUL 2009 14:24 +entering extended mode + Source specials enabled. + %&-line parsing enabled. +**main.tex +(./main.tex +LaTeX2e <2005/12/01> +Babel and hyphenation patterns for english, usenglishmax, dumylang, noh +yphenation, ukrainian, russian, bulgarian, loaded. +(/usr/share/texmf-texlive/tex/latex/base/report.cls +Document Class: report 2005/09/16 v1.4f Standard LaTeX document class +(/usr/share/texmf-texlive/tex/latex/base/size10.clo +File: size10.clo 2005/09/16 v1.4f Standard LaTeX file (size option) +) +\c@part=\count79 +\c@chapter=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texmf-texlive/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package +) +(/usr/share/texmf-texlive/tex/latex/base/inputenc.sty +Package: inputenc 2006/05/05 v1.1b Input encoding file +\inpenc@prehook=\toks14 +\inpenc@posthook=\toks15 + +(/usr/share/texmf-texlive/tex/latex/base/latin1.def +File: latin1.def 2006/05/05 v1.1b Input encoding file +)) +(/usr/share/texmf-texlive/tex/generic/babel/babel.sty +Package: babel 2005/11/23 v3.8h The Babel package + +(/usr/share/texmf-texlive/tex/generic/babel/spanish.ldf +Language: spanish.ldf 2005/03/31 v4.2b Spanish support from the babel system + +(/usr/share/texmf-texlive/tex/generic/babel/babel.def +File: babel.def 2005/11/23 v3.8h Babel common definitions +\babel@savecnt=\count88 +\U@D=\dimen103 +) + +Package babel Warning: No hyphenation patterns were loaded for +(babel) the language `Spanish' +(babel) I will use the patterns loaded for \language=0 instead. + +\l@spanish = a dialect from \language0 +\es@quottoks=\toks16 +\es@quotdepth=\count89 +Package babel Info: Making . an active character on input line 509. +Package babel Info: Making " an active character on input line 540. +Package babel Info: Making < an active character on input line 641. +Package babel Info: Making > an active character on input line 642. +)) (/usr/share/texmf-texlive/tex/latex/graphics/graphicx.sty +Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-texlive/tex/latex/graphics/keyval.sty +Package: keyval 1999/03/16 v1.13 key=value parser (DPC) +\KV@toks@=\toks17 +) +(/usr/share/texmf-texlive/tex/latex/graphics/graphics.sty +Package: graphics 2006/02/20 v1.0o Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-texlive/tex/latex/graphics/trig.sty +Package: trig 1999/03/16 v1.09 sin cos tan (DPC) +) +(/etc/texmf/tex/latex/config/graphics.cfg +File: graphics.cfg 2007/01/18 v1.5 graphics configuration of teTeX/TeXLive +) +Package graphics Info: Driver file: pdftex.def on input line 90. + +(/usr/share/texmf-texlive/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2007/01/08 v0.04d Graphics/color for pdfTeX +\Gread@gobject=\count90 +)) +\Gin@req@height=\dimen104 +\Gin@req@width=\dimen105 +) +(/usr/share/texmf-texlive/tex/latex/psnfss/times.sty +Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) +) +(/usr/share/texmf-texlive/tex/latex/colortbl/colortbl.sty +Package: colortbl 2001/02/13 v0.1j Color table columns (DPC) + +(/usr/share/texmf-texlive/tex/latex/tools/array.sty +Package: array 2005/08/23 v2.4b Tabular extension package (FMi) +\col@sep=\dimen106 +\extrarowheight=\dimen107 +\NC@list=\toks18 +\extratabsurround=\skip43 +\backup@length=\skip44 +) +(/usr/share/texmf-texlive/tex/latex/graphics/color.sty +Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) + +(/etc/texmf/tex/latex/config/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: pdftex.def on input line 130. +) +\everycr=\toks19 +\minrowclearance=\skip45 +) +(/usr/share/texmf-texlive/tex/latex/tools/multicol.sty +Package: multicol 2006/05/18 v1.6g multicolumn formatting (FMi) +\c@tracingmulticols=\count91 +\mult@box=\box26 +\multicol@leftmargin=\dimen108 +\c@unbalance=\count92 +\c@collectmore=\count93 +\doublecol@number=\count94 +\multicoltolerance=\count95 +\multicolpretolerance=\count96 +\full@width=\dimen109 +\page@free=\dimen110 +\premulticols=\dimen111 +\postmulticols=\dimen112 +\multicolsep=\skip46 +\multicolbaselineskip=\skip47 +\partial@page=\box27 +\last@line=\box28 +\mult@rightbox=\box29 +\mult@grightbox=\box30 +\mult@gfirstbox=\box31 +\mult@firstbox=\box32 +\@tempa=\box33 +\@tempa=\box34 +\@tempa=\box35 +\@tempa=\box36 +\@tempa=\box37 +\@tempa=\box38 +\@tempa=\box39 +\@tempa=\box40 +\@tempa=\box41 +\@tempa=\box42 +\@tempa=\box43 +\@tempa=\box44 +\@tempa=\box45 +\@tempa=\box46 +\@tempa=\box47 +\@tempa=\box48 +\@tempa=\box49 +\c@columnbadness=\count97 +\c@finalcolumnbadness=\count98 +\last@try=\dimen113 +\multicolovershoot=\dimen114 +\multicolundershoot=\dimen115 +\mult@nat@firstbox=\box50 +\colbreak@box=\box51 +) +(/usr/share/texmf-texlive/tex/latex/multirow/multirow.sty +\bigstrutjot=\dimen116 +) +(/usr/share/texmf-texlive/tex/latex/pdfpages/pdfpages.sty +Package: pdfpages 2006/08/12 v0.4a Insert pages of external PDF documents (AM) + +(/usr/share/texmf-texlive/tex/latex/base/ifthen.sty +Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) +) +(/usr/share/texmf-texlive/tex/latex/tools/calc.sty +Package: calc 2005/08/06 v4.2 Infix arithmetic (KKT,FJ) +\calc@Acount=\count99 +\calc@Bcount=\count100 +\calc@Adimen=\dimen117 +\calc@Bdimen=\dimen118 +\calc@Askip=\skip48 +\calc@Bskip=\skip49 +LaTeX Info: Redefining \setlength on input line 75. +LaTeX Info: Redefining \addtolength on input line 76. +\calc@Ccount=\count101 +\calc@Cskip=\skip50 +) +(/usr/share/texmf-texlive/tex/latex/eso-pic/eso-pic.sty +Package: eso-pic 2006/07/14 v1.1d eso-pic (RN) + +(/usr/share/texmf-texlive/tex/latex/everyshi/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texmf-texlive/tex/latex/pdfpages/pppdftex.def +File: pppdftex.def 2006/08/12 v0.4a Pdfpages driver for pdfTeX (AM) +) +\AM@pagebox=\box52 +\AM@toc@title=\toks20 +\c@AM@survey=\count102 +) +(/usr/share/texmf-texlive/tex/latex/graphics/lscape.sty +Package: lscape 2000/10/22 v3.01 Landscape Pages (DPC) +) +(/usr/share/texmf-texlive/tex/latex/listings/listings.sty +\lst@mode=\count103 +\lst@gtempboxa=\box53 +\lst@token=\toks21 +\lst@length=\count104 +\lst@currlwidth=\dimen119 +\lst@column=\count105 +\lst@pos=\count106 +\lst@lostspace=\dimen120 +\lst@width=\dimen121 +\lst@newlines=\count107 +\lst@lineno=\count108 +\c@lstlisting=\count109 +\lst@maxwidth=\dimen122 + +(/usr/share/texmf-texlive/tex/latex/listings/lstpatch.sty +File: lstpatch.sty 2004/10/17 1.3b (Carsten Heinz) +) +(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2004/09/07 1.3 (Carsten Heinz) +\c@lstnumber=\count110 +\lst@skipnumbers=\count111 +\lst@framebox=\box54 +) +(/usr/share/texmf-texlive/tex/latex/listings/listings.cfg +File: listings.cfg 2004/09/05 1.3 listings configuration +)) +Package: listings 2004/10/17 1.3b (Carsten Heinz) + +(/usr/share/texmf-texlive/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2004/09/05 1.3 listings language file +) +(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2004/09/07 1.3 (Carsten Heinz) +) +(/usr/share/texmf-texlive/tex/latex/tools/longtable.sty +Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC) +\LTleft=\skip51 +\LTright=\skip52 +\LTpre=\skip53 +\LTpost=\skip54 +\LTchunksize=\count112 +\LTcapwidth=\dimen123 +\LT@head=\box55 +\LT@firsthead=\box56 +\LT@foot=\box57 +\LT@lastfoot=\box58 +\LT@cols=\count113 +\LT@rows=\count114 +\c@LT@tables=\count115 +\c@LT@chunks=\count116 +\LT@p@ftn=\toks22 +) (./main.aux) +\openout1 = `main.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Try loading font information for OT1+ptm on input line 43. + +(/usr/share/texmf-texlive/tex/latex/psnfss/ot1ptm.fd +File: ot1ptm.fd 2001/06/04 font definitions for OT1/ptm. +) +(/usr/share/texmf/tex/context/base/supp-pdf.tex +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count117 +\scratchdimen=\dimen124 +\scratchbox=\box59 +\nofMPsegments=\count118 +\nofMParguments=\count119 +\everyMPshowfont=\toks23 +\MPscratchCnt=\count120 +\MPscratchDim=\dimen125 +\MPnumerator=\count121 +\everyMPtoPDFconversion=\toks24 +) ABD: EveryShipout initializing macros (./title.tex +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 11. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +Underfull \hbox (badness 10000) in paragraph at lines 16--20 + + [] + +LaTeX Font Info: Try loading font information for OMS+ptm on input line 23. +(/usr/share/texmf-texlive/tex/latex/psnfss/omsptm.fd +File: omsptm.fd +) +LaTeX Font Info: Font shape `OMS/ptm/m/n' in size <10> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 23. +LaTeX Font Info: Try loading font information for OT1+pcr on input line 24. + +(/usr/share/texmf-texlive/tex/latex/psnfss/ot1pcr.fd +File: ot1pcr.fd 2001/06/04 font definitions for OT1/pcr. +) +Underfull \hbox (badness 10000) in paragraph at lines 23--25 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 26--30 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 31--34 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 35--36 + + [] + +[1]) +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <24.88> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 46. + (./main.toc +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <10> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 2. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 4. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 4. +) +\tf@toc=\write3 +\openout3 = `main.toc'. + + (./introduction.tex [2 + +] +Cap\'{\i }tulo 1. +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <20.74> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 1. +[3 + +] <./images/Current_OS.jpg, id=19, 401.5pt x 460.72125pt> +File: ./images/Current_OS.jpg Graphic file (type jpg) + + +<./images/OS_embedded.jpg, id=20, 301.125pt x 232.79893pt> +File: ./images/OS_embedded.jpg Graphic file (type jpg) + + +Underfull \hbox (badness 10000) in paragraph at lines 21--21 +[][]\OT1/ptm/m/n/10 Figura 1.2: Uti-lizaci[]on ac-tu-al de OS para apli-ca-cion +es em-be-bidas: Fuente + [] + +[4 <./images/Current_OS.jpg>] [5 <./images/OS_embedded.jpg>]) (./chapter1.tex +[6] +Cap\'{\i }tulo 2. +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <14.4> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 3. +<./images/ES_Architecture.png, id=32, 488.82625pt x 407.5225pt> +File: ./images/ES_Architecture.png Graphic file (type png) + + [7 + +] [8 <./images/ES_Architecture.png (PNG copy)>] + +LaTeX Warning: Citation `Cor05' on page 9 undefined on input line 62. + +<./images/design_flow.jpg, id=39, 675.52374pt x 1068.99374pt> +File: ./images/design_flow.jpg Graphic file (type jpg) + + + +LaTeX Warning: Float too large for page by 24.60542pt on input line 67. + +[9] [10 <./images/design_flow.jpg>] +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <12> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 149. +LaTeX Font Info: Font shape `OT1/ptm/bx/it' in size <12> not available +(Font) Font shape `OT1/ptm/b/it' tried instead on input line 149. + +<./images/embedded-linux-tool-trends-sm.jpg, id=46, 301.125pt x 227.04292pt> +File: ./images/embedded-linux-tool-trends-sm.jpg Graphic file (type jpg) + + [11 <./images/embedded-linux-t +ool-trends-sm.jpg>] [12] [13] +<./images/vdc_embedded_dev_company_size.jpg, id=59, 1806.75pt x 843.15pt> +File: ./images/vdc_embedded_dev_company_size.jpg Graphic file (type jpg) + + +LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <8> not available +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 241. +LaTeX Font Info: Font shape `OMS/ptm/m/n' in size <8> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 253. + [14 <./images/vdc_embedded_dev_company_size.jpg>] +LaTeX Font Info: Font shape `OT1/ptm/bx/it' in size <14.4> not available +(Font) Font shape `OT1/ptm/b/it' tried instead on input line 287. + +<./images/embedded-processor-trends-sm.jpg, id=64, 301.125pt x 223.84514pt> +File: ./images/embedded-processor-trends-sm.jpg Graphic file (type jpg) + + + +LaTeX Warning: `h' float specifier changed to `ht'. + +[15] <./images/ELF_Link_exec1.png, id=68, 509.905pt x 312.16624pt> +File: ./images/ELF_Link_exec1.png Graphic file (type png) + + [16 <./images/embedded-processor-trends-sm.jp +g> <./images/ELF_Link_exec1.png (PNG copy)>] +LaTeX Font Info: Try loading font information for OML+ptm on input line 337. + + +(/usr/share/texmf-texlive/tex/latex/psnfss/omlptm.fd +File: omlptm.fd +) +LaTeX Font Info: Font shape `OML/ptm/m/n' in size <8> not available +(Font) Font shape `OML/cmm/m/it' tried instead on input line 337. + [17] +<./images/SW_design_flow.png, id=76, 564.1075pt x 438.63875pt> +File: ./images/SW_design_flow.png Graphic file (type png) + + [18 <./images/SW_design_flow.png (PNG copy)>] +[19] +Underfull \hbox (badness 10000) in paragraph at lines 491--492 + + [] + + +Overfull \hbox (72.41374pt too wide) in paragraph at lines 496--497 +[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][ +][] + [] + +) (./main.bbl [20] +Underfull \hbox (badness 10000) in paragraph at lines 26--29 +[][]\OT1/ptm/m/n/8 Venture De-vel-op-ment Corp. Small teams dom-i-nate em-bed- +ded soft-ware de-vel-op-ment. + [] + +) [21 + +] (./main.aux) + +LaTeX Warning: There were undefined references. + + ) +Here is how much of TeX's memory you used: + 5331 strings out of 94834 + 67806 string characters out of 1179181 + 152743 words of memory out of 1500000 + 8415 multiletter control sequences out of 10000+50000 + 38234 words of font info for 65 fonts, out of 1200000 for 2000 + 212 hyphenation exceptions out of 8191 + 34i,9n,49p,1368b,1776s stack positions out of 5000i,500n,6000p,200000b,5000s +{/usr/share/texmf-texlive/fonts/enc/dvips/base/8r.enc}< +/usr/share/texmf-texlive/fonts/type1/urw/times/utmr8a.pfb> +Output written on main.pdf (22 pages, 648643 bytes). +PDF statistics: + 123 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 131072) + 46 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/course/.docs/cambio_categoria/main.pdf b/course/.docs/cambio_categoria/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39f68d0e14869015396acc4bf9b03de4e957d4e2 GIT binary patch literal 648643 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