÷ƒ’À;è TeX output 2005.07.15:1149‹ÿÿÿÿ Û_2 ý ~? ÕÁ ýZ2ÿóþÖëI½q½qecss2074¼RTLinux‘fÑHO‘ÿwmWTOŽ¤ ®„ØcÕÁGŽŽ¡–U ó½HЃ ecti1000½Dinil‘“°Divakar‘ÿ}/an“óqLË ectt1000ºmailto:dinildivakaran@rediffmail.com’Š²nó 1ê± ecrm1000¹1.1,“2002-08-29Ž¡Ÿ&°óŒ6 ecss1000¾Installazione–"Ídi“RTLinux“e“come“scrivere“pš¸èrogrammi“realtime“in“Linux.‘Ú†T‘ÿ*¸raduzione“a“cura“di“Etto˜re“BenedettiŽ¡(mantra–U at“elitel.biz)e“revisione“a“cura“di“Sandro“Caš¸èrdelli“(saca˜rde“at“tiscali.it).ŽŸ'õzó&Lt$ffffecbx1440ÀIndiceŽ©Øó]fŒ ecbx1000Á1Ž‘ÿIn®>troQÂduzione’€Ó1ŽŽ¤ؼ‘ÿ¹1.1Ž‘%ý¡ScopGo‘,Ï‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï1ŽŽ¡‘ÿ1.2Ž‘%ý¡Chi–U doš¸èvrebbGe“leggere“questo“HO˜WTO‘ù‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï1ŽŽ¡‘ÿ1.3Ž‘%ý¡Ringraziamen¸èti‘Xÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘ÿ1.4Ž‘%ý¡F‘ÿ*¸eedbac¸èk‘mK‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘ÿ1.5Ž‘%ý¡Distribution‘U P¸èolicy‘ k‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¦Á2Ž‘ÿInstallare‘ÕR‘ÿ ºTLINUX’Xa¦2ŽŽ¦3Ž‘ÿP•®>erc“h€é‘ÕR‘ÿ ºTLin“ux’nä'4ŽŽ¦4Ž‘ÿScrivš®>ere–Õprogrammi“pQÂer“R‘ÿ ºTLin˜ux’Âm4ŽŽ¡‘ÿ¹4.1Ž‘%ý¡In¸ètrošGduzione–U alla“scrittura“di“mo˜duli‘c‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ4.2Ž‘%ý¡Creazione–U di“thread“in“R‘ÿ*¸TLin¸èux‘Û¿‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘ÿ4.3Ž‘%ý¡Un–U programma“di“esempio‘¡÷‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¦Á5Ž‘ÿCompilazione–Õed“esecuzione’5³Ñ7ŽŽ¦6Ž‘ÿCom•®>unicazione‘Õin“ter-proQÂcesso’+‡§8ŽŽ¡‘ÿ¹6.1Ž‘%ý¡FIF¸èO‘U realtime Ñü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘ÿ6.2Ž‘%ý¡Un'applicazione–U cš¸èhe“fa“uso“di“FIF˜O‘j‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¦Á7Ž‘ÿP®>assi‘Õsuccessivi’n‰11ŽŽŸ'õzÀ1Ž‘ÁInctropœduzioneŽŸèó¥!¢N ecbx1200Ã1.1Ž‘¾Scop_úoŽ¤Mª¹Questo–U došGcumen¸èto“si“pregge“di“rendere“op˜erativš¸èo“l'uten˜te“no˜vizio“nella“maniera“pi€ù“indolore“pGossibile.ŽŸ"R¡Ã1.2Ž‘¾Chi–¸doš vrebb_úe“leggere“questo“HO˜WTOŽ¡¹Questo–ÿ došGcumen¸èto“€è“p˜ensato“p˜er“tutti“coloro“cš¸èhe“v˜ogliono“sapGere“come“funziona“un“k˜ernel“realtime.‘TÎA‘þóquelliŽŸ ®di–ýÏv¸èoi“gi€à“familiari“con“la“programmazione“dei“mošGduli“il“do˜cumenš¸èto“non“sem˜brer€à“ostico.‘kŒGli“altri“non“siŽŽŽŒ‹* Û_2 ý ~?Ÿ„€ÕÁGŽÁ2.‘ñ8Installare‘ÕR‘ÿ ºTLINUX’V>:¹2ŽŽ ÕÁ ýV¯devš¸èono–[4preoGccupare“visto“c˜he“sono“necessarie“solo“le“basi“della“programmazione“dei“moGduli,‘œ¹c˜he“sarannoŽ¤ ®comš¸èunque–U espGoste“al“momen˜to“oppGortuno.Ž©#ÃÃ1.3Ž‘¾Ringraziamen tiŽŸMª¹Prima–˜ødi“tutto“v¸èorrei“ringraziare“il“mio“advisor,›¾šPramoGde“C.“E.,˜pGer“il“suo“incoraggiamen¸èto“ed“aiuto.‘2ÈEsprimoŽ¡pure–þsincero“apprezzamenš¸èto“a“Victor“Y‘ÿ*¸oGdaik˜en.‘%Questo“doGcumen˜to“non“sarebbšGe“stato“p˜ossibile“senza“tutteŽ¡le–W|informazioni“raccolte“sulle“sv‘ÿqÐariate“pubblicazioni“a“cui“Victor“Y‘ÿ*¸oGdaikš¸èen“ha“con˜tribuito.‘x”Sono“anc˜he“gratoŽ¡a–U Micš¸èhael“Barabano˜v“pšGer“la“sua“tesi“dal“titolo“Un“sistema“op˜erativš¸èo“Realtime“basato“su“Lin˜ux.Ž¦Ã1.4Ž‘¾F‘þàeedbac kŽŸMª¹Qualsiasi–(dubbio“o“commenš¸èto“relativ˜o“a“questo“doGcumen˜to“€è“sempre“bGen“accetto.‘ê4Non“abbiate“timore“diŽ¡mandarmi–jVun'“½email“ºmailto:dinildivakaran@rediffmail.com“¹.‘±#Se“troš¸èv‘ÿqÐate“errori“in“questo“doGcumen˜toŽ¡segnalatemelo–U pure,“cosicc¸èh€é“pGossa“correggere“la“revisione“futura.‘q€Grazie.Ž¦Ã1.5Ž‘¾Distribution‘¸P olicyŽŸMª¹Cop•¸èyrigh“t–U (C)2002“Dinil“Div–ÿqÐak“aran.Ž©ؼThis–-doGcumenš¸èt“is“free;‘:by˜ou“can“redistribute“it“and/or“moGdify“it“under“the“terms“of“the“GNU‘,øGeneral“PublicŽ¡License–Äÿas“published“bš¸èy“the“F‘ÿ*¸ree“Soft˜w˜are“F‘ÿ*¸oundation;‘üïeither“v˜ersion“2“of“the“License,‘à÷or“(at“y˜our“option)Ž¡anš¸èy–U later“v˜ersion.Ž¦This–ÇÿdošGcumen¸èt“is“distributed“in“the“hop˜e“that“it“will“b˜e“useful,‘ä8but“WITHOUT–ÇÛANY“W‘þã ARRANTY;‘ÇÿwithoutŽ¡evš¸èen–…éthe“implied“w˜arran˜t˜y“of“MER˜CHANT‘ÿ*¸ABILITY›…Üor“FITNESS˜F¸èOR˜A˜P–ÿ*¸AR“TICULAR˜PURPOSE.‘…éSeeŽ¡the–U GNU“General“Public“License“for“more“details.ŽŸ(ÀœÀ2Ž‘ÁInstallare‘G\R‘þ®(TLINUXŽŸ¿:¹Il–Òprimo“passo“nella“compilazione“del“kš¸èernel“R‘ÿ*¸TLin˜ux“consiste“nello“scaricare“e“decomprimere“in“/usr/src“unŽ¡k¸èernel–U ½2.2.18“ºhttp://ftp.kernel.org/pub/linux/kernel/v2.2/linux-‘€2.2.18.tar.gzŽ¦¹pre-patc¸èhed–U (solo“x86)“oppureŽ¦½2.4.0-test1‘U ºhttp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-–€2.4.0-“test1.tar.gzŽ¦¹(x86,‘L]P•¸èo“w“erPC,–J,Alpha).‘mÙMettete“inoltre“in“/usr/src/rtlinš¸èux“una“copia“recen˜te“del“k˜ernel“R‘ÿ*¸TLin˜ux“(v˜ersioneŽ¡3.0)–épresa“da“½www.rtlinux.or‘ÿ}/g“ºhttp://www.rtlinux.org“¹.‘ -j(Useremo“il“carattere“$“pGer“rappresen¸ètare“ilŽ¡prompt).ŽŸؼ‘ 9b1.ŽŽŽ‘Ora–U congurate“il“kš¸èernel“Lin˜ux:Ž©®‘lúº$–?¬cd“/usr/src/linuxŽ¡‘lúÂ$–?¬make“configŽ¡’–ø"oppureŽ¡‘lúÂ$–?¬make“menuconfigŽ¡’–ø"oppureŽ¡‘lúÂ$–?¬make“xconfigŽ¦‘ 9b¹2.ŽŽŽ‘Pš¸èer–U costruire“l'immagine“del“k˜ernel“digitate:ŽŽŽŒ‹£ Û_2 ý ~?Ÿ„€ÕÁGŽÁ2.‘ñ8Installare‘ÕR‘ÿ ºTLINUX’V>:¹3ŽŽ ÕÁ ýV¯‘lúº$–?¬make“depŽ¤ ®‘lúÂ$–?¬make“bzImageŽ¡‘lúÂ$–?¬make“modulesŽ¡‘lúÂ$–?¬make“modules_installŽ¡‘lúÂ$–?¬cp“arch/i386/boot/bzImage“/boot/rtzImageŽ¤®‘ 9b¹3.ŽŽŽ‘Come–U passo“successivš¸èo“si“congura“LILO.“Digitate“le“seguen˜ti“righe“nel“le“/etc/lilo.confŽ¡‘lúºimage=/boot/rtzImageŽ¤ ®‘lúÂlabel=rtlŽ¡‘lúÂread-onlyŽ¡‘lúÂroot=/dev/hda1Ž©®‘¹A‘ÿ*¸TTENZIONE:–õ¤sostituite“la“vš¸èoGce“/dev/hda1“vista“sopra“col“lesystem“do˜v˜e“€è“situata“la“v˜ostra“roGotŽ¡‘directory‘ÿ*¸.‘`ôLa–¤ñvia“pi€ù“semplice“pšGer“capire“quale“esso“sia“consiste“nel“dare“un'o˜ccš¸èhiata“alla“v˜ošGce“ro˜ot=Ž¡‘gi€à–U esistenš¸ète“nel“v˜ostro“/etc/lilo.conf.ŽŸ®‘ 9b4.ŽŽŽ‘Ora–Ö‡riaš¸èvviate“il“v˜ostro“computer“e“caricate“il“k˜ernel“R‘ÿ*¸TLin˜ux“digitando“'rtl'“al“prompt“di“LILO.“QuindiŽ¡‘spGostatevi–U in“/usr/src/rtlinš¸èux“e“congurate“R‘ÿ*¸TLin˜ux.Ž¦‘lúº$–?¬make“configŽ¡’–ø"oppureŽ¡‘lúÂ$–?¬make“menuconfigŽ¡’–ø"oppureŽ¡‘lúÂ$–?¬make“xconfigŽ¦‘ 9b¹5.ŽŽŽ‘Pš¸èer–U compilare“R‘ÿ*¸TLin˜ux,“digitate“inne:Ž¦‘lúº$‘?¬makeŽ¡‘lúÂ$–?¬make“devicesŽ¡‘lúÂ$–?¬make“installŽ©ؼ¹L'ultimo–U passo“creer€à“la“directory:Ž¤ؼ/usr/rtlinš¸èux-xx–U (xx“iden˜tica“la“v˜ersione)Ž¡c•¸èhe›Èkcon“terr€à˜la˜directory˜predenita˜di˜installazione˜pGer˜R‘ÿ*¸TLin“ux,‘å>necessaria˜pGer˜creare˜e˜compilare˜i˜pro-Ž¤ ®grammi–erc“h€é‘ÕR‘ÿ ºTLin“ux’lÀ»¹4ŽŽ ÕÁ ýV¯À3Ž‘ÁP•cerc“h€é‘G\R‘þ®(TLin“uxŽŸ¿:¹Le–motiv‘ÿqÐazioni“alla“base“dello“sviluppšGo“di“R‘ÿ*¸TLin¸èux“p˜ossono“essere“comprese“esaminando“il“mo˜do“in“cuiŽ¤ ®la•¸èv“ora–öil“kš¸èernel“standard“di“Lin˜ux.‘QûEsso“separa“l'hardw˜are“dai“task“a“liv˜ello“di“uten˜te.‘QûIl“k˜ernel“impiega“degliŽ¡algoritmi–:di“sc¸èheduling“e“assegna“ad“ogni“task“una“certa“priorit€à“in“moGdo“tale“da“fornire“in“media“buoneŽ¡prestazioni–Áðo“alte“v¸èelošGcit€à“di“trasmissione“dati.‘·ðA‘ÁÔquesto“scop˜o,‘Ý$il“k¸èernel“pu€ò“sosp˜endere“un“qualsiasi“taskŽ¡a–ý)livš¸èello“uten˜te“ogni“qualv˜olta“tale“task“abbia“esaurito“l'in˜terv‘ÿqÐallo“di“tempGo“assegnatogli.‘iœGli“algoritmi“diŽ¡scš¸èheduling,‘]assieme–(¡ai“device“driv˜er,‘]alle“c˜hiamate“di“sistema“non-in˜terrompibili,‘]alla“disabilitazione“degliŽ¡inš¸èterrupt–,e“alle“opGerazioni“di“memoria“virtuale“rendono“il“k˜ernel“meno“prev˜edibile.‘cËSi“pu€ò“aermare“c˜he“essiŽ¡sono–U i“fattori“c¸èhe“impšGediscono“ad“un“task“di“op˜erare“in“realtime.Ž©ؼP•¸èotreste›VÞa“v“ere˜gi€à˜familiarit€à˜con˜le˜prestazioni˜non-realtime,–WNdiciamo,“pGer˜a•¸èv“er˜ascoltato˜m“usica˜riproGdottaŽ¡usando–Åp'mpg123'“o“un“qualsiasi“altro“programma“del“genere.‘A›DopšGo“a•¸èv“er–Åpeseguito“tale“pro˜cesso“p˜er“l'in¸èterv‘ÿqÐalloŽ¡di–€'tempGo“pre-determinato,‘Êéil“kš¸èernel“standard“di“Lin˜ux“p•Gotrebb“e–€'decidere“di“in˜terrompšGerlo“p˜er“concedereŽ¡completamen¸ète–= la“CPU‘<Ãad“un“altro“prošGcesso“(p˜er“es.‘$uno“cš¸èhe“attiv‘ÿqÐa“il“serv˜er“X‘<Ão“NescapGe).‘$Come“conseguenza,Ž¡la›µcon•¸ètin“uit€à˜della˜m“usica˜p•Gotrebb“e˜andare˜p“erduta.‘<'In˜denitiv‘ÿqÐa,‘Õnel˜ten•¸ètativ“o˜di˜assicurare˜a˜tutti˜i˜proGcessiŽ¡un–U equo“bilanciamenš¸èto“del“tempGo“di“CPU,“il“k˜ernel“pu€ò“impGedire“c˜he“certi“ev˜en˜ti“v˜engano“gestiti.Ž¦Un–$kš¸èernel“realtime“do˜vrebbGe“riuscire“a“garan˜tire“il“rispšGetto“dei“requisiti“temp˜orali“del“pro˜cesso“sottostan¸ète.Ž¡Il–6Ákš¸èernel“R‘ÿ*¸TLin˜ux“raggiunge“prestazioni“realtime“eliminando“i“fattori“di“imprev˜edibilit€à“sopra“elencati.‘g`P˜os-Ž¡siamo–Úsimmaginare“il“kš¸èernel“R‘ÿ*¸TLin˜ux“come“pGosto“fra“il“k˜ernel“standard“di“Lin˜ux“e“l'hardw˜are.‘xIl“k˜ernel“diŽ¡Linš¸èux–¼ê€è“cos€ì“pGortato“a“scam˜biare“lo“strato“realtime“pGer“l'hardw˜are“v˜ero“e“proprio.‘>ÄOra“l'uten˜te“pu€ò“impGostareŽ¡le–Âxpriorit€à“di“ciascun“task,‘ÝÎoppure“inš¸ètroGdurne“di“n˜uo˜v˜e.‘¹ˆL'uten˜te“pu€ò“ottenere“una“tempistica“corretta“pGerŽ¡i–uÊprošGcessi“gio˜cando“con“gli“algoritmi“di“sc¸èheduling,›½ôle“priorit€à,˜la“frequenza“di“esecuzione,˜ecc.‘Ó}Il“k¸èernelŽ¡R‘ÿ*¸TLinš¸èux–@ùassegna“la“priorit€à“pi€ù“bassa“al“k˜ernel“standard“di“Lin˜ux.‘5 Col“metošGdo“esp˜osto“i“task“di“uten¸èteŽ¡saranno–U cos€ì“eseguiti“in“realtime.Ž¦Le–ÓXprestazioni“realtime“sono“ottenš¸èute“in˜tercettando“tutti“gli“in˜terrupt“hardw˜are.‘ì)Solo“pGer“quegli“in˜terruptŽ¡legati–®@a“R›ÿ*¸TLin¸èux“viene“subito“eseguita“la“routine“di“servizio“appropriata.‘9àT˜utti“gli“altri“sono“tratten¸èuti“e,‘Ï unaŽ¡v•¸èolta› c“he˜il˜k“ernel˜R‘ÿ*¸TLin“ux˜sia˜div“en“tato˜inattiv“o,‘©sono˜passati˜sotto˜forma˜di˜in“terrupt˜soft“w“are˜al˜k“ernel˜diŽ¡Linš¸èux.‘q€L'eseguibile–U di“R‘ÿ*¸TLin˜ux“non“€è“di“pGer“s€è“in˜terrompibile.Ž¦I‘îøtask–ïrealtime“goGdono“di“privilegi“(hanno“accesso“diretto“all'hardw¸èare)“e“non“fanno“uso“di“memoria“virtuale.Ž¡Essi– 8sono“scritti“come“fossero“mošGduli“sp˜eciali“di“Linš¸èux“c˜he“pGossono“essere“dinamicamen˜te“caricati“in“memoria.Ž¡Il–,cošGdice“di“inizializzazione“dei“task“realtime“imp˜osta“un“app˜osita“struttura“dati“e“informa“il“kš¸èernel“R‘ÿ*¸TLin˜uxŽ¡dei–U propri“requisiti“di“durata,“vita“massima“e“tempi“di“rilascio.Ž¦R‘ÿ*¸TLinš¸èux–Æriesce“a“co-esistere“col“k˜ernel“Lin˜ux“pGerc˜h€é“non“gli“appGorta“alcun“cam˜biamen˜to.‘€sA˜ttra˜v˜erso“unaŽ¡serie–é#di“accorgimenš¸èti,‘#esso“riesce“a“con˜v˜ertire“il“k˜ernel“Lin˜ux“esisten˜te“in“un“am˜bien˜te“hard“realtime“senzaŽ¡ostacolare–U i“futuri“cam•¸èbiamen“ti–U cui“Lin¸èux“sar€à“soggetto.ŽŸ(ÀœÀ4Ž‘ÁScrivšcere–G\programmi“ppœer“R‘þ®(TLin˜uxŽŸèÃ4.1Ž‘¾In troš_úduzione–¸alla“scrittura“di“mo˜duliŽŸMª¹Ma–»cosa“sono“i“mošGduli?‘[^Un“mo˜dulo“di“Linš¸èux“non“€è“nien˜t'altro“c˜he“un“le“oggetto,‘ di“solito“creato“pGer“mezzoŽ¡dell'opzione–ï-c“di“gcc.‘]Di“pšGer“s€è,‘$,il“mo˜dulo“€è“creato“compilando“un“normale“le“in“linguaggio“C‘àcui“manca“laŽ¡funzione–Ø…main().‘G÷Al“suo“pšGosto“sono“presen¸èti“un“paio“di“funzioni“denominate“init_mo˜dule“e“clean¸èup_mo˜dule:ŽŸؼ‘ó !",š cmsy10¸ŽŽŽ‘¹init_mošGdule()–'€è“c¸èhiamata“quando“il“mo˜dulo“€è“inserito“nel“k¸èernel.‘Z-Essa“restituisce“0“in“caso“di“successoŽ¡‘oppure–U un“v‘ÿqÐalore“negativ¸èo“in“caso“di“problemi.ŽŸ®‘¸ŽŽŽ‘¹cleanš¸èup_moGdule()–U €è“c˜hiamato“appšGena“prima“della“rimozione“del“mo˜dulo.ŽŽŽŒ‹*× Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Scrivš®>ere–Õprogrammi“pQÂer“R‘ÿ ºTLin˜ux’Ÿ¹5ŽŽ ÕÁ ýV¯Di–g#solito“init_mošGdule()“o“registra“nel“k¸èernel“un“handler“p˜er“i“motivi“pi€ù“sv‘ÿqÐariati,‘«£oppure“rimpiazza“unaŽ¤ ®funzione–øŒdel“kš¸èernel“con“proprio“coGdice“(di“solito“esso“c˜hiamer€à“a“sua“v˜olta“la“funzione“originale).‘R¤La“funzioneŽ¡clean¸èup_mošGdule()–^2ci“si“asp˜etta“rifaccia“in“senso“in•¸èv“erso–^2le“azioni“compiute“da“init_mo˜dule(),‘ wcosicc¸èh€é“ilŽ¡mo•Gdulo›U p“ossa˜essere˜rimosso˜in˜sicurezza.ŽŸؼPš¸èer–ªJesempio,‘Ìuse“a˜v˜ete“scritto“un“le“in“C‘ªc˜hiamato“mošGdule.c“(con“init_mo˜dule()“e“clean¸èup_mo˜dule()“al“p˜ostoŽ¡della–U funzione“main()“)“il“cošGdice“pu€ò“essere“con•¸èv“ertito–U in“un“mo˜dulo“digitando:Ž¤þþ‘)ý`º$–?¬gcc“-c“{SOME-FLAGS}“my_module.cŽ¡¹T‘ÿ*¸ale–a¤comando“crea“un“mošGdulo“c¸èhiamato“mo˜dule.o“cš¸èhe“pu€ò“essere“a“questo“pun˜to“caricato“nel“k˜ernel“pGerŽ© ®mezzo–U del“comando“'insmoGd'“:Ž¡‘)ý`º$–?¬insmod“module.oŽ¡¹Nella–U stessa“maniera,“pšGer“rim•¸èuo“v“ere–U il“mo˜dulo“p˜otete“impiegare“il“comando“'rmmo˜d'“:Ž¡‘)ý`º$–?¬rmmod“moduleŽ¤"øEÃ4.2Ž‘¾Creazione–¸di“thread“in“R‘þàTLin uxŽŸMª¹Un'–cmapplicazione“realtime“€è“di“solito“compšGosta“da“sv‘ÿqÐariati“'thread'“di“esecuzione.‘œhI‘c(thread“sono“pro˜cessiŽ¦alleggeriti–T6cš¸èhe“condividono“il“medesimo“spazio“di“indirizzamen˜to.‘q2In“R‘ÿ*¸TLin˜ux,‘Tetutti“i“thread“condividono“loŽ¦spazio–&pdi“indirizzamenš¸èto“del“k˜ernel“Lin˜ux.‘aðIl“v‘ÿqÐan˜taggio“oerto“dai“thread“€è“c˜he“il“passaggio“dall'uno“all'altroŽ¦€è–V¸piuttosto“ecienš¸ète“se“comparato“con“un“normale“passaggio“di“con˜testo.‘vGGli“esempi“c˜he“seguono“illustranoŽ¦come–U il“conš¸ètrollo“completo“dell'esecuzione“di“un“thread“pGossa“essere“otten˜uto“usando“una“serie“di“funzioni.Ž¡Ã4.3Ž‘¾Un–¸programma“di“esempioŽŸMª¹Il–L3miglior“mošGdo“p˜er“capire“come“la•¸èv“ora–L3un“thread“€è“di“seguire“passo“passo“un“programma“realtime.‘V¸P¸èerŽ¦esempio,‘¶Kil–o©programma“mostrato“sotto“vš¸èerr€à“eseguito“una“v˜olta“al“secondo“e“duran˜te“ciascuna“iterazioneŽ¦mostrer€à–U il“messaggio“'Hello“W‘ÿ*¸orld'.ŽŸؼIl–U coGdice“sorgen¸ète“del“programma“(le“-“hello.c)“:ŽŸþþº#include‘?¬Ž¦#include‘?¬Ž¦#include‘?¬Ž¦¦pthread_t‘?¬thread;Ž¦¦void–?¬*“thread_code(void)Ž¦{Ž¦‘)ý`pthread_make_periodic_np(pthread_self(),–?¬gethrtime(),“1000000000);Ž¦¦‘)ý`while‘?¬(1)Ž¦‘)ý`{Ž¦‘SúÀpthread_wait_np‘?¬();Ž¦‘SúÀrtl_printf("Hello‘?¬World\n");Ž¦‘)ý`}Ž¦ŽŽŒ‹> Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Scrivš®>ere–Õprogrammi“pQÂer“R‘ÿ ºTLin˜ux’Ÿ¹6ŽŽ ÕÁ ýV¯‘)ý`ºreturn‘?¬0;Ž¤ ®}Ž¡¡int‘?¬init_module(void)Ž¡{Ž¡‘¿return–?¬pthread_create(&thread,“NULL,“thread_code,“NULL);Ž¡}Ž¡¡void‘?¬cleanup_module(void)Ž¡{Ž¡‘¿pthread_delete_np(thread);Ž¡}Ž©G¹Iniziamo–u1da“init_moGdule().›Ñ´T‘ÿ*¸ale“funzione“ric¸èhiama“pthread_create().˜Questi“crea“un“n•¸èuo“v“o–u1thread“c¸èheŽ¡viene– üeseguito“in“conš¸ètempGoranea“al“thread“c˜hiaman˜te.‘™½pthr–ÿ}/e“ad_cr“e“ate()–<Ödeve“esser›ÿ}/e“chiamata“unic˜amenteŽ¡dal›“°thr–ÿ}/e“ad˜nel˜kernel˜Linux˜(p“er˜esempio˜da˜init_mo“dule()).Ž¦‘)ý`ºint– Xpthread_create(pthread_t“*‘?¬thread,Ž¡’’öÐpthread_attr_t–?¬*“attr,Ž¡’’öÐvoid–?¬*“(*thread_code)(void“*),Ž¡’’öÐvoid–?¬*“arg);Ž¦¹Il›¢µn•¸èuo“v“o˜thread˜creato˜€è˜di˜tipGo˜pthread_t,‘Æddenito˜nell'header˜pthread.h.‘6T‘ÿ*¸ale˜thread˜consiste˜nella˜funzioneŽ¡thread_coGde()–úra“cui“viene“passato“½ar‘ÿ}/g›:µ¹come“parametro.‘SFIl“parametro“½attr˜¹serv¸èe“a“spGecicare“quali“attributiŽ¡debbano–U essere“applicati“al“n•¸èuo“v“o–U thread.‘q€Se“½attr‘èй€è“NULL,“esso“a¸èvr€à“gli“attributi“predeniti.Ž©ؼIn–m2questo“caso“thread_cošGde()“€è“c¸èhiamato“senza“parametri.‘¹µthread_co˜de()“€è“comp˜osto“da“tre“sp˜ezzoni“-Ž¡inizializzazione,–U corpGo“e“c¸èhiusura.Ž¦Nella–U fase“di“inizializzazione“viene“cš¸èhiamata“la“funzione“pthread_mak˜e_p•Gerio“dic_np().Ž©G‘)ý`ºint–?¬pthread_make_periodic_np(pthread_t“thread,Ž¡’Â3Ührtime_t‘?¬start_time,Ž¡’Â3Ührtime_t‘?¬period);Ž¦¹pthread_makš¸èe_p•Gerio“dic_np–€marca“il“½thr–ÿ}/e“ad‘U¹come–€pron˜to“pGer“essere“eseguito.‘ Il“thread“inizier€à“all'istan˜teŽ¡½start_time‘禹e–T…sar€à“in•¸èv“oGcato–T…a“in¸èterv›ÿqÐalli“regolari,‘T¤di“durata“pari“al“v˜alore“di“½p–ÿ}/erio“d‘“!¹,‘T¤espresso–T…in“nanosecondi.ŽŸؼgethrtime–U restituisce“il“tempšGo,“sempre“in“nanosecondi,“trascorso“dal“b˜o˜ot.Ž¦‘$½´ºhrtime_t‘?¬gethrtime(void);Ž¦¹Questo–ÝPv›ÿqÐalore“non“viene“mai“resettato“o“moGdicato.‘ gethrtime“ritorna“sempre“v˜alori“monotonicamen¸èteŽ¡crescenš¸èti.‘q€hrtime_t–U €è“un“in˜tero“con“segno“a“64“bit.Ž©ؼA•¸èttra“v“erso–Ìla“cš¸èhiamata“della“funzione“pthread_mak˜e_p•Gerio“dic_np(),‘il–Ìthread“impGone“allo“sc˜heduler“di“ese-Ž¡guire›í{p•Gerio“dicamen¸ète˜tale˜thread˜ad˜una˜frequenza˜di˜1˜Hz˜.‘NôCi€ò˜segna˜la˜ne˜della˜sezione˜di˜inizializzazioneŽ¡del‘U thread.Ž¦Il–¶ciclo“while()“inizia“con“una“cš¸èhiamata“alla“funzione“pthread_w˜ait_np()“c˜he“sospGende“l'esecuzione“del“threadŽ¡realtime–â#in“esecuzione“al“momenš¸èto,‘cno“all'inizio“del“prossimo“p•Gerio“do.‘ˆIl–â#thread“€è“stato“preceden˜temen˜teŽ¡marcato–·bpšGer“l'esecuzione“con“pthread_mak¸èe_p˜erio˜dic_np.‘˜EUna“vš¸èolta“c˜he“il“thread“€è“ric˜hiamato“di“n˜uo˜v˜o,Ž¡esso–0esegue“il“con•¸èten“uto›0rimanen“te˜del˜coGdice˜den“tro˜il˜ciclo˜while()˜no˜a˜quando˜non˜incon“tri˜un'altraŽ¡cš¸èhiamata–U a“pthread_w˜ait_np().ŽŽŽŒ‹H› Û_2 ý ~?Ÿ„€ÕÁGŽÁ5.‘ñ8Compilazione–Õed“esecuzione’3e¹7ŽŽ ÕÁ ýV¯Visto–Ãcš¸èhe“non“€è“stata“inclusa“alcuna“via“d'uscita“dal“ciclo,‘{questo“thread“con˜tin˜uer€à“ad“essere“eseguitoŽ¤ ®ad–õ)una“frequenza“di“1Hz.‘ QœL'unica“maniera“pšGer“in¸èterromp˜ere“il“programma“consiste“nel“rim•¸èuo“v“erlo‘õ)dalŽ¡k¸èernel–ôcol“comando“rmmošGd.‘ N(Questo“p˜orta“alla“cš¸èhiamata“di“clean˜up_moGdule(),‘[»c˜he“a“sua“v˜olta“in˜v˜oGcaŽ¡pthread_delete_np()–U pšGer“eliminare“il“thread“e“deallo˜care“le“sue“risorse.ŽŸ(D-À5Ž‘ÁCompilazione–G\ed“esecuzioneŽŸ¿:¹P¸èer–ËäpšGoter“eseguire“il“programma“hello.c“(dop˜o“a•¸èv“er›Ëäa“vviato˜il˜sistema˜con˜rtlin“ux,‘çVo“vviamen“te)˜do“v“ete˜seguireŽ¡i–U seguen¸èti“passi:ŽŸ ‘ 9b1.ŽŽŽ‘Compilate–-—il“cošGdice“sorgen¸ète“e“create“un“mo˜dulo“usando“il“compilatore“GCC.“P¸èer“semplicarvi“la“vita,Ž¡‘comš¸èunque,‘¨Î€è–}ºconsigliabile“creare“un“Mak˜ele.‘)´In“questo“mošGdo“o˜ccorre“solo“digitare“'mak¸èe'“p˜er“compilareŽ¡‘il‘U coGdice.ŽŸŠ‘Il–U Makš¸èele“pu€ò“essere“creato“inserendo“le“seguen˜ti“righe“in“un“le“c˜hiamato,“appun˜to,“'Mak˜ele'.Ž©Jב3>^ºinclude‘?¬rtl.mkŽ¡‘3>^all:‘?¬hello.oŽ¡‘3>^clean:Ž¡‘H=rm–?¬-f“*.oŽ¡‘3>^hello.o:‘?¬hello.cŽ¡‘H=$(CC)–?¬${INCLUDE}“${CFLAGS}“-c“hello.cŽ¦‘ 9b¹2.ŽŽŽ‘Copiate–¤bil“le“rtl.mk“nella“stessa“directory“do•¸èv“e–¤bsi“troš¸èv‘ÿqÐano“i“v˜ostri“hello.c“e“Mak˜ele.‘6—rtl.mk“€è“un“includeŽ¡‘le›•%con•¸ètenen“te˜tutti˜i˜ag˜necessari˜p•Ger˜compilare˜il˜co“dice.‘1Questo˜le˜da˜aancare˜al˜v¸èostro˜hello.cŽ¡‘pu€ò–U essere“prelev‘ÿqÐato“dai“sorgenš¸èti“di“R‘ÿ*¸TLin˜ux.ŽŸ‘ 9b3.ŽŽŽ‘Pš¸èer–U compilare“il“coGdice“usate“il“comando“'mak˜e'.Ž¦‘Býbº$‘?¬makeŽ¦‘ 9b¹4.ŽŽŽ‘Il–ÌÁle“oggetto“ottenš¸èuto“dev˜e“essere“caricato“nel“k˜ernel,‘ê©do˜v˜e“v˜err€à“eseguito“da“R‘ÿ*¸TLin˜ux.‘ØbP˜er“fare“ci€òŽ¡‘usate–U il“comando“'rtlinš¸èux'“come“uten˜te“roGot.Ž¦‘Býbº$–?¬rtlinux“start“helloŽ© ¹Doš¸èvreste–eUiniziare“a“v˜edere“da“subito“il“messaggio“di“hello.c“visualizzato“ogni“secondo.‘¢A‘eQseconda“di“come“laŽ¡v•¸èostra›‹ macc“hina˜€è˜congurata,‘³†il˜messaggio˜p•Gotrebb“e˜apparire˜o˜direttamen¸ète˜sulla˜console˜oppure˜eseguendo:Ž¦‘)ý`º$‘?¬dmesgŽ¦¹P•¸èer›U in“terromp•Gere˜il˜programma˜o“ccorre˜rim•¸èuo“v“erlo˜dal˜k“ernel.‘q€A˜questo˜scopGo,˜digitate:Ž¦‘)ý`º$–?¬rtlinux“stop“helloŽ¦¹Un'altra–U maniera“pšGer“caricare“e“rim•¸èuo“v“ere–U il“mo˜dulo“consiste“nell'usare“risp˜ettiv‘ÿqÐamen¸ète“insmo˜d“e“rmmo˜d.Ž©ؼL'esempio–ÂãappšGena“prop˜osto“€è“decisamenš¸ète“semplice.‘ºÊA‘ÂÇdierenza“di“ci€ò“c˜he“abbiamo“appšGena“visto,‘ÞTci“p˜os-Ž¡sono–#messere“div¸èersi“thread“in“un“programma.‘ÜgLe“priorit€à“pšGossono“essere“imp˜ostate“al“momen¸èto“della“loroŽ¡creazione–3ma“pšGossono“essere“anc¸èhe“mo˜dicate“in“un“secondo“temp˜o.‘Ÿ¸In“aggiun¸èta,‘=·p˜ossiamo“stabilire“pureŽ¡quale–U algoritmo“di“scš¸èheduling“v˜err€à“usato.‘q€P˜ossiamo“addirittura“scriv˜ere“il“nostro“algoritmo“pGersonale!Ž¦T‘ÿ*¸ornando–Wãal“nostro“esempio,‘X“pšGotremmo“imp˜ostare“la“priorit€à“del“thread“al“v‘ÿqÐalore“1“e“scegliere“lo“sc¸èhedulingŽ¡FIFš¸èO–U inserendo“le“seguen˜ti“righe“in“testa“alla“funzione“thread_coGde()“:ŽŽŽŒ‹T€ Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Com•®>unicazione‘Õin“ter-proQÂcesso’)d;¹8ŽŽ ÕÁ ýV¯‘)ý`ºstruct–?¬sched_param“p;Ž¤ ®‘)ý`p–?¬.“sched_priority“=“1;Ž¡‘)ý`pthread_setschedparam–?¬(pthread_self(),“SCHED_FIFO,“&p);ŽŸ(ÀœÀ6Ž‘ÁCom•cunicazione‘G\in“ter-propœcessoŽŸ¿:¹Il–Zprogramma“di“esempio“visto“prima“€è“quel“cš¸èhe“si“dice“essere“un“proGcesso“realtime.‘€qCom˜unque“non“oGccorreŽ¡cš¸èhe–¥tutte“le“parti“c˜he“compGongono“un“applicativ˜o“siano“scritte“pGer“funzionare“in“realtime.‘ÎDi“solito,‘QsoloŽ¡quelle–àWsezioni“cš¸èhe“necessitano“di“tempGorizzazioni“molto“precise“sono“scritte“in“tale“maniera.‘%Le“rimamen˜tiŽ¡pšGossono–²Oessere“eseguite“in“user“space.‘‰ Risp˜etto“ai“thread“realtime,‘Éši“pro˜cessi“in“user“space“sono“sp˜esso“pi€ùŽ¡semplici–U da“scriv¸èere“ed“eseguire“ed“€è“pi€ù“facile“farne“il“debug.Ž©ؼLa–Ú©comš¸èunicazione“in˜ter-proGcesso“pu€ò“a˜vv˜enire“in“div˜ersi“mošGdi.‘V‘ÿ*¸err€à“qui“discusso“solo“il“pi€ù“imp˜ortan¸ète“eŽ¡frequen•¸ètemen“te–U usato:‘q€i“FIF¸èO“realtime.ŽŸ#ÃÃ6.1Ž‘¾FIF O‘¸realtimeŽŸMª¹I–? FIF¸èO“realtime–?%sono“cošGde“unidirezionali“(First“In“First“Out).‘j,I‘? dati“p˜ossono“essere“scritti“da“un“lato“e“lettiŽ¡dall'altro–Ãpda“proGcessi“dierenš¸èti.‘@ðUno“dei“due“€è“di“solito“il“thread“realtime“men˜tre“l'altro“si“tro˜v‘ÿqÐa“in“user“space.Ž¦I–bEFIFš¸èO“realtime–bHsono“semplicemen˜te“dei“c˜haracter“device“(/dev/rtf*)“con“un“n˜umero“primario“pari“a“150.‘˜ùIŽ¡thread–órealtime“usano“nš¸èumeri“in˜teri“pGer“riferirsi“a“ciascun“FIF˜O‘òÚ(pGer“esempio“il“n˜umero“2“pGer“/dev/rtf2).Ž¡Si–ÂEnoti“cš¸èhe“esiste“un“limite“pGer“il“n˜umero“totale“di“FIF˜O.“I–Â)FIF˜O“dev˜ono–ÂEessere“gestiti“attra˜v˜erso“appGositeŽ¡funzioni–U come“rtf_create(),“rtf_destro¸èy(),“rtf_get(),“rtf_put()“e“cos€ì“via.Ž¦P•¸èer›|oquan“to˜riguarda˜in“v“ece˜i˜proGcessi˜d'uten“te,‘†Bessi˜v“edono˜i˜FIF“O‘|drealtime˜come˜normali˜c“haracter˜device.Ž¡Di–U conseguenza“pšGossono“essere“usate“le“solite“funzioni“come“op˜en(),“close(),“read()“e“write().ŽŸ#ÃÃ6.2Ž‘¾Un'applicazione–¸cš he“fa“uso“di“FIF˜OŽŸMª¹Consideriamo–Ž²in“primo“luogo“un“semplice“programma“in“C‘Ž€(di“nome“pšGcaudio.c)“c¸èhe“ripro˜duce“m¸èusica“(sempli-Ž¡cemenš¸ète–ݦdue“note)“pGer“mezzo“dell'altoparlan˜te“del“PC.“P˜er“il“momen˜to“si“suppGonga“c˜he“pGer“suonare“una“notaŽ¡si–÷×debba“semplicemenš¸ète“scriv˜ere“sul“c˜haracter“device“/dev/rtf3.‘Y¥(In“seguito“v˜edremo“un“proGcesso“realtimeŽ¡cš¸èhe–U manda“all'altoparlan˜te“ci€ò“c˜he“legge“da“tale“FIF˜O“(/dev/rtf3)).ŽŸؼº#include‘?¬Ž¡#include‘?¬Ž¡#include‘?¬Ž¡#include‘?¬Ž¡¡#define–?¬DELAY“30000Ž¡¡void–?¬make_tone1(int“fd)Ž¡{Ž¡‘)ý`static–?¬char“buf“=“0;Ž¡‘)ý`write–?¬(fd,“&buf,“1);Ž¡}Ž¡¡void–?¬make_tone2(int“fd)Ž¡{ŽŽŽŒ‹ am Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Com•®>unicazione‘Õin“ter-proQÂcesso’)d;¹9ŽŽ ÕÁ ýV¯‘)ý`ºstatic–?¬char“buf“=“0xff;Ž¤ ®‘)ý`write–?¬(fd,“&buf,“1);Ž¡}Ž¡¡main()Ž¡{Ž¡‘)ý`int–?¬i,“fd“=“open“("/dev/rtf3",“O_WRONLY);Ž¡‘)ý`while‘?¬(1)Ž¡‘)ý`{Ž¡‘SúÀfor‘?¬(i=0;i¹Ora,‘:1se– ail“programma“sopra“espšGosto“(p˜caudio.c)“€è“compilato“ed“eseguito,‘:1esso“do¸èvrebb˜e“dar“luogo“ad“unaŽ¡serie–©»di“suoni“corrispGondenš¸èti“ad“un'onda“quadra.‘oQT‘ÿ*¸utta˜via“abbiamo“prima“bisogno“di“un“moGdulo“c˜he“leggaŽ¡da–C'/dev/rtf3'“e“mandi“i“dati“corrispGondenš¸èti“all'altoparlan˜te“del“PC.“Questo“programma“realtime“pu€ò“essereŽ¡troš¸èv‘ÿqÐato–rfra“i“sorgen˜ti“di“rtlin˜ux“(/usr/src/rtlin˜ux/examples/sound/).‘ywInserite“il“moGdulo“sound.o“usando“ilŽ¡comando‘U 'insmoGd'.Ž©ؼVisto–ßcš¸èhe“abbiamo“caricato“il“moGdulo“c˜he“legge“dal“device,‘A{pGossiamo“a“questo“pun˜to“eseguire“il“nostroŽ¡programma–d(compilatelo“usando“'gcc'“e“lanciate“il“corrispšGonden¸ète“'a.out').‘ðMIl“pro˜cesso“pro˜durr€à“dei“toniŽ¡pi€ù–ôo“meno“regolari,‘kalmeno“nel“caso“non“ci“siano“altri“(impšGegnativi)“pro˜cessi“nel“sistema.‘OÏT‘ÿ*¸utta¸èvia,‘kse“ilŽ¡servš¸èer–TWX‘Tviene“fatto“partire“da“un'altra“console,‘”$si“a˜vv˜ertiranno“alcune“pause“nella“riproGduzione.‘o$P˜eggioŽ¡ancora,›óOquando–ÚÛun“comando“'nd'“(pGer“un“le“sotto“la“directory“/usr)“viene“eseguito,˜la“serie“di“suoni“div¸èerr€àŽ¡completamenš¸ète–õdistorta.‘Q%Il“motiv˜o“di“questo“fenomeno“risiede“nel“fatto“c˜he“non“stiamo“scriv˜endo“dati“nelŽ¡FIF¸èO–U in“realtime.Ž¦V‘ÿ*¸err€à–ï²illustrato“subito“come“eseguire“il“prošGcesso“in“realtime,‘ûin“maniera“tale“c¸èhe“il“suono“sia“ripro˜dotto“senzaŽ¡alcun–‹tipšGo“di“disturb˜o.‘.úIn“primo“luogo,‘µvcon•¸èv“ertiamo–‹il“programma“preceden•¸ètemen“te–‹esp˜osto“in“un“programmaŽ¡realtime–U (nome“del“le“rtaudio.c).ŽŸû>º#include‘?¬Ž¡#include‘?¬Ž¡#include‘?¬Ž¡#include‘?¬Ž¡¡#define–?¬FIFO_NO“3Ž¡#define–?¬DELAY“30000Ž¡pthread_t‘?¬thread;Ž¡¡void–?¬*“sound_thread(int“fd)Ž¡{Ž¡‘)ý`int‘?¬i;Ž¡‘)ý`static–?¬char“buf“=“0;Ž¡‘)ý`while‘?¬(1)Ž¡‘)ý`{Ž¡‘SúÀfor(i=0;–?¬iunicazione‘Õin“ter-proQÂcesso’$d‹¹10ŽŽ ÕÁ ýV¯¤ ®‘SúÀºfor(i=0;iassi‘Õsuccessivi’l¶¹11ŽŽ ÕÁ ýV¯À7Ž‘ÁPcassi‘G\successiviŽŸ¿:¹In–wìquesto“doGcumenš¸èto“sono“state“illustrate“le“basi“della“programmazione“sotto“R‘ÿ*¸TLin˜ux.‘ÙãUna“v˜olta“aerratiŽ¤ ®i–9concetti“di“base,‘>¬non“doš¸èvrebbGe“essere“dicile“compiere“da“soli“i“passi“successivi.‘h%P˜otete“esaminare“tutti“gliŽ¡esempi–óäcš¸èhe“accompagnano“i“sorgen˜ti“di“R‘ÿ*¸TLin˜ux.‘MÍAlla“ne“do˜vreste“essere“in“grado“di“scriv˜ere“e“testare“iŽ¡v•¸èostri›•DmoGduli.‘1íP“er˜ulteriori˜informazioni˜riguardan“ti˜la˜programmazione˜dei˜mo•Gduli˜p“otete˜fare˜riferimen¸ètoŽ¡alla–U 'Lin¸èux“Kernel“MoGdule“Programming“Guide'“di“½Ori–“°Pomer‘ÿ}/antz“¹.ŽŽŽŒø}Óƒ’À;èÛ_2ÕÁG ó¥!¢N ecbx1200ó]fŒ ecbx1000ó&Lt$ffffecbx1440óŒ6 ecss1000ó½HЃ ecti1000óþÖëI½q½qecss2074óqLË ectt1000ó 1ê± ecrm1000ó !",š cmsy10ù€Éßßßßßß