÷ƒ’À;è TeX output 2005.07.15:1114‹ÿÿÿÿ Û_2 ý ~? ÕÁ ý[¡óþÖëI½q½qecss2074¼Linux–fÑI/O“p‘ˆ’o›ÿwmrt“p˜rogramming“mini-HO˜WTOŽ¤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹Autore:‘q€Riku–U Saikk¸èonen“ó  b> cmmi10µ<óqLË ectt1000ºRiku.Saikkonen@hut.fiµ>’ …g¹v3.0,“13/12/2000Ž¡Ÿ&°óŒ6 ecss1000½Questo–ZHOš¸èWTO‘-descrive“la“p˜rogrammazione“delle“pGo˜rte“I/O‘-e“come“realizza˜re“delle“b˜revi“attese“di“tempGo“neiŽ¡pš¸èrogrammi–[ãche“girano“in“moGdo“utente,‘]”su“macchine“basate“sugli“Intel“x86.‘…ÉT‘ÿ*¸raduzione“a“cura“di“óø8‹ ecsi1000¾F˜ab˜rizio“StefaniŽ¡½,–U 8“giugno“2003,“e“revisione“a“cura“di“¾Sandro“Ca¸èrdelli“½,“4“luglio“2005.ŽŸ(Àœó&Lt$ffffecbx1440ÀIndiceŽ¤Øó]fŒ ecbx1000Á1Ž‘ÿIn®>troQÂduzione’€Ó2ŽŽ¡2Ž‘ÿUsare–Õle“pQÂorte“I/O“nei“programmi“C’s2ŽŽ¤ؼ‘ÿ¹2.1Ž‘%ý¡Il–U metoGdo“normale‘à“‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘%ý¡2.1.1Ž‘EûŸP¸èermessi‘’!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘%ý¡2.1.2Ž‘EûŸA¸èccedere–U alle“pGorte‘é‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï3ŽŽ¡‘ÿ2.2Ž‘%ý¡Un–U altro“metoGdo:‘q€º/dev/port‘Û'‘ü¹.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï3ŽŽ¤ØÁ3Ž‘ÿGli–Õinš®>terrupt“(IR˜Q)“e“l'accesso“DMA’{¿3ŽŽ¡4Ž‘ÿT‘ÿ ºempQÂorizzazione–Õad“elev‘ÿ\|ata“precisione’©4ŽŽ¤ؼ‘ÿ¹4.1Ž‘%ý¡Ritardi‘»_‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘%ý¡4.1.1Ž‘EûŸP¸èause:‘q€ºsleep()–U ¹e“ºusleep()‘êy‘ü¹.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘%ý¡4.1.2Ž‘EûŸºnanosleep()‘}e‘ü¹.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘%ý¡4.1.3Ž‘EûŸRitardare–U tramite“l'I/O“sulle“pGorte‘E‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘%ý¡4.1.4Ž‘EûŸRitardare–U usando“le“istruzioni“assem¸èbler‘,]‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘%ý¡4.1.5Ž‘EûŸºrdtsc–U ¹pGer“i“P•¸èen“tium‘Sí‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘ÿ4.2Ž‘%ý¡Misurare–U il“tempGo=‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï6ŽŽ¤ØÁ5Ž‘ÿAltri–Õlinguaggi“di“programmazione’ s6ŽŽ¡6Ž‘ÿAlcune–Õutili“pQÂorte’fïQ6ŽŽ¤ؼ‘ÿ¹6.1Ž‘%ý¡La–U pGorta“parallela‘§“‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï6ŽŽ¡‘ÿ6.2Ž‘%ý¡La–U pšGorta“gio˜cš¸èhi“(jo˜ystic˜k)‘>‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘ÿ6.3Ž‘%ý¡La–U pGorta“seriale‘ ë‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï9ŽŽ¤ØÁ7Ž‘ÿSuggerimen®>ti’~ôí9ŽŽ¡8Ž‘ÿRisoluzione–Õdei“problemi’>Ü"10ŽŽ¡9Ž‘ÿCoQÂdice‘Õd'esempio’cˆ10ŽŽŽŽŒ‹* Û_2 ý ~?Ÿ„€ÕÁGŽÁ1.‘ñ8In®>troQÂduzione’~¯œ¹2ŽŽ ÕÁ ýV¯Á10Ž‘ÿRingraziamen®>ti’n‚f11ŽŽ©(ÀœÀ1Ž‘ÁInctropœduzioneŽŸ¿:¹Questo›“ØHO•¸èWTO‘“Èdescriv“e˜la˜programmazione˜delle˜p•Gorte˜I/O‘“Èe˜come˜realizzare˜delle˜brevi˜attese˜di˜temp“oŽ¤ ®nei–Nprogrammi“cš¸èhe“girano“in“moGdo“uten˜te,‘)Esu“macc˜hine“basate“sugli“In˜tel“x86.‘_:Questo“doGcumen˜to“€è“deriv‘ÿqÐatoŽ¡dal–U piccolissimo“IO-Pš¸èort“mini-HO˜WTO“dello“stesso“autore.Ž¤ؼQuesto–U doGcumenš¸èto“€è“Cop˜yrigh˜t“1995-2000“di“Riku“Saikk˜onen.‘q€V‘ÿ*¸edere“ilŽ¡ó½HЃ ecti1000ÂLinux–“°HO¾˜WTO“c‘ÿ}/opyright–U ºhttp://sunsite.unc.edu/pub/Linux/docs/HOWTO/COPYRIGHT“¹pGer“i“dettagli.Ž¡Pš¸èer–U correzioni“o“ev˜en˜tuali“aggiun˜te“sono“raggiungibile“via“e-mail“(ºRiku.Saikkonen@hut.fi¹)...Ž¦À2Ž‘ÁUsare–G\le“ppœorte“I/O“nei“programmi“CŽŸèó¥!¢N ecbx1200Ä2.1Ž‘¾Il–¸meto_údo“normaleŽŸMª¹Le–þroutine“pšGer“accedere“alle“p˜orte“I/O‘îsono“in“º/usr/include/asm/io.h“¹(o“ºlinux/include/asm-i386/io.hŽ¤ ®¹nella–عdistribuzione“del“sorgenš¸ète“del“k˜ernel).‘üLT‘ÿ*¸ali“routine“sono“delle“macro“inline,‘ù quindi“€è“sucien˜te“usareŽ¡º#include‘?¬µ<ºasm/io.hµ>¹;–U non“servš¸èe“nessuna“libreria“aggiun˜tiv‘ÿqÐa.Ž©ؼA‘‡ìcausa–ˆ;di“una“limitazione“in“gcc“(presenš¸ète“in“tutte“le“v˜ersioni“di“cui“sono“al“corren˜te,‘Õcompreso“egcs),Ž¡Âbiso‘ÿ}/gna‘»÷¹compilare–÷¢tutti“i“sorgenš¸èti“c˜he“usano“tali“routine“con“l'ottimizzazione“abilitata“(ºgcc‘?¬-O1“¹o“maggiore),Ž¡oppure–šëusare“º#define–?¬extern“static–šë¹prima“di“º#include‘?¬µ<ºasm/io.hµ>“¹(ricordarsi“pGoi“di“mettere“º#undefŽ¡extern¹).Ž¦Pš¸èer–!yil“debugging“si“pu€ò“usare“ºgcc–?¬-g“-O‘!D¹(almeno–!ycon“le“ultime“v˜ersioni“di“gcc),‘TsebbGene“l'ottimizzazioneŽ¡pGossa–=Ncausare,›Ba“v¸èolte,˜un“compšGortamen¸èto“un“p˜€ò“strano“del“debugger.‘i€È‘=Hp˜ossibile“evitare“tale“incon•¸èv“enien“teŽ¡mettendo–ª•le“routine“cš¸èhe“accedono“alla“pGorta“I/O‘ªin“un“le“sorgen˜te“separato“e“compilare“solo“quest'ultimoŽ¡con–U l'ottimizzazione“abilitata.ŽŸ ÖÁ2.1.1Ž‘#!\P®>ermessiŽŸMª¹Prima–ÑEdi“accedere“ad“una“qualsiasi“pšGorta,‘0Nbisogna“dare“al“programma“il“p˜ermesso“p˜er“farlo.‘åîCi€ò“si“faŽ¡cš¸èhiamando–â“la“funzione“ºioperm()“¹(dic˜hiarata“in“ºunistd.h“¹e“denita“nel“k˜ernel)“da“qualc˜he“parte“all'inizio“delŽ¡programma–Òè(prima“di“qualunque“accesso“ad“una“pGorta“I/O).“La“sin¸ètassi“€è“ºioperm(from,–?¬num,“turn_on)¹,Ž¡do•¸èv“e–fºfrom“¹€è“il“primo“nš¸èumero“di“pGorta“e“ºnum“¹il“n˜umero“di“pGorte“consecutiv˜e“a“cui“dare“l'accesso.‘U—P˜er“esempio,Ž¡ºioperm(0x300,–?¬5,“1)–D-¹d€à“l'accesso“alle“pšGorte“da“0x300“a“0x304“(p˜er“un“totale“di“5“p˜orte).‘…L'ultimo“argomen¸ètoŽ¡€è–`Nun“v‘ÿqÐalore“b•Go“oleano–`Nc¸èhe“spšGecica“se“dare“(true“(1))“o“togliere“(false“(0))“al“programma“l'accesso“alle“p˜orte.Ž¡€È‘®ÒpGossibile–®écš¸èhiamare“pi€ù“v˜olte“ºioperm()“¹pšGer“abilitare“pi€ù“p˜orte“non“consecutiv¸èe.‘~ÚV‘ÿ*¸edere“la“pagina“di“manŽ¡di–U ºioperm(2)“¹pGer“i“dettagli“sulla“sin¸ètassi.Ž¦La–Þcš¸èhiamata“ºioperm()“¹necessita“c˜he“il“programma“abbia“i“privilegi“di“roGot;‘ÑŸquindi“bisogna“eseguirlo“da“uten˜teŽ¡rošGot,‘AÊoppure–urenderlo“suid“ro˜ot.‘©Dop˜o“la“c¸èhiamata“ºioperm“¹p˜er“abilitare“le“p˜orte“cš¸èhe“si“v˜ogliono“usare,‘AÊsiŽ¡pu€ò– ârinš¸èunciare“ai“privilegi“di“roGot.‘•ÇAlla“ne“del“programma“non“€è“necessario“abbandonare“esplicitamen˜teŽ¡i–$Óprivilegi“di“accesso“alle“pGorte“con“ºioperm(...,‘?¬0)¹,‘X¿ci€ò“vš¸èerr€à“fatto“automaticamen˜te“quando“il“proGcessoŽ¡termina.Ž¦Un–³ºsetuid()“¹ad“un“uten¸ète“non“rošGot“non“disabilita“l'accesso“alla“p˜orta“fornito“da“ºioperm()¹,‘ß—men¸ètre“unŽ¡ºfork()–U ¹lo“disabilita“(il“proGcesso“glio“non“ottiene“l'accesso,“il“genitore“in•¸èv“ece–U lo“man¸ètiene).ŽŽŽŒ‹V Û_2 ý ~?Ÿ„€ÕÁGŽÁ3.‘ñ8Gli–Õinš®>terrupt“(IR˜Q)“e“l'accesso“DMA’XS¹3ŽŽ ÕÁ ýV¯ºioperm()–9ø¹pu€ò“fornire“l'accesso“solo“alle“pšGorte“da“0x000“a“0x3;‘¬dp˜er“p˜orte“pi€ù“alte“bisogna“usare“ºiopl()Ž¤ ®¹(cš¸èhe,‘ con–êÃuna“sola“c˜hiamata,‘ fornisce“l'accesso“a“tutte“le“pGorte).‘N P˜er“fornire“al“programma“l'accesso“a“Âtutte‘«¹leŽ¡pGorte–NI/O‘;usare“3“come“argomenš¸èto“di“liv˜ello“(ciošG€è“ºiopl(3)¹)“(quindi“attenzione:‘Kaccedere“alle“p˜orte“sbagliateŽ¡pu€ò›!Cpro•¸èv“oGcare˜un˜sacco˜di˜sgradev“oli˜cose˜al˜computer).‘`7Di˜n“uo“v“o,‘+£pGer˜eettuare˜la˜c“hiamata˜a˜ºiopl()˜¹sonoŽ¡necessari–U i“privilegi“di“roGot.‘q€Pš¸èer“maggiori“dettagli“v˜edere“le“pagine“di“man“di“ºiopl(2)¹.ŽŸ ÖÁ2.1.2Ž‘#!\A®>ccedere–Õalle“pQÂorteŽŸMª¹Pš¸èer–Óqleggere“(input)“un“b˜yte“(8“bit)“da“una“pGorta,‘3c˜hiamare“ºinb(port)¹,‘3c˜he“restituisce“il“b˜yte“presen˜teŽ¡all'ingresso.‘_ÍP•¸èer› scriv“ere˜(output)˜un˜b“yte,‘*¤c“hiamare˜ºoutb(valore,‘?¬porta)˜¹(notare˜l'ordine˜dei˜parametri).Ž¡Pš¸èer–6Oleggere“una“w˜ord“(16“bit)“dalle“pGorte“ºx“¹e“ºx+1“¹(un“b˜yte“da“ogn˜una“pGer“formare“una“w˜ord“con“l'istruzioneŽ¡assemš¸èbler–\Jºinw¹)“c˜hiamare“ºinw(x)¹.‘†ýP˜er“scriv˜ere“una“w˜ord“sulle“due“pGorte“si“usa“ºoutw(valore,‘?¬x)¹.‘†ýSe“siŽ¡hanno–Hüdubbi“su“quali“istruzioni“(bš¸èyte“o“w˜ord)“usare“pšGer“le“p˜orte,‘Kiprobabilmenš¸ète“serv˜ono“ºinb()“¹e“ºoutb()“¹Ž¡la–maggior“parte“dei“dispšGositivi“sono“progettati“p˜er“gestire“l'accesso“alle“p˜orte“a“livš¸èello“di“b˜yte.‘ öNotare“c˜heŽ¡tutte–U le“istruzioni“pšGer“accedere“alle“p˜orte“ric¸èhiedono“almeno“un“microsecondo“(circa)“p˜er“essere“eseguite.Ž©ؼLe–Ù"macro“ºinb_p()¹,–ú"ºoutb_p()¹,“ºinw_p()–Ù"¹e“ºoutw_p()“¹funzionano“esattamenš¸ète“come“le“preceden˜ti,‘ú"ma“in˜tro-Ž¡ducono–LWun“ritardo,›Ndi“circa“un“microsecondo,˜dopšGo“l'accesso“alla“p˜orta.‘n’Si“pu€ò“allungare“tale“ritardo“a“circaŽ¡quattro–Àmicrosecondi“mettendo“º#define›?¬REALLY_SLOW_IO‘¿Þ¹prima“di“º#include˜µ<ºasm/io.hµ>¹.‘?ÌQueste“macro,Ž¡di––7solito“(a“meno“non“si“usi“º#define‘?¬SLOW_IO_BY_JUMPING¹,“cš¸èhe“probabilmen˜te“€è“meno“preciso),‘¦}eettuanoŽ¡una–ƒ(scrittura“sulla“pšGorta“0x80“p˜er“ottenere“il“ritardo“e“quindi,›Žªprima“di“usarle,˜bisogna“dargli“l'accesso“allaŽ¡pšGorta–á¬0x80“con“ºioperm()“¹(le“scritture“fatte“sulla“p˜orta“0x80“non“hanno“conseguenze“su“nessuna“parte“delŽ¡sistema).‘q€Pi€ù›U a•¸èv‘ÿqÐan“ti˜€è˜spiegato˜come˜ottenere˜dei˜ritardi˜con˜sistemi˜pi€ù˜v“ersatili.Ž¦Nelle–¦èraccolte“di“pagine“di“man“pGer“Linš¸èux,‘»Znelle“v˜ersioni“ragionev˜olmen˜te“recen˜ti,‘»Zci“sono“le“pagine“di“manŽ¡di–U ºioperm(2)¹,“ºiopl(2)“¹e“pGer“le“suddette“macro.ŽŸ#ÃÄ2.2Ž‘¾Un–¸altro“meto_údo:‘ÿ óD7`± ectt1200Å/dev/portŽŸMª¹Un–d(altro“mošGdo“p˜er“accedere“alle“p˜orte“I/O‘cë€è“quello“di“aprire,›”Zin“lettura“e/o“scrittura,˜con“ºopen()¹,˜il“dispGositiv¸èoŽ¡a–ãcaratteri“º/dev/port“¹(nš¸èumero“primario“1,‘°secondario“4)“(le“funzioni“stdio“ºf*()“¹hanno“un“buer“in˜terno“eŽ¡sono–ì quindi“da“evitare).‘6:Pš¸èoi“pGosizionarsi“con“ºlseek()“¹sul“b˜yte“appropriato“nel“le“(pGosizione“0“del“le“=Ž¡p•Gorta›H0x00,‘J¤p“osizione˜1˜del˜le˜=˜p“orta˜0x01˜e˜cos€ì˜via...)‘m"e˜leggere˜(ºread()¹),–J¤o˜scriv¸èere˜(ºwrite()¹),“un˜b¸èyteŽ¡o–U una“w¸èord“da,“o“in,“esso.Ž¦Ovviamen•¸ète,›ÆbpGerc“h€é–¯»ci€ò“funzioni,˜il“programma“a¸èvr€à“bisogno“dell'accesso“in“lettura/scrittura“a“º/dev/port¹.Ž¡Questo–³metoGdo“€è“probabilmenš¸ète“pi€ù“len˜to“del“metoGdo“normale“preceden˜temen˜te“descritto,‘Ónma“non“ha“bisognoŽ¡n€é–.di“ottimizzazioni“in“compilazione“n€é“della“funzione“ºioperm()¹.‘U…Non“serv¸èe“nemmeno“l'accesso“da“roGot,‘øse“siŽ¡fornisce–)«al“gruppšGo“o“agli“uten¸èti“non“ro˜ot“l'accesso“a“º/dev/port“¹“ma,›2\in“termini“di“sicurezza“del“sistema,˜farŽ¡questo–r€è“una“pšGessima“idea“p˜erc¸èh€é“€è“p˜ossibile“danneggiare“il“sistema,‘yYe“forse“anc¸èhe“ottenere“l'accesso“a“ro˜ot,Ž¡usando–U º/dev/port“¹pGer“accedere“direttamenš¸ète“agli“hard“disk,“alle“sc˜hede“di“rete,“ecc.Ž¦Non–FÔ€è“pšGossibile“usare“ºselect(2)“¹oppure“ºpoll(2)“¹p˜er“leggere“º/dev/port¹,‘|ãp˜ercš¸èh€é“l'hardw˜are“non“ha“la“capacit€àŽ¡di–U noticare“alla“CPU“il“cam•¸èbiamen“to–U del“v‘ÿqÐalore“in“una“pGorta“d'ingresso.ŽŸ(ÀœÀ3Ž‘ÁGli–G\inšcterrupt“(IR˜Q)“e“l'accesso“DMAŽŸ¿:¹Non–ßñ€è“pGossibile“usare“gli“IR¸èQ›ßÍo“il“DMA˜direttamen¸ète“da“un“prošGcesso“in“mo˜do“utenš¸ète,‘¦bisogna“scriv˜ere“unŽ¡drivš¸èer–{pGer“il“k˜ernel.‘ãyV‘ÿ*¸edere“ÂThe–¶¤Linux“Kernel“Hacker's“Guide‘{ºhttp://www.redhat.com:8080/HyperNews/Ž¡get/khg.html–U ¹pšGer“i“dettagli“e“il“co˜dice“sorgenš¸ète“del“k˜ernel“pGer“gli“esempi.ŽŽŽŒ‹, Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8T‘ÿ ºempQÂorizzazione–Õad“elev‘ÿ\|ata“precisione’þ÷=¹4ŽŽ ÕÁ ýV¯€È‘)pšGossibile–Udisabilitare“gli“in¸èterrupt“da“un“programma“in“mo˜do“uten¸ète,‘+#ma“pu€ò“essere“p˜ericoloso“(anc¸èhe“iŽ¤ ®drivš¸èer–´¥del“k˜ernel“lo“fanno“pšGer“il“temp˜o“pi€ù“brev¸èe“p˜ossibile).‘<Dop˜o“la“c¸èhiamata“ºiopl(3)“¹€è“p˜ossibile“disabilitareŽ¡gli–U inš¸èterrupt“con“una“semplice“c˜hiamata“ºasm(cli);“¹e“pGoi“riabilitarli“con“ºasm(sti);¹.ŽŸ(ÀœÀ4Ž‘ÁT‘þ®(emppœorizzazione–G\ad“elev‘ÿÆata“precisioneŽŸèÄ4.1Ž‘¾RitardiŽ©Mª¹Innanzi–9ktutto“€è“bGene“precisare“cš¸èhe,‘>öa“causa“della“natura“m˜ultitasking“di“Lin˜ux,‘>önon“€è“pGossibile“garan˜tire“c˜heŽ¡un–"°prošGcesso“c¸èhe“gira“in“mo˜do“utenš¸ète“abbia“un“preciso“con˜trollo“delle“tempšGorizzazioni.‘`°Un“pro˜cesso“p˜otrebb˜eŽ¡essere–sospšGeso“p˜er“un“temp˜o“c¸èhe“pu€ò“v‘ÿqÐariare“dai,–ÞÌcirca,“dieci›millisecondi,“no˜ad˜alcuni˜secondi˜(in˜unŽ¡sistema–ömolto“carico).‘QÒComš¸èunque,‘ pGer“la“maggior“parte“delle“applicazioni“c˜he“usano“le“pGorte“I/O,“ci€ò“non“haŽ¡impšGortanza.‘lÏP¸èer–¨åminimizzare“tale“temp˜o“€è“p˜ossibile“assegnare“al“pro˜cesso“un“pi€ù“elev›ÿqÐato“v˜alore“di“priorit€àŽ¡(vš¸èedere–U la“pagina“di“man“di“ºnice(2)¹),“oppure“si“pu€ò“usare“uno“sc˜heduling“in“real“time“(v˜edere“sotto).ŽŸؼP¸èer–n-tempšGorizzazioni“pi€ù“precise“di“quelle“disp˜onibili“p˜er“i“pro˜cessi“c¸èhe“girano“in“mo˜do“uten¸ète,‘tqci“sono“delleŽ¡forniture–=€pšGer“il“supp˜orto“dell'elab˜orazione“real“time“in“mo˜do“uten•¸ète.‘* I‘=Dk“ernel–=€2.x“di“Lin¸èux“forniscono“unŽ¡supp•Gorto›Þ°p“er˜il˜soft˜real˜time;‘#wp“er˜i˜dettagli˜v¸èedere˜la˜pagina˜di˜man˜di˜ºsched_setscheduler(2)¹.‘/C'€è˜unŽ¡kš¸èernel–¢spGeciale“c˜he“suppšGorta“l'hard“real“time;‘Èp˜er“maggiori“informazioni“v¸èedere‘D*ºhttp://luz.cs.nmt.edu/Ž¡~rtlinux/‘U ¹.ŽŸ ÖÁ4.1.1Ž‘#!\P®>ause:‘ ºsleep()–ÕÁe“ºusleep()Ž¦¹Incominciamo–¼Ccon“le“pi€ù“semplici“cš¸èhiamate“di“funzioni“di“tempGorizzazione.‘>ŒP˜er“ritardi“di“pi€ù“secondi“la“sceltaŽ¡migliore›&©€è,–[ probabilmen¸ète,“quella˜di˜usare˜ºsleep()¹.‘æP¸èer˜ritardi˜dell'ordine˜delle˜decine˜di˜millisecondi˜(ilŽ¡ritardo–Åminimo“semš¸èbra“essere“di“circa“10“ms)“do˜vrebbšGe“andar“b˜ene“ºusleep()¹.‘¡pQueste“funzioni“cedono“laŽ¡CPU‘°†agli–°žaltri“prošGcessi“(v‘ÿqÐanno“a“dormire:‘({sleep),‘Ç}in“mo˜do“c¸èhe“il“temp˜o“di“CPU‘°†non“vš¸èenga“sprecato.‘ƒùP˜er“iŽ¡dettagli–U v¸èedere“le“pagine“di“man“di“ºsleep(3)“¹e“ºusleep(3)¹.ŽŸؼPš¸èer–gritardi“inferiori“a,–«–circa,“50–gmillisecondi“(dipGenden˜temen˜te“dal“carico“del“sistema“e“dalla“v˜eloGcit€à“delŽ¡proGcessore–f1e“della“maccš¸èhina)“il“rilascio“della“CPU‘eëric˜hiede“troppšGo“temp˜o;‘îºci€ò“p˜erc¸èh€é“(p˜er“le“arc¸èhitettureŽ¡x86)–Û±lo“scš¸èheduler“generalmen˜te“la˜v˜ora,–ýUalmeno,“dai–Û±10“ai“30“millisecondi“prima“di“restituire“il“con˜trollo“adŽ¡un–e¥proGcesso.‘£Pš¸èer“questo“motiv˜o,›iÆpGer“i“piccoli“ritardi,˜ºusleep(3)“¹in“genere“ritarda“un“pGo'“pi€ù“della“quan¸ètit€àŽ¡spGecicatagli–U nei“parametri,“almeno“10“ms“circa.ŽŸ ÖÁ4.1.2Ž‘#!\ºnanosleep()Ž¦¹Nei–÷åkš¸èernel“Lin˜ux“della“serie“2.0.x,‘ Šc'€è“una“n˜uo˜v‘ÿqÐa“c˜hiamata“di“sistema,‘ Šºnanosleep()“¹(v˜edere“la“pagina“di“manŽ¡di–½ºnanosleep(2)¹),‘G$c¸èhe“pšGermette“di“dormire“o“ritardare“p˜er“brevi“p˜erio˜di“di“temp˜o“(p˜o˜c¸èhi“microsecondi“oŽ¡pi€ù).Ž©ؼP¸èer–Š\ritardi“no“a“2“ms,‘׫se“(e“solo“se)“il“prošGcesso“€è“imp˜ostato“p˜er“lo“sc¸èheduling“in“soft“real“time“(usan-Ž¡do–=Bºsched_setscheduler()¹),›wKºnanosleep()“¹usa“un“ciclo“di“attesa,˜altrimen¸èti“dorme“(sleep),˜proprio“comeŽ¡ºusleep()¹.Ž¦Il–>÷ciclo“di“attesa“usa“ºudelay()“¹(una“funzione“inš¸èterna“del“k˜ernel“usata“da“parecc˜hi“k˜ernel“driv˜er)“e“laŽ¡lunghezza–Xdel“ciclo“viene“calcolata“usando“il“v‘ÿqÐalore“di“BogoMips“(la“v¸èelošGcit€à“di“questo“tip˜o“di“cicli“diŽ¡attesa–圀è“una“delle“cose“cš¸èhe“BogoMips“misura“accuratamen˜te).‘ "ôP˜er“i“dettagli“sul“funzionamen˜to“v˜edereŽ¡º/usr/include/asm/delay.h¹.ŽŽŽŒ‹?* Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8T‘ÿ ºempQÂorizzazione–Õad“elev‘ÿ\|ata“precisione’þ÷=¹5ŽŽ ÕÁ ýV¯Á4.1.3Ž‘#!\Ritardare–Õtramite“l'I/O“sulle“pQÂorteŽ©Mª¹Un–:daltro“mošGdo“p˜er“realizzare“un“ritardo“di“p˜o˜c¸èhi“microsecondi“€è“di“eettuare“delle“op˜erazioni“di“I/O‘:]su“unaŽ¤ ®pGorta.‘pLa–RQlettura“dalla,›Ráo“la“scrittura“sulla“(come“si“fa“€è“stato“descritto“preceden•¸ètemen“te),˜pGorta–RQ0x80“di“unŽ¡bš¸èyte–Ñimpiega“quasi“esattamen˜te“un“microsecondo,‘ëƒindipGenden˜temen˜te“dal“tipGo“e“dalla“v˜elošGcit€à“del“pro˜cessore.Ž¡€È‘Hp•Gossibile›HTrip“etere˜tale˜op“erazione˜pi€ù˜v¸èolte˜p“er˜ottenere˜un'attesa˜di˜alcuni˜microsecondi.‘KLa˜scritturaŽ¡sulla–+¤pšGorta“non“do¸èvrebb˜e“a•¸èv“ere›+¤con“troindicazioni˜su˜nessuna˜macc“hina˜standard˜(e˜infatti˜qualc“he˜driv“er˜delŽ¡kš¸èernel–÷eusa“questa“tecnica).‘XOQuesto“€è“il“metoGdo“normalmen˜te“usato“da“ó !",š cmsy10¸fºin¸jºout¸gº[bw]_p()“¹pGer“realizzare“ilŽ¡ritardo–U (v¸èedere“ºasm/io.h¹).ŽŸؼIn–¿ƒeetti“una“istruzione“di“I/O‘¿]su“una“qualunque“delle“pGorte“nell'inš¸èterv‘ÿqÐallo“0-0x3“impiega“quasi“esattamen˜teŽ¡un–°microsecondo;‘]œquindi“se,›ÜpGer“esempio,˜si“sta“accedendo“direttamen¸ète“alla“pGorta“parallela,˜si“pGossonoŽ¡semplicemen¸ète–U eettuare“degli“ºinb()“¹in“pi€ù“pGer“ottenere“il“ritardo.ŽŸ ÖÁ4.1.4Ž‘#!\Ritardare–Õusando“le“istruzioni“assem®>blerŽ¦¹Se–~si“conosce“il“tipšGo“e“la“v¸èelo˜cit€à“del“pro˜cessore“della“macc¸èhina“su“cui“girer€à“il“programma,‘©€è“p˜ossibile“sfruttareŽ¡del–xcoGdice“basato“sull'hardw•¸èare,›Íc“he–xusa“certe“istruzioni“assem¸èbler,˜pGer“realizzare“dei“ritardi“molto“brevi“(maŽ¡ricordare–äçcš¸èhe“lo“sc˜heduler“pu€ò“sospšGendere“il“pro˜cesso“in“qualsiasi“momen¸èto,‘HØquindi“i“ritardi“p˜otrebb˜eroŽ¡essere–Øimpredicibilmenš¸ète“pi€ù“lunghi“del“previsto).‘ûÍNella“tabGella“seguen˜te“la“v˜eloGcit€à“in˜terna“del“proGcessoreŽ¡determina–lhil“nš¸èumero“di“cicli“di“cloGc˜k“ric˜hiesti.‘·WA˜d“esempio,‘r:pšGer“un“pro˜cessore“a“50“MHz“(tip˜o“un“486D¸èX-50Ž¡o–U un“486Dš¸èX2-50)“un“ciclo“di“cloGc˜k“dura“1/50.000.000“di“secondo“(pari“a“200“nanosecondi).ŽŸ´å‘óqLË ectt0900ÇIstruzione›WÔcicli–¹Ndi“clock˜cicli“di“clockŽ¤ Š=‘n~su–¹Nun“i386‘/= su“un“i486Ž¡‘xchg‘¹N%bx,%bx‘/= 3‘YÀÊ3Ž¡‘nop–YÀÊ3“1Ž¡‘or‘¹N%ax,%ax‘8¯¨2‘YÀÊ1Ž¡‘mov‘¹N%ax,%ax‘3öZ2‘YÀÊ1Ž¡‘add‘¹N%ax,0‘=hö2‘YÀÊ1ŽŸؼ¹I‘;™cicli–;àdi“cloGcš¸èk“dei“P˜en˜tium“do˜vrebbGero“essere“gli“stessi“degli“i486,‘t ma“nei“P˜en˜tium“Pro/IšGI‘;™ºadd–?¬%ax,“0‘;à¹p˜otrebb˜eŽ¤ ®ricš¸èhiedere–‚ksolo“1/2“ciclo“di“cloGc˜k.‘ùbSi“pu€ò“rimediare“usando“un'altra“istruzione“(a“causa“dell'esecuzione“fuoriŽ¡ordine–U non“€è“necessario“cš¸èhe“tale“istruzione“sia“quella“immediatamen˜te“successiv‘ÿqÐa“nel“coGdice).Ž©ؼLe–Fÿistruzioni“ºnop“¹e“ºxchg¹,›IÒindicate“nella“tabGella,˜non“doš¸èvrebbGero“a˜v˜ere“eetti“collaterali.‘lÊLe“altre“p•Gotrebb“eroŽ¡mošGdicare–ê)i“ag“dei“registri,‘ÿŽma“ci€ò“non“do¸èvrebb˜e“essere“un“problema“p˜oicš¸èh€é“gcc“do˜vrebbGe“accorgersene.‘MÙP˜erŽ¡realizzare–U istruzioni“di“ritardo“ºxchg–?¬%bx,“%bx–U ¹€è“una“buona“scelta.Ž¦Pš¸èer–Ÿºusarle“bisogna“c˜hiamare“ºasm("istruzione")¹.‘5 La“sin˜tassi“delle“istruzioni“€è“come“nella“tabGella“preceden˜te.Ž¡Se–}si“vš¸èogliono“mettere“pi€ù“istruzioni“in“un“singolo“ºasm()“¹bisogna“separarle“con“dei“pun˜ti“e“virgola.‘)~A˜d“esempioŽ¡ºasm("nop–?¬;“nop“;“nop“;“nop")–mõ¹esegue“quattro“istruzioni“ºnop¹,‘œ0generando“un“ritardo“di“quattro“cicli“di“cloGc¸èkŽ¡sui–U prošGcessori“i486“o“P•¸èen“tium–U (o“12“cicli“di“clo˜c¸èk“su“un“i386).Ž¦Gcc–U traduce“ºasm()“¹in“cošGdice“assem¸èbler“inline,“p˜er“cui“si“risparmiano“i“tempi“p˜er“la“c¸èhiamata“di“funzione.Ž¦Ritardi–U pi€ù“brevi“di“un“ciclo“di“clošGc¸èk“sono“imp˜ossibili“con“le“arcš¸èhitetture“In˜tel“x86.ŽŸ ÖÁ4.1.5Ž‘#!\ºrdtsc–ÕÁpQÂer“i“P•®>en“tiumŽŸMª¹Con–ri“P•¸èen“tium–r€è“pšGossibile“ottenere“il“n¸èumero“di“cicli“di“clo˜cš¸èk“trascorsi“dall'ultimo“ria˜vvio“del“sistema“con“ilŽ¡seguenš¸ète–U coGdice“C“(c˜he“esegue“l'istruzione“RDTSC):ŽŸæ‰ffÕÁGŸ ?œ‘'+ìÇextern–¹N__inline__“unsigned“long“long“int“rdtsc()ŽŽŽŒ‹OG Û_2 ý ~?Ÿ„€ÕÁGŽÁ5.‘ñ8Altri–Õlinguaggi“di“programmazione’ê¹6ŽŽ ÕÁ ýV¯‘'+ìÇ{Ž¤ Š=‘0žˆunsigned–¹Nlong“long“int“x;Ž¡‘0žˆ__asm__–¹Nvolatile“(".byte“0x0f,“0x31"“:“"=A"“(x));Ž¡‘0žˆreturn‘¹Nx;Ž¡‘'+ì}ŽŸ&Z‰ffÕÁGŸ ȹSi–U pu€ò“sondare“tale“v‘ÿqÐalore“pšGer“ritardare“del“n¸èumero“di“cicli“di“clo˜c¸èk“desiderato.ŽŸ#ÃÄ4.2Ž‘¾Misurare–¸il“temp_úoŽŸMª¹Pš¸èer–Ú©tempi“della“precisione“dell'ordine“del“secondo“€è“probabilmen˜te“pi€ù“facile“usare“ºtime()¹.‘P˜er“tempi“pi€ùŽ¤ ®precisi,‘§ºgettimeofday()–O%¹€è“preciso“no“a“circa“un“microsecondo“(ma“vš¸èedere“quan˜to“gi€à“detto“riguardo“loŽ¡scš¸èheduling).‘\Con–ði“P˜en˜tium,‘!Æil“frammen˜to“di“cošGdice“sopra“(ºrdtsc¹)“ha“una“precisione“pari“a“un“ciclo“di“clo˜c¸èk.Ž©ؼSe–ªêsi“desidera“c¸èhe“un“prošGcesso“ricev‘ÿqÐa“un“segnale“dop˜o“un“certo“quan¸èto“di“temp˜o,‘]usare“ºsetitimer()“¹oŽ¡ºalarm()¹.‘q€Pš¸èer–U i“dettagli“v˜edere“le“pagine“di“man“delle“suddette“funzioni.ŽŸ(ÀœÀ5Ž‘ÁAltri–G\linguaggi“di“programmazioneŽŸ¿:¹La–zdescrizione“precedenš¸ète“era“relativ‘ÿqÐa“spGecicamen˜te“al“linguaggio“C.“Do˜vrebbšGe“v‘ÿqÐalere“inalterata“p˜er“il“C++Ž¡e–›Ál'Ob‘Ž0jectivš¸èe“C.“In“assem˜bler,‘­jbisogna“eettuare“la“c˜hiamata“a“ºioperm()“¹o“ºiopl()“¹come“in“C,“ma“dopGo“diŽ¡ci€ò–U €è“pšGossibile“usare“direttamen¸ète“le“istruzioni“di“lettura/scrittura“p˜er“l'I/O“sulla“p˜orta.Ž¦In–&(altri“linguaggi,›Zjse“non“si“pu€ò“inserire“nel“programma“coGdice“assem¸èbler“o“C‘%òinline,˜o“se“non“€è“pGossibileŽ¡usare–J:le“cš¸èhiamate“di“sistema“menzionate“prima,‘Lh€è“probabilmen˜te“pi€ù“facile“scriv˜ere“un“semplice“le“sorgen˜teŽ¡C›kacon•¸ètenen“te–kgle“funzioni“pGer“l'accesso“in“I/O˜alle“pšGorte“o“p˜er“realizzare“i“ritardi“cš¸èhe“serv˜ono,‘pøe“compilarlo“eŽ¡link‘ÿqÐarlo–U con“il“resto“del“programma.‘q€Oppure“si“pu€ò“usare“º/dev/port“¹come“descritto“preceden•¸ètemen“te.ŽŸ(ÀœÀ6Ž‘ÁAlcune–G\utili“ppœorteŽŸ¿:¹V‘ÿ*¸engono–Crora“fornite“delle“informazioni“pšGer“la“programmazione“delle“p˜orte“pi€ù“comš¸èuni“c˜he“pGossono“essereŽ¡usate–U pšGer“l'I/O“delle“logic¸èhe“TTL“(o“CMOS)“p˜er“scopi“generici.Ž¦Se–WÃsi“v¸èogliono“usare“queste“o“altre“pšGorte“p˜er“il“loro“scop˜o“originale“(cio˜€è“conš¸ètrollare“una“normale“stampan˜teŽ¡o–ÍQun“mo•Gdem),‘ë]sarebb“e–ÍQmeglio“usare“i“drivš¸èer“esisten˜ti“(c˜he,›ë]di“solito,˜sono“inclusi“nel“k¸èernel),˜piuttosto“c¸èheŽ¡programmare–;ädirettamenš¸ète“le“pGorte“come“descritto“in“questo“HO˜WTO.“Questa“sezione“€è“indirizzata“a“quelliŽ¡c•¸èhe›4¥v“ogliono˜connettere˜alle˜pGorte˜standard˜di˜un˜PC‘4kdegli˜sc“hermi˜LCD,˜dei˜motori˜passo˜passo,‘l†o˜altriŽ¡comp•Gonen¸èti‘U sp“ecici.Ž¦Se–ØYsi“desidera“conš¸ètrollare“un“dispGositiv˜o“di“largo“uso,‘ù'come“uno“scanner“(c˜he“€è“sul“mercato“gi€à“da“un“pG€ò),Ž¡cercate–54se“c'€è“gi€à“un“drivš¸èer“di“Lin˜ux“c˜he“lo“riconosce.‘»L'›4úÂHar–ÿ}/dwar“e-HO¾˜WTO˜ºhttp://sunsite.unc.edu/Ž¡pub/Linux/docs/HOWTO/Hardware-‘€HOWTO–U ¹€è“un“buon“pGosto“da“cui“iniziare“la“ricerca.Ž¦ºhttp://www.hut.fi/Misc/Electronics/–¹€è“una“buona“fon¸ète“di“informazioni“sulla“connessione“di“dispGositiviŽ¡ai–U computer“(e“sull'elettronica“in“generale).ŽŸ#ÃÄ6.1Ž‘¾La–¸p_úorta“parallelaŽŸMª¹L'indirizzo–ØGbase“della“pšGorta“parallela“(detto“ºBASE‘Ø%¹nel“seguito)“€è“0x3b˜c“p˜er“º/dev/lp0¹,‘ù0x378“p˜er“º/dev/lp1Ž¡¹e–- 0x278“pGer“º/dev/lp2¹.‘ûPš¸èer“con˜trollare“qualcosa“c˜he“si“compGorta“come“una“normale“stampan˜te,‘cÀv˜edere“ilŽ¡ÂPrinting-HO¾˜WTO–U ºhttp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Printing-‘€HOWTO“¹.ŽŽŽŒ‹_û Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Alcune–Õutili“pQÂorte’dËå¹7ŽŽ ÕÁ ýV¯Nella–1¸maggior“parte“delle“pšGorte“parallele,‘8Íoltre“al“mo˜do“standard“di“sola“scrittura“descritto“di“seguito,‘8ÍesisteŽ¤ ®un–=5moGdo“bidirezionale“esteso.‘)¾Pš¸èer“maggiori“informazioni“su“tale“argomen˜to“e“sui“n˜uo˜vi“moGdi“ECP/EPP‘ÿ*¸,Ž¡v¸èedere–vºhttp://www.fapo.com/›»¹e“ºhttp://www.senet.com.au/~cpeacock/parallel.htm˜¹.‘£'Ricordare˜c¸èheŽ¡pšGoic¸èh€é–ŽVnon“€è“p˜ossibile“usare“gli“IR¸èQ›Ž$o“il“DMA˜in“un“programma“cš¸èhe“gira“in“moGdo“uten˜te,‘¶pGer“usare“ECP/EPPŽ¡probabilmenš¸ète–,wsar€à“necessario“scriv˜ere“un“driv˜er“pGer“il“k˜ernel.‘cóCredo“c˜he“qualcuno“stia“gi€à“scriv˜endo“un“taleŽ¡driv¸èer,–U ma“non“conosco“i“dettagli“della“cosa.Ž©ؼLa–èØpšGorta“ºBASE+0“¹(p˜orta“dati)“con¸ètrolla“i“segnali“dei“dati“della“p˜orta“(da“D0“a“D7“p˜er“i“bit“da“0“a“7,Ž¡rispšGettiv‘ÿqÐamen¸ète;‘36stati:‘X0–"A=“basso“(0“V),“1“=“alto“(5“V)).“Una“scrittura“su“tale“p˜orta“ssa“i“dati“sui“pin.‘`‹UnaŽ¡lettura–¯Örestituisce“i“dati“c¸èhe“sono“stati“scritti“pšGer“ultimi,‘Ðåin“mo˜do“standard“(oppure“esteso),‘Ðåoppure“restituisceŽ¡i–U dati“pro•¸èv“enien“ti–U dai“pin“di“un“altro“dispGositivš¸èo“c˜he“la˜v˜ora“in“moGdalit€à“di“lettura“estesa.Ž¦La–U pšGorta“ºBASE+1“¹(p˜orta“di“Stato)“€è“di“sola“lettura“e“restituisce“lo“stato“dei“seguen¸èti“segnali“d'ingresso:Ž©Tõ‘¸ŽŽŽ‘¹Bit–U 0“e“1,“riserv‘ÿqÐati.Ž¤l1‘¸ŽŽŽ‘¹Bit–U 2“stato“dell'IR¸èQ“(non“€è“un“pin“e“non“so“come“funziona)Ž¡‘¸ŽŽŽ‘¹Bit–U 3“ERR¸èOR“(1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 4“SLCT“(1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 5“PE“(1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 6“A¸èCK“(1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 7“-BUSY“(0“=“alto)Ž¦La–ÚpšGorta“ºBASE+2“¹(p˜orta“di“Con¸ètrollo)“€è“di“sola“scrittura“(una“lettura“restituisce“l'ultimo“dato“scritto)“eŽŸ ®conš¸ètrolla–U i“seguen˜ti“segnali“di“stato:Ž¦‘¸ŽŽŽ‘¹Bit–U 0“-STR¸èOBE“(0“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 1“-A¸èUTO_FD_XT“(0“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 2“INIT“(1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 3“-SLCT_IN“(0“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–û4,›$‹quando“impGostato“ad“1,˜abilita“l'IRš¸èQ‘úädella“pGorta“parallela“(c˜he“si“v˜erica“nella“transizione“diŽ© ®‘A¸èCK–U da“basso“ad“alto)Ž¡‘¸ŽŽŽ‘¹Bit–%5“con¸ètrolla“la“direzione“del“moGdo“esteso“(0“=“scrittura,‘Y1“=“lettura)“ed“€è“di“sola“scrittura“(unaŽ¦‘lettura–U di“questo“bit“non“restituisce“n¸èulla“di“utile).Ž¡‘¸ŽŽŽ‘¹Bit–U 6“e“7,“riserv‘ÿqÐati.ŽŸTõCongurazione–aždei“pin“(connettore“a“D‘aYfemmina“a“25-pin“sulla“pGorta)“(i“=“input,‘¤¾ingresso;‘çÝo“=“output,Ž¦uscita):ŽŸ1‘Ç1io–¹N-STROBE,“2io“D0,“3io“D1,“4io“D2,“5io“D3,“6io“D4,“7io“D5,“8io“D6,Ž¤ Š=‘9io–¹ND7,“10i“ACK,“11i“-BUSY,“12i“PE,“13i“SLCT,“14o“-AUTO_FD_XT,Ž¡‘15i–¹NERROR,“16o“INIT,“17o“-SLCT_IN,“18-25“GroundŽŸTõ¹Le–mspGecicš¸èhe“IBM‘^dicono“c˜he“i“pin“1,–ž14,“16–me“17“(le“uscite“di“con˜trollo)“hanno“i“driv˜er“dei“collettori“apGertiŽ¦connessi–ƒ˜a“5“V‘ƒJattra•¸èv“erso–ƒ˜resistori“da“4.7“kš¸èohm“(pGozzo“20“mA,“fon˜te“0.55“mA,“uscita“a“liv˜ello“alto“pariŽ¦a–d50.5“V›cïmeno“il“pullup).‘ž¿I˜rimanenš¸èti“pin“hanno“il“pGozzo“a“24“mA,“la“fon˜te“a“15“mA,“e“la“loro“uscita“aŽ¦livš¸èello–e±alto“€è“di“2.4“V‘ek(minimo).‘£4P˜er“en˜tram˜bi,‘©Ölo“stato“basso“€è“di“0.5“V‘ek(massimo).‘£4Le“pGorte“paralleleŽŽŽŒ‹n< Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Alcune–Õutili“pQÂorte’dËå¹8ŽŽ ÕÁ ýV¯non–’$IBM‘’probabilmenš¸ète“si“discostano“da“questo“standard.‘(ŒP˜er“maggiori“informazioni“a“tal“riguardo“v˜edereŽ¤ ®ºhttp://www.hut.fi/Misc/Electronics/circuits/lptpower.html‘U ¹.Ž©ؼIn–_ultimo“un“a•¸èvv“ertimen“to:‘ïþattenzione–_con“i“collegamenš¸èti“a“massa.‘¯=P˜ersonalmen˜te“ho“rotto“div˜erse“pGorteŽ¡parallele–ŒÎcollegandoGci“qualcosa“menš¸ètre“il“computer“era“acceso.‘ŠP˜er“gioGc˜hetti“del“genere“sarebbGe“buona“cosaŽ¡usare–  una“pGorta“parallela“cš¸èhe“non“sia“in˜tegrata“sulla“piastra“madre.‘Sÿ(Di“solito“€è“pGossibile“ottenere“unaŽ¡seconda–ì½pšGorta“parallela,‘p˜er“la“propria“maccš¸èhina,‘tramite“una“economica“e“standard“sc˜heda“m˜ulti-I/O;“bastaŽ¡disabilitare– ¸le“pšGorte“di“cui“non“si“ha“bisogno“e“imp˜ostare“l'indirizzo“I/O‘ «della“p˜orta“parallela“sulla“sc¸èheda“adŽ¡un–U indirizzo“libšGero.‘q€Non“€è“necessario“conoscere“l'IR¸èQ“della“p˜orta“parallela“se“non“lo“si“usa.)ŽŸ#ÃÄ6.2Ž‘¾La–¸pš_úorta“gio˜cš hi“(jo˜ystic˜k)ŽŸMª¹La–®ŸpšGorta“gio˜cš¸èhi“€è“situata“agli“indirizzi“0x200-0x207.‘:P˜er“con˜trollare“i“normali“jo˜ystic˜k“€è“probabilmen˜te“meglioŽ¡usare–U i“drivš¸èer“distribuiti“con“il“k˜ernel“di“Lin˜ux.Ž¦Congurazione–U dei“pin“(connettore“a“D“femmina“a“15“pin):Ž©ؼ‘¸ŽŽŽ‘¹1,–U 8,“9,“15“:‘q€+5“V“(alimen¸ètazione)Ž¤®‘¸ŽŽŽ‘¹4,–U 5,“12“:‘q€massaŽ¡‘¸ŽŽŽ‘¹2,–U 7,“10,“14“:‘q€ingressi“digitali“BA1,“BA2,“BB1“e“BB2,“rispGettiv‘ÿqÐamen¸èteŽ¡‘¸ŽŽŽ‘¹3,–U 6,“11,“13“:‘q€ingressi“analogici“AX,“A‘ÿ*¸Y,“BX“e“BY,“rispGettiv‘ÿqÐamen¸èteŽ¦I›ýpin–ý>+5“V˜semš¸èbra“c˜he“siano“spGesso“collegati“direttamen˜te“alle“linee“di“alimen˜tazione“sulla“sc˜heda“madre,Ž¤ ®quindi–Òído¸èvrebbšGero“p˜oter“fornire“un“b˜el“p˜€ò“di“p˜otenza,›ìøa“seconda“della“sc¸èheda“madre,˜dell'alimen¸ètatore“e“dellaŽ¡p•Gorta‘U gio“c¸èhi.Ž©ؼGli–”3ingressi“digitali“sono“usati“pGer“i“pulsanš¸èti“dei“due“jo˜ystic˜k“(jo˜ystic˜k“A‘“áe“jo˜ystic˜k“B,“con“due“pulsan˜tiŽ¡ciascuno)–h~collegabili“alla“p•Gorta.‘«šDoš¸èvrebb“ero–h~usare“i“normali“liv˜elli“d'ingresso“TTL‘hyed“€è“pGossibile“leggerne“loŽ¡stato–‰/direttamenš¸ète“dalla“pGorta“di“stato“(v˜edere“sotto).‘ ¬Quando“il“pulsan˜te“€è“prem˜uto,‘–2il“jo˜ystic˜k“restituisceŽ¡uno–Õ¦stato“basso“(0“V),“altrimenš¸èti“restituisce“uno“stato“alto“(i“5“V‘Õ…del“pin“dell'alimen˜tazione“attra˜v˜erso“unŽ¡resistore–U di“1“k¸èohm).Ž¦I‘ *cos€ìdetti– Xingressi“analogici“in“eetti“misurano“una“resistenza.‘‘)La“pšGorta“gio˜cš¸èhi“ha“un“quadruplo“m˜ultivi-Ž¡bratore–&monostabile“(un“cš¸èhip“558)“collegato“ai“quattro“ingressi.‘Ì’A˜d“ogni“ingresso,‘Pgfra“il“pin“di“ingresso“eŽ¡l'uscita–Œšdel“mš¸èultivibratore,‘šxc'€è“un“resistore“da“2.2“k˜ohm“e,‘šxfra“l'uscita“del“m˜ultivibratore“e“la“massa,‘šxc'€è“unŽ¡condensatore–Äêdi“tempšGorizzazione“pari“a“0.01“uF.“Il“jo•¸èystic“k–Äê€è“dotato“di“un“p˜otenziometro“p˜er“ogni“asse“(XŽ¡e–‹‡Y),“connesso“fra“+5“V›‹ye“l'appropriato“pin“d'ingresso“(AX˜o“A‘ÿ*¸Y˜pGer“il“jo•¸èystic“k–‹‡A,“oppure“BX˜o“BY˜pGer“ilŽ¡jo•¸èystic“k‘U B).Ž¦Il–¿m¸èultivibratore,›Òquando“attiv‘ÿqÐato,˜impšGosta“alte“(5“V)‘«le“sue“linee“di“uscita“ed“asp˜etta“c¸èhe“ogni“condensatoreŽ¡di–‚tempšGorizzazione“raggiunga“i“3.3“V‘mprima“di“abbassare“le“risp˜ettiv¸èe“linee“di“uscita.‘VöCos€ì“facendo,‘nla“durataŽ¡dello– ,stato“alto“del“m¸èultivibratore“sar€à“propšGorzionale“alla“resistenza“del“p˜otenziometro“nel“jo•¸èystic“k– ,(cio˜€è“allaŽ¡pšGosizione–U della“lev‘ÿqÐa“sull'asse“corrisp˜onden¸ète),“secondo“la“relazione:Ž¤ؼ‘'ÿR–U =“(t“-“24.2)“/“0.011,Ž¡do•¸èv“e–U R“€è“la“resistenza“(in“ohm)“del“pGotenziometro“e“t“la“durata“dello“stato“alto“(in“microsecondi).Ž¦Quindi,›#>pGer–úleggere“gli“ingressi“analogici,˜bisogna“prima“attiv‘ÿqÐare“il“m¸èultivibratore“(con“una“scrittura“sullaŽ¤ ®p•Gorta;‘Y·v¸èedere›Úsotto),‘.Ip“oi˜con¸ètrollare˜(con˜letture˜rip“etute˜della˜p“orta)˜lo˜stato˜dei˜quattro˜assi˜nc¸èh€é˜nonŽ¡scendono–{õdallo“stato“alto“a“quello“basso,‘Ūe“quindi“misurare“la“durata“del“loro“stato“alto.‘åþT‘ÿ*¸ale“con¸ètrolloŽ¡ricš¸èhiede–Eabbastanza“tempGo“di“CPU‘9e,‘ŒNsu“di“un“sistema“m˜ultitasking“non“in“real“time“come“Lin˜ux“(in“moGdoŽŽŽŒ‹ {Ô Û_2 ý ~?Ÿ„€ÕÁGŽÁ7.‘ñ8Suggerimen®>ti’|ѹ9ŽŽ ÕÁ ýV¯utenš¸ète–Ä9normale),‘ßÿil“risultato“non“€è“molto“preciso“pGerc˜h€é“non“€è“pGossibile“con˜trollare“costan˜temen˜te“la“pGortaŽ¤ ®(a–+Žmeno“cš¸èhe“si“usi“un“driv˜er“a“liv˜ello“di“k˜ernel“e“si“disabilitino“gli“in˜terrupt“duran˜te“il“con˜trollo;‘–Åma“cos€ìŽ¡si–Âàspreca“ancor“pi€ù“tempGo“di“CPU).“Se“si“sa“cš¸èhe“il“segnale“impiegher€à“parecc˜hio“tempšGo“(decine“di“ms)“p˜erŽ¡tornare–gÉbasso,‘lssi“pu€ò“cš¸èhiamare“usleep()“prima“di“cominciare“il“con˜trollo,‘lsregalando“cos€ì“quel“tempGo“di“CPUŽ¡ad–U altri“proGcessi.Ž©ؼLa–ÔKsola“pšGorta“di“I/O‘Ô*a“cui“serv¸èe“di“accedere“€è“la“p˜orta“0x201“(le“altre“p˜orte“o“si“comp˜ortano“allo“stesso“mo˜do,Ž¡o–HInon“fanno“n¸èulla).‘m8Qualsiasi“scrittura“su“questa“pšGorta“(non“imp˜orta“cosa“si“scrivš¸èe)“attiv‘ÿqÐa“il“m˜ultivibratore.Ž¡Una–U lettura“da“questa“pGorta“restituisce“lo“stato“dei“segnali“di“ingresso:ŽŸؼ‘¸ŽŽŽ‘¹Bit–U 0:‘q€AX“(stato“dell'uscita“del“m¸èultivibratore“(1“=“alto))Ž¤®‘¸ŽŽŽ‘¹Bit–U 1:‘q€A‘ÿ*¸Y“(stato“dell'uscita“del“m¸èultivibratore“(1“=“alto))Ž¡‘¸ŽŽŽ‘¹Bit–U 2:‘q€BX“(stato“dell'uscita“del“m¸èultivibratore“(1“=“alto))Ž¡‘¸ŽŽŽ‘¹Bit–U 3:‘q€BY“(stato“dell'uscita“del“m¸èultivibratore“(1“=“alto))Ž¡‘¸ŽŽŽ‘¹Bit–U 4:‘q€BA1“(ingresso“digitale,“1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 5:‘q€BA2“(ingresso“digitale,“1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 6:‘q€BB1“(ingresso“digitale,“1“=“alto)Ž¡‘¸ŽŽŽ‘¹Bit–U 7:‘q€BB2“(ingresso“digitale,“1“=“alto)ŽŸ#ÃÄ6.3Ž‘¾La–¸p_úorta“serialeŽŸMª¹Se–ævil“dispGositivš¸èo“d'in˜teresse“suppGorta“qualcosa“c˜he“somiglia“alla“RS-232,‘ Ëdo˜vrebbšGe“essere“p˜ossibile“usare“laŽ¤ ®pšGorta–*„seriale“p˜er“comš¸èunicare“con“esso.‘ñ¬Il“driv˜er“di“Lin˜ux“pšGer“le“p˜orte“seriali“do¸èvrebb˜e“andar“b˜ene“p˜er“laŽ¡maggior––'parte“delle“applicazioni“(non“€è“necessario“programmare“direttamen¸ète“la“pšGorta“seriale,‘æip˜er“farlo,Ž¡probabilmen•¸ète,‘XÝbisognerebbGe›Xscriv“ere˜un˜driv“er˜pGer˜il˜k“ernel);‘Yœ€è˜piuttosto˜v“ersatile˜e˜quindi,‘XÝusando˜v“eloGcit€àŽ¡di–U trasmissione“(b/s)“non“standard,“o“cose“del“genere,“non“do¸èvrebbGero“esserci“problemi.Ž¦Pš¸èer–w¤maggiori“informazioni“sulla“programmazione“delle“pGorte“seriali“sui“sistemi“Unix,‘ÀEv˜edere“la“pagina“diŽ¡man–ädi“ºtermios(3)¹,‘NÕil“coGdice“sorgenš¸ète“del“driv˜er“pšGer“la“p˜orta“seriale“(ºlinux/drivers/char/serial.c¹)“eŽ¡ºhttp://www.easysw.com/~mike/serial/‘U ¹.ŽŸ(ÀœÀ7Ž‘ÁSuggerimenctiŽŸ¿:¹Se–åsi“desidera“un“buon“I/O›Öanalogico,‘ž—collegare“dei“c¸èhip“ADC˜e/o“D•¸èA“C˜alla–åpGorta“parallela“(suggerimen¸èto:Ž¡pšGer–ѽl'alimen¸ètazione“usare“il“connettore“della“p˜orta“gio˜cš¸èhi“o“un“connettore“di“alimen˜tazione“pGer“i“disc˜hi“ancoraŽ¡libGero–ßBcš¸èhe“v‘ÿqÐa“cablato“no“all'esterno“del“computer,‘öÕa“meno“c˜he“non“si“abbia“un“dispGositiv˜o“a“basso“consumo“eŽ¡si–ß°pšGossa“usare“la“p˜orta“parallela“stessa“p˜er“l'alimenš¸ètazione,‘÷-o“una“fon˜te“di“alimen˜tazione“esterna),‘÷-o“comprareŽ¡una–u‡scš¸èheda“AD/D˜A‘u=(la“maggior“parte“di“quelle“pi€ù“v˜ecc˜hie,‘½¡e“pi€ù“len˜te,‘½¡v˜engono“con˜trollate“dalle“pGorteŽ¡I/O).– ¡Oppure,›8se“ci“si“accon•¸èten“ta– ¡di“1“o“2“canali,˜se“non“d€à“fastidio“l'imprecisione“e“(probabilmen¸ète)“unoŽ¡spGostamenš¸èto–ê'di“fuori“zero,‘ÿŒdo˜vrebbGe“bastare“(e“risulta“v˜eramen˜te“v˜eloGce)“una“sc˜heda“audio“economica“c˜he“siaŽ¡suppGortata–U dai“drivš¸èer“audio“di“Lin˜ux.Ž¦Con–dispGositivi“analogici“precisi,‘>Ïuna“cattiv‘ÿqÐa“messa“a“terra“pu€ò“generare“degli“errori“negli“input“o“outputŽ¡analogici.‘ lSe–ýøcapita“qualcosa“del“genere,‘h-proš¸èv‘ÿqÐare“ad“isolare“elettricamen˜te“il“dispGositiv˜o“dal“computer,Ž¡usando–³degli“accoppiatori“ottici“(su“Âtutti‘ |¹i“segnali“tra“il“computer“ed“il“dispGositiv•¸èo).‘V±P“er–³ottenere“un“miglioreŽ¡isolamen•¸èto›,pro“v‘ÿqÐare˜a˜prendere˜l'alimen“tazione˜pGer˜gli˜accoppiatori˜dal˜computer˜(i˜segnali˜non˜usati˜sullaŽ¡p•Gorta›U p“otrebb“ero˜fornire˜p“otenza˜sucien¸ète).ŽŽŽŒ‹ Œà Û_2 ý ~?Ÿ„€ÕÁGŽÁ8.‘ñ8Risoluzione–Õdei“problemi’=xª¹10ŽŽ ÕÁ ýV¯Se–x£si“sta“cercando“un“programma“pšGer“Lin¸èux“p˜er“il“progetto“di“circuiti“stampati,‘Áƒc'€è“un'applicazione“p˜erŽ¤ ®X11,–òWcš¸èhiamata‘ÒæPcb,“c˜he–Òæfunziona“piuttosto“bšGene,‘òWalmeno“p˜er“applicazioni“non“molto“complesse.‘êҀȑÒÆinclusaŽ¡in–]Epareccš¸èhie“distribuzioni“Lin˜ux“ed“€è“dispGonibile“in‘ºŠºftp://sunsite.unc.edu/pub/Linux/apps/circuits/Ž¡¹(nome–U del“le:‘q€ºpcb-*¹).ŽŸ(µÚÀ8Ž‘ÁRisoluzione–G\dei“problemiŽŸˆÁD1.ŽŽŽ¤¡–‘¹Quando–U accedo“alle“pGorte“ottengo“segmen¸ètation“faults.Ž©•ÁR1.ŽŽŽ¡‘¹Il–¶mtuo“programma“non“ha“i“privilegi“di“rošGot,‘ÎÀoppure“la“c¸èhiamata“ºioperm()“¹€è“fallita“p˜er“qualc¸èhe“altroŽ¤ ®‘motiv•¸èo.›LtCon“trolla–žil“v‘ÿqÐalore“restituito“da“ºioperm()¹.˜Inoltre,‘°[assicurati“di“stare“accedendo“proprio“alleŽ¡‘pGorte–’5cš¸èhe“hai“abilitato“con“ºioperm()“¹(v˜edi“D3).‘0‡Se“stai“usando“le“macro“di“ritardo“(ºinb_p()¹,‘¹1ºoutb_p()¹,Ž¡‘e–!Åvia“dicendo),‘, ricordati“di“eettuare“una“cš¸èhiamata“a“ºioperm()“¹pGer“ottenere“l'accesso“anc˜he“alla“pGortaŽ¡‘0x80.Ž¦ÁD2.ŽŽŽŸ¡–‘¹Non–t|riesco“a“troš¸èv‘ÿqÐare“le“funzioni“ºin*()“¹e“ºout*()“¹denite“o˜vunque,‘|Se“gcc“si“lamen˜ta“pGer“dei“riferimen˜tiŽ¡‘non–U deniti“(undened“references).Ž¦ÁR2.ŽŽŽŸ¡–‘¹Non–Áªhai“compilato“con“l'ottimizzazione“abilitata“(º-O¹)‘ÁLe“quindi“gcc“non“riesce“a“risolv¸èere“le“macroŽ¡‘con•¸èten“ute–U in“ºasm/io.h¹.‘q€Oppure“hai“dimen¸èticato“di“mettere“º#include‘?¬µ<ºasm/io.hµ>Ž¦ÁD3.ŽŽŽ¤¡–‘ºout*()–U ¹non“f€à“n¸èulla,“o“f€à“qualcosa“di“strano.Ž¦ÁR3.ŽŽŽ¡‘¹Conš¸ètrolla–‡l'ordine“dei“parametri;‘ddev˜e“essere“ºoutb(valore,›?¬porta)“¹e“non“ºoutportb(porta,˜valore)ŽŸ ®‘¹come–U €è“in“MS-DOS.Ž¦ÁD4.ŽŽŽ¡‘¹V‘ÿ*¸oglio–U conš¸ètrollare“un“dispGositiv˜o“standard“RS-232/una“stampan˜te“parallela/un“jo˜ystic˜k...Ž¦ÁR4.ŽŽŽ¡‘¹Probabilmenš¸ète–|ti“con˜viene“usare“i“driv˜er“esisten˜ti“(nel“k˜ernel“di“Lin˜ux,‘…Ýo“in“un“serv˜er“X,“o“da“qualc˜heŽ¤ ®‘altra–±*parte).‘:ÙI‘±drivš¸èer“generalmen˜te“sono“abbastanza“v˜ersatili,‘Ñõtan˜to“da“far“funzionare“anc˜he“i“dispGositiviŽ¡‘non–Àdstandard,‘Û5di“solito.‘³KV‘ÿ*¸edere“le“informazioni“preceden•¸ètemen“te–Àddate“riguardo“le“pšGorte“standard“p˜erŽ¡‘indicazioni–U sulla“doGcumen¸ètazione.ŽŸ(µÚÀ9Ž‘ÁCopœdice‘G\d'esempioŽŸ¿:¹Ecco–U un“esempio“di“cošGdice“p˜er“l'accesso“alla“p˜orta“I/O:ŽŸ Þì‰ffÕÁGŸ 3‘Ç/*Ž¤ Š=‘¹P*–¹Nexample.c:“un“semplicissimo“esempio“di“I/O“su“portaŽ¡‘¹P*Ž¡‘¹P*–¹NQuesto“codice“non“fa“nulla“di“utile,“solo“una“scrittura“sullaŽ¡‘¹P*–¹Nporta,“una“pausa“e“una“lettura“dalla“porta.“Compilarlo“conŽŽŽŒ‹ 2 Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Ringraziamen®>ti’g_J¹11ŽŽ ÕÁ ýV¯‘¹PÇ*–¹N`gcc“-O2“-o“example“example.c'“ed“eseguitelo“da“root“con“"./example".Ž¤ Š=‘¹P*/Ž¡¡¡‘#include‘¹NŽ¡‘#include‘¹NŽ¡‘#include‘¹NŽ¡¡‘#define–¹NBASEPORT“0x378“/*“lp1“*/Ž¡¡‘int‘¹Nmain()Ž¡‘{Ž¡‘"rž/*–¹NRichiede“l'accesso“alle“porte“*/Ž¡‘"ržif–¹N(ioperm(BASEPORT,“3,“1))“{perror("ioperm");“exit(1);}Ž¡¡‘"rž/*–¹NImposta“bassi“(0)“i“segnali“di“dati“(D0-7)“della“porta“*/Ž¡‘"ržoutb(0,‘¹NBASEPORT);Ž¡¡‘"rž/*–¹NVa“in“pausa“(dorme)“per“un“p€ò“(100“ms)“*/Ž¡‘"ržusleep(100000);Ž¡¡‘"rž/*–¹NLegge“dalla“porta“lo“stato“(BASE+1)“e“mostra“il“risultato“*/Ž¡‘"ržprintf("stato:–¹N%d\n",“inb(BASEPORT“+“1));Ž¡¡‘"rž/*–¹NLa“porta“non“serve“pi€ù“*/Ž¡‘"ržif–¹N(ioperm(BASEPORT,“3,“0))“{perror("ioperm");“exit(1);}Ž¡¡‘"ržexit(0);Ž¡‘}Ž¡¡‘/*–¹Nfine“dell'esempio“example.c“*/ŽŸfF‰ffÕÁGŸ+ƒÀ10Ž‘¬%RingraziamenctiŽŸ¿:¹Ha–‹€conš¸ètribuito“troppa“gen˜te“pGerc˜h€é“pGossa“elencarla,‘Ùma“grazie“tan˜te,‘Ùa“tutti.‘ŸNon“ho“rispGosto“a“tutti“iŽŸ ®con•¸ètributi›U c“he˜mi˜sono˜giun“ti;˜me˜ne˜scuso,˜e˜grazie˜ancora˜pGer˜l'aiuto.ŽŽŽŒø¨"ƒ’À;èÛ_2ÕÁG óqLË ectt0900óD7`± ectt1200ó¥!¢N ecbx1200ó½HЃ ecti1000ó]fŒ ecbx1000ó&Lt$ffffecbx1440óø8‹ ecsi1000óŒ6 ecss1000óþÖëI½q½qecss2074óqLË ectt1000ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ù¬ôßßßßß