<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34341153</id><updated>2012-01-31T13:28:44.691Z</updated><category term='OpenCV'/><category term='Ubuntu'/><category term='RTLinux'/><category term='Gtk'/><category term='RTAI'/><category term='Ch'/><title type='text'>A Simple Life</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34341153.post-6332599455546856026</id><published>2008-06-03T00:52:00.001+01:00</published><updated>2008-06-03T00:53:47.830+01:00</updated><title type='text'>new toy</title><content type='html'>&lt;span&gt;Gumstix LCD pack (verdex XL6P + consoleLCD16-vx + netmicroSD + Samsung LCD).&lt;br /&gt;&lt;br /&gt;A second hand is moving at every 0.5 second.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6XVZLfhtOr0&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6XVZLfhtOr0&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-6332599455546856026?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/6332599455546856026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=6332599455546856026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6332599455546856026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6332599455546856026'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2008/06/new-toy.html' title='new toy'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-2960286897551124205</id><published>2008-01-20T15:14:00.001Z</published><updated>2008-04-16T20:24:15.369+01:00</updated><title type='text'>How to build mail-notificaton to suport SSL in Ubuntu.</title><content type='html'>I'd had a problem with mail-notification in Ubuntu 7.10 for an ages. The problem was mail-notification didn't support SSL because it was compiled with --disable-ssl (it's something about a licence policy of Debian.). I need to use SSL for one of my email server and was lazy to find a replacement program. After ignoring the problem for a while, I finally found out how to compile mail-notification by using apt-src.&lt;br /&gt;&lt;br /&gt;$ sudo aptitude install apt-src&lt;br /&gt;$ mkdir build&lt;br /&gt;$ cd build&lt;br /&gt;$ sudo apt-src install mail-notification&lt;br /&gt;&lt;br /&gt;It will create mail-notification_4.1.dfsg.1 directory, then we have to edit a rules file for Debian to enable SSL.&lt;br /&gt;&lt;br /&gt;$ sudo gvim mail-notification_4.1.dfsg.1/debian/rules&lt;br /&gt;&lt;br /&gt;Erase --disable-ssl and save the file. It's ready to build.&lt;br /&gt;&lt;br /&gt;$ sudo apt-src build mail-notification&lt;br /&gt;&lt;br /&gt;We finally get mail-notification_4.1.dfsg.1-2ubuntu1_i386.deb and mail-notification-evolution_4.1.dfsg.1-2ubuntu1_i386.deb.&lt;br /&gt;&lt;br /&gt;$ sudo aptitude remove mail-notification&lt;br /&gt;$ sudo dpkg -i mail-notification_4.1.dfsg.1-2ubuntu1_i386.deb&lt;br /&gt;&lt;br /&gt;PS. you might need to install libssl-dev package by "sudo aptitude install libssl-dev" before you can compile mail-notification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-2960286897551124205?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/2960286897551124205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=2960286897551124205' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2960286897551124205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2960286897551124205'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2008/01/i-had-have-problem-with-mail.html' title='How to build mail-notificaton to suport SSL in Ubuntu.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-5409364064973661030</id><published>2007-10-18T15:07:00.000+01:00</published><updated>2007-11-25T22:21:46.824Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Upgrade from Ubuntu 7.04 to 7.10 in ThinkPad R50e.</title><content type='html'>    Upgrade from Ubuntu 7.04 to 7.10 in ThinkPad R50e.&lt;br&gt;&lt;br&gt;I upgraded my computer from 7.04 to 7.10 via update-manager. It works fine with an old kernel but cannot boot from a new kernel which is 2.6.22 version. When I tried to boot from the new kernel, it paused for a while and then gave me a (initramfs) terminal with a message that I implied it could not detect a hard drive. I found out it happened because the initramfs script didn't load ide_generic module to the kernel. I tried to use yaird instead of initramfs-tools, but it doesn't work. I have no idea what's going on. &lt;br&gt;&lt;br&gt;I solved this problem by compiling a kernel by myself. It's not a best choice to do but I like to have a custom kernel that fits to my computer. Instead of compiling ide_generic and piix as modules, I compiled both of them into the 2.6.22 kernel. I'm happy with the result and it works very well.&lt;br&gt;&lt;br&gt;&lt;font color="#ff0000"&gt;I recalled the problem has happened since I did upgrade from 6.10 to 7.04. Fortunately, my computer's running by my custom kernel and it didn't bother me to find out how to use the provided kernel. Just today, 25 Nov, something came up in my mind. When I got a terminal console after waiting for a while as I mention above, I inserted ide_generic module and then the hard drive had been detected. It meant that either 7.10 or kernel 2.6.22 doesn't need to load piix module which I normally used for my notebook to detect the hard drive. I's surprised!!! Moreover, there isn't piix module in the provided kernel. It's been removed for a while I guessed but I didn't notice. It might has happened since 7.04.&lt;br&gt;&lt;br&gt;To make my computer run by the provided kernel, I edited my own /etc/initramfs-tools/modules from piix to ide_generic and reconfigured the kernel. Everything works very well. I would haven't had the problem if I installed Ubuntu 7.10 instead of upgrading.&lt;/font&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-5409364064973661030?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/5409364064973661030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=5409364064973661030' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5409364064973661030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5409364064973661030'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/10/upgrade-from-ubuntu-7.html' title='Upgrade from Ubuntu 7.04 to 7.10 in ThinkPad R50e.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-1100866840323545133</id><published>2007-08-19T19:20:00.000+01:00</published><updated>2008-01-23T01:48:16.925Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTAI'/><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'>My Old Documents</title><content type='html'>วันนี้บังเอิญไปค้นเอกสารเก่าๆ แล้วเจอเอกสารย่อๆ เกี่ยวกับ &lt;a title="RTOS และ Computer Control System" target="_blank" href="http://www.esnips.com/doc/66521ea0-6461-48b5-a977-414fdb78455e/RTOS_CCS" id="j7zy"&gt;RTOS และ Computer Control System&lt;/a&gt; พร้อมกับการแนะนำอย่างสั้นๆ สำหรับ&lt;a title="การติดตั้ง RTAI รุ่นโบราณ" target="_blank" href="http://www.esnips.com/doc/081a5088-841e-4ac9-bfae-9334966eaf9a/RTAI_INS" id="xrwc"&gt;การติดตั้ง RTAI รุ่นโบราณ&lt;/a&gt; และ &lt;a title="การติดตั้งโปรแกรม CNC ที่ชื่อ EMC" target="_blank" href="http://www.esnips.com/doc/bcbcb327-af0d-4f25-a92b-8b0186a00117/emc-installation" id="fzqs"&gt;การติดตั้งโปรแกรม CNC ที่ชื่อ EMC&lt;/a&gt; เข้าไปหาในเว็ปของหน่วยงาน ไม่เจอ ไม่รู้ไปอยู่ไหน เลยเอามาไว้ที่นี่ด้วย จะได้กระจายๆ แบ่งปั้นความรู้กันไปครับ ดีกว่าเก็บไว้อ่านคนเดียว ก็หวังว่าคนอื่นจะได้เอาไปใช้ประโยชน์บ้างแม้จะเก่าอีกเช่นเคย&lt;br /&gt;&lt;br /&gt;ปล. แนะนำให้เข้าไปดูที่ &lt;a title="www.rtai.org" target="_blank" href="http://www.rtai.org/" id="x6_4"&gt;www.rtai.org&lt;/a&gt; สำหรับข้อมูลเพิ่มเติมของ RTAI และ &lt;a title="www.linuxcnc.org" target="_blank" href="http://www.linuxcnc.org/" id="r3ak"&gt;www.linuxcnc.org&lt;/a&gt; สำหรับโปรแกรม EMC เดี๋ยวนี้เค้าทำไว้ดีมาก ติดตั้งง่ายกว่าเดิมเยอะ และก็สวยด้วย โปรแกรมก็ได้รับการปรับปรุงขึ้นกว่าเก่ามาก สำหรับ EMC ถ้าสนใจเพิ่มเติมลองติดต่อไปที่หน่วยงานในเอกสาร มีพนักงานที่ติดตามเรื่องนี้อยู่พร้อมที่จะให้ความช่วยเหลือเต็มที่ครับ ได้ยินว่าพิมพ์หนังสือเกี่ยวกับ EMC ออกว่างจำหน่ายด้วย แต่ผมยังไม่เคยเห็นหนังสือเลย :-)&lt;br /&gt;&lt;br /&gt;วันนี้(23 มกราคม 2551)ไปเจอมาอีกตัวครับ &lt;a href="http://www.esnips.com/doc/a5ca38a6-e506-4a35-adb3-526619279a41/RTLinuxThai"&gt;เป็น pdf ของ RTLinux&lt;/a&gt; ทั้งห้าบทในบล๊อกนี้ เผื่อใครยังคิดว่ามันมีประโยชน์อยู่บ้าง อยากนำไปพิมพ์มาอ่าน แต่ไม่รับประกันว่าเหมือนกันกับในบล๊อกนะครับ อาจแตกต่างกันนิดหน่อย คำผิด หรือมีเพิ่มเติม&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-1100866840323545133?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/1100866840323545133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=1100866840323545133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1100866840323545133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1100866840323545133'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/08/rtos-computer-control-system-rtai.html' title='My Old Documents'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-3007443853774501124</id><published>2007-07-17T03:33:00.000+01:00</published><updated>2007-08-02T17:55:07.616+01:00</updated><title type='text'>Installing Puppy Linux to USB Drive without writing any CD.</title><content type='html'>      Installing Puppy Linux to USB Drive without writing any CD.&lt;br&gt;&lt;br&gt;I've tested the method with Ubuntu 7.04 and qemu. After getting Puppy Linux,&lt;br&gt;- Plug a usb drive in.&lt;br&gt;- Run lsusb to get ID xxxx:yyyy of the usb drive.&lt;br&gt;- Run the following command as root&lt;br&gt;sudo qemu -cdrom puppy-2.16-seamonkey-fulldrivers.iso -boot d -usbdevice host:&lt;font color="#cc0000"&gt;xxxx:yyyy&lt;br&gt;&lt;font color="#000000"&gt;- Install Puppy Linux to the usb drive via &lt;/font&gt;&lt;/font&gt;"Puppy Universal Installer" inside Setup menu.&lt;br&gt;- Following the instruction and restart to boot Puppy Linux with the usb drive.&lt;br&gt;&lt;br&gt;I'm quite impressed by Puppy Linux. It's fast, easy to config X server and network system.&lt;br&gt;&lt;br&gt;PS. Don't forget to set your computer to boot from USB Drive first.&lt;br&gt;&lt;font color="#cc0000"&gt;&lt;/font&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-3007443853774501124?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/3007443853774501124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=3007443853774501124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3007443853774501124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3007443853774501124'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/07/install-puppy-linux-to-usb-drive.html' title='Installing Puppy Linux to USB Drive without writing any CD.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-6815397338861485067</id><published>2007-07-07T19:49:00.000+01:00</published><updated>2007-07-07T22:18:40.463+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>ภาษาไทยสำหรับ Latex และ Ubuntu 7.04</title><content type='html'>  ภาษาไทยสำหรับ Latex และ Ubuntu 7.04&lt;br&gt;&lt;br&gt;พยายามใช้ภาษาไทยใน Latex แต่ใช้ไม่ได้ package thailatex ที่ใช้เป็นรุ่น 0.4.0-1 บน Ubuntu ใช้ไม่ได้ในที่นี่คือเมื่อแปลงเป็น .dvi แล้วอักษรไทยกลายเป็น &lt;font color="#ff0000"&gt;ธธธธ&lt;/font&gt; เสียส่วนมากสังเกตุว่าเป็นเพราะผมแก้ไขแฟ้ม latex ด้วย gvim หรือ gedit แล้วก็ locale ของระบบเป็น UTF-8 พอทำการบรรทึกมันจะทำการบันทึกโดยการเข้ารหัสเป็น UTF-8 (ยังไม่ได้ลองแก้เป็น TIS-620 ไม่รู้ว่าถ้าแก้เป็น TIS-620 แล้วเวลาแก้ไขแฟ้มเอกสารมันจะบันทึกเป็น TIS-620 หรือเปล่าน่ะครับ :-) ขี้เกี่ยจทำ ยังเป็นประเภทจะใช้ค่อยหาทางแก้อยู่) เมื่อได้แฟ้มมาผมก็สั่ง latex แล้วก็ได้ dvi มาแต่เป็น ธธธธธ ซะอย่างนั้น&lt;br&gt;&lt;br&gt;วิธีแก้ไขง่ายๆ พอช่วยถูไถปัญหาไปได้ ผมแก้โดยการเปลี่ยนรหัสแฟ้มจาก UTF-8 ไปเป็น TIS-620 ปัญหาก็ไม่เกิดครับ .dvi ที่ได้ออกมาสวยงามอย่างที่ตั้งใจ แต่ว่าถ้าเอาแฟ้มต้นฉบับไปเปิดด้วย gvim หรือ gedti ทีนี้อ่านไม่ออกนะครับ เป็นภาษาไรไม่รู้เลย ดังนั้นขั้นตอนแก้ไขก็ใช้รหัสเป็น UTF-8 แหละครับเพื่อที่จะได้อ่านออก แต่ตอนจะแปลงเป็น dvi ต้องทำการแปลงรหัสเป็น TIS-620 ก่อนตามนี้ครับ สมมติว่าแฟ้มต้นฉบับชื่อ thai.tex&lt;br&gt;&lt;br&gt;iconv -f UTF-8 -t TIS-620 thai.tex &amp;gt; thai_tis.tex    &amp;lt;--- แปลงรหัสของแฟ้มครับ&lt;br&gt;swath -f latex &amp;lt; thai_tis.tex &amp;gt; thai_tis.ttex         &amp;lt;--- ตัดคำภาษาไทยด้วย swath&lt;br&gt;latex thai_tis.ttex                               &amp;lt;--- แปลงไปเป็น dvi ครับ&lt;br&gt;&lt;br&gt;&lt;br&gt;แต่ ถ้าจะให้ดี ไม่ควรมีการแปลงไปแปลงมาระหว่างรหัสแฟ้มเอกสาร ... คงต้องให้ท่านอื่นช่วยหาทางแก้แล้วครับ ว่าจะทำอย่างไรได้บ้าง ผมไม่อยากคิดต่อ :-) เพราะผมใช้ lyx (&lt;a title="www.lyx.org" target="_blank" href="http://www.lyx.org"&gt;www.lyx.org&lt;/a&gt;&lt;a title="www.lyx.org" href="http://www.lyx.org"&gt;&lt;/a&gt;) ก็สุขสบายดี โดยเฉพาะรุ่น 1.5 ตอนนี้ถึงจะเป็น RC อยู่ เพียงแค่ไปกำหนดค่าใน Document-&amp;gt;Settings-&amp;gt;Language-&amp;gt;Thai แค่นี้มันก็จัดการแปลงรหัสแฟ้มให้อัตโนมัติหากต้องการ .dvi .pdf หรือ .ps สำหรับ Ubuntu สามารถ Donwload lyx รุ่น 1.5 RC2 ได้ที่ &lt;a title="http://wiki.lyx.org/LyX/Download" target="_blank" href="http://wiki.lyx.org/LyX/Download%20"&gt;http://wiki.lyx.org/LyX/Download&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-6815397338861485067?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/6815397338861485067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=6815397338861485067' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6815397338861485067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6815397338861485067'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/07/latex-ubuntu-7.html' title='ภาษาไทยสำหรับ Latex และ Ubuntu 7.04'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-9158776678912570564</id><published>2007-04-20T12:15:00.000+01:00</published><updated>2008-01-23T01:50:58.220Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'>ระบบปฏิบัติการเวลาจริง</title><content type='html'>linux.thai.net/plone จะหยุดให้บริการแล้ว เลยเอาเอกสารเกี่ยวกับ RTLinux ที่เคยเขียนไว้เมื่อนานมาแล้วมาแปะไว้ที่นี่ก็แล้วกันครับ เนื้อหาอาจจะเก่าไปหน่อยแต่ก็หวังว่าจะยังคงมีประโยชน์กับใครบางคนบ้าง มีห้าตอนด้วยกัน ตอนต่อๆ ไปยังไม่ได้เขียนเลย ถ้าเขียนคงเปลี่ยนไปเป็น RTAI แทนที่ RTLinux ( แต่ไม่รู้ว่าจะได้เขียนหรือเปล่า ;-) )&lt;br /&gt;&lt;br /&gt; &lt;p style="color: rgb(0, 153, 0);"&gt;"โฮมเพจนี้จัดทำขึ้นเพื่อบอกเล่าเรื่องราวที่ผมได้ทดลองเล่นเกี่ยวกับการนำ Linux ไปใช้ในงานที่ผมเเกี่ยวข้อง เนื้อหาโดยหลักๆ แล้วนำมาจากต้นฉบับของ &lt;a href="http://rde.scipark.nectec.or.th/"&gt;NECTEC&lt;/a&gt; เพื่อจะเป็นอีกช่องทางสำหรับผู้สนใจที่ไม่สามารถเข้าไปอ่านได้จากเว็ปของ NECTEC&lt;br /&gt;&lt;/p&gt; &lt;p style="color: rgb(0, 153, 0);"&gt;   ตัวผมเองไม่ได้จบทางด้านคอมพิวเตอร์มา แต่จบมาทางด้านระบบควบคุม (Control System) ดังนั้นในบทความที่นำมาลงอาจจะไม่มีกลวิธีอะไรน่าสนใจนักสำหรับนักพัฒนาโปรแกรม แต่ก็หวังว่าจะเป็นจุดเริ่มต้นที่ดีได้สำหรับผู้ที่มีความสนใจ หรือต้องการใช้งาน Linux ในแนวทางที่ผมได้ทำอยู่&lt;br /&gt;&lt;/p&gt; &lt;p style="color: rgb(0, 153, 0);"&gt;   หวังว่าทุกท่านคงจะสนุกกับมันครับ&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   บทที่ห้ามาแล้วน่ะครับสำหรับ RTLinux ... 26/01/2004"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ปล. มีเป็น pdf ไฟล์ในบล๊อก My Old Documents นะครับ&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-9158776678912570564?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/9158776678912570564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=9158776678912570564' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/9158776678912570564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/9158776678912570564'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/linux.html' title='ระบบปฏิบัติการเวลาจริง'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-1744653509873993733</id><published>2007-04-20T12:10:00.000+01:00</published><updated>2007-04-20T23:39:01.004+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'></title><content type='html'>   &lt;p&gt; &lt;/p&gt; &lt;h1 align="center"&gt;&lt;a name="SECTION00100000000000000000"&gt;&lt;/a&gt;RTLinux : Linux สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง&lt;/h1&gt; &lt;div style="text-align: center;"&gt; &lt;h1&gt;&lt;a name="SECTION00100000000000000000"&gt;ตอน&lt;wbr&gt;ที่ 5. การ&lt;wbr&gt;อ่าน&lt;wbr&gt;และ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่าน I/O Port&lt;/a&gt;&lt;/h1&gt; &lt;/div&gt; &lt;div style="text-align: right;"&gt; &lt;a title="พิเชษฐ์ บุญหนุน" href="mailto:p%20i%20s%20h%20e%20d@nectec.or.th"&gt;&lt;big class="LARGE"&gt;พิเชษฐ์ บุญ&lt;wbr&gt;หนุน&lt;/big&gt;&lt;/a&gt;&lt;/div&gt; &lt;h1&gt;&lt;a name="SECTION00110000000000000000"&gt;1. บทนำ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; การ&lt;wbr&gt;นำ&lt;wbr&gt;ระบบปฏิบัติการ RTLinux ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ประโยชน์&lt;wbr&gt;จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ได้&lt;wbr&gt;ชัดเจน&lt;wbr&gt;มาก&lt;wbr&gt;เมื่อ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;หรือ ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก โดยเฉพาะ&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;จาก&lt;wbr&gt;บท&lt;wbr&gt;ที่&lt;wbr&gt;ผ่านๆ มา&lt;wbr&gt;เรา&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เห็น&lt;wbr&gt;ถึง&lt;wbr&gt;วิธีการ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;เลย&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;หลายๆ ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เบื่อ&lt;wbr&gt;ไป&lt;wbr&gt;บ้าง&lt;wbr&gt;แล้ว&lt;wbr&gt;ก็ได้ แต่&lt;wbr&gt;ใน&lt;wbr&gt;บท&lt;wbr&gt;นี้&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;คิด&lt;wbr&gt;ว่า&lt;wbr&gt;คง&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;สนุก&lt;wbr&gt;ขึ้น&lt;wbr&gt;มา&lt;wbr&gt;บ้าง&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;มา&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;กัน&lt;wbr&gt;ครับ&lt;/p&gt; &lt;p&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรมคอมพิวเตอร์&lt;wbr&gt;เพื่อ&lt;wbr&gt;ควบคุม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;จำเป็น&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ผ่าน&lt;wbr&gt;ระบบI/O Port ของ&lt;wbr&gt;คอมพิวเตอร์ อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ผ่าน Parallel Port, Serial Port, ISA Bus หรือ PCI Bus เป็นต้น เพื่อ&lt;wbr&gt;ความ&lt;wbr&gt;สะดวก&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทดลอง Parallel Port น่าจะ&lt;wbr&gt;เป็น&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ที่&lt;wbr&gt;สะดวก&lt;wbr&gt;ที่สุด&lt;wbr&gt;เพราะ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ใน&lt;wbr&gt;ปัจจุบัน&lt;wbr&gt;แทบ&lt;wbr&gt;ทุก&lt;wbr&gt;เครื่อง&lt;wbr&gt;ต้อง&lt;wbr&gt;มี&lt;wbr&gt;ดังนั้น&lt;wbr&gt;ใน&lt;wbr&gt;บท&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;มา&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม RTLinux สำหรับ&lt;wbr&gt;อ่าน&lt;wbr&gt;และ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่านParallel Port กัน &lt;/p&gt; &lt;p&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง I/O Port สำหรับ Linux แล้ว&lt;wbr&gt;นั้น&lt;wbr&gt;สามารถ&lt;wbr&gt;เขียน&lt;wbr&gt;ได้&lt;wbr&gt;ทั้ง&lt;wbr&gt;ใน Kernel Space และ User Space แต่&lt;wbr&gt;ใน&lt;wbr&gt;บทความ&lt;wbr&gt;ตอนนี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;เฉพาะที่&lt;wbr&gt;เขียน&lt;wbr&gt;ในKernel Space เพราะ&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;มัน&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;สำหรับ&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ที่&lt;wbr&gt;สนใจ&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;บนUser Space ใน Linux นั้น&lt;wbr&gt;สามารถ&lt;wbr&gt;หา&lt;wbr&gt;ข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;ได้&lt;wbr&gt;จาก [1] &lt;/p&gt; &lt;p&gt;&lt;span class="textbf"&gt;วงจร&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทดสอบ&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;ได้&lt;wbr&gt;ทดสอบ&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า&lt;wbr&gt;ใช้ได้&lt;wbr&gt;แต่&lt;wbr&gt;ไม่&lt;wbr&gt;ขอ&lt;wbr&gt;รับประกัน&lt;wbr&gt;ความ&lt;wbr&gt;เสียหาย&lt;wbr&gt;ที่&lt;wbr&gt;อาจ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ของ&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ฉะนั้น&lt;wbr&gt;ตรวจ&lt;wbr&gt;เช็ค&lt;wbr&gt;ดีๆ ก่อน&lt;wbr&gt;ทดสอบ&lt;wbr&gt;ด้วย&lt;wbr&gt;นะ&lt;wbr&gt;ครับ&lt;/span&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00120000000000000000"&gt;2. การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ Printer Port และ วงจร&lt;wbr&gt;ทดสอบ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; Parallel Port เป็น&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;มาตรฐาน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;เครื่องพิมพ์&lt;wbr&gt;ของ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;เป็น&lt;wbr&gt;ได้&lt;wbr&gt;ทั้ง Input Port หรือ Output Port สำหรับ&lt;wbr&gt;รายละเอียด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;สามารถ&lt;wbr&gt;อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;จาก[2] ซึ่ง&lt;wbr&gt;พอจะ&lt;wbr&gt;สรุป&lt;wbr&gt;ขา&lt;wbr&gt;ต่าง ๆ ของ Paralle Port ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ทดสอบ&lt;wbr&gt;ได้&lt;wbr&gt;ดัง&lt;wbr&gt;ตาราง&lt;wbr&gt;ที่ &lt;a href="#408"&gt;1&lt;/a&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="408"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption&gt;&lt;strong&gt;Table 1:&lt;/strong&gt; ขา&lt;wbr&gt;และ&lt;wbr&gt;ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ของ Parallel Port&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;       &lt;table align="center" border="1" cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td style="text-align: center;"&gt;Pin No (D-Type 25)&lt;/td&gt;             &lt;td style="text-align: center;"&gt;SPP Signal&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Direction In/Out&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Register&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Hardware Inverted &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;1&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nStrobe&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In/Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Control&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Yes&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;2&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 0&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;3&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 1&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;4&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 2&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;5&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 3&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;6&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 4&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;7&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 5&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;8&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 6&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;9&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data 7&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;10&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nAck&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;11&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Busy&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Yes&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;12&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Paper-Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;13&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Select&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;14&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nAuto-LineFeed&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In/Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Control&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Yes&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;15&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nError/nFault&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;16&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nInitialize&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In/Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Control&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;17&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;nSelect-Printer&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;In/Out&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Control&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Yes&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;18-25&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Ground&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Ground&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/div&gt;       &lt;p&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;br&gt; &lt;p&gt; Parallel Port แต่ละ Port ใน&lt;wbr&gt;โหมด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ SPP จะ&lt;wbr&gt;มี Register อยู่&lt;wbr&gt;ทั้งหมด3 ชุด&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล ประกอบ&lt;wbr&gt;ด้วย Control Port, Data Port และ Status Port แต่ละ Port ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;ดัง&lt;wbr&gt;ตาราง&lt;wbr&gt;ต่อไปนี้&lt;/p&gt; &lt;div align="center"&gt;&lt;a name="409"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption&gt;&lt;strong&gt;Table 2:&lt;/strong&gt; ค่า Register ต่าง ๆ ของ Data Port&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;       &lt;table align="center" border="1" cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td style="text-align: center;"&gt;Offset&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Name&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Read/Write&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Bit No.&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Properties &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Base + 0&lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Data Port&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Write/Read*&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 7&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 6&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 5&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 4&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 3&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 2&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 1&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 0&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 7 (Pin 9)&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 6 (Pin 8)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 5 (Pin 7)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 4 (Pin 6)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 3 (Pin 5)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 2 (Pin 4)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 1 (Pin 3)&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Data 0 (Pin 2)&lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/div&gt;       &lt;p&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; *สำหรับ Data Port นี้&lt;wbr&gt;โดย&lt;wbr&gt;ปรกติ&lt;wbr&gt;จะ&lt;wbr&gt;อยู่&lt;wbr&gt;ใน&lt;wbr&gt;สถานะ&lt;wbr&gt;สำหรับ&lt;wbr&gt;เขียน&lt;wbr&gt;แต่&lt;wbr&gt;หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;ในControl Port บิต&lt;wbr&gt;ที่ 5 Data Port จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;ด้วย&lt;/p&gt; &lt;div align="center"&gt;&lt;a name="410"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption&gt;&lt;strong&gt;Table 3:&lt;/strong&gt; ค่า Register ต่าง ๆ ของ Status Port&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;       &lt;table align="center" border="1" cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td style="text-align: center;"&gt;Offset&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Name&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Read/Write&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Bit No.&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Properties &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Base + 1&lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Status Port&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Read Only&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 7&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 6&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 5&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 4&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 3&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 2&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 1&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 0&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Busy&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Ack&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Paper Out&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Select In&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Error&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;IRQ(Not)&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Reserved&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Reserved&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/div&gt;       &lt;p&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;div align="center"&gt;&lt;a name="411"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption&gt;&lt;strong&gt;Table 4:&lt;/strong&gt; ค่า Register ต่าง ๆ ของ Control Port&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;       &lt;table align="center" border="1" cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td style="text-align: center;"&gt;Offset&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Name&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Read/Write&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Bit No.&lt;/td&gt;             &lt;td style="text-align: center;"&gt;Properties &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Base + 2             &lt;p&gt; &lt;/p&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Control Port&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;Read/Write&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 7&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 6&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 5&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 4&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 3&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 2&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 1&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Bit 0&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top; text-align: center;"&gt;             &lt;table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2"&gt;               &lt;tbody&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Unused&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Unused&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Enable Bi-Directional Port&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Enable IRQ Via Ack Line&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Select Printer&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Initialize Printer (Reset)&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Auto Linefeed&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;                 &lt;tr&gt;                   &lt;td style="vertical-align: top;"&gt;Strobe&lt;br&gt;                   &lt;/td&gt;                 &lt;/tr&gt;               &lt;/tbody&gt;             &lt;/table&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; จาก&lt;wbr&gt;ลักษณะ Parallel Port ได้&lt;wbr&gt;ออกแบบ&lt;wbr&gt;วงจร&lt;wbr&gt;สำหรับ&lt;wbr&gt;ทดสอบ&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a href="#fig:io-program:parallel_test"&gt;1&lt;/a&gt; สำหรับ&lt;wbr&gt;ทดสอบ Data Port ใน&lt;wbr&gt;โหมด Output โดย&lt;wbr&gt;ต่อ&lt;wbr&gt;เข้า&lt;wbr&gt;กับ&lt;wbr&gt;ตัว&lt;wbr&gt;ต้านทาน&lt;wbr&gt;และ LEDs และ ได้&lt;wbr&gt;ต่อ ขา 10 และ ขา 11 กับ&lt;wbr&gt;สวิทซ์&lt;wbr&gt;สำหรับ&lt;wbr&gt;ทดสอบ&lt;wbr&gt;การ&lt;wbr&gt;รับ&lt;wbr&gt;ค่า Input และ&lt;wbr&gt;ทดสอบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ Interrupt &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:io-program:parallel_test"&gt;&lt;/a&gt;&lt;a name="412"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; วงจร&lt;wbr&gt;ทดสอบ Parallel Port&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;&lt;img style="height: 576px; width: 686px;" src="http://docs.google.com/File?id=dhdj5j7_65ghtvgf"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน&lt;wbr&gt;ค่า Register ของ Parallel Port จะ&lt;wbr&gt;อ่าน&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง&lt;span class="textit"&gt;inb( io_port )&lt;/span&gt; สำหรับ&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า&lt;wbr&gt;จาก Register และ &lt;span class="textit"&gt;outb( char var, io_port )&lt;/span&gt; สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า &lt;span class="textit"&gt;var&lt;/span&gt; ให้ Register โดย&lt;wbr&gt;ที่&lt;wbr&gt;ค่า&lt;span class="textit"&gt;io_port&lt;/span&gt; จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ค่า&lt;wbr&gt;ตำแหน่ง&lt;wbr&gt;ของ&lt;wbr&gt;ที่อยู่ (Port Address) ที่&lt;wbr&gt;ใช้&lt;wbr&gt;อ้าง&lt;wbr&gt;ถึง&lt;wbr&gt;ค่าRegister ต่าง ๆ โดย&lt;wbr&gt;ปรกติ&lt;wbr&gt;สำหรับ Parallel Port แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า Port Address ตรง&lt;wbr&gt;กับ Register ดัง&lt;wbr&gt;ตาราง&lt;wbr&gt;ที่ &lt;a href="#413"&gt;&lt;span style="text-decoration: underline;"&gt;5&lt;/span&gt;&lt;/a&gt; ส่วน&lt;wbr&gt;ตำแหน่ง IRQ นั้น&lt;wbr&gt;ปรกติ&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ค่า&lt;wbr&gt;เป็น 5 หรือ 7 แต่&lt;wbr&gt;อาจ&lt;wbr&gt;ไม่&lt;wbr&gt;ตรง&lt;wbr&gt;กัน&lt;wbr&gt;ใน&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;แต่ละ&lt;wbr&gt;เครื่อง&lt;wbr&gt;ต้อง&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ตรวจ&lt;wbr&gt;ดู&lt;wbr&gt;ที่ BIOS อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;หนึ่ง &lt;/p&gt; &lt;p&gt;&lt;br&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="413"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption&gt;&lt;strong&gt;Table 5:&lt;/strong&gt; Parallel Port Address&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt;       &lt;table align="center" border="1" cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="center"&gt;Address&lt;/td&gt;             &lt;td align="center"&gt;Notes: &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top;"&gt;378h - 37Fh&lt;/td&gt;             &lt;td style="vertical-align: top;"&gt;Usual Address For LPT 1&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td style="vertical-align: top;"&gt;278h - 27Fh&lt;br&gt;             &lt;/td&gt;             &lt;td style="vertical-align: top;"&gt;Usual Address For LPT 2&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/div&gt;       &lt;p&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;br&gt; &lt;p&gt; ค่า&lt;wbr&gt;แรก&lt;wbr&gt;ใน&lt;wbr&gt;ตาราง&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ค่า Base Port Address ของ Parallel Port นั้นๆจาก&lt;wbr&gt;ตาราง&lt;wbr&gt;ที่ &lt;a href="#409"&gt;2&lt;/a&gt;, &lt;a href="#410"&gt;3&lt;/a&gt; และ &lt;a href="#411"&gt;4&lt;/a&gt; ใช่&lt;wbr&gt;ช่อง Offset จะ&lt;wbr&gt;บอก&lt;wbr&gt;ค่า Port Address ต่าง ๆ ของ Register เช่น สำหรับ LPT1 มี&lt;wbr&gt;ค่า Base Port Address เท่า&lt;wbr&gt;กับ 378h แสดง&lt;wbr&gt;ว่า&lt;wbr&gt;สามารถ&lt;wbr&gt;ติดต่อ Data Port Register ได้&lt;wbr&gt;ที่ Port Address 378h, Status Port Register ได้&lt;wbr&gt;ที่ Port Address 379h และ Control Port Register ได้&lt;wbr&gt;ที่ Port Address 37Ah &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00130000000000000000"&gt;3. โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ทดสอบ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;เขียน&lt;wbr&gt;ขึ้น&lt;wbr&gt;จะ&lt;wbr&gt;แบ่ง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ออก&lt;wbr&gt;เป็น&lt;wbr&gt;สาม&lt;wbr&gt;แบบ&lt;wbr&gt;คือ กำหนด&lt;wbr&gt;ให้Data Port เป็น Output ขับ LEDs, ใช้&lt;wbr&gt;ขา&lt;wbr&gt;ที่ 11 ของ Parallel Port หรือ&lt;wbr&gt;ขา Busy ของ Status Port เป็น&lt;wbr&gt;ขา Input เพื่อ&lt;wbr&gt;รับ&lt;wbr&gt;สถานะ&lt;wbr&gt;ของ&lt;wbr&gt;สวิทซ์ SW1 และ&lt;wbr&gt;ใช้&lt;wbr&gt;ขา&lt;wbr&gt;ที่10 ของ Parallel Port หรือ ขา Ack ของ Status Port เป็น&lt;wbr&gt;ขา Input รับ&lt;wbr&gt;สัญญาณInterrupt จาก&lt;wbr&gt;สวิทซ์ SW2 มา&lt;wbr&gt;ดู&lt;wbr&gt;ต้น&lt;wbr&gt;หรัส&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;กัน&lt;wbr&gt;เลย&lt;wbr&gt;ครับ จะ&lt;wbr&gt;ขอ&lt;wbr&gt;ตัด&lt;wbr&gt;เป็น&lt;wbr&gt;ท่อนๆ อธิบาย&lt;wbr&gt;เป็น&lt;wbr&gt;ตอนๆ ไป&lt;/p&gt; &lt;div align="left"&gt;001. #ifndef __KERNEL__ &lt;br&gt; 002. #define __KERNEL__ &lt;br&gt; 003. #endif &lt;br&gt; 004. #ifndef __MODULE__ &lt;br&gt; 005. #define __MODULE__ &lt;br&gt; 006. #endif &lt;br&gt; 007. #include &amp;lt;rtl.h&amp;gt; &lt;br&gt; 008. #include &amp;lt;time.h&amp;gt; &lt;br&gt; 009. #include &amp;lt;pthread.h&amp;gt; &lt;br&gt; 010. #include &amp;lt;linux/kernel.h&amp;gt; &lt;br&gt; 011. #include &amp;lt;linux/version.h&amp;gt; &lt;br&gt; 012. #include &amp;lt;linux/sched.h&amp;gt; &lt;br&gt; 013. #include &amp;lt;linux/errno.h&amp;gt; &lt;br&gt; 014. #include &amp;lt;linux/module.h&amp;gt; &lt;br&gt; 015. #include &amp;lt;linux/ioport.h&amp;gt; &lt;br&gt; 016. #include &amp;lt;asm/io.h&amp;gt;&lt;br&gt; &lt;/div&gt; &lt;p&gt; ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 15 และ 16 จะ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;มา&lt;wbr&gt;เพื่อให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;สามารถ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน&lt;span class="textit"&gt;inb( io_port )&lt;/span&gt; และ &lt;span class="textit"&gt;outb( char var, io_port )&lt;/span&gt; ได้&lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;017. #define DATA_PORT 0x378 &lt;br&gt; 018. #define STATUS_PORT 0x379 &lt;br&gt; 019. #define CONTROL_PORT 0x37a &lt;br&gt; 020. #define IRQ_NO 7 &lt;br&gt; 021. MODULE_LICENSE("GPL v2"); &lt;br&gt; 022. MODULE_AUTHOR("Pished Bunnun"); &lt;br&gt; 023. MODULE_DESCRIPTION("using RTLinux with I/O Port"); &lt;br&gt; 024. #define D0 1 &lt;br&gt; 025. #define D1 2 &lt;br&gt; 026. #define D2 4 &lt;br&gt; 027. #define D3 8 &lt;br&gt; 028. #define D4 16 &lt;br&gt; 029. #define D5 32 &lt;br&gt; 030. #define D6 64 &lt;br&gt; 031. #define D7 128&lt;br&gt; &lt;/div&gt; &lt;p&gt; กำหนด&lt;wbr&gt;ค่า DATA_PORT, STATUS_PORT และ CONTROL_PORT เพื่อ&lt;wbr&gt;อ้างอิง&lt;wbr&gt;ถึงPort Address ของ Data Register, Status Register และ Control Register ตาม&lt;wbr&gt;ลำดับ และ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า IRQ_NO เพื่อ&lt;wbr&gt;อ้างอิง&lt;wbr&gt;ถึง&lt;wbr&gt;ค่า&lt;wbr&gt;ของ Interrupt Number โดย&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;เหล่านี้&lt;wbr&gt;สามารถ&lt;wbr&gt;ดู&lt;wbr&gt;ได้&lt;wbr&gt;จาก BIOS ของ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ว่า&lt;wbr&gt;กำหนด Base Address ไว้&lt;wbr&gt;ที่ใด และ กำหนด&lt;wbr&gt;ค่า Interrupt Number ไว้&lt;wbr&gt;ที่ใด ส่วน&lt;wbr&gt;ค่า D0 ถึง D7 เป็น&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;ขึ้น&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;อ้างอิง&lt;wbr&gt;ถึง&lt;wbr&gt;ตำแหน่ง&lt;wbr&gt;บิต&lt;wbr&gt;ต่าง ๆ ของRegister &lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;032. pthread_t led_thread; &lt;br&gt; 033. pthread_t switch_thread; &lt;br&gt; 034. pthread_t irq_thread; &lt;br&gt; 035. char command; &lt;br&gt; 036. char control_port_register;&lt;br&gt; &lt;/div&gt; &lt;p&gt; โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่&lt;wbr&gt;ด้วย&lt;wbr&gt;กัน 3 thread คือ led_thread จะ&lt;wbr&gt;เป็น thread ที่&lt;wbr&gt;จัดการ&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ LEDs, switch_thread จะ&lt;wbr&gt;เป็น thread ที่&lt;wbr&gt;จัดการ&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของSW1 และ irq_thread จะ&lt;wbr&gt;เป็น thread ที่&lt;wbr&gt;จัดการ&lt;wbr&gt;เกี่ยวกับ Interrupt โดย&lt;wbr&gt;รับInterrupt จาก SW2 &lt;/p&gt; &lt;p&gt;ตัวแปร command เป็น&lt;wbr&gt;ตัวแปร global ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ระหว่างswitch_thread และ led_thread โดย&lt;wbr&gt;ที่ switch_thread จะ&lt;wbr&gt;เปลี่ยน&lt;wbr&gt;ค่า command เพื่อ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้led_thread หยุด&lt;wbr&gt;ทำงาน จะ&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้ ส่วนตัว&lt;wbr&gt;แปรcontrol_port_register ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เก็บ&lt;wbr&gt;ค่า Control Register ของ Parallel Port เดิม&lt;wbr&gt;ไว้&lt;wbr&gt;ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;เปลี่ยน&lt;wbr&gt;ค่า เมื่อ&lt;wbr&gt;เลิก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน Parallel Port จะ&lt;wbr&gt;ได้&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เดิม&lt;wbr&gt;ให้&lt;wbr&gt;กับControl Register ได้&lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;037. unsigned int irq_handler( unsigned int irq, struct pt_regs *regs ){ &lt;br&gt; 038. printk("Interrupt Handlern''); &lt;br&gt; 039. rtl_hard_enable_irq( IRQ_NO ); &lt;br&gt; 040. return 0; &lt;br&gt; 041. }&lt;br&gt; &lt;/div&gt; &lt;p&gt; ฟังก์ชัน &lt;span class="textit"&gt;irq_handler( )&lt;/span&gt; จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เมื่อ&lt;wbr&gt;เกิดInterrupt ขึ้น&lt;wbr&gt;โดย&lt;wbr&gt;การ&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า``Interrupt Handler'' ไว้&lt;wbr&gt;ใน Kernel Message (ใช้&lt;wbr&gt;คำสั่ง dmesg เรียก&lt;wbr&gt;ดู&lt;wbr&gt;ครับ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 39 มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ฟังก์ชัน &lt;span class="textit"&gt;rtl_hard_enable_irq( IRQ_NO )&lt;/span&gt; ซึ่ง&lt;wbr&gt;จำเป็น หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;บรรทัด&lt;wbr&gt;นี้&lt;wbr&gt;แล้ว Interrupt จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ได้&lt;wbr&gt;อีก&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ลอง&lt;wbr&gt;คอม&lt;wbr&gt;เมนต์&lt;wbr&gt;บรรทัด&lt;wbr&gt;นี้&lt;wbr&gt;ออก แล้ว&lt;wbr&gt;สังเกต&lt;wbr&gt;ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เทียบ&lt;wbr&gt;กัน&lt;wbr&gt;ดู&lt;wbr&gt;ครับ&lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;042. void *switch_thread_code( void * temp ){ &lt;br&gt; 043. char input, input_latch = 0, toggle = 0; &lt;br&gt; 044. while( 1 ){ &lt;br&gt; 045. input = inb( STATUS_PORT ); &lt;br&gt; 046. if( (input &amp;amp; D7) == D7 ){ &lt;br&gt; 047. if( input_latch == 0 ){ &lt;br&gt; 048. input_latch = 1; &lt;br&gt; 049. toggle = (toggle+1)%2; &lt;br&gt; 050. if( toggle == 1 &amp;amp;&amp;amp; command == 0 ) &lt;br&gt; 051. pthread_wakeup_np( led_thread ); &lt;br&gt; 052. else &lt;br&gt; 053. command = 1; &lt;br&gt; 054. } &lt;br&gt; 055. } &lt;br&gt; 056. else &lt;br&gt; 057. input_latch = 0; &lt;br&gt; 058. pthread_wait_np(); &lt;br&gt; 059. } &lt;br&gt; 060. }&lt;br&gt; &lt;/div&gt; &lt;p&gt; ฟังก์ชัน &lt;span class="textit"&gt;switch_thread_code( )&lt;/span&gt; เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ switch_thread ตัวแปร input, และ input_latch ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ตรวจ&lt;wbr&gt;สถานะ&lt;wbr&gt;การ&lt;wbr&gt;กด SW1 ส่วน toggle ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เก็บ&lt;wbr&gt;สถานะ&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม&lt;wbr&gt;แบบ&lt;wbr&gt;สลับ&lt;wbr&gt;ไป&lt;wbr&gt;มา&lt;/p&gt; &lt;p&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 45 และ 46 ใช้&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า&lt;wbr&gt;จาก STATUS PORT และ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เปรียบเทียบ&lt;wbr&gt;บิต&lt;wbr&gt;ที่7 ว่า&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เปลี่ยนแปลง&lt;wbr&gt;หรือ&lt;wbr&gt;ไม่ หรือ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;กด SW1 หรือ&lt;wbr&gt;ไม่&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่47 ว่า&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;ค้าง&lt;wbr&gt;ไว้ หรือ&lt;wbr&gt;ไม่ ถ้า&lt;wbr&gt;กด&lt;wbr&gt;ค้าง&lt;wbr&gt;ไว้ &lt;span class="textit"&gt;input_latch&lt;/span&gt; จะ&lt;wbr&gt;เท่า&lt;wbr&gt;กับ1 และ&lt;wbr&gt;จะ&lt;wbr&gt;ข้าม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ส่วน&lt;wbr&gt;นี้&lt;wbr&gt;ไป แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;ครั้ง&lt;wbr&gt;ใหม่&lt;wbr&gt;ค่า &lt;span class="textit"&gt;input_latch&lt;/span&gt; จะ&lt;wbr&gt;เท่า&lt;wbr&gt;กับ 0 โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 48 โดย&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า &lt;span class="textit"&gt;input_latch&lt;/span&gt; เท่า&lt;wbr&gt;กับ 1 เพื่อ&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;เข้า&lt;wbr&gt;มา&lt;wbr&gt;ทำงาน&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;หาก&lt;wbr&gt;ใน&lt;wbr&gt;รอบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป SW1 ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ปล่อย&lt;/p&gt; &lt;p&gt;บรรทัด&lt;wbr&gt;ที่ 49 ถึง 53 จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ว่า&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;งาน&lt;wbr&gt;แบบ&lt;wbr&gt;ไหน&lt;wbr&gt;ให้&lt;wbr&gt;เรียก&lt;wbr&gt;คืน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน(บรรทัด&lt;wbr&gt;ที่51) หรือ ให้&lt;wbr&gt;หยูด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน(บรรทัด&lt;wbr&gt;ที่ 53) ของ led_thread สังเกต&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ตัวแปร&lt;wbr&gt;โก&lt;wbr&gt;ลบ&lt;wbr&gt;อลcommand ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ led_thread แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;ต่อไป &lt;/p&gt; &lt;p&gt;บรรทัด&lt;wbr&gt;ที่ 58 ก็&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ thread นี้&lt;wbr&gt;จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;ถึง&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ถัด&lt;wbr&gt;ไป&lt;wbr&gt;จึง&lt;wbr&gt;จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใหม่&lt;wbr&gt;เหมือน&lt;wbr&gt;ที่&lt;wbr&gt;ผ่านๆ มา&lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;061. void *led_thread_code( void * temp ){ &lt;br&gt; 062. char output; &lt;br&gt; 063. output = 0xFF; &lt;br&gt; 064. while( 1 ){ &lt;br&gt; 065. outb(output, DATA_PORT); &lt;br&gt; 066. output = ~output; &lt;br&gt; 067. if( command == 1 ){ &lt;br&gt; 068. command = 0; &lt;br&gt; 069. pthread_suspend_np( pthread_self() ); &lt;br&gt; 070. } &lt;br&gt; 071. pthread_wait_np(); &lt;br&gt; 072. } &lt;br&gt; 073. }&lt;br&gt; &lt;/div&gt; &lt;p&gt; ฟังก์ชัน led_thread_code( ) ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ LEDs ทุก&lt;wbr&gt;ดวง&lt;wbr&gt;กระพริบ&lt;wbr&gt;พร้อมๆ&lt;wbr&gt;กัน การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ LEDs ดับ&lt;wbr&gt;หรือ&lt;wbr&gt;สว่าง&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน outb( output, DATA_PORT ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 65 ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;ต่าง&lt;wbr&gt;จาก&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ใน DOS ตรง&lt;wbr&gt;ที่&lt;wbr&gt;มัน&lt;wbr&gt;สลับ&lt;wbr&gt;ตำแหน่ง&lt;wbr&gt;กัน&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ค่าPORT ADDRESS และ DATA ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ส่ง ส่วน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 66 เป็น&lt;wbr&gt;การ&lt;wbr&gt;กลับ&lt;wbr&gt;ค่า&lt;wbr&gt;ไป&lt;wbr&gt;มา&lt;wbr&gt;ระหว่าง0x00 และ 0xFF &lt;/p&gt; &lt;p&gt;บรรทัด 67 ถึง 70 เป็น&lt;wbr&gt;การ&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง&lt;wbr&gt;จาก switch_thread ผ่าน&lt;wbr&gt;ตัวแปรcommand เพื่อ&lt;wbr&gt;บอก&lt;wbr&gt;ให้&lt;wbr&gt;หยุด การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ thread นี้&lt;wbr&gt;หรือ&lt;wbr&gt;ไม่&lt;wbr&gt;วิธี&lt;wbr&gt;นี้&lt;wbr&gt;เป็น&lt;wbr&gt;วิธี&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของthread โดย thread อื่นๆ เพื่อ&lt;wbr&gt;รับประกัน&lt;wbr&gt;ว่า&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ thread ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ที่&lt;wbr&gt;สำคัญๆ&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน&lt;wbr&gt;เสร็จ&lt;wbr&gt;แล้ว&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ จึง&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ thread &lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;074. int init_module(void){ &lt;br&gt; 075. pthread_attr_t attr; &lt;br&gt; 076. struct sched_param sched_param; &lt;br&gt; 077. rtl_irqstate_t irq_state; &lt;br&gt; 078. command = 1; &lt;br&gt; 079. if( check_region( DATA_PORT, 3 ) &amp;lt; 0){ &lt;br&gt; 080. printk(" I/O PORT region 0x378 is taken by other Devicen''); &lt;br&gt; 081. return -EIO; &lt;br&gt; 082. } &lt;br&gt; 083. printk(" I/O PORT region 0x378 is OK.n''); &lt;br&gt; 084. request_region( DATA_PORT, 3, "rt_parport" ); &lt;br&gt; 085. outb( 0xFF, DATA_PORT ); &lt;br&gt; 086. pthread_attr_init( &amp;amp;attr ); &lt;br&gt; 087. sched_param.sched_priority = 10; &lt;br&gt; 088. pthread_attr_setschedparam( &amp;amp;attr, &amp;amp;sched_param ); &lt;br&gt; 089. pthread_create( &amp;amp;led_thread, &amp;amp;attr, led_thread_code, 0 ); &lt;br&gt; 090. pthread_attr_init( &amp;amp;attr ); &lt;br&gt; 091. sched_param.sched_priority = 1; &lt;br&gt; 092. pthread_attr_setschedparam( &amp;amp;attr, &amp;amp;sched_param ); &lt;br&gt; 093. pthread_create( &amp;amp;switch_thread, &amp;amp;attr, switch_thread_code, 0 ); &lt;br&gt; 094. pthread_make_periodic_np( led_thread, gethrtime()+10000000, 1000000000); &lt;br&gt; 095. pthread_make_periodic_np( switch_thread,gethrtime()+10000000, 10000000); &lt;br&gt; 096. // Enable Interrupt &lt;br&gt; 097. control_port_register = inb( CONTROL_PORT ); &lt;br&gt; 098. rtl_no_interrupts( irq_state ); &lt;br&gt; 099. rtl_request_irq( IRQ_NO, irq_handler ); &lt;br&gt; 100. rtl_hard_enable_irq( IRQ_NO ); &lt;br&gt; 101. rtl_restore_interrupts( irq_state ); &lt;br&gt; 102. // Enable IRQ via ACK Line &lt;br&gt; 103. outb( control_port_register | D4, CONTROL_PORT ); &lt;br&gt; 104. return 0; &lt;br&gt; 105. }&lt;br&gt; &lt;/div&gt; &lt;p&gt; ฟังก์ชัน init_module(void) คง&lt;wbr&gt;ยัง&lt;wbr&gt;จำ&lt;wbr&gt;กัน&lt;wbr&gt;ได้&lt;wbr&gt;นะ&lt;wbr&gt;ครับ&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;ทำงาน&lt;wbr&gt;เมื่อไหร่&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 79 ถึง 84 จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;จอง PORT ADDRESS เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;มี&lt;wbr&gt;ประโยชน์&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ว่า&lt;wbr&gt;มี&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อื่น&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้PORT ADDRESS นี้&lt;wbr&gt;อยู่&lt;wbr&gt;หรือ&lt;wbr&gt;ไม่ จะ&lt;wbr&gt;ได้&lt;wbr&gt;ไม่&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ทับ&lt;wbr&gt;ซ้อน&lt;wbr&gt;กัน&lt;wbr&gt;และ&lt;wbr&gt;หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;คน&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;เรา&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;จอง&lt;wbr&gt;ไว้ และ&lt;wbr&gt;บอก&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อื่น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;รู้&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;ใช้&lt;wbr&gt;อยู่&lt;wbr&gt;ให้&lt;wbr&gt;ไป&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้PORT ADDRESS อื่น&lt;wbr&gt;แทน&lt;/p&gt; &lt;p&gt;ค่าตัวแปร control_port_register ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 97 ถูก&lt;wbr&gt;อ่าน&lt;wbr&gt;เก็บ&lt;wbr&gt;ไว้&lt;wbr&gt;เพื่อ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เดิม&lt;wbr&gt;เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;ออก&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 98 ถึง 101 เป็น&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้ Interrupt ที่&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ที่ IRQ_NO ไป&lt;wbr&gt;เรียก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน irq_handler() ส่วน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 103 เป็น&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้Parallel Port รับ Interrupt ผ่าน&lt;wbr&gt;ทาง SW2 &lt;br&gt; &lt;/p&gt; &lt;div align="left"&gt;105. int cleanup_module( void ){ &lt;br&gt; 106. rtl_free_irq( IRQ_NO ); &lt;br&gt; 107. outb( control_port_register, CONTROL_PORT ); &lt;br&gt; 108. outb( 0, DATA_PORT ); &lt;br&gt; 109. printk("Release I/O Port region 0x378n''); &lt;br&gt; 110. pthread_delete_np( led_thread ); &lt;br&gt; 111. pthread_delete_np( switch_thread ); &lt;br&gt; 112. return 0; &lt;br&gt; 113. }&lt;br&gt; &lt;/div&gt; &lt;p&gt; ฟังก์ชัน cleanup_module(void) ก็&lt;wbr&gt;คง&lt;wbr&gt;ยัง&lt;wbr&gt;คุ้นเคย&lt;wbr&gt;กัน&lt;wbr&gt;ดี&lt;wbr&gt;นะ&lt;wbr&gt;ครับ ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่106 เป็น&lt;wbr&gt;การ&lt;wbr&gt;คืน&lt;wbr&gt;การ&lt;wbr&gt;จอง Interrupt ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อื่น&lt;wbr&gt;เอา&lt;wbr&gt;ไป&lt;wbr&gt;ใช้ได้ บรรทัด&lt;wbr&gt;ที่ 107 เป็น&lt;wbr&gt;การ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เก่า&lt;wbr&gt;ของ Control Register ของ Parallel Port ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ของ&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00140000000000000000"&gt;4. สรุป&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ใน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;เรา&lt;wbr&gt;ก็ได้&lt;wbr&gt;เล่นสนุก&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;ได้&lt;wbr&gt;บ้าง&lt;wbr&gt;พอสมควร&lt;wbr&gt;ทั้ง&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ Interrupt การ&lt;wbr&gt;อ่าน&lt;wbr&gt;เขียน&lt;wbr&gt;สัญญาณ I/O ผ่าน&lt;wbr&gt;ทาง Parallel Port คง&lt;wbr&gt;เป็น&lt;wbr&gt;ที่&lt;wbr&gt;ถูกอกถูกใจ&lt;wbr&gt;กัน&lt;wbr&gt;พอสมควร&lt;wbr&gt;นะ&lt;wbr&gt;ครับ แต่&lt;wbr&gt;ก็&lt;wbr&gt;อย่า&lt;wbr&gt;หยุด&lt;wbr&gt;เพียง&lt;wbr&gt;เท่านี้&lt;wbr&gt;ลอง&lt;wbr&gt;ไป&lt;wbr&gt;นั่ง&lt;wbr&gt;คิด&lt;wbr&gt;เล่นๆ ดู&lt;wbr&gt;ครับ จะ&lt;wbr&gt;ทำ&lt;wbr&gt;อย่างไร&lt;wbr&gt;ให้ LEDs มัน&lt;wbr&gt;กระพริบ&lt;wbr&gt;หลายๆ รูปแบบ, ทำ&lt;wbr&gt;อย่างไร&lt;wbr&gt;ให้ LEDs หยุด&lt;wbr&gt;หรือ&lt;wbr&gt;เริ่ม&lt;wbr&gt;กระพริบ&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ในUser Space นอกจาก&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;สวิทซ์ SW1, ถ้า&lt;wbr&gt;นำ Parallel Port มา&lt;wbr&gt;ทำ&lt;wbr&gt;เป็น Input ต่อ&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เป็น A/D จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;หรือเปล่า ถ้า&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;ถ่าย&lt;wbr&gt;โอน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;เก็บ&lt;wbr&gt;ลง&lt;wbr&gt;เป็น&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;อย่างไร&lt;wbr&gt;หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;คิด&lt;wbr&gt;เล่นๆ แล้ว ลอง&lt;wbr&gt;ทำ&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ จังๆ ดู&lt;wbr&gt;ครับ คง&lt;wbr&gt;ได้&lt;wbr&gt;อะไร&lt;wbr&gt;ไว้&lt;wbr&gt;ทดลอง&lt;wbr&gt;เล่น&lt;wbr&gt;หรือ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;กัน&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ จังๆ ซัก&lt;wbr&gt;อย่าง&lt;/p&gt; &lt;p&gt;ไว้&lt;wbr&gt;พบ&lt;wbr&gt;กัน&lt;wbr&gt;ตอน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ครับ คง&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;เก็บ&lt;wbr&gt;รายละเอียด&lt;wbr&gt;ที่&lt;wbr&gt;เหลือ เช่น การ Share Memory ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน Kernel Space กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน User Space ซึ่ง&lt;wbr&gt;เป็น&lt;wbr&gt;อีก&lt;wbr&gt;ช่องทาง&lt;wbr&gt;สำหรับ&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;กันและกัน&lt;wbr&gt;นอกจากFIFO ที่&lt;wbr&gt;เคย&lt;wbr&gt;พูด&lt;wbr&gt;มา&lt;wbr&gt;แล้ว, การ Syncronize กัน&lt;wbr&gt;ระหว่าง Thread เป็นต้น&lt;wbr&gt;แล้ว&lt;wbr&gt;พบ&lt;wbr&gt;กัน&lt;wbr&gt;ครับ&lt;wbr&gt;สวัสดี... &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00150000000000000000"&gt;5. แหล่งข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.tldp.org/HOWTO/IO-Port-Programming.html"&gt;http://www.tldp.org/HOWTO/IO-Port-Programming.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.beyondlogic.org/index.htm"&gt;http://www.beyondlogic.org/index.htm&lt;/a&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00200000000000000000"&gt;About this document ...&lt;/a&gt; &lt;/h1&gt; &lt;p&gt;This document was generated using the &lt;a href="http://www.latex2html.org/"&gt;&lt;strong&gt;LaTeX&lt;/strong&gt;2&lt;tt&gt;HTML&lt;/tt&gt;&lt;/a&gt; translator Version 2002-2-1 (1.70) &lt;/p&gt; &lt;p&gt;Copyright © 1993, 1994, 1995, 1996, &lt;a href="http://cbl.leeds.ac.uk/nikos/personal.html"&gt;Nikos Drakos&lt;/a&gt;, Computer Based Learning Unit, University of Leeds. &lt;br&gt; Copyright © 1997, 1998, 1999, &lt;a href="http://www.maths.mq.edu.au/%7Eross/"&gt;Ross Moore&lt;/a&gt;, Mathematics Department, Macquarie University, Sydney. &lt;/p&gt; &lt;p&gt;The translation was initiated by root on 2004-01-26 &lt;/p&gt; &lt;div class="navigation"&gt; &lt;hr&gt;&lt;/div&gt;  &lt;address&gt;Pished Bunnun 2004-01-26 &lt;/address&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-1744653509873993733?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/1744653509873993733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=1744653509873993733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1744653509873993733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1744653509873993733'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/rtlinux-linux-5.html' title=''/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-5031997971795087518</id><published>2007-04-20T12:08:00.000+01:00</published><updated>2007-04-20T23:39:01.004+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'></title><content type='html'> &lt;p&gt; &lt;/p&gt; &lt;h1 align="center"&gt;   &lt;a name="SECTION00100000000000000000"&gt;&lt;/a&gt;RTLinux : Linux สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง &lt;/h1&gt; &lt;h1 align="center"&gt;   &lt;a name="SECTION00100000000000000000"&gt; ตอน&lt;wbr&gt;ที่ 4. การ&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;/a&gt; &lt;/h1&gt; &lt;p align="right"&gt;   &lt;a title="พิเชษฐ์ บุญหนุน" href="mailto:p%20i%20s%20h%20e%20d@nectec.or.th"&gt;&lt;font size="+1"&gt;พิเชษฐ์ &lt;wbr&gt;บุญหนุน&lt;/font&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;   &lt;a name="SECTION00110000000000000000"&gt; 1 บทนำ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt;   พบ&lt;wbr&gt;กัน&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ครับ&lt;wbr&gt;กับ&lt;wbr&gt;บทความ&lt;wbr&gt;ใน&lt;wbr&gt;ชุด&lt;wbr&gt;นี้ ตอนนี้&lt;wbr&gt;ก็&lt;wbr&gt;เป็น&lt;wbr&gt;ตอน&lt;wbr&gt;ที่ 4 แล้ว ผม&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;เชื่อ&lt;wbr&gt;ว่า สำหรับ&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;หลายๆ ท่าน&lt;wbr&gt;หาก&lt;wbr&gt;มี&lt;wbr&gt;เวลา&lt;wbr&gt;พอ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ศึกษา&lt;wbr&gt;ค้นคว้า&lt;wbr&gt;ด้วย&lt;wbr&gt;ตนเอง&lt;wbr&gt;ต่อ&lt;wbr&gt;จาก&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;แนวทาง&lt;wbr&gt;แล้ว&lt;wbr&gt;นั้น บทความ&lt;wbr&gt;ใน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;และ&lt;wbr&gt;ตอน&lt;wbr&gt;ต่อๆ ไป อาจ&lt;wbr&gt;ไม่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;อ่าน&lt;wbr&gt;แล้ว&lt;wbr&gt;ก็ได้ ไม่&lt;wbr&gt;แน่&lt;wbr&gt;ว่า&lt;wbr&gt;สิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;อ่าน&lt;wbr&gt;นี้&lt;wbr&gt;อาจ&lt;wbr&gt;เป็น&lt;wbr&gt;สิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;ท่าน&lt;wbr&gt;รู้อยู่&lt;wbr&gt;แล้ว&lt;wbr&gt;และ&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;รู้มาก&lt;wbr&gt;กว่า&lt;wbr&gt;เสีย&lt;wbr&gt;ด้วย แต่&lt;wbr&gt;สำหรับ&lt;wbr&gt;ท่าน&lt;wbr&gt;ที่&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;เวลา&lt;wbr&gt;พอ&lt;wbr&gt;หรือ&lt;wbr&gt;ติดขัด&lt;wbr&gt;ประการ&lt;wbr&gt;ใด&lt;wbr&gt;ก็&lt;wbr&gt;คง&lt;wbr&gt;ต้อง&lt;wbr&gt;ศึกษา&lt;wbr&gt;และ&lt;wbr&gt;ทดลอง&lt;wbr&gt;ร่วม&lt;wbr&gt;กัน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ครับ &lt;/p&gt; &lt;p&gt;   ตอน&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;กัน แต่&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;เหมาะ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;อย่าง&lt;wbr&gt;อื่น ไม่&lt;wbr&gt;เหมาะ&lt;wbr&gt;ตรง&lt;wbr&gt;ที่&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ทันที&lt;wbr&gt;ที่&lt;wbr&gt;แทรก&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel และ&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ทันที&lt;wbr&gt;ก็&lt;wbr&gt;ต่อเมื่อ&lt;wbr&gt;ลบ&lt;wbr&gt;มัน&lt;wbr&gt;ออก&lt;wbr&gt;จาก kernel เรา&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ควบคุม&lt;wbr&gt;การ&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;หรือ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ใหม่ นอกจากนี้&lt;wbr&gt;แล้ว&lt;wbr&gt;มัน&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;หรือ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;อื่น&lt;wbr&gt;ได้ หาก&lt;wbr&gt;มัน&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;นี้&lt;wbr&gt;ด้วย&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ดี&lt;wbr&gt;อย่างยิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;จัด&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;หรือ&lt;wbr&gt;สุ่ม&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก&lt;wbr&gt;มา&lt;wbr&gt;จัด&lt;wbr&gt;เก็บ&lt;wbr&gt;ลง&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;วิเคราะห์&lt;wbr&gt;ผล&lt;wbr&gt;ต่อไป &lt;/p&gt; &lt;p&gt;   อย่าง&lt;wbr&gt;ที่&lt;wbr&gt;ทราบ&lt;wbr&gt;กัน&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า RTLinux ได้&lt;wbr&gt;เตรียม&lt;wbr&gt;วิธีการ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ไว้&lt;wbr&gt;ให้&lt;wbr&gt;แล้ว 2 วิธี&lt;wbr&gt;คือ ผ่าน&lt;wbr&gt;ทาง Shared Memory หรือ ผ่าน&lt;wbr&gt;ทาง FIFO ใน&lt;wbr&gt;บทความ&lt;wbr&gt;ตอนนี้&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน FIFO สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ ทั้งนี้เพราะ FIFO มี&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;ง่าย ไม่&lt;wbr&gt;ยุ่งยาก&lt;wbr&gt;ซับซ้อน และ&lt;wbr&gt;ยัง&lt;wbr&gt;มี&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;บาง&lt;wbr&gt;ประการ&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;นำมา&lt;wbr&gt;ใช้ประโยชน์ คุณสมบัติ&lt;wbr&gt;ที่&lt;wbr&gt;ว่า&lt;wbr&gt;นี้&lt;wbr&gt;คือ&lt;wbr&gt;อะไร อดใจ&lt;wbr&gt;ไว้&lt;wbr&gt;อีก&lt;wbr&gt;นิด&lt;wbr&gt;เดี๋ยว&lt;wbr&gt;เรา&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ใช้&lt;wbr&gt;กัน &lt;/p&gt; &lt;p&gt;   ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ทดลอง&lt;wbr&gt;อะไร&lt;wbr&gt;กัน&lt;wbr&gt;ต่อไป ใน&lt;wbr&gt;ครั้งนี้&lt;wbr&gt;จะ&lt;wbr&gt;ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้&lt;wbr&gt;รู้จัก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;โปรแกรม make อย่าง&lt;wbr&gt;ง่ายๆ กัน แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;รู้&lt;wbr&gt;ว่า&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ง่าย&lt;wbr&gt;ขึ้น&lt;wbr&gt;อีก&lt;wbr&gt;เยอะ&lt;wbr&gt;หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;จึง&lt;wbr&gt;จะ&lt;wbr&gt;เข้าเนื้อ&lt;wbr&gt;หา&lt;wbr&gt;กัน&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ โดย&lt;wbr&gt;เริ่ม&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ถึง FIFO เสร็จ&lt;wbr&gt;แล้ว&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ลhello_rt ต่อ&lt;wbr&gt;จาก&lt;wbr&gt;ตอน&lt;wbr&gt;ที่แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;สามารถ&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง และ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ขึ้น&lt;wbr&gt;ใหม่ สุดท้าย&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;อธิบาย&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง frank ที่มา&lt;wbr&gt;พร้อมกับ RTLinux &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;   &lt;a name="SECTION00120000000000000000"&gt; 2 ง่าย&lt;wbr&gt;ขึ้น&lt;wbr&gt;อีก&lt;wbr&gt;นิด&lt;wbr&gt;กับ Makefile&lt;/a&gt; &lt;/h1&gt; &lt;p&gt;   โปรแกรม make เป็น&lt;wbr&gt;เครื่องมือ&lt;wbr&gt;ช่วย&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส เหมาะ&lt;wbr&gt;สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;จัดการ&lt;wbr&gt;กับ&lt;wbr&gt;แฟ้ม&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;จำนวน&lt;wbr&gt;มาก เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;สั่ง&lt;wbr&gt;เพียงแค่&lt;wbr&gt;คำสั่ง ``make" คำสั่ง&lt;wbr&gt;เดียว&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;จัดการ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;หรือ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ทั้งหมด และ&lt;wbr&gt;มัน&lt;wbr&gt;ยัง&lt;wbr&gt;เก่ง&lt;wbr&gt;พอ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;จัดการ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;เฉพาะ&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;เท่านั้น ส่วน&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ที่&lt;wbr&gt;เคย&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ไว้&lt;wbr&gt;แล้ว&lt;wbr&gt;และ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข มัน&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ซ้ำ โปรแกรม make จะ&lt;wbr&gt;ใช้&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ชื่อ ``Makefile" เป็น&lt;wbr&gt;ชื่อ&lt;wbr&gt;โดย&lt;wbr&gt;ปริยาย&lt;wbr&gt;ที่&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;อ่าน&lt;wbr&gt;และ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ตาม&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;เขียน&lt;wbr&gt;ไว้ โครงสร้าง&lt;wbr&gt;ง่ายๆ ของMakefile มี&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ดังนี้ &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="left"&gt;   01. all: ชื่อ โปรแกรม&lt;wbr&gt;ประยุกต์ อ๊อปเจ็ค หรือ โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;คอมไพล์&lt;br&gt;   02. ชื่อ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์: ชื่อ&lt;wbr&gt;แฟ้ม&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;wbr&gt;ตาม&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ข้างล่าง&lt;wbr&gt;นี้&lt;br&gt;   03. &amp;lt;-- Tab --&amp;gt; คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;br&gt;   04. ชื่อ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล: ชื่อ&lt;wbr&gt;แฟ้ม&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;wbr&gt;ตาม&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ข้างล่าง&lt;wbr&gt;นี้&lt;br&gt;   05. &amp;lt;-- Tab --&amp;gt; คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;br&gt;   06. อื่นๆ:&lt;br&gt;   07. &amp;lt;-- Tab --&amp;gt; คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;br&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;   โครงสร้าง&lt;wbr&gt;ของ Makefile &lt;/div&gt; &lt;p&gt;   คำ&lt;wbr&gt;ว่า ``Tab" ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 03, 05 และ 07 หมายถึง&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;แป้น&lt;wbr&gt;อักษร Tab ใน&lt;wbr&gt;การ&lt;wbr&gt;เว้น&lt;wbr&gt;ระยะ ถ้า&lt;wbr&gt;ใช้&lt;wbr&gt;อย่าง&lt;wbr&gt;อื่น เมื่อ&lt;wbr&gt;สั่ง&lt;wbr&gt;โปรแกรม make จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ถูกต้อง โครงสร้าง&lt;wbr&gt;ดังกล่าว&lt;wbr&gt;นี้&lt;wbr&gt;เป็น&lt;wbr&gt;เพียง&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ง่ายๆ สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม make ทำงาน หาก&lt;wbr&gt;ต้องการ&lt;wbr&gt;รายละเอียด&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;คง&lt;wbr&gt;ต้องหา&lt;wbr&gt;จาก&lt;wbr&gt;เอกสารอ้างอิง&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ให้&lt;wbr&gt;รายละเอียด&lt;wbr&gt;ได้&lt;wbr&gt;มาก&lt;wbr&gt;กว่า แล้ว&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ประโยชน์&lt;wbr&gt;จาก&lt;wbr&gt;มัน&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ขึ้น&lt;wbr&gt;อีก&lt;wbr&gt;มาก จาก&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;ลอง&lt;wbr&gt;มา&lt;wbr&gt;ดู&lt;wbr&gt;ตัวอย่าง Makefile กัน &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="left"&gt;   01. all: hello_app hello_rt.o&lt;br&gt;   02. CC=kgcc&lt;br&gt;   03. hello_app: hello_app.c common.h&lt;br&gt;   04. ${CC} `rtl-config --include` -Wall -O2 hello_app.c -o hello_app&lt;br&gt;   05. hello_rt.o: hello_rt.c common.h&lt;br&gt;   06. ${CC} `rtl-config --cflags` -c hello_rt.c -o hello_rt.o&lt;br&gt;   07. clean:&lt;br&gt;   08. rm -f * .o *~ hello_app&lt;br&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;   ตัวอย่าง&lt;wbr&gt;แฟ้มข้อมูล Makefile &lt;/div&gt; &lt;p&gt;   เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;เรียก&lt;wbr&gt;คำสั่ง ``make" โปรแกรม make จะ&lt;wbr&gt;ไป&lt;wbr&gt;ดู&lt;wbr&gt;รายละเอียด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ชื่อ Makefile โดย&lt;wbr&gt;ปริยาย(หาก&lt;wbr&gt;เก็บ Makefile ไว้&lt;wbr&gt;ใน&lt;wbr&gt;ชื่อ&lt;wbr&gt;อื่น&lt;wbr&gt;เช่น mymakefile ให้&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``make -f mymakefile") และ&lt;wbr&gt;หาก&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;โปรแกรม make โดย&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;อาร์กิวเมนต์&lt;wbr&gt;อื่น มัน&lt;wbr&gt;จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่ all: ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 01 จาก&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ก็&lt;wbr&gt;คือ&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ตาม hello_app: และ hello_rt: โดย&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่&lt;wbr&gt;ตาม&lt;wbr&gt;มา เช่น hello_app: ก็&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 04 แต่ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ก่อน&lt;wbr&gt;ว่า โปรแกรม hello_app มี&lt;wbr&gt;อยู่&lt;wbr&gt;หรือ&lt;wbr&gt;ไม่ ถ้า&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;จึง&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้ แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;มี โปรแกรม make ก็&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ชื่อ&lt;wbr&gt;แฟ้ม&lt;wbr&gt;ที่&lt;wbr&gt;ตาม hello_app มา ใน&lt;wbr&gt;ที่นี้&lt;wbr&gt;คือ hello_app.c และ common.h หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เปลี่ยนแปลง&lt;wbr&gt;หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;เคย&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โปรแกรม hello_app ไว้&lt;wbr&gt;แล้ว&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 04 อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;หนึ่ง ส่วน&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 02 เป็น&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;ให้ CC เพื่อ&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 04 และ 06 &lt;/p&gt; &lt;p&gt;   เพื่อ&lt;wbr&gt;ความ&lt;wbr&gt;เข้าใจ&lt;wbr&gt;ยิ่ง&lt;wbr&gt;ขึ้น ถ้า&lt;wbr&gt;เรา&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``make clean" โปรแกรม make จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 08 ทันที&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;คิด&lt;wbr&gt;อะไร&lt;wbr&gt;ให้&lt;wbr&gt;มาก และ&lt;wbr&gt;ถ้า&lt;wbr&gt;เรา&lt;wbr&gt;สั่ง ``make hello_rt.o" โปรแกรม make ก็&lt;wbr&gt;จะ&lt;wbr&gt;จัดการ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เฉพาะ hello_rt.o: แล้ว&lt;wbr&gt;ถ้า&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;จะ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;เฉพาะ&lt;wbr&gt;โปรแกรม hello_app ล่ะ ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;คิด&lt;wbr&gt;ว่า&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;สั่ง&lt;wbr&gt;อย่างไร ถ้า&lt;wbr&gt;ตอบ&lt;wbr&gt;ได้&lt;wbr&gt;ทันที&lt;wbr&gt;ก็&lt;wbr&gt;แสดง&lt;wbr&gt;ว่า&lt;wbr&gt;พอจะ&lt;wbr&gt;เข้าใจ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม make แล้ว แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;ตอบ&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;ไว้&lt;wbr&gt;มา&lt;wbr&gt;ตอบ&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;หลังจาก&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;พัฒนา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt และ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม hello_app ซึ่ง&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;ใช้&lt;wbr&gt;โปรแกรม make กัน รับรอง&lt;wbr&gt;ว่า&lt;wbr&gt;คราวนี้&lt;wbr&gt;ตอบ&lt;wbr&gt;ได้&lt;wbr&gt;แน่นอน&lt;wbr&gt;ครับ &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;   &lt;a name="SECTION00130000000000000000"&gt; 3 FIFO เข้า&lt;wbr&gt;ก่อน&lt;wbr&gt;ออก&lt;wbr&gt;ก่อน&lt;/a&gt; &lt;/h1&gt; &lt;p&gt;   FIFO(First In First Out) หรือ เข้า&lt;wbr&gt;ก่อน&lt;wbr&gt;ออก&lt;wbr&gt;ก่อน&lt;wbr&gt;คือ&lt;wbr&gt;วิธีการ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;กระบวนการ&lt;wbr&gt;วิธี&lt;wbr&gt;หนึ่ง เป็น&lt;wbr&gt;ชื่อ&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;มา&lt;wbr&gt;จาก&lt;wbr&gt;ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ถ่ายเท&lt;wbr&gt;ข้อมูล โดย&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;ส่ง&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน FIFO ก่อน&lt;wbr&gt;หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;จะ&lt;wbr&gt;ถูก&lt;wbr&gt;เรียก&lt;wbr&gt;ออก&lt;wbr&gt;มา&lt;wbr&gt;ก่อน ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;1&lt;/a&gt; ใน RTLinux ได้&lt;wbr&gt;จัดเตรียม&lt;wbr&gt;วิธีการ&lt;wbr&gt;สร้าง FIFO ให้ การ&lt;wbr&gt;สร้าง&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;สร้าง&lt;wbr&gt;ด้วย&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล การ&lt;wbr&gt;อ่าน&lt;wbr&gt;และ&lt;wbr&gt;เขียน&lt;wbr&gt;ลง&lt;wbr&gt;ไป&lt;wbr&gt;ใน FIFO จึง&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;ทั้ง&lt;wbr&gt;จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;และ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ โดย&lt;wbr&gt;ปกติ&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;สร้าง FIFO ได้&lt;wbr&gt;ทั้งหมด 64 ชุด(เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;จำนวน&lt;wbr&gt;ชุด&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;แก้ตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ RTLinux ใน&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ที่&lt;wbr&gt;เกี่ยวกับ Driver) ขนาด&lt;wbr&gt;หน่วยความจำ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;สร้าง FIFO แต่ละ&lt;wbr&gt;ชุด&lt;wbr&gt;รวม&lt;wbr&gt;กัน&lt;wbr&gt;แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;ถูก&lt;wbr&gt;จำกัด&lt;wbr&gt;โดย&lt;wbr&gt;ขนาด&lt;wbr&gt;หน่วยความจำ&lt;wbr&gt;ของ&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์ &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;   &lt;a name="fig:fifo:fifo-art"&gt;&lt;/a&gt;&lt;a name="565"&gt;&lt;/a&gt;   &lt;table&gt;     &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ FIFO&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;div align="center"&gt;           &lt;img src="http://docs.google.com/File?id=dhdj5j7_59f8wzvp" style="height: 147px; width: 681px;"&gt;         &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt; &lt;p&gt;   การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ของ FIFO ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;เฉพาะ&lt;wbr&gt;แต่&lt;wbr&gt;ใน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ FIFO เหมือน&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ทั่วไป&lt;wbr&gt;ผ่าน&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ชื่อ ``/dev/rtf{fifo}" (เมื่อ fifo มี&lt;wbr&gt;ค่า&lt;wbr&gt;ได้&lt;wbr&gt;ตั้งแต่ 0 ถึง 63) ที่&lt;wbr&gt;ถูก&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น&lt;wbr&gt;จาก&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux หาก&lt;wbr&gt;คอม&lt;wbr&gt;พิวเตอ์&lt;wbr&gt;ของ&lt;wbr&gt;ท่าน&lt;wbr&gt;ใด&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ให้&lt;wbr&gt;ไป&lt;wbr&gt;ที่&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่&lt;wbr&gt;ของ RTLinux ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;แล้ว&lt;wbr&gt;สั่ง ``make install" &lt;/p&gt; &lt;p&gt;   นอกจาก FIFO จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ทางผ่าน&lt;wbr&gt;ของ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;แล้ว RTLinux ยัง&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;ขึ้น&lt;wbr&gt;หาก&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน FIFO ด้วย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;หรือ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;งาน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ให้&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;กัน ตอนนี้&lt;wbr&gt;เรา&lt;wbr&gt;ก็&lt;wbr&gt;รู้จัก&lt;wbr&gt;กับ FIFO พอสมควร&lt;wbr&gt;แล้ว ได้&lt;wbr&gt;เวลา&lt;wbr&gt;มา&lt;wbr&gt;พัฒนา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt กัน&lt;wbr&gt;แล้ว&lt;wbr&gt;ครับ &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;   &lt;a name="SECTION00140000000000000000"&gt; 4 hello_rt โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;รุ่น&lt;wbr&gt;พัฒนา&lt;/a&gt; &lt;/h1&gt; &lt;p&gt;   ก่อน&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ต่อ&lt;wbr&gt;จาก&lt;wbr&gt;ตอน&lt;wbr&gt;ที่แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;สามารถ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ได้ หลักๆ แล้ว&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;เพิ่ม FIFO เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง&lt;wbr&gt;จาก&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;และ&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;แสดง&lt;wbr&gt;ผล&lt;wbr&gt;หรือ&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;แฟ้มข้อมูล อันดับ&lt;wbr&gt;แรก&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;สร้าง&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ชื่อ ``common.h" เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;อ้างอิง&lt;wbr&gt;ค่า&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;ทั้ง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง&lt;wbr&gt;และ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ร่วม&lt;wbr&gt;กัน &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="left"&gt;   01. #ifndef _COMMON_H_&lt;br&gt;   02. #define&lt;tt&gt;&lt;/tt&gt; _COMMON_H_ &lt;br&gt;   03. #define COMMAND_FIFO 0 &lt;br&gt;   04. #define DATA_FIFO 1 &lt;br&gt;   05. #define COMM_FIFO_SIZE 20 &lt;br&gt;   06. #define DATA_FIFO_SIZE 4000 &lt;br&gt;   07. #define START 0 &lt;br&gt;   08. #define STOP 1 &lt;br&gt;   09. &lt;b&gt;struct&lt;/b&gt; data_struct{ &lt;br&gt; 10.      &lt;b&gt;unsigned int&lt;/b&gt; count; &lt;br&gt;   11.  &lt;b&gt;    unsigned int&lt;/b&gt; period; &lt;br&gt;   12. }; &lt;br&gt;   13. &lt;b&gt;struct&lt;/b&gt; command_struct{ &lt;br&gt;   14.  &lt;b&gt;    unsigned char&lt;/b&gt; command; &lt;br&gt;   15.  &lt;b&gt;    hrtime_t&lt;/b&gt; period; &lt;br&gt;   16. }; &lt;br&gt;   17. #endif  // &lt;i&gt;_COMMON_H_&lt;/i&gt;  &lt;/div&gt;      &lt;p&gt; &lt;/p&gt;   &lt;div align="center"&gt; รายละเอียด common.h  &lt;/div&gt;       &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 03 และ 04 จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สร้าง FIFO บรรทัด&lt;wbr&gt;ที่ 05 และ 06 ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ขนาด&lt;wbr&gt;ของ FIFO มี&lt;wbr&gt;หน่วย&lt;wbr&gt;เป็น bytes บรรทัด&lt;wbr&gt;ที่ 07 และ 08 เป็น&lt;wbr&gt;ค่า&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง โครงสร้าง data_struct เป็น&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ ใน&lt;wbr&gt;ขณะที่&lt;wbr&gt;โครงสร้าง command_struct จะ&lt;wbr&gt;เป็น&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  &lt;/p&gt;   &lt;p&gt; count ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 10 จะ&lt;wbr&gt;หมายถึง&lt;wbr&gt;รอบ&lt;wbr&gt;ที่ &lt;i&gt;thread&lt;/i&gt; เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ทำงาน และ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;โดย&lt;wbr&gt;ประมาณ&lt;wbr&gt;เท่า&lt;wbr&gt;กับ&lt;wbr&gt;ค่า period ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่11 มี&lt;wbr&gt;หน่วย&lt;wbr&gt;เป็น&lt;wbr&gt;นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที ส่วน command ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 14 จะ&lt;wbr&gt;เป็น&lt;wbr&gt;คำสั่ง START ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง  หรือ STOP ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง หาก&lt;wbr&gt;เป็น START โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา period ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 15 มี&lt;wbr&gt;หน่วย&lt;wbr&gt;เป็น&lt;wbr&gt;นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที เมื่อ&lt;wbr&gt;ได้&lt;wbr&gt;ข้อกำหนด&lt;wbr&gt;ต่างๆ เหล่านี้&lt;wbr&gt;แล้ว  เรา&lt;wbr&gt;มา&lt;wbr&gt;ดู&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ที่&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;แล้ว&lt;wbr&gt;ดังต่อไปนี้  &lt;/p&gt;   &lt;p&gt; &lt;/p&gt; &lt;div align="left"&gt;01. #include &amp;lt;linux/module.h&amp;gt;&lt;br&gt;   02. #include &amp;lt;rtl.h&amp;gt;&lt;br&gt;   03. #include &amp;lt;pthread.h&amp;gt;&lt;br&gt;   04. #include &amp;lt;rtl_fifo.h&amp;gt;&lt;br&gt;   05. #include &amp;lt;linux/errno.h&amp;gt;&lt;br&gt;   06. #include "common.h&lt;tt&gt;&lt;/tt&gt;" &lt;br&gt;   07. MODULE_AUTHOR(&lt;tt&gt;"XXX"&lt;/tt&gt;); &lt;br&gt;   08. MODULE_LICENSE(&lt;tt&gt;"GPL"&lt;/tt&gt;); &lt;br&gt;   09. MODULE_DESCRIPTION(&lt;tt&gt;"EXAMPLE PROGRAM"&lt;/tt&gt;); &lt;br&gt;   10. pthread_t periodic_thread; &lt;br&gt;   11. &lt;b&gt;char&lt;/b&gt; command_stop = 0; &lt;br&gt;   12. &lt;b&gt;void&lt;/b&gt; *  periodic_function( &lt;b&gt;void&lt;/b&gt; * arg ) &lt;br&gt;   13. { &lt;br&gt; 14.  &lt;b&gt;    struct&lt;/b&gt; data_struct data; &lt;br&gt;   15.      hrtime_t time,time_old; &lt;br&gt;   16.  &lt;b&gt;    int&lt;/b&gt; count=0; &lt;br&gt;   17.      time_old = gethrtime( ); &lt;br&gt;   18.      &lt;b&gt;while&lt;/b&gt;( 1 ) &lt;br&gt;   19.      { &lt;br&gt;   20.          pthread_wait_np( ); &lt;br&gt;   21.  &lt;b&gt;        if&lt;/b&gt;( command_stop != 0 ) &lt;br&gt;   22.              pthread_suspend_np( pthread_self( ) ); &lt;br&gt;   23.              rtl_printf(&lt;tt&gt;"%d t Hello World! n"&lt;/tt&gt;,++count); &lt;br&gt;   24.              data.count = count; &lt;br&gt;   25.              time = gethrtime( ); &lt;br&gt;   26.              data.period = time-time_old; &lt;br&gt;   27.              rtf_put( DATA_FIFO, &amp;amp;data, &lt;b&gt;sizeof&lt;/b&gt;(data) ); &lt;br&gt;   28.              time_old = time; &lt;br&gt;   29.      } &lt;br&gt;   30.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;   31. } &lt;br&gt;   32. &lt;b&gt;int&lt;/b&gt; fifo_handler( &lt;b&gt;unsigned&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; handler ) &lt;br&gt;   33. { &lt;br&gt;   34.  &lt;b&gt;    struct&lt;/b&gt; command_struct ctl; &lt;br&gt;   35.  &lt;b&gt;    int&lt;/b&gt; err; &lt;br&gt;   36.  &lt;b&gt;    if&lt;/b&gt;( (err = rtf_get( COMMAND_FIFO, &amp;amp;ctl, &lt;b&gt;sizeof&lt;/b&gt;(ctl)  ) == &lt;b&gt;sizeof&lt;/b&gt;(ctl )) ) &lt;br&gt;   37.  &lt;b&gt;        switch&lt;/b&gt;( ctl.command ) &lt;br&gt;   38.          { &lt;br&gt;   39.  &lt;b&gt;            case&lt;/b&gt; START: &lt;br&gt;   40.                  command_stop = 0; &lt;br&gt;   41.                  pthread_make_periodic_np( periodic_thread, gethrtime( ), ctl.period ); &lt;br&gt;   42.                  &lt;b&gt;break&lt;/b&gt;; &lt;br&gt;   43.  &lt;b&gt;            case&lt;/b&gt; STOP: &lt;br&gt;   44.                  command_stop = 1; &lt;br&gt;   45.  &lt;b&gt;                break&lt;/b&gt;; &lt;br&gt;   46.  &lt;b&gt;            default&lt;/b&gt;: &lt;br&gt;   47.  &lt;b&gt;                break&lt;/b&gt;; &lt;br&gt;   48.          } &lt;br&gt;   49.  &lt;b&gt;    else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt;( err != 0 ) &lt;br&gt;   50.      { &lt;br&gt;   51.  &lt;b&gt;        return&lt;/b&gt; -EINVAL; &lt;br&gt;   52.      } &lt;br&gt;   53.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;   54. } &lt;br&gt;   55. &lt;b&gt;int&lt;/b&gt; init_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;   56. { &lt;br&gt;   57.  &lt;b&gt;    struct&lt;/b&gt; sched_param p; &lt;br&gt;   58.      rtf_create( COMMAND_FIFO, COMM_FIFO_SIZE ); &lt;br&gt;   59.      rtf_create( DATA_FIFO, DATA_FIFO_SIZE ); &lt;br&gt;   60.      pthread_create( &amp;amp;periodic_thread, NULL, periodic_function, 0 );  &lt;br&gt;   61.      p.sched_priority = 1; &lt;br&gt;   62.      pthread_setschedparam( periodic_thread, SCHED_FIFO, &amp;amp;p ); &lt;br&gt;   63.      rtf_create_handler( COMMAND_FIFO, &amp;amp;fifo_handler ); &lt;br&gt;   64.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;   65. } &lt;br&gt;   66. &lt;b&gt;void&lt;/b&gt; cleanup_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;   67. { &lt;br&gt;   68.      rtf_destroy( COMMAND_FIFO ); &lt;br&gt;   69.      rtf_destroy( DATA_FIFO ); &lt;br&gt;   70.      pthread_delete_np( periodic_thread ); &lt;br&gt;   71.      printk(&lt;tt&gt;"Byen"&lt;/tt&gt;); &lt;br&gt;   72. } &lt;/div&gt;      &lt;p&gt; &lt;/p&gt;   &lt;div align="center"&gt; ต้น&lt;wbr&gt;รหัส hello_rt.c  &lt;/div&gt;        &lt;p&gt; จาก&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส hello_rt.c จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ของ RTLinux ที่&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;มา&lt;wbr&gt;ประกอบ&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย&lt;wbr&gt;ฟังก์ชัน rtf_create( ), rtf_destroy( ), rtf_create_handler( ), rtf_put( ) และ rtf_get( ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;จัดการ&lt;wbr&gt;เกี่ยวกับ FIFO นอกจากนี้&lt;wbr&gt;ยัง&lt;wbr&gt;มี&lt;wbr&gt;ฟังก์ชัน pthread_suspend_pn( ) ที่&lt;wbr&gt;ใช้&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ส่วน&lt;wbr&gt;ฟังก์ชัน fifo_handler( ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;เพื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ &lt;i&gt;thread&lt;/i&gt; เวลาจริง&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน ลอง&lt;wbr&gt;มา&lt;wbr&gt;ดู&lt;wbr&gt;รายละเอียด&lt;wbr&gt;ทีละ&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;กัน&lt;wbr&gt;ครับ  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;ol&gt;   &lt;li&gt;int rtf_create( unsigned int fifo, int size ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;สร้าง FIFO ค่าตัวแปร fifo เป็น&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;บอก&lt;wbr&gt;ว่า&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;สร้าง FIFO ตัว&lt;wbr&gt;ใด โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;จะ&lt;wbr&gt;อ้างอิง&lt;wbr&gt;กับ&lt;wbr&gt;แฟ้มข้อมูล /dev/rtf{fifo} เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ FIFO เช่น ถ้า fifo เท่า&lt;wbr&gt;กับ 1 โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน  FIFO ตัว&lt;wbr&gt;นี้&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;การ&lt;wbr&gt;เปิด&lt;wbr&gt;แฟ้มข้อมูล /dev/rtf1 เป็นต้น การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ควร&lt;wbr&gt;เรียก&lt;wbr&gt;ใน&lt;wbr&gt;ฟังก์ชัน  init_modules( ) ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า 0 ถ้า&lt;wbr&gt;ทำงาน&lt;wbr&gt;สำเร็จ แต่&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ติดลบ&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น   &lt;/li&gt;   &lt;li&gt;int rtf_destroy( unsigned int fifo ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ลบ FIFO  ตัว&lt;wbr&gt;ที่ fifo การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ควร&lt;wbr&gt;เรียก&lt;wbr&gt;ใน&lt;wbr&gt;ฟังก์ชัน cleanup_modules( ) ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า  0 ถ้า&lt;wbr&gt;ทำงาน&lt;wbr&gt;สำเร็จ แต่&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ติดลบ&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น  &lt;/li&gt;   &lt;li&gt;int rtf_create_handler( unsigned int fifo, int (* handler)() ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้&lt;wbr&gt;ฟังก์ชัน  handler( ) ถูก&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ทุก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน FIFO ตัว&lt;wbr&gt;ที่ fifo โดย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์  แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;หาก&lt;wbr&gt;ต้องการ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ทุก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน FIFO โดย&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล(ใช้&lt;wbr&gt;ฟังก์ชัน  rtf_get( ) หรือ rtf_put( )) ให้&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน rtf_create_rt_handler( ) แทน ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า  0 ถ้า&lt;wbr&gt;ทำงาน&lt;wbr&gt;สำเร็จ แต่&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ติดลบ&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น  &lt;/li&gt;   &lt;li&gt;int rtf_get( unsigned int fifo, char * buf, int count ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก FIFO ตัว&lt;wbr&gt;ที่ fifo เป็น&lt;wbr&gt;จำนวน count ใน&lt;wbr&gt;หน่วย bytes และ&lt;wbr&gt;อ่าน&lt;wbr&gt;เสร็จ&lt;wbr&gt;จะ&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ใน&lt;wbr&gt;ตัวแปร buf การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เรียก&lt;wbr&gt;ภายใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เท่านั้น ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เป็น&lt;wbr&gt;ขนาด&lt;wbr&gt;ของ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;ใน&lt;wbr&gt;หน่วย bytes อาจ&lt;wbr&gt;จะ&lt;wbr&gt;น้อย&lt;wbr&gt;กว่า&lt;wbr&gt;ค่า count ถ้า&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่อยู่&lt;wbr&gt;ใน FIFO มี&lt;wbr&gt;ไม่&lt;wbr&gt;ถึง แต่&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ติดลบ&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น   &lt;/li&gt;   &lt;li&gt;int rtf_put( unsigned int fifo, char * buf, int count ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก&lt;wbr&gt;ตัวแปร buf ลง&lt;wbr&gt;ใน FIFO ตัว&lt;wbr&gt;ที่ fifo เป็น&lt;wbr&gt;จำนวน count ใน&lt;wbr&gt;หน่วย bytes การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เรียก&lt;wbr&gt;ภายใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เท่านั้น ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เป็น&lt;wbr&gt;ขนาด&lt;wbr&gt;ของ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;เขียน&lt;wbr&gt;ได้&lt;wbr&gt;มี&lt;wbr&gt;ค่า&lt;wbr&gt;เท่า&lt;wbr&gt;กับ count แต่&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ติดลบ&lt;wbr&gt;ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น   &lt;/li&gt;   &lt;li&gt;int pthread_suspend_np( pthread_t thread ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ thread ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;ระบบ&lt;wbr&gt;มี&lt;wbr&gt;หนึ่ง&lt;wbr&gt;หน่วยประมวลผลกลาง เมื่อ&lt;wbr&gt;เรียก&lt;wbr&gt;คำสั่ง&lt;wbr&gt;นี้ thread จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ทันที หาก&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้ thread กลับ&lt;wbr&gt;มา&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อ&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชันpthread_wakeup_np( pthread_t thread ) หรือ อาจ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน pthread_make_periodic_np( ) เพื่อ&lt;wbr&gt;กำหนด&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใหม่&lt;wbr&gt;และ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง  ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เป็น0 เสมอ  &lt;/li&gt;     &lt;/ol&gt;   เมื่อ&lt;wbr&gt;รู้&lt;wbr&gt;ว่า&lt;wbr&gt;แต่&lt;wbr&gt;ล่ะ&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;เอา&lt;wbr&gt;ไว้&lt;wbr&gt;ทำ&lt;wbr&gt;อะไร&lt;wbr&gt;แล้ว ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;พอจะ&lt;wbr&gt;รู้&lt;wbr&gt;หรือ&lt;wbr&gt;ไม่ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ทำงาน&lt;wbr&gt;อย่างไร ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;คิด&lt;wbr&gt;นาน&lt;wbr&gt;ครับ มา&lt;wbr&gt;อ่าน&lt;wbr&gt;กัน&lt;wbr&gt;ต่อ&lt;wbr&gt;ดี&lt;wbr&gt;กว่า เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel มัน&lt;wbr&gt;จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน init_module( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่  56-66 มี&lt;wbr&gt;การ&lt;wbr&gt;สร้าง FIFO ขึ้น 2 ตัว COMMAND_FIFO สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง&lt;wbr&gt;จาก&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ ส่วน DATA_FIFO ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ไป&lt;wbr&gt;ยัง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;สร้าง &lt;i&gt;thread&lt;/i&gt; ชื่อ periodic_thread ที่ทำงาน&lt;wbr&gt;โดย&lt;wbr&gt;ฟังก์ชัน periodic_function( )(หลังจาก&lt;wbr&gt;การ&lt;wbr&gt;สร้าง  periodic_thread ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;จนถึง&lt;wbr&gt;คำสั่ง pthread_wait_np( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 20 ทันที) และ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน fifo_handler( ) ทุก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;หรือ&lt;wbr&gt;เขียน COMMAND_FIFO โดย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์    &lt;p&gt; หลังจาก&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน init_module( ) แล้ว โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt จะ&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใดๆ ทั้งสิ้น&lt;wbr&gt;จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เขียน COMMAND_FIFO โดย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ จาก&lt;wbr&gt;พฤติกรรม&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;งาน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ได้ สมมติ&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เขียน COMMAND_FIFO ด้วย&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;เป็น  command_struct โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ก็&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ฟังก์ชัน fifo_handler( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่  32-55 ใน&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า&lt;wbr&gt;คำสั่ง&lt;wbr&gt;จาก&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ หาก&lt;wbr&gt;เป็น START มัน&lt;wbr&gt;จะ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้  periodic_thread เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;เท่า&lt;wbr&gt;กับ&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ส่ง&lt;wbr&gt;มา&lt;wbr&gt;ทันที แต่&lt;wbr&gt;หาก&lt;wbr&gt;เป็น STOP มัน&lt;wbr&gt;จะ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่าตัวแปร command_stop เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ของ periodic_thread  &lt;/p&gt;   &lt;p&gt; เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ periodic_thread มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ ฟังก์ชัน periodic_function( )  จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อ&lt;wbr&gt;จาก&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 20 มี&lt;wbr&gt;การ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ว่า command_stop มี&lt;wbr&gt;ค่า&lt;wbr&gt;เท่า&lt;wbr&gt;กับ0 หรือ&lt;wbr&gt;ไม่ ถ้า&lt;wbr&gt;ไม่&lt;wbr&gt;เท่า&lt;wbr&gt;กับ 0 มัน&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ทันที แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;เท่า&lt;wbr&gt;กับ  0 มัน&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 23-28  &lt;/p&gt;   &lt;p&gt; ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 23-28 จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เก็บ&lt;wbr&gt;ค่า&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์ ค่า&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;มี&lt;wbr&gt;ค่า count และ&lt;wbr&gt;ค่า&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน period โดย&lt;wbr&gt;ประมาณ จากนั้น&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ในDATA_FIFO เพื่อให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;มา&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า และ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;แสดง&lt;wbr&gt;ผล&lt;wbr&gt;ต่อไป  &lt;/p&gt;   &lt;p&gt; ผู้อ่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;สัย&lt;wbr&gt;ว่า&lt;wbr&gt;ตัวแปร command_stop มี&lt;wbr&gt;ไว้&lt;wbr&gt;ทำไม ไม่&lt;wbr&gt;เห็น&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;เลย&lt;wbr&gt;ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ periodic_thread หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ได้&lt;wbr&gt;ตั้งแต่&lt;wbr&gt;ใน&lt;wbr&gt;ฟังก์ชัน fifo_handler( )  ที่&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;ดังนี้&lt;wbr&gt;เพื่อ&lt;wbr&gt;ป้องกัน&lt;wbr&gt;ปัญหา&lt;wbr&gt;ที่&lt;wbr&gt;อาจ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน periodic_function( )  กำลัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;อยู่&lt;wbr&gt;แต่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เหล่านั้น&lt;wbr&gt;จะ&lt;wbr&gt;เสร็จ วิธีการ&lt;wbr&gt;ที่&lt;wbr&gt;ดี&lt;wbr&gt;ที่สุด&lt;wbr&gt;จึง&lt;wbr&gt;ต้อง&lt;wbr&gt;ให้&lt;wbr&gt;ฟังก์ชัน periodic_function( ) สั่ง&lt;wbr&gt;ตัวเอง&lt;wbr&gt;ให้&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน ตอนนี้&lt;wbr&gt;ก็&lt;wbr&gt;คง&lt;wbr&gt;พอจะ&lt;wbr&gt;รู้&lt;wbr&gt;บ้าง&lt;wbr&gt;แล้ว&lt;wbr&gt;น่ะ&lt;wbr&gt;ครับ&lt;wbr&gt;ว่า&lt;wbr&gt;สิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt นั้น&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;อะไร&lt;wbr&gt;บ้าง  ต่อไป&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;งาน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;แล้ว&lt;wbr&gt;น่ะ&lt;wbr&gt;ครับ  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00150000000000000000"&gt; 5 โปรแกรม&lt;wbr&gt;ประยุกต์ hello_app&lt;/a&gt;  &lt;/h1&gt;      &lt;p&gt; จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา หัวข้อ&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ชื่อ hello_app เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;งาน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล ใน&lt;wbr&gt;ขณะเดียวกัน&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;คอย&lt;wbr&gt;รับ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ด้วย มา&lt;wbr&gt;ดู&lt;wbr&gt;กัน&lt;wbr&gt;เลย&lt;wbr&gt;ครับ   &lt;/p&gt;   &lt;p&gt;   &lt;/p&gt;   &lt;p&gt; &lt;/p&gt;   &lt;div align="left"&gt; 01. #include &amp;lt;stdio.h&amp;gt;&lt;br&gt;   02. #include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;   03. #include &amp;lt;unistd.h&amp;gt;&lt;br&gt;   04. #include &amp;lt;rtl_time.h&amp;gt;&lt;br&gt;   05. #include "common.h"&lt;br&gt;   06. &lt;b&gt;int&lt;/b&gt; main( &lt;b&gt;void&lt;/b&gt; ) &lt;br&gt;   07. { &lt;br&gt;   08.      &lt;b&gt;int&lt;/b&gt; fd_data, fd_ctl, i; &lt;br&gt;   09.  &lt;b&gt;    struct&lt;/b&gt; data_struct data; &lt;br&gt;   10.  &lt;b&gt;    struct&lt;/b&gt; command_struct ctl;  &lt;br&gt;   11.      &lt;b&gt;if&lt;/b&gt; ((fd_data = open(&lt;tt&gt;"/dev/rtf1"&lt;/tt&gt;, O_RDONLY)) &amp;lt;   0) { &lt;br&gt;   12.          printf(&lt;tt&gt;"Error opening /dev/rtf1 n"&lt;/tt&gt;); &lt;br&gt;   13.          exit(1); &lt;br&gt;   14.      } &lt;br&gt;   15.      &lt;b&gt;if&lt;/b&gt; ((fd_ctl = open(&lt;tt&gt;"/dev/rtf0"&lt;/tt&gt;, O_WRONLY)) &amp;lt; 0) { &lt;br&gt;   16.          printf(&lt;tt&gt;"Error opening /dev/rtf0 n"&lt;/tt&gt;); &lt;br&gt;   17.          exit(1); &lt;br&gt;   18.      } &lt;br&gt;   19. /* &lt;i&gt;send command to hello_rt &lt;/i&gt;  */&lt;br&gt;   20.      ctl.command = START; &lt;br&gt;   21.      ctl.period = 1000000000; &lt;br&gt;   22.  &lt;b&gt;    if&lt;/b&gt; (write(fd_ctl, &amp;amp;ctl, &lt;b&gt;sizeof&lt;/b&gt;(ctl)) &amp;lt; 0) { &lt;br&gt;   23.          printf(&lt;tt&gt;"Can't send a command to RT-task n"&lt;/tt&gt;); &lt;br&gt;   24.          exit(1); &lt;br&gt;   25.      } &lt;br&gt;   26. /* &lt;i&gt;read data from hello_rt */&lt;/i&gt;&lt;br&gt;   27.  &lt;b&gt;    for&lt;/b&gt; (i = 0; i &amp;lt; 10 ; i++) { &lt;br&gt;   28.          read(fd_data, &amp;amp;data, &lt;b&gt;sizeof&lt;/b&gt;(data)); &lt;br&gt;   29.          printf(&lt;tt&gt;"Count:=  %d t Period:=   %d ns. n"&lt;/tt&gt;, data.count, data.period ); &lt;br&gt;   30.      } &lt;br&gt;   31. /*  &lt;i&gt;stop the tasks */&lt;/i&gt;&lt;br&gt;   32.      ctl.command = STOP; &lt;br&gt;   33.  &lt;b&gt;    if&lt;/b&gt; (write(fd_ctl, &amp;amp;ctl, &lt;b&gt;sizeof&lt;/b&gt;(ctl)) &amp;lt;  0) { &lt;br&gt;   34.          printf(&lt;tt&gt;"Can't send a command to RT-task n"&lt;/tt&gt;); &lt;br&gt;   35.          exit(1); &lt;br&gt;   36.      } &lt;br&gt;   37.      close( fd_data ); &lt;br&gt;   38.      close( fd_ctl ); &lt;br&gt;   39.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;   40. } &lt;br&gt;   &lt;/div&gt;      &lt;p&gt; &lt;/p&gt;   &lt;div align="center"&gt; ต้น&lt;wbr&gt;รหัส hello_app.c  &lt;/div&gt;        &lt;p&gt; การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม hello_app ไม่&lt;wbr&gt;ซับซ้อน&lt;wbr&gt;อะไร&lt;wbr&gt;มาก&lt;wbr&gt;นัก ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 11-14 เป็น&lt;wbr&gt;การ&lt;wbr&gt;เปิด  FIFO ขึ้น&lt;wbr&gt;มา&lt;wbr&gt;สำหรับ&lt;wbr&gt;อ่าน&lt;wbr&gt;อย่างเดียว เป็น FIFO ตัว&lt;wbr&gt;ที่ 1 หรือ DATA_FIFO เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;รับ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  hello_rt จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;มา&lt;wbr&gt;ให้ ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 15-18 ยัง&lt;wbr&gt;ได้&lt;wbr&gt;เปิด FIFO ขึ้น&lt;wbr&gt;มา&lt;wbr&gt;อีก&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ตัว&lt;wbr&gt;สำหรับ&lt;wbr&gt;เขียน&lt;wbr&gt;อย่างเดียว  เป็น FIFO ตัว&lt;wbr&gt;ที่ 0 หรือ CONTROL_FIFO เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;จาก&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  &lt;/p&gt;   &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 20-25 เป็น&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;ให้&lt;wbr&gt;ตัวแปร ctl และ&lt;wbr&gt;เขียน&lt;wbr&gt;ลง&lt;wbr&gt;ไป&lt;wbr&gt;ใน COMMAND_FIFO  โดย&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน write( ) เพื่อ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ periodic_thread ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา  1,000,000,000 นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที หรือ 1 วินาที  &lt;/p&gt;   &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 27-30 เป็น&lt;wbr&gt;การ&lt;wbr&gt;วน&lt;wbr&gt;รอบ&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จำนวน 10 รอบ&lt;wbr&gt;จาก DATA_FIFO ที่&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ส่ง&lt;wbr&gt;มา&lt;wbr&gt;ให้  เรา&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน read( ) ใน&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ออก&lt;wbr&gt;มา การ&lt;wbr&gt;อ่าน&lt;wbr&gt;ด้วย&lt;wbr&gt;วิธี&lt;wbr&gt;นี้&lt;wbr&gt;หาก&lt;wbr&gt;ใน DATA_FIFO  ไม่&lt;wbr&gt;มี&lt;wbr&gt;ข้อมูล&lt;wbr&gt;อยู่ โปรแกรม hello_app ก็&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ไว้&lt;wbr&gt;ที่&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ฟังก์ชัน read( ) จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่ DATA_FIFO ให้&lt;wbr&gt;อ่าน โปรแกรม&lt;wbr&gt;จึง&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ได้ &lt;/p&gt;   &lt;p&gt; เมื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จน&lt;wbr&gt;ครบ 10 รอบ&lt;wbr&gt;แล้ว ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 32-36 โปรแกรม hello_app  จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ periodic_thread ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง โดย&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ลง&lt;wbr&gt;ไป&lt;wbr&gt;ใน  COMMAND_FIFO อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง STOP  &lt;/p&gt;   &lt;p&gt; ก่อน&lt;wbr&gt;จบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 37,38 ได้&lt;wbr&gt;สั่ง&lt;wbr&gt;ปิด&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ DATA_FIFO และ  COMMAND_FIFO หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ปิด&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ออก&lt;wbr&gt;จาก kernel ได้ จาก&lt;wbr&gt;ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรมhello_app ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;มา&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;ง่าย&lt;wbr&gt;มาก ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ต่อ&lt;wbr&gt;ได้  อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ส่วน&lt;wbr&gt;ที่ทำการ&lt;wbr&gt;บันทึก&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ลง&lt;wbr&gt;แฟ้มข้อมูล หรือ อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ส่วน  Graphical User Interface(GUI) ให้&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ได้&lt;wbr&gt;สะดวก&lt;wbr&gt;ขึ้น หรือ อาจ&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ไป&lt;wbr&gt;แสดง&lt;wbr&gt;เป็น&lt;wbr&gt;กราฟ&lt;wbr&gt;แบบ&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ก็ได้  ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;แบบ GUI เพื่อ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ RTLinux นี้ หาก&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;มี&lt;wbr&gt;เวลา&lt;wbr&gt;พอ&lt;wbr&gt;เรา&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;มา&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประเภท&lt;wbr&gt;นี้&lt;wbr&gt;ด้วย&lt;wbr&gt;กัน  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00160000000000000000"&gt; 6 ตัวอย่าง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ hello_rt  และ hello_app&lt;/a&gt; &lt;/h1&gt;      &lt;p&gt; ได้&lt;wbr&gt;เวลา&lt;wbr&gt;ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;โปรแกรม make กัน&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ แล้ว&lt;wbr&gt;ครับ หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;บันทึก&lt;wbr&gt;แฟ้มข้อมูล Makefile, hello_rt.c, hello_app.c, และ common.h ไว้&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่&lt;wbr&gt;เดียวกัน&lt;wbr&gt;แล้ว ลอง&lt;wbr&gt;สั่ง&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง ``make" ดู&lt;wbr&gt;ครับ ถ้า&lt;wbr&gt;ไม่&lt;wbr&gt;พิมพ์&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ตกหล่น&lt;wbr&gt;ตรง&lt;wbr&gt;ไหน จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่&lt;a&gt;2&lt;/a&gt; ครับ  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;      &lt;div align="center"&gt;&lt;a name="fig:fifo:make"&gt;&lt;/a&gt;&lt;a name="578"&gt;&lt;/a&gt;   &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง  ``make"&lt;/caption&gt; &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;               &lt;div align="center"&gt; &lt;img src="http://docs.google.com/File?id=dhdj5j7_60dn7874" style="height: 164px; width: 750px;"&gt;   &lt;/div&gt;                  &lt;/td&gt;      &lt;/tr&gt;         &lt;/tbody&gt;  &lt;/table&gt;   &lt;/div&gt;       &lt;p&gt; หลังจาก&lt;wbr&gt;ได้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt และ hello_app มา&lt;wbr&gt;ลอง&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง ``./hello_app"  ดู ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แสดง&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;ขึ้น&lt;wbr&gt;เหมือน&lt;wbr&gt;ใน&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;2&lt;/a&gt; เนื่องจาก&lt;wbr&gt;โปรแกรม hello_app ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;เปิด&lt;wbr&gt;แฟ้ม  /dev/rtf1 เพื่อ&lt;wbr&gt;อ่าน&lt;wbr&gt;อย่างเดียว&lt;wbr&gt;ได้&lt;wbr&gt;ถึงแม้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ชื่อ&lt;wbr&gt;แฟ้ม&lt;wbr&gt;นี้&lt;wbr&gt;อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ระบบ&lt;wbr&gt;ก็ตาม ทั้งนี้เพราะ&lt;wbr&gt;ว่า&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ใด&lt;wbr&gt;ทำงาน&lt;wbr&gt;สร้าง  FIFO ตัว&lt;wbr&gt;ที่ 1 ที่&lt;wbr&gt;อ้างอิง&lt;wbr&gt;กับ&lt;wbr&gt;แฟ้ม /dev/rtf1 เลย การ&lt;wbr&gt;สั่ง ``./hello_app" อักษร  ``./" จำเป็น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;เพื่อ&lt;wbr&gt;บอก&lt;wbr&gt;ว่า&lt;wbr&gt;โปรแกรม hello_app อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่&lt;wbr&gt;ปัจจุบัน หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี ``./" แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม hello_app ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;เพราะ&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ค้นหา&lt;wbr&gt;โปรแกรม  hello_app ใน PATH(ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``export" และ&lt;wbr&gt;ดู&lt;wbr&gt;ที่ PATH) ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;ไว้&lt;wbr&gt;เท่านั้น  &lt;/p&gt;   &lt;p&gt; หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;ยังคง&lt;wbr&gt;ไม่&lt;wbr&gt;ลืม&lt;wbr&gt;วิธีการ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel นะ&lt;wbr&gt;ครับ  เมื่อ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel แล้ว&lt;wbr&gt;ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``dmesg" จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  hello_rt ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง ``./hello_app"  จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;3&lt;/a&gt; เมื่อ&lt;wbr&gt;สั่ง ``dmesg" จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป &lt;a&gt;4&lt;/a&gt; จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;จำนวน 10 รอบ&lt;wbr&gt;เท่านั้น&lt;wbr&gt;ตาม&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ไว้&lt;wbr&gt;ใน&lt;wbr&gt;โปรแกรม  hello_rt คราวนี้&lt;wbr&gt;ลอง&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง ``./hello_app" อีก&lt;wbr&gt;ครั้ง จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;5&lt;/a&gt; จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt  จะ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อ&lt;wbr&gt;จาก&lt;wbr&gt;เดิม ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใหม่&lt;wbr&gt;ทั้งหมด&lt;wbr&gt;ดู&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;ค่า count ที่&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ขึ้น&lt;wbr&gt;เป็น  11-20  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;      &lt;div align="center"&gt;&lt;a name="fig:fifo:hello_app"&gt;&lt;/a&gt;&lt;a name="579"&gt;&lt;/a&gt;   &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง  ``hello_app"&lt;/caption&gt; &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;               &lt;div align="center"&gt; &lt;img src="http://docs.google.com/File?id=dhdj5j7_61cxnj77" style="height: 190px; width: 751px;"&gt;   &lt;/div&gt;                  &lt;/td&gt;      &lt;/tr&gt;         &lt;/tbody&gt;  &lt;/table&gt;   &lt;/div&gt;       &lt;p&gt;  &lt;/p&gt;      &lt;div align="center"&gt;&lt;a name="fig:fifo:dmesg"&gt;&lt;/a&gt;&lt;a name="580"&gt;&lt;/a&gt;   &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง  ``dmesg"&lt;/caption&gt; &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;               &lt;div align="center"&gt; &lt;img style="height: 188px; width: 750px;" src="http://docs.google.com/File?id=dhdj5j7_62dc95hx"&gt;   &lt;/div&gt;                  &lt;/td&gt;      &lt;/tr&gt;         &lt;/tbody&gt;  &lt;/table&gt;   &lt;/div&gt;       &lt;p&gt;  &lt;/p&gt;      &lt;div align="center"&gt;&lt;a name="fig:fifo:hello_app-again"&gt;&lt;/a&gt;&lt;a name="581"&gt;&lt;/a&gt;   &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คำสั่ง  ``hello_app" อีก&lt;wbr&gt;ครั้ง&lt;/caption&gt; &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;               &lt;div align="center"&gt; &lt;img style="height: 328px; width: 746px;" src="http://docs.google.com/File?id=dhdj5j7_63c5mzbk"&gt;   &lt;/div&gt;                  &lt;/td&gt;      &lt;/tr&gt;         &lt;/tbody&gt;  &lt;/table&gt;   &lt;/div&gt;       &lt;p&gt;ค่า Period ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;มี&lt;wbr&gt;ค่า&lt;wbr&gt;ใกล้เคียง 1 วินาที&lt;wbr&gt;ตาม&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;กำหนด&lt;wbr&gt;ไว้ ตั้งแต่&lt;wbr&gt;ตอน&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;เคย&lt;wbr&gt;สงสัย&lt;wbr&gt;ไหม&lt;wbr&gt;ว่า เรา&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ได้&lt;wbr&gt;สั้น&lt;wbr&gt;ที่สุด&lt;wbr&gt;เท่าใด&lt;wbr&gt;ที่&lt;wbr&gt;เครื่อง&lt;wbr&gt;จะ&lt;wbr&gt;ยังคง&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ได้ เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;ทดลอง&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;การ&lt;wbr&gt;ลด&lt;wbr&gt;ค่า ctr.period ใน&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส hello_app.c ดู&lt;wbr&gt;ครับ เมื่อ&lt;wbr&gt;แก้ไข&lt;wbr&gt;และ&lt;wbr&gt;บัน&lt;wbr&gt;ทึน&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;เสร็จ&lt;wbr&gt;อ&lt;wbr&gt;ลง&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง  ``make" โปรแกรม make จะ&lt;wbr&gt;สั่ง&lt;wbr&gt;คอมไพล์&lt;wbr&gt;เฉพาะ&lt;wbr&gt;โปรแกรม hello_app เท่านั้น ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;พอจะ&lt;wbr&gt;เห็น&lt;wbr&gt;ประโยชน์&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม make ยัง&lt;wbr&gt;ครับ  &lt;/p&gt;   &lt;p&gt; เมื่อ&lt;wbr&gt;สั่ง&lt;wbr&gt;โปรแกรม hello_app หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ใน kernel หาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ยัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ได้  ก็&lt;wbr&gt;ลอง&lt;wbr&gt;ลด&lt;wbr&gt;ค่า&lt;wbr&gt;ของ ctr.period ลง&lt;wbr&gt;ไป&lt;wbr&gt;เรื่อยๆ จนกว่า&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ได้  ค่า&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;สุดท้าย&lt;wbr&gt;ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;หยุด&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้ จะ&lt;wbr&gt;เป็นคาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;สั้น&lt;wbr&gt;ที่สุด&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ได้ ค่า&lt;wbr&gt;นี้&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;แต่ละ&lt;wbr&gt;เครื่อง ไม่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;กัน จำ&lt;wbr&gt;คำ&lt;wbr&gt;นี้&lt;wbr&gt;ไว้&lt;wbr&gt;ครับ ``คอมพิวเตอร์&lt;wbr&gt;ยิ่ง&lt;wbr&gt;แรง คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ยิ่ง&lt;wbr&gt;สั้น"  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00170000000000000000"&gt; 7 การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง frank&lt;/a&gt;  &lt;/h1&gt;      &lt;p&gt; ผ่าน&lt;wbr&gt;กัน&lt;wbr&gt;มา&lt;wbr&gt;หลาย&lt;wbr&gt;ตอน&lt;wbr&gt;แล้ว การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง frank ที่มา&lt;wbr&gt;กับ RTLinux เป็น&lt;wbr&gt;อย่างไร&lt;wbr&gt;นั้น มา&lt;wbr&gt;ถึง&lt;wbr&gt;ตอนนี้&lt;wbr&gt;ถ้า&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ไป&lt;wbr&gt;เปิด&lt;wbr&gt;อ่าน&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ดู ก็&lt;wbr&gt;คงที่&lt;wbr&gt;จะ&lt;wbr&gt;รู้&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;ทำงาน&lt;wbr&gt;อย่างไร เลย&lt;wbr&gt;จะ&lt;wbr&gt;ขอ&lt;wbr&gt;สรุป&lt;wbr&gt;ง่ายๆ เพื่อ&lt;wbr&gt;ไม่&lt;wbr&gt;ให้&lt;wbr&gt;เปลือง&lt;wbr&gt;หน้ากระดาษ&lt;wbr&gt;ดังนี้&lt;wbr&gt;นะ&lt;wbr&gt;ครับ  &lt;/p&gt;   &lt;p&gt; ตัวอย่าง frank ประกอบ&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล frank_module และ โปรแกรม frank_app ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ร่วม&lt;wbr&gt;กัน  โม&lt;wbr&gt;ดู&lt;wbr&gt;ล frank_module จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;สร้าง &lt;i&gt;thread&lt;/i&gt; ขึ้น 2 &lt;i&gt;thread&lt;/i&gt; ทั้ง&lt;wbr&gt;สอง  &lt;i&gt;thread&lt;/i&gt; จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;และ&lt;wbr&gt;แต่ละ &lt;i&gt;thread&lt;/i&gt; จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่าน  FIFO ให้&lt;wbr&gt;กับ frank_app FIFO ที่ frank_module สร้าง&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ด้วย&lt;wbr&gt;กัน 5 FIFO 2 กลุ่ม  FIFO กลุ่ม&lt;wbr&gt;แรก&lt;wbr&gt;มี&lt;wbr&gt;สอง&lt;wbr&gt;ตัว&lt;wbr&gt;คือ&lt;wbr&gt;ตัว&lt;wbr&gt;ที่ 1 และ 2 จะ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก frank_module  ไป&lt;wbr&gt;ให้ frank_app ส่วน&lt;wbr&gt;กลุ่ม&lt;wbr&gt;ที่ 2 ประกอบ&lt;wbr&gt;ด้วย&lt;wbr&gt;ตัว&lt;wbr&gt;ที่ 3 ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ส่ง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;จาก frank_app  ไป&lt;wbr&gt;ให้ frank_module ส่วนตัว&lt;wbr&gt;ที่ 4 และ 5 ใช้&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;เดียวกัน&lt;wbr&gt;กับ&lt;wbr&gt;ตัวแปร command_stop  ของ&lt;wbr&gt;ตัวอย่าง hello_rt ของ&lt;wbr&gt;เรา  &lt;/p&gt;   &lt;p&gt; เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก frank_module เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel มัน&lt;wbr&gt;จะ&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;จนกว่า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;สั่ง frank_app ให้&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;ส่ง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ให้&lt;wbr&gt;กับ frank_module คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ส่ง&lt;wbr&gt;ประกอบ&lt;wbr&gt;ด้วย&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;เลือก &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง คำสั่ง&lt;wbr&gt;เริ่ม&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน และ ค่า&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้  &lt;i&gt;thread&lt;/i&gt; ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ใน FIFO ทุกๆ คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;เพื่อ&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้ frank_app อ่าน&lt;wbr&gt;และ&lt;wbr&gt;แสดง&lt;wbr&gt;ผล&lt;wbr&gt;ข้อมูล โดย&lt;wbr&gt;ที่ &lt;i&gt;thread&lt;/i&gt;  แรก&lt;wbr&gt;จะ&lt;wbr&gt;เขียน&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Frank" ลง&lt;wbr&gt;ใน FIFO ตัว&lt;wbr&gt;ที่ 1 ใน&lt;wbr&gt;ขณะที่&lt;wbr&gt;อีก&lt;wbr&gt;ตัว&lt;wbr&gt;จะ&lt;wbr&gt;เขียน&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Zappa"  ลง&lt;wbr&gt;ใน FIFO ตัว&lt;wbr&gt;ที่ 2  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;      &lt;div align="center"&gt;&lt;a name="fig:fifo:frank"&gt;&lt;/a&gt;&lt;a name="582"&gt;&lt;/a&gt;   &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง  frank&lt;/caption&gt; &lt;tbody&gt;      &lt;tr&gt;        &lt;td&gt;               &lt;div align="center"&gt; &lt;img style="height: 198px; width: 595px;" src="http://docs.google.com/File?id=dhdj5j7_64htc5n2"&gt;   &lt;/div&gt;                  &lt;/td&gt;      &lt;/tr&gt;         &lt;/tbody&gt;  &lt;/table&gt;   &lt;/div&gt;       &lt;p&gt; frank_app จะ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ &lt;i&gt;thread&lt;/i&gt; ตัว&lt;wbr&gt;ที่ 1 เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา 0.5 วินาที&lt;wbr&gt;และ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ &lt;i&gt;thread&lt;/i&gt; ตัว&lt;wbr&gt;ที่ 2 เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา 0.2 วินาที หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;วน&lt;wbr&gt;รอบ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จากFIFO วิธีการ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง frank จะ&lt;wbr&gt;ไม่&lt;wbr&gt;เหมือน&lt;wbr&gt;กับ&lt;wbr&gt;ตัวอย่าง hello_rt ของ&lt;wbr&gt;เรา&lt;wbr&gt;ตรง&lt;wbr&gt;ที่&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;รอ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จากFIFO เป็น&lt;wbr&gt;เวลา&lt;wbr&gt;จำกัด หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ข้อมูล&lt;wbr&gt;มา&lt;wbr&gt;ให้&lt;wbr&gt;อ่าน มัน&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;โดย&lt;wbr&gt;วน&lt;wbr&gt;รอบ&lt;wbr&gt;ต่อไป&lt;wbr&gt;เลย&lt;wbr&gt;ไม่&lt;wbr&gt;หยุด&lt;wbr&gt;รอ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จากFIFO เมื่อ&lt;wbr&gt;มัน&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;วน&lt;wbr&gt;รอบ&lt;wbr&gt;ครบ 100 รอบ&lt;wbr&gt;แล้ว&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ &lt;i&gt;thread&lt;/i&gt; ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ  &lt;/p&gt;   &lt;p&gt; การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;6&lt;/a&gt;  จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า &lt;i&gt;thread&lt;/i&gt; ตัว&lt;wbr&gt;ที่ 1 มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;ช้า&lt;wbr&gt;กว่า&lt;wbr&gt;ตัว&lt;wbr&gt;ที่ 2 ดู&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า``Zappa" มี&lt;wbr&gt;มาก&lt;wbr&gt;กว่า&lt;wbr&gt;การ&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Frank"  &lt;/p&gt;   &lt;p&gt; ตัวอย่าง&lt;wbr&gt;นี้&lt;wbr&gt;เป็น&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ที่&lt;wbr&gt;ดี ตัวอย่าง&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ที่&lt;wbr&gt;แสดง&lt;wbr&gt;ให้&lt;wbr&gt;เห็น&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;งาน&lt;wbr&gt;สอง&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป&lt;wbr&gt;หรือ&lt;wbr&gt;ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า multithread การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ไม่&lt;wbr&gt;ขึ้น&lt;wbr&gt;แก่&lt;wbr&gt;กัน ต่าง&lt;wbr&gt;คน&lt;wbr&gt;ต่าง&lt;wbr&gt;ทำ&lt;wbr&gt;ไป  แต่&lt;wbr&gt;ถ้า&lt;wbr&gt;หาก&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;งาน&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ&lt;wbr&gt;สอดคล้อง&lt;wbr&gt;กัน&lt;wbr&gt;ล่ะ ไม่&lt;wbr&gt;ใช่&lt;wbr&gt;ต่าง&lt;wbr&gt;คน&lt;wbr&gt;ต่าง&lt;wbr&gt;ทำ  ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;คิด&lt;wbr&gt;ว่า&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;อย่างไร ถ้า&lt;wbr&gt;คิด&lt;wbr&gt;ไม่&lt;wbr&gt;ออก&lt;wbr&gt;บอกใบ้&lt;wbr&gt;ให้&lt;wbr&gt;นิด&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ครับ ลองดู&lt;wbr&gt;ตัวอย่าง  mutex ที่มา&lt;wbr&gt;กับ RTLinux ครับ หรือ&lt;wbr&gt;ไม่&lt;wbr&gt;อย่าง&lt;wbr&gt;นั้น&lt;wbr&gt;ก็&lt;wbr&gt;ลอง&lt;wbr&gt;ไป&lt;wbr&gt;ค้น&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``semaphore" ดู&lt;wbr&gt;ครับ  &lt;/p&gt;   &lt;p&gt; ถึงแม้ว่า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;บอก&lt;wbr&gt;ว่า&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;นี้&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป&lt;wbr&gt;แต่&lt;wbr&gt;อย่า&lt;wbr&gt;ลืม&lt;wbr&gt;นะ&lt;wbr&gt;ครับ&lt;wbr&gt;ว่า&lt;wbr&gt;หาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;ใช้&lt;wbr&gt;อยู่&lt;wbr&gt;มี&lt;wbr&gt;ตัว&lt;wbr&gt;ประมวลผล&lt;wbr&gt;กลาง&lt;wbr&gt;เพียง&lt;wbr&gt;ตัว&lt;wbr&gt;เดียว การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ นั้น&lt;wbr&gt;ก็&lt;wbr&gt;ยัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;อนุกรม&lt;wbr&gt;กัน&lt;wbr&gt;ไป&lt;wbr&gt;หรือ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อๆ กัน&lt;wbr&gt;ไป ดังนั้น&lt;wbr&gt;พึ่ง&lt;wbr&gt;จำ&lt;wbr&gt;ไว้&lt;wbr&gt;เสมอ&lt;wbr&gt;ว่า&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ  &lt;i&gt;thread&lt;/i&gt; จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;เมื่อ&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ว่าง&lt;wbr&gt;เท่านั้น อย่า&lt;wbr&gt;ออกแบบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;โดย&lt;wbr&gt;คิด&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ได้&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ  จน&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ &lt;i&gt;thread&lt;/i&gt; ตัว&lt;wbr&gt;ใด&lt;wbr&gt;ตัว&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;คืน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ให้  &lt;i&gt;thread&lt;/i&gt; อื่น&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน  &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00180000000000000000"&gt; 8 สรุป&lt;/a&gt; &lt;/h1&gt;      &lt;p&gt; ใน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;ทุก&lt;wbr&gt;ท่าน&lt;wbr&gt;คง&lt;wbr&gt;คุ้นเคย&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม make และ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;กัน&lt;wbr&gt;พอสมควร เบื่อๆ กนหรือยัง หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;คง&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;เบื่อ&lt;wbr&gt;กัน&lt;wbr&gt;ก่อน&lt;wbr&gt;นะ&lt;wbr&gt;ครับ ไหนๆ ก็&lt;wbr&gt;อุ&lt;wbr&gt;ตสาห์&lt;wbr&gt;ติดตาม&lt;wbr&gt;กัน&lt;wbr&gt;มา&lt;wbr&gt;หลาย&lt;wbr&gt;เดือน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;ก็&lt;wbr&gt;เป็น&lt;wbr&gt;ตอน&lt;wbr&gt;ที่ 4 แล้ว ก็&lt;wbr&gt;ขอ&lt;wbr&gt;ให้&lt;wbr&gt;ติดตาม&lt;wbr&gt;กัน&lt;wbr&gt;ต่อไป&lt;wbr&gt;อีก ใน&lt;wbr&gt;ตอน&lt;wbr&gt;หน้า&lt;wbr&gt;รับรอง&lt;wbr&gt;ว่า&lt;wbr&gt;ไม่&lt;wbr&gt;น่า&lt;wbr&gt;เบื่อ&lt;wbr&gt;แน่นอน&lt;wbr&gt;เพราะ&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;มา&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ Printer Port กัน ถ้า&lt;wbr&gt;หน้ากระดาษ&lt;wbr&gt;มาก&lt;wbr&gt;พอ ก็&lt;wbr&gt;คงจะ&lt;wbr&gt;พา&lt;wbr&gt;ทดลอง&lt;wbr&gt;ทั้ง&lt;wbr&gt;การ&lt;wbr&gt;สร้าง&lt;wbr&gt;คลื่น&lt;wbr&gt;สัญญาณ&lt;wbr&gt;สี่เหลี่ยม&lt;wbr&gt;ที่&lt;wbr&gt;ความ&lt;wbr&gt;ถี่&lt;wbr&gt;ต่างๆ และ&lt;wbr&gt;ทดลอง&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;อิน&lt;wbr&gt;เตอร์รัพ&lt;wbr&gt;ของ Printer Port ไว้&lt;wbr&gt;พบ&lt;wbr&gt;กัน&lt;wbr&gt;อีก&lt;wbr&gt;ครับ&lt;wbr&gt;ฉบับ&lt;wbr&gt;หน้า&lt;wbr&gt;ครับ&lt;wbr&gt;สวัสดี   &lt;/p&gt;   &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00190000000000000000"&gt; 9 แหล่งข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;/a&gt; &lt;/h1&gt;      &lt;p&gt;  &lt;/p&gt;   &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.gnu.org/software/make/make.html"&gt;http://www.gnu.org/software/make/make.html     &lt;/a&gt;เป็น&lt;wbr&gt;โฮ&lt;wbr&gt;มเพจ&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม make  &lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.gnu.org/manual/make-3.79.1/make.html"&gt;http://www.gnu.org/manual/make-3.79.1/make.html&lt;/a&gt; เป็น&lt;wbr&gt;คู่มือ&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม  make  &lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.csee.umbc.edu/%20acedil1/umbc/makefile.shtml"&gt;http://www.csee.umbc.edu/ acedil1/umbc/makefile.shtml&lt;/a&gt; หาก&lt;wbr&gt;ไม่&lt;wbr&gt;ต้องการ&lt;wbr&gt;อ่าน&lt;wbr&gt;คู่มือ&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม  make แบบ&lt;wbr&gt;ละเอียด &lt;/li&gt;     &lt;/ol&gt;      &lt;p&gt;  &lt;/p&gt;   &lt;h1&gt;&lt;a name="SECTION00200000000000000000"&gt; About this document ...&lt;/a&gt; &lt;/h1&gt;      &lt;p&gt; This document was generated using the &lt;a href="http://www-texdev.mpce.mq.edu.au/l2h/docs/manual/"&gt;&lt;strong&gt;LaTeX&lt;/strong&gt;2&lt;tt&gt;HTML&lt;/tt&gt;&lt;/a&gt;  translator Version 2K.1beta (1.48) &lt;/p&gt;   &lt;p&gt; Copyright © 1993, 1994, 1995, 1996, &lt;a href="http://cbl.leeds.ac.uk/nikos/personal.html"&gt;Nikos Drakos&lt;/a&gt;,  Computer  Based Learning Unit, University of Leeds. &lt;br&gt;   Copyright © 1997, 1998, 1999, &lt;a href="http://www.maths.mq.edu.au/%7Eross/"&gt;Ross Moore&lt;/a&gt;,  Mathematics Department, Macquarie University, Sydney. &lt;/p&gt;   &lt;p&gt;The translation was initiated by Pished Bunnun on 2003-02-14&lt;/p&gt;   &lt;hr&gt;      &lt;br&gt;      &lt;address&gt; Pished Bunnun 2003-02-14 &lt;/address&gt;   &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-5031997971795087518?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/5031997971795087518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=5031997971795087518' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5031997971795087518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5031997971795087518'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/rtlinux-linux-4.html' title=''/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-7076865405540677281</id><published>2007-04-20T12:05:00.000+01:00</published><updated>2007-04-20T23:39:01.004+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'></title><content type='html'>          &lt;h1 align="center"&gt;&lt;a name="SECTION00100000000000000000"&gt;&lt;/a&gt;RTLinux : Linux  สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง&lt;/h1&gt;     &lt;h1 align="center"&gt;&lt;a name="SECTION00100000000000000000"&gt;ตอน&lt;wbr&gt;ที่ 3. พื้นฐาน&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม RTLinux&lt;/a&gt; &lt;/h1&gt;        &lt;p align="right"&gt; &lt;a title="พิเชษฐ์ บุญหนุน" href="mailto:p%20i%20s%20h%20e%20d@nectec.or.th"&gt;&lt;font size="+1"&gt;พิเชษฐ์ บุญ&lt;wbr&gt;หนุน&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;     &lt;p&gt;   &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00110000000000000000"&gt; 1 บทนำ&lt;/a&gt; &lt;/h1&gt;        &lt;p&gt; จาก&lt;wbr&gt;บทความ&lt;wbr&gt;ครั้ง&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;คง&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;ติดตั้ง RTLinux กัน&lt;wbr&gt;ไป&lt;wbr&gt;แล้ว   บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;ยาก&lt;wbr&gt;เพราะ&lt;wbr&gt;เคย&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel เอง&lt;wbr&gt;กัน&lt;wbr&gt;มา&lt;wbr&gt;ก่อน แต่&lt;wbr&gt;บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เหนื่อย&lt;wbr&gt;กัน&lt;wbr&gt;หน่อย&lt;wbr&gt;แต่&lt;wbr&gt;ก็&lt;wbr&gt;คง&lt;wbr&gt;ทำ&lt;wbr&gt;สำเร็จ&lt;wbr&gt;กัน&lt;wbr&gt;ได้&lt;wbr&gt;ด้วย&lt;wbr&gt;ดี   มา&lt;wbr&gt;ใน&lt;wbr&gt;ครั้งนี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;สำหรับ&lt;wbr&gt;ระบบปฏิบัติการ   RTLinux  &lt;/p&gt;     &lt;p&gt; การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง ไม่&lt;wbr&gt;เหมือน&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ทั่วไป เพราะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เขียน&lt;wbr&gt;เป็น&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล(โปรแกรม&lt;wbr&gt;ใน&lt;wbr&gt;ระดับ kernel space ต่อไป&lt;wbr&gt;จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า โม&lt;wbr&gt;ดู&lt;wbr&gt;ล)สำหรับ&lt;wbr&gt;แทรก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ในkernel  ของ RTLinux ไม่&lt;wbr&gt;ใช่&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ที่ทำการ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;งาน(โปรแกรม&lt;wbr&gt;ใน&lt;wbr&gt;ระดับ   user space ต่อไป&lt;wbr&gt;จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า โปรแกรม&lt;wbr&gt;ประยุกต์)ทั่วไป อย่างไรก็ตาม&lt;wbr&gt;นอกจาก&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;แล้ว   เรา&lt;wbr&gt;อาจ&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;รับคำ&lt;wbr&gt;สั่ง แสดง&lt;wbr&gt;ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน   หรือ ใช้&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;แฟ้มข้อมูล แทน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล ทั้งนี้เพราะ&lt;wbr&gt;ว่า&lt;wbr&gt;โดย&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;แล้ว&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;นี้&lt;wbr&gt;ได้   จาก&lt;wbr&gt;ความจำ&lt;wbr&gt;เป็น&lt;wbr&gt;ดังกล่าว การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;1&lt;/a&gt; จึง&lt;wbr&gt;มี&lt;wbr&gt;ความจำ&lt;wbr&gt;เป็น  &lt;/p&gt;     &lt;p&gt; ใน RTLinux ได้&lt;wbr&gt;จัดเตรียม&lt;wbr&gt;วิธี&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ไว้&lt;wbr&gt;ให้&lt;wbr&gt;สอง&lt;wbr&gt;วิธิหลักๆ ด้วย&lt;wbr&gt;กัน&lt;wbr&gt;คือ การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กัน&lt;wbr&gt;ผ่านShared Memory หรือ ผ่าน FIFO หาก&lt;wbr&gt;ยัง&lt;wbr&gt;จำ&lt;wbr&gt;กัน&lt;wbr&gt;ได้ ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;วิธี จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ใน&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;แก้kernel ของ RTLinux ใน&lt;wbr&gt;บท&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:fifo"&gt;&lt;/a&gt;&lt;a name="311"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; เส้นทาง&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;/caption&gt;     &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 312px; width: 482px;" src="http://docs.google.com/File?id=dhdj5j7_52f5f92p"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; กล่าว&lt;wbr&gt;โดย&lt;wbr&gt;สรุป&lt;wbr&gt;แล้ว&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux โดย&lt;wbr&gt;ทั่วไป&lt;wbr&gt;ประกอบ&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;สอง&lt;wbr&gt;ส่วน&lt;wbr&gt;หลัก&lt;wbr&gt;คือ   โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง และ โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;สำหรับ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;งาน โดย&lt;wbr&gt;ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;ส่วน&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กัน&lt;wbr&gt;ผ่าน Shared Memory หรือ FIFO  &lt;/p&gt;     &lt;p&gt; สำหรับ&lt;wbr&gt;บทความ&lt;wbr&gt;ใน&lt;wbr&gt;ครั้งนี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;เรียนรู้&lt;wbr&gt;ถึง&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล การ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง   และ&lt;wbr&gt;หลังจาก&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;โครงสร้างพื้นฐาน&lt;wbr&gt;ต่างๆ แล้ว&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;มา&lt;wbr&gt;ศึกษา&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;อย่าง&lt;wbr&gt;ง่าย&lt;wbr&gt;กัน   ก่อน&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ลต่างๆ ตาม&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ใน&lt;wbr&gt;บทความ อย่า&lt;wbr&gt;ลืม&lt;wbr&gt;บูต&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ด้วย   kernel ของ RTLinux ก่อน ไม่&lt;wbr&gt;เช่นนั้น&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;อาจ&lt;wbr&gt;ไม่&lt;wbr&gt;ทำงาน&lt;wbr&gt;ตาม&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;ไว้  และ&lt;wbr&gt;ถ้า&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ไหน&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;สั่ง&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;บัญชี&lt;wbr&gt;รายชื่อ&lt;wbr&gt;เป็น root ดู&lt;wbr&gt;ครับ (แล้ว&lt;wbr&gt;ทำไม&lt;wbr&gt;ต้อง&lt;wbr&gt;เป็น  root ด้วย&lt;wbr&gt;ล่ะ ... ?)  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00120000000000000000"&gt; 2 โครงสร้าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;/a&gt; &lt;/h1&gt;        &lt;p&gt; การ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;สำหรับ&lt;wbr&gt;แทรก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel ของ Linux ไม่&lt;wbr&gt;ได้&lt;wbr&gt;ยาก&lt;wbr&gt;ไป&lt;wbr&gt;กว่า&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;เท่าใด&lt;wbr&gt;นัก   มี&lt;wbr&gt;ข้อกำหนด&lt;wbr&gt;และ&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ที่&lt;wbr&gt;แตกต่าง&lt;wbr&gt;กัน&lt;wbr&gt;เท่านั้น หาก&lt;wbr&gt;เคย&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;มา  และ&lt;wbr&gt;รู้&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ง่ายๆ ได้&lt;wbr&gt;แล้ว โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ประกอบ&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย&lt;wbr&gt;สอง&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;หลัก&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;มี&lt;wbr&gt;คือ  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;ol&gt;    &lt;li&gt;&lt;i&gt;int init_module(void)&lt;/i&gt; จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน   kernel(แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง &lt;i&gt;insmod&lt;/i&gt;) ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม   ตรวจสอบ&lt;wbr&gt;ทรัพยากร&lt;wbr&gt;ของ&lt;wbr&gt;เครื่อง&lt;wbr&gt;ก่อน&lt;wbr&gt;เริ่ม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน หรือ อื่นๆ ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน     &lt;/li&gt;    &lt;li&gt;&lt;i&gt;void cleanup_module(void)&lt;/i&gt; จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;ออก&lt;wbr&gt;จาก   kernel(ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง &lt;i&gt;rmmod&lt;/i&gt;) ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ทรัพยากร&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;ระบบ   หรือ&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;ก่อน&lt;wbr&gt;จบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน  &lt;/li&gt;       &lt;/ol&gt;    นอกจาก&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;แล้ว&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;เรา&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน   ลอง&lt;wbr&gt;พิจารณา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ง่ายๆ ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แสดง&lt;wbr&gt;ข้อความ&lt;wbr&gt;ว่า ``Hello Wrold!" ใน kernel messages (ใช้&lt;wbr&gt;คำสั่ง &lt;i&gt;dmesg&lt;/i&gt; ใน&lt;wbr&gt;การ&lt;wbr&gt;แสดง kernel messages) เมื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel และ&lt;wbr&gt;แสดง&lt;wbr&gt;ข้อความ&lt;wbr&gt;ว่า ``Bye" เมื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;ออก&lt;wbr&gt;จาก kernel ดัง&lt;wbr&gt;รายละเอียด&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ 1.     &lt;p&gt;   &lt;/p&gt;     &lt;p&gt; &lt;/p&gt;     &lt;div align="left"&gt;01. #include &amp;lt;linux/module.h&amp;gt;&lt;br&gt;    02. MODULE_AUTHOR(&lt;tt&gt;"XXX"&lt;/tt&gt;); &lt;br&gt;    03. MODULE_LICENSE(&lt;tt&gt;"GPL"&lt;/tt&gt;); &lt;br&gt;    04. MODULE_DESCRIPTION(&lt;tt&gt;"EXAMPLE PROGRAM"&lt;/tt&gt;); &lt;br&gt;    05. &lt;b&gt;int&lt;/b&gt; init_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;    06. { &lt;br&gt;    07.      printk(&lt;tt&gt;"Hello World!n"&lt;/tt&gt;); &lt;br&gt;    08.      &lt;b&gt;return&lt;/b&gt; 0; &lt;br&gt;    09. } &lt;br&gt;    10. &lt;b&gt;void&lt;/b&gt; cleanup_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;    11. { &lt;br&gt;    12.      printk(&lt;tt&gt;"Bye!n"&lt;/tt&gt;); &lt;br&gt;    13. } &lt;/div&gt;        &lt;p&gt; &lt;/p&gt;     &lt;div align="center"&gt; โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ 1. โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello  &lt;/div&gt;          &lt;p&gt; เมื่อ&lt;wbr&gt;บันทึก&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ไว้&lt;wbr&gt;ใน&lt;wbr&gt;ชื่อ ``hello.c" จากนั้น&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง   ``kgcc `rtl-config -cflags` -c hello.c -o hello.o" จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง   &lt;i&gt;kgcc&lt;/i&gt; โดย&lt;wbr&gt;ที่&lt;wbr&gt;ตัวเลือก &lt;i&gt;`rtl-config -cflags`&lt;/i&gt; เป็น&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;คำสั่ง   rtl-config เพื่อ&lt;wbr&gt;ดึง&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล(ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง  ``rtl-config -cflags") สำหรับ `` ` " ที่อยู่&lt;wbr&gt;หน้า&lt;wbr&gt;และ&lt;wbr&gt;หลัง&lt;wbr&gt;ของ&lt;wbr&gt;คำสั่ง rtl-config  เป็น&lt;wbr&gt;สัญลักษณ์&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;แป้นพิมพ์&lt;wbr&gt;ที่อยู่&lt;wbr&gt;ที่&lt;wbr&gt;เดียวกับ ``~ " ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เปลี่ยน&lt;wbr&gt;ภาษา&lt;wbr&gt;แป้นพิมพ์&lt;wbr&gt;ใน&lt;wbr&gt;ระบบปฏิบัติการ  M$ Window, &lt;i&gt;-c&lt;/i&gt; เป็น&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;เป็น&lt;wbr&gt;ออ&lt;wbr&gt;ปเจ็ค&lt;wbr&gt;เท่านั้น ส่วน &lt;i&gt;-o&lt;/i&gt; และ&lt;wbr&gt;ชื่อ&lt;wbr&gt;แฟ้มข้อมูล&lt;wbr&gt;ที่&lt;wbr&gt;ตาม&lt;wbr&gt;มา&lt;wbr&gt;จะ&lt;wbr&gt;หมายถึง&lt;wbr&gt;ชื่อ&lt;wbr&gt;ออ&lt;wbr&gt;ปเจ็ค&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ใน&lt;wbr&gt;ครั้งนี้   ดังนั้น&lt;wbr&gt;เมื่อ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เสร็จ&lt;wbr&gt;และ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ปัญหา&lt;wbr&gt;ใดๆ เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;พร้อม&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;ชื่อ   hello.o  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:lsmod-hello-nort"&gt;&lt;/a&gt;&lt;a name="317"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง lsmod หลังจาก&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel&lt;/caption&gt; &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 63px; width: 579px;" src="http://docs.google.com/File?id=dhdj5j7_53fh6kfd"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; หลังจาก&lt;wbr&gt;ได้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello แล้ว&lt;wbr&gt;ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``insmod hello.o" จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel หาก&lt;wbr&gt;ต้องการ&lt;wbr&gt;ดู&lt;wbr&gt;ว่า&lt;wbr&gt;ขณะนี้&lt;wbr&gt;มี&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อะไร&lt;wbr&gt;บ้าง&lt;wbr&gt;ที่&lt;wbr&gt;แทรก&lt;wbr&gt;อยู่&lt;wbr&gt;ในkernel  ให้&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``lsmod" ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;2&lt;/a&gt; และ&lt;wbr&gt;เมื่อ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello ออก&lt;wbr&gt;จาก kernel ให้&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``rmmod hello" (สังเกต&lt;wbr&gt;ว่า&lt;wbr&gt;ตอน&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง insmod  นั้น hello ที่&lt;wbr&gt;ตาม&lt;wbr&gt;มา&lt;wbr&gt;ต้อง&lt;wbr&gt;มี ``.o" ด้วย หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี คำสั่ง insmod จะ&lt;wbr&gt;ไป&lt;wbr&gt;ค้นหา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ชื่อ   hello ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ ``/lib/modules/kernel_version" โดย&lt;wbr&gt;ที่ kernel_version  คือ&lt;wbr&gt;ชื่อ&lt;wbr&gt;ของ kernel รุ่น&lt;wbr&gt;ที่&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่ ส่วน&lt;wbr&gt;คำสั่ง rmmod นั้น hello ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;มี ``.o" ตาม )  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:dmesg-rmmod-hello-nort"&gt;&lt;/a&gt;&lt;a name="318"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง rmmod ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello ออก&lt;wbr&gt;จาก kernel&lt;/caption&gt; &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 78px; width: 482px;" src="http://docs.google.com/File?id=dhdj5j7_55gh8w3j"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; เมื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``dmesg" ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;3&lt;/a&gt; จะ&lt;wbr&gt;มี&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Hello  World!" และ ``Bye" ขึ้น&lt;wbr&gt;ที่ kernel messages โดย&lt;wbr&gt;ข้อความ&lt;wbr&gt;แรกเกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล ส่วน&lt;wbr&gt;ข้อความ&lt;wbr&gt;ที่&lt;wbr&gt;สอง&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ลออ&lt;wbr&gt;ก&lt;wbr&gt;จาก kernel  &lt;/p&gt;     &lt;p&gt; จาก&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา&lt;wbr&gt;นอกจาก&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;หลักๆ สอง&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ไป&lt;wbr&gt;แล้ว ยัง&lt;wbr&gt;มี&lt;wbr&gt;ฟังก์ชันprintk( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 07 และ 12 ที่ทำงาน&lt;wbr&gt;ค&lt;wbr&gt;ล้า&lt;wbr&gt;ยๆ กับ&lt;wbr&gt;ฟังก์ชัน printf( ) และ&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่02-04 เป็น&lt;wbr&gt;มา&lt;wbr&gt;โค&lt;wbr&gt;ร&lt;wbr&gt;ที่&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ขึ้น&lt;wbr&gt;มา&lt;wbr&gt;ใน kernel รุ่น&lt;wbr&gt;ใหม่ๆ ถึง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;บรรทัด&lt;wbr&gt;เหล่านี้ โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ก็&lt;wbr&gt;ยัง&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ตาม&lt;wbr&gt;ปกติ&lt;wbr&gt;แต่...? ( ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ทดลอง&lt;wbr&gt;ลบ&lt;wbr&gt;สาม&lt;wbr&gt;บรรทัด&lt;wbr&gt;ดังกล่าว&lt;wbr&gt;ออก&lt;wbr&gt;ก่อน&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอม&lt;wbr&gt;ไฟล์&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล และ&lt;wbr&gt;ลอง&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ดู&lt;wbr&gt;ครับ )  &lt;/p&gt;     &lt;p&gt; มา&lt;wbr&gt;ถึง&lt;wbr&gt;ขั้น&lt;wbr&gt;นี้&lt;wbr&gt;แล้ว&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ก็&lt;wbr&gt;คง&lt;wbr&gt;พอจะ&lt;wbr&gt;เข้าใจ&lt;wbr&gt;หลักการ&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ไม่&lt;wbr&gt;มาก&lt;wbr&gt;ก็&lt;wbr&gt;น้อย หาก&lt;wbr&gt;ต้องการ&lt;wbr&gt;ศึกษา&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;ก็&lt;wbr&gt;ลอง&lt;wbr&gt;ค้นคว้า&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;เอกสารอ้างอิง&lt;wbr&gt;ใน&lt;wbr&gt;ตอน&lt;wbr&gt;ท้าย&lt;wbr&gt;บทความ    &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00130000000000000000"&gt; 3 โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;/a&gt;  &lt;/h1&gt;        &lt;p&gt; หลังจาก&lt;wbr&gt;ได้&lt;wbr&gt;ลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello กัน&lt;wbr&gt;มา&lt;wbr&gt;แล้ว เรา&lt;wbr&gt;จะ&lt;wbr&gt;มา&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;กัน   แต่ก่อน&lt;wbr&gt;อื่น&lt;wbr&gt;มา&lt;wbr&gt;เข้าใจ&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;จาก&lt;wbr&gt;เดิม&lt;wbr&gt;อีก&lt;wbr&gt;นิด&lt;wbr&gt;ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;มี&lt;wbr&gt;ลักษณะ&lt;wbr&gt;อย่างไร    &lt;/p&gt;     &lt;p&gt; โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ใน&lt;wbr&gt;แบบ&lt;wbr&gt;ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า &lt;i&gt;multithread&lt;/i&gt;   การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;นี้ ใน&lt;wbr&gt;หนึ่ง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;หรือ&lt;wbr&gt;หนึ่ง&lt;wbr&gt;กระบวนการ(process)สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;หลายๆ   &lt;i&gt;thread&lt;/i&gt; พร้อมๆ กัน โดย&lt;wbr&gt;ที่&lt;wbr&gt;แต่ละ &lt;i&gt;thread&lt;/i&gt; ทำงาน&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:multithread"&gt;&lt;/a&gt;&lt;a name="319"&gt;&lt;/a&gt;     &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; ลักษณะ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ &lt;i&gt;multithread&lt;/i&gt;&lt;/caption&gt;     &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 443px; width: 564px;" src="http://docs.google.com/File?id=dhdj5j7_56j8jtdp"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; ลอง&lt;wbr&gt;พิจารณา&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;4&lt;/a&gt;  FUNCTION1 และ FUNCTION2 ด้าน&lt;wbr&gt;บน&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า &lt;i&gt;multithread&lt;/i&gt;  โดย&lt;wbr&gt;แต่ละ&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;คน&lt;wbr&gt;ล่ะ &lt;i&gt;thread&lt;/i&gt; และ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป ใน&lt;wbr&gt;ขณะที่ FUNCTION1  และ FUNCTION2 ด้าน&lt;wbr&gt;ล่าง เป็น&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ทั่วไป&lt;wbr&gt;ซึ่ง&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อ&lt;wbr&gt;กัน&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป&lt;wbr&gt;ได้   จาก&lt;wbr&gt;รูป&lt;wbr&gt;จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ &lt;i&gt;multithread&lt;/i&gt; สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;โดย&lt;wbr&gt;ใช้เวลา&lt;wbr&gt;ที่&lt;wbr&gt;สั้น&lt;wbr&gt;กว่า&lt;wbr&gt;ได้   อย่างไรก็ตาม&lt;wbr&gt;สำหรับ&lt;wbr&gt;ระบบ&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;หน่วยประมวลผลกลาง(CPU)เพียง&lt;wbr&gt;ตัว&lt;wbr&gt;เดียว&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;เห็น&lt;wbr&gt;ประโยชน์&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;แบบ   &lt;i&gt;muiltithread&lt;/i&gt; นี้&lt;wbr&gt;มาก&lt;wbr&gt;นัก นอกจาก&lt;wbr&gt;ลักษณะ&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;นั้น&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;หลายๆ งาน&lt;wbr&gt;ที่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ขนาน&lt;wbr&gt;กัน&lt;wbr&gt;ไป&lt;wbr&gt;ได้&lt;wbr&gt;และ&lt;wbr&gt;ใน&lt;wbr&gt;แต่&lt;wbr&gt;ล่ะ&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;ว่า&lt;wbr&gt;นี้&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;รอ&lt;wbr&gt;ค่า&lt;wbr&gt;หรือ&lt;wbr&gt;รอ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;จาก&lt;wbr&gt;ภายนอก&lt;wbr&gt;อย่าง&lt;wbr&gt;อื่น&lt;wbr&gt;ก่อน&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป   ซึ่ง&lt;wbr&gt;อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ว่าง&lt;wbr&gt;และ&lt;wbr&gt;สามารถ&lt;wbr&gt;มา&lt;wbr&gt;ทำงาน&lt;wbr&gt;อื่น&lt;wbr&gt;ก่อน&lt;wbr&gt;ได้&lt;wbr&gt;เป็นต้น  &lt;/p&gt;     &lt;p&gt; ผู้อ่าน&lt;wbr&gt;บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;เกิด&lt;wbr&gt;คำถาม&lt;wbr&gt;ว่า แล้ว&lt;wbr&gt;หากแต่&lt;wbr&gt;ละ&lt;wbr&gt;งาน&lt;wbr&gt;เกิด&lt;wbr&gt;ต้องการ&lt;wbr&gt;ทำงาน&lt;wbr&gt;พร้อมกัน&lt;wbr&gt;ล่ะ   จะ&lt;wbr&gt;เกิด&lt;wbr&gt;อะไร&lt;wbr&gt;ขึ้น คำตอบ&lt;wbr&gt;คือ งาน&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;มาก&lt;wbr&gt;กว่า&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ก่อน และ ใน&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ที่&lt;wbr&gt;งาน&lt;wbr&gt;ใด&lt;wbr&gt;งาน&lt;wbr&gt;หนึ่ง&lt;wbr&gt;กำลัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่&lt;wbr&gt;หาก&lt;wbr&gt;มี&lt;wbr&gt;งาน&lt;wbr&gt;อื่น&lt;wbr&gt;ที่&lt;wbr&gt;สำคัญ&lt;wbr&gt;กว่า&lt;wbr&gt;ต้องการ&lt;wbr&gt;ทำงาน   งาน&lt;wbr&gt;ที่&lt;wbr&gt;กำลัง&lt;wbr&gt;ทำ&lt;wbr&gt;อยู่&lt;wbr&gt;นั้น&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน และ&lt;wbr&gt;ให้&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;กว่า&lt;wbr&gt;ทำงาน&lt;wbr&gt;ก่อน&lt;wbr&gt;เสมอ    &lt;/p&gt;     &lt;p&gt; ใน&lt;wbr&gt;เรื่อง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;แบบ &lt;i&gt;multithread&lt;/i&gt; นี้&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;ขอ&lt;wbr&gt;จบ&lt;wbr&gt;ไว้&lt;wbr&gt;เพียง&lt;wbr&gt;เท่านี้   หาก&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;สนใจ&lt;wbr&gt;ค้นคว้า&lt;wbr&gt;ข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;ลอง&lt;wbr&gt;ศึกษา&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;เอกสารอ้างอิง&lt;wbr&gt;ที่&lt;wbr&gt;ให้&lt;wbr&gt;ไว้  และ&lt;wbr&gt;หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;เกิด&lt;wbr&gt;ความ&lt;wbr&gt;สนใจ&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;นี้&lt;wbr&gt;และ&lt;wbr&gt;นำ&lt;wbr&gt;มัน&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ประโยชน์&lt;wbr&gt;ต่อไป    &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00140000000000000000"&gt; 4 ตัวอย่าง&lt;wbr&gt;การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;/a&gt;   &lt;/h1&gt;        &lt;p&gt; จาก&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello เรา&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ด้วย&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ   ดังนั้น&lt;wbr&gt;เมื่อ&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;แก้ไข&lt;wbr&gt;แล้ว&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ข้อความ   ``Hello World!" ที่ kernel messages ซ้ำๆ ขึ้น&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;กำหนด ลอง&lt;wbr&gt;พิจารณา&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ 2. ดู&lt;wbr&gt;ครับ  &lt;/p&gt;     &lt;p&gt; &lt;/p&gt;   &lt;div align="left"&gt;&lt;br&gt;  01. #include &amp;lt;linux/module.h&amp;gt;&lt;br&gt;    02. #include &amp;lt;rtl.h&amp;gt;&lt;br&gt;    03. #include &amp;lt;pthread.h&amp;gt;&lt;br&gt;    04. MODULE_AUTHOR(&lt;tt&gt;"XXX"&lt;/tt&gt;); &lt;br&gt;    05. MODULE_LICENSE(&lt;tt&gt;"GPL"&lt;/tt&gt;); &lt;br&gt;    06. MODULE_DESCRIPTION(&lt;tt&gt;"EXAMPLE PROGRAM"&lt;/tt&gt;); &lt;br&gt;    07. pthread_t periodic_thread; &lt;br&gt;    08. &lt;b&gt;void&lt;/b&gt; *  periodic_function( &lt;b&gt;void&lt;/b&gt; *  arg ) &lt;br&gt;    09. { &lt;br&gt;    10.      &lt;b&gt;int&lt;/b&gt; count=0; &lt;br&gt;    11.  &lt;b&gt;    struct&lt;/b&gt; sched_param p; &lt;br&gt;    12.      p.sched_priority = 1; &lt;br&gt;    13.      pthread_setschedparam( pthread_self( ), SCHED_FIFO, &amp;amp;p );  &lt;br&gt;    14.      pthread_make_periodic_np( pthread_self( ), gethrtime( ), 500000000  ); &lt;br&gt;    15.      &lt;b&gt;while&lt;/b&gt;( 1 ) &lt;br&gt;    16.      { &lt;br&gt;    17.          pthread_wait_np( ); &lt;br&gt;    18.          rtl_printf(&lt;tt&gt;"%d t Hello World! n",++count&lt;/tt&gt;); &lt;br&gt;    19.      } &lt;br&gt;    20.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;    21. } &lt;br&gt;    22. &lt;b&gt;int&lt;/b&gt; init_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;    23. { &lt;br&gt;    24.      pthread_create( &amp;amp;periodic_thread, NULL, periodic_function,  0 );  &lt;br&gt;    25.  &lt;b&gt;    return&lt;/b&gt; 0; &lt;br&gt;    26. } &lt;br&gt;    27. &lt;b&gt;void&lt;/b&gt; cleanup_module(&lt;b&gt;void&lt;/b&gt;) &lt;br&gt;    28. { &lt;br&gt;    29.      pthread_delete_np( periodic_thread ); &lt;br&gt;    30.      rtl_printf(&lt;tt&gt;"Byen"&lt;/tt&gt;); &lt;br&gt;    31. } &lt;br&gt;    &lt;/div&gt;        &lt;p&gt; &lt;/p&gt;     &lt;div align="center"&gt; โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ 2. โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เวลาจริง hello_rt.o ที่ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ   &lt;/div&gt;          &lt;p&gt;&lt;br&gt;   เมื่อ&lt;wbr&gt;ได้&lt;wbr&gt;แฟ้มข้อมูล hello_rt.c แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``kgcc  `rtl-config -cflags` -c hello_rt.c -o hello_rt.o" หลังจาก&lt;wbr&gt;คอมไพล์&lt;wbr&gt;เสร็จ&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ใน&lt;wbr&gt;ชื่อ hello_rt.o แล้ว&lt;wbr&gt;ลอง&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``insmod hello_rt.o" จะ&lt;wbr&gt;พบ&lt;wbr&gt;ว่า&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ได้&lt;wbr&gt;ทั้งนี้&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล   hello_rt มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;คอมไพล์&lt;wbr&gt;รวม&lt;wbr&gt;ไว้&lt;wbr&gt;ใน kernel ดังนั้น&lt;wbr&gt;ต้อง&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ก่อน เพื่อให้ kernel มี&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ต่างๆ ที่ hello_rt ต้องการ  &lt;/p&gt;     &lt;p&gt; ลอง&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``rtlinux start hello_rt.o" จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่  &lt;a&gt;5&lt;/a&gt; คำสั่ง rtlinux  เป็น&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ที่ RTLinux เตรียม&lt;wbr&gt;ไว้&lt;wbr&gt;ให้&lt;wbr&gt;เพื่อ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่ RTLinux ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้   kernel สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ ก่อน&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ต่อไป    &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:rtlinux-hello-rt"&gt;&lt;/a&gt;&lt;a name="325"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง rtlinux สำหรับ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt&lt;/caption&gt; &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 157px; width: 613px;" src="http://docs.google.com/File?id=dhdj5j7_57d2ph2r"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; จาก&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;5&lt;/a&gt; จะ&lt;wbr&gt;เห็น&lt;wbr&gt;ว่า&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  mbuff, rtl_config, rtl, rtl_posixio, rtl_sched และ rtl_time ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  hello_rt จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;แทรก&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel นี้ มี&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อะไร&lt;wbr&gt;บ้าง&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ก่อน&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล  hello_rt สามารถ&lt;wbr&gt;ดู&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``lsmod" จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;6&lt;/a&gt;  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:lsmod-hello-rt"&gt;&lt;/a&gt;&lt;a name="326"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง lsmod หลังจาก&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt&lt;/caption&gt; &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 123px; width: 747px;" src="http://docs.google.com/File?id=dhdj5j7_54g852nm"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; จาก&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;6&lt;/a&gt; สามารถ&lt;wbr&gt;อธิบาย&lt;wbr&gt;ได้&lt;wbr&gt;ว่า&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล   hello_rt จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล rtl_sched, rtl_time และ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล rtl สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง   หาก&lt;wbr&gt;เรา&lt;wbr&gt;ไม่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง rtlinux ใน&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง  insmod ใน&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ได้ แต่&lt;wbr&gt;ต้อง&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;เรียง&lt;wbr&gt;ตาม&lt;wbr&gt;ลำดับ&lt;wbr&gt;ดังนี้ rtl, rtl_time  และ rtl_sched แล้ว&lt;wbr&gt;ตาม&lt;wbr&gt;ด้วย hello_rt  &lt;/p&gt;     &lt;p&gt; ส่วน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล mbuff และ rtl_fifo ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;นำมา&lt;wbr&gt;ใช้ ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;เป็น&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;รับส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;กับ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;อื่น   หรือ โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;อื่นๆ เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;กัน&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ใน&lt;wbr&gt;บทความ&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อไป  &lt;/p&gt;     &lt;p&gt; มา&lt;wbr&gt;ดู&lt;wbr&gt;ผล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt กัน ลอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``dmesg" จะ&lt;wbr&gt;ได้&lt;wbr&gt;ผล&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่  &lt;a&gt;7&lt;/a&gt; โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt   นี้&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;โดย&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``x Hello World!" การ&lt;wbr&gt;พิมพ์&lt;wbr&gt;จะ&lt;wbr&gt;พิมพ์&lt;wbr&gt;ซ้ำ&lt;wbr&gt;ทุกๆ   0.5 วินาที&lt;wbr&gt;ไป&lt;wbr&gt;เรื่อยๆ จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นี้&lt;wbr&gt;ออก&lt;wbr&gt;จาก kernel โดย&lt;wbr&gt;ที่ x คือ&lt;wbr&gt;ตัวเลข&lt;wbr&gt;ที่&lt;wbr&gt;เริ่ม&lt;wbr&gt;จาก 1 และ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ค่า&lt;wbr&gt;ขึ้น&lt;wbr&gt;ทุกๆ คร้งที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;พิมพ์  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;        &lt;div align="center"&gt;&lt;a name="fig:easy-rt:dmesg-insmod-hello-rt"&gt;&lt;/a&gt;&lt;a name="327"&gt;&lt;/a&gt;    &lt;table&gt;    &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; ผล&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง dmesg หลังจาก&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt&lt;/caption&gt; &lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;                      &lt;div align="center"&gt; &lt;img style="height: 116px; width: 535px;" src="http://docs.google.com/File?id=dhdj5j7_58cp84h2"&gt;    &lt;/div&gt;                   &lt;/td&gt;       &lt;/tr&gt;             &lt;/tbody&gt;   &lt;/table&gt;    &lt;/div&gt;         &lt;p&gt; การ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ออก&lt;wbr&gt;จาก kernel ทำ&lt;wbr&gt;ได้ 2 วิธี วิธี&lt;wbr&gt;แรก&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``rtlinux   stop hello_rt" คำสั่ง&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt และ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;บอื่นๆ ของ RTLinux  ออก&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย ส่วน&lt;wbr&gt;วิธี&lt;wbr&gt;ที่&lt;wbr&gt;สอง&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``rmmod hello_rt" คำสั่ง&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;เฉพาะ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ออก&lt;wbr&gt;จาก kernel เท่านั้น วิธี&lt;wbr&gt;นี้&lt;wbr&gt;เหมาะ&lt;wbr&gt;สำหรับ&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง   เรา&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;นั้น&lt;wbr&gt;ได้&lt;wbr&gt;เลย&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง insmod ซึ่ง&lt;wbr&gt;จะ&lt;wbr&gt;เร็ว&lt;wbr&gt;กว่า&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง   rtlinux ทั้งนี้เพราะ โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต่างๆ ยัง&lt;wbr&gt;อยู่&lt;wbr&gt;ใน kernel  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00150000000000000000"&gt; 5 การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;/a&gt;   &lt;/h1&gt;        &lt;p&gt; หลังจาก&lt;wbr&gt;ได้&lt;wbr&gt;ทดลอง&lt;wbr&gt;แทรก&lt;wbr&gt;และ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt แล้ว มา&lt;wbr&gt;พิจารณา&lt;wbr&gt;ส่วนประกอบ&lt;wbr&gt;ต่างๆ ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ลhello_rt กัน&lt;wbr&gt;ว่า&lt;wbr&gt;มี&lt;wbr&gt;อะไร&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ขึ้น&lt;wbr&gt;จาก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello บ้าง  &lt;/p&gt;     &lt;p&gt; ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 02 และ 03 เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;มา&lt;wbr&gt;สำหรับ&lt;wbr&gt;อ้างอิง&lt;wbr&gt;ถึง&lt;wbr&gt;ประเภท&lt;wbr&gt;ตัวแปร&lt;wbr&gt;และ&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล   hello ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง บรรทัด&lt;wbr&gt;ที่ 07 เป็น&lt;wbr&gt;การ&lt;wbr&gt;ประกาศ&lt;wbr&gt;ตัวแปร periodic_thread สำหรับ&lt;wbr&gt;เก็บ&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง  &lt;/p&gt;     &lt;p&gt; ฟังก์ชัน periodic_function( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 08 จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน   periodic_thread โดย&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ให้&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;ฟังก์ชัน pthread_create( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 24 บรรทัด&lt;wbr&gt;ที่ 10-14 (ก่อน&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ฟังก์ชัน while( 1 ))จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;เพียง&lt;wbr&gt;ครั้ง&lt;wbr&gt;เดียว   เมื่อ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ทำงาน&lt;wbr&gt;มา&lt;wbr&gt;ถึง&lt;wbr&gt;คำสั่ง pthread_create( ) จึง&lt;wbr&gt;เหมาะ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ส่วน&lt;wbr&gt;นี้&lt;wbr&gt;ของ&lt;wbr&gt;ฟังก์ชัน   periodic_function( ) สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ภายใน&lt;wbr&gt;ฟังก์ชัน    &lt;/p&gt;     &lt;p&gt; โครงสร้าง sched_param p ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 11 จะ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;ค่า&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ทาง&lt;wbr&gt;ด้าน&lt;wbr&gt;ตารางเวลา&lt;wbr&gt;ของ   &lt;i&gt;thread&lt;/i&gt; บรรทัด&lt;wbr&gt;ที่ 12 เป็น&lt;wbr&gt;การ&lt;wbr&gt;กำหนด&lt;wbr&gt;ลำดับ&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;หลายๆ &lt;i&gt;thread&lt;/i&gt; ทำงาน&lt;wbr&gt;พร้อมกัน ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; จะ&lt;wbr&gt;มาก&lt;wbr&gt;หรือ&lt;wbr&gt;น้อย&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้ ถ้า&lt;wbr&gt;มี&lt;wbr&gt;ค่า&lt;wbr&gt;น้อย&lt;wbr&gt;กว่า&lt;wbr&gt;เมื่อ&lt;wbr&gt;เทียบ&lt;wbr&gt;กับ &lt;i&gt;thread&lt;/i&gt; อื่น แสดง&lt;wbr&gt;ว่า &lt;i&gt;thread&lt;/i&gt; นี้&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;ต่ำ&lt;wbr&gt;กว่า&lt;wbr&gt;และ&lt;wbr&gt;พร้อม&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ให้   &lt;i&gt;thread&lt;/i&gt; อื่น&lt;wbr&gt;ได้&lt;wbr&gt;ใช้&lt;wbr&gt;งาน  &lt;/p&gt;     &lt;p&gt; ฟังก์ชัน pthread_setschedparam( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 13 ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ทาง&lt;wbr&gt;ด้าน&lt;wbr&gt;ตารางเวลา&lt;wbr&gt;ของ   &lt;i&gt;thread&lt;/i&gt; ค่าตัวแปร&lt;wbr&gt;แรก&lt;wbr&gt;เป็น &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;จะ&lt;wbr&gt;กำหนด&lt;wbr&gt;คุณสมบัติ ใน&lt;wbr&gt;ที่นี้&lt;wbr&gt;ได้&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชันpthread_self( ) ซึ่ง&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้(&lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;คือperiodic_thread) ตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;สอง&lt;wbr&gt;ใน RTLinux รุ่น&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;เฉพาะ SCHED_FIFO เท่านั้น&lt;wbr&gt;เพื่อ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;บอก&lt;wbr&gt;ว่า&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;โครงสร้าง   sched_param p เฉพาะ&lt;wbr&gt;ค่า sched_priority สำหรับ&lt;wbr&gt;กำหนด&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt;   ส่วนตัว&lt;wbr&gt;แปร&lt;wbr&gt;ที่&lt;wbr&gt;สาม&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;โครงสร้าง sched_param p ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;กำหนด  &lt;/p&gt;     &lt;p&gt; ฟังก์ชัน pthread_make_periodic_np( ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 14 ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;กำหนด &lt;i&gt;thread&lt;/i&gt;  ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;ราย&lt;wbr&gt;คาบ ตัวแปร&lt;wbr&gt;แรก&lt;wbr&gt;จะ&lt;wbr&gt;เป็น &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง ใน&lt;wbr&gt;ที่นี้&lt;wbr&gt;คือ periodic_thread ซึ่ง&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชันpthread_self( ) ตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;สอง&lt;wbr&gt;เป็น&lt;wbr&gt;เวลาเริ่ม&lt;wbr&gt;ต้น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ให้ periodic_thread เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง มี&lt;wbr&gt;ประเภท&lt;wbr&gt;ตัวแปร&lt;wbr&gt;เป็น hrtime (signed integer 64 bit) ใน&lt;wbr&gt;หน่วย นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที โดย&lt;wbr&gt;เวลา&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ค่า&lt;wbr&gt;เทียบ&lt;wbr&gt;กับ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เริ่ม&lt;wbr&gt;นับ&lt;wbr&gt;ตั้งแต่&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย   RT kernel ใน&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ได้&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน gethrtime( ) ซึ่ง&lt;wbr&gt;จะ&lt;wbr&gt;คืน&lt;wbr&gt;ค่า&lt;wbr&gt;เวลา&lt;wbr&gt;ปัจจุบัน&lt;wbr&gt;ใน&lt;wbr&gt;หน่วย&lt;wbr&gt;นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที&lt;wbr&gt;กลับ&lt;wbr&gt;มา   ตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;สาม&lt;wbr&gt;เป็นคาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;จะ&lt;wbr&gt;ให้ periodic_thread ทำงาน&lt;wbr&gt;มี หน่วย&lt;wbr&gt;เป็น&lt;wbr&gt;นา&lt;wbr&gt;โน&lt;wbr&gt;วินาที   ดังนั้น&lt;wbr&gt;ใน&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ periodic_thread ทุกๆ 0.5 วินาที โดย&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ทันที&lt;wbr&gt;ที่&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;นี้    &lt;/p&gt;     &lt;p&gt; การ&lt;wbr&gt;เรียก&lt;wbr&gt;ฟังก์ชัน while( 1 ) ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 15 เป็น&lt;wbr&gt;สิ่ง&lt;wbr&gt;จำเป็น&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ   เงื่อนไข&lt;wbr&gt;ใน while จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;จริง&lt;wbr&gt;เสมอ เพื่อที่จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 17-18  ทำงาน&lt;wbr&gt;วน&lt;wbr&gt;ซ้ำ&lt;wbr&gt;ไป&lt;wbr&gt;เรื่อยๆ ไม่&lt;wbr&gt;มี&lt;wbr&gt;จบ ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 17 ฟังก์ชัน pthread_wait_np( ) จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ไว้&lt;wbr&gt;จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;ถึง&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;กำหนด   periodic_thread จึง&lt;wbr&gt;จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;และ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ต่อไป  ใน&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ที่ periodic_thread ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;หน่วยประมวลผลกลาง กระบวนการ&lt;wbr&gt;อื่น  โปรแกรม&lt;wbr&gt;อื่น หรือ &lt;i&gt;thread&lt;/i&gt; อื่น&lt;wbr&gt;สามารถ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;หน่วยประมวลผลกลาง&lt;wbr&gt;ได้  &lt;/p&gt;     &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 18 และ 30 เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน rtl_printf( ) แทน&lt;wbr&gt;ฟังก์ชัน printk(  )  ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 18 จะ&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``x Hello World!" โดย&lt;wbr&gt;ที่ x คือ&lt;wbr&gt;ตัวเลข 1, 2,  ... ใน&lt;wbr&gt;ขณะที่&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่ 30 จะ&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Bye"  &lt;/p&gt;     &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 24 เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน pthread_create( ) สำหรับ&lt;wbr&gt;สร้าง &lt;i&gt;thread&lt;/i&gt;   ตัวแปร&lt;wbr&gt;แรก periodic_thread ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เก็บ&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ต่างๆ ของ &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;เรา&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;สอง&lt;wbr&gt;เป็นคุณ&lt;wbr&gt;สมบัติ&lt;wbr&gt;ของ &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;ต้องการ หาก&lt;wbr&gt;ใช้&lt;wbr&gt;ค่า ``NULL" ฟังก์ชัน&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ค่า&lt;wbr&gt;โดย&lt;wbr&gt;ปริยาย&lt;wbr&gt;ตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;สาม periodic_function( ) เป็น&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน &lt;i&gt;thread&lt;/i&gt; ที่&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น ส่วนตัว&lt;wbr&gt;แปร&lt;wbr&gt;ที่&lt;wbr&gt;สี่&lt;wbr&gt;เป็น&lt;wbr&gt;ค่าตัวแปร&lt;wbr&gt;ที่&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้&lt;wbr&gt;ฟังก์ชัน periodic_function( )  &lt;/p&gt;     &lt;p&gt; บรรทัด&lt;wbr&gt;ที่ 29 เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน pthread_delete_np( ) สำหรับ&lt;wbr&gt;ลบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ   periodic_thread ออก&lt;wbr&gt;จาก kernel เป็น&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;วิธี&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ของ&lt;wbr&gt;ฟังก์ชัน   perodic_function( )  &lt;/p&gt;     &lt;p&gt; โดย&lt;wbr&gt;สรุป&lt;wbr&gt;แล้ว การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt เมื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel จะ&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน init_module( ) ทำ&lt;wbr&gt;การ&lt;wbr&gt;สร้าง periodic_thread จาก&lt;wbr&gt;ฟังก์ชัน pthread_create( ) และ&lt;wbr&gt;เรียก&lt;wbr&gt;ฟังก์ชัน  periodic_function( ) ให้&lt;wbr&gt;ทำงาน ใน&lt;wbr&gt;ฟังก์ชัน periodic_function( ) มี&lt;wbr&gt;การ&lt;wbr&gt;เรียก&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน  pthread_make_periodic_np( ) เพื่อ&lt;wbr&gt;กำหนด&lt;wbr&gt;ให้ periodic_thread ทำงาน&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;ด้วย&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา  0.5 วินาที หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;จะ&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ทำงาน&lt;wbr&gt;วน&lt;wbr&gt;ซ้ำ&lt;wbr&gt;ภายใต้&lt;wbr&gt;ฟังก์ชันwhile( 1 ) แต่&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;และ&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใหม่&lt;wbr&gt;เมื่อ&lt;wbr&gt;ถึง&lt;wbr&gt;คาบ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;ด้วย&lt;wbr&gt;ฟังก์ชัน   pthread_wait_np( ) การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;ลง&lt;wbr&gt;เมื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล hello_rt ออก&lt;wbr&gt;จาก kernel  โดย&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;จะ&lt;wbr&gt;ไป&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ฟังก์ชัน cleanup_module( ) และ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ลบ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ periodic_thread  ออก&lt;wbr&gt;จาก kernel ด้วย&lt;wbr&gt;ฟังก์ชัน pthread_delete_np( )  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00160000000000000000"&gt; 6 สรุป&lt;/a&gt; &lt;/h1&gt;        &lt;p&gt; ใน&lt;wbr&gt;ครั้งนี้&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;คง&lt;wbr&gt;ได้&lt;wbr&gt;รู้&lt;wbr&gt;และ&lt;wbr&gt;ทดลอง&lt;wbr&gt;เขียน&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;สำหรับ Linux และ RTLinux   กัน คง&lt;wbr&gt;เกิด&lt;wbr&gt;ปัญหา&lt;wbr&gt;กัน&lt;wbr&gt;บ้าง บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ไม่&lt;wbr&gt;อ่าน บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ที่&lt;wbr&gt;สร้าง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ไม่&lt;wbr&gt;ได้   และ อีก&lt;wbr&gt;หลายๆ บาง&lt;wbr&gt;ที่&lt;wbr&gt;อาจ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น มัน&lt;wbr&gt;ก็&lt;wbr&gt;เป็น&lt;wbr&gt;เรื่อง&lt;wbr&gt;ปกติ&lt;wbr&gt;ครับ ผู้เขียน&lt;wbr&gt;เอง&lt;wbr&gt;ก็&lt;wbr&gt;ผ่าน&lt;wbr&gt;เรื่อง&lt;wbr&gt;เหล่านี้&lt;wbr&gt;มา&lt;wbr&gt;จน&lt;wbr&gt;ชิน&lt;wbr&gt;กับ&lt;wbr&gt;มัน&lt;wbr&gt;เสียแล้ว   เมื่อ&lt;wbr&gt;เจอ&lt;wbr&gt;ปัญหา&lt;wbr&gt;ก็&lt;wbr&gt;ขอ&lt;wbr&gt;ให้&lt;wbr&gt;ดีใจ&lt;wbr&gt;เถอะ&lt;wbr&gt;ครับ ดีใจ&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;แก้&lt;wbr&gt;ปัญหา ผม&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;เป็น&lt;wbr&gt;บทเรียน&lt;wbr&gt;ที่&lt;wbr&gt;ดี&lt;wbr&gt;ที่สุด&lt;wbr&gt;เลย&lt;wbr&gt;ทีเดียว   หาก&lt;wbr&gt;ติด&lt;wbr&gt;อะไร แก้&lt;wbr&gt;ไม่&lt;wbr&gt;ตก ก็&lt;wbr&gt;อย่า&lt;wbr&gt;ได้&lt;wbr&gt;เกรงใจ เขียน&lt;wbr&gt;จดหมาย&lt;wbr&gt;อิเล็กทรอนิกส์&lt;wbr&gt;มา&lt;wbr&gt;ปรึกษา&lt;wbr&gt;กัน&lt;wbr&gt;ได้    &lt;/p&gt;     &lt;p&gt; ใน&lt;wbr&gt;ครั้ง&lt;wbr&gt;หน้า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ศึกษา&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ประยุกต์&lt;wbr&gt;กัน   โดย&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กัน&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง FIFO และ&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;อธิบาย&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;ตัวอย่าง frank ที่มา&lt;wbr&gt;กับ RTLinux  &lt;/p&gt;     &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00170000000000000000"&gt; 7 แหล่งข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;/a&gt; &lt;/h1&gt;        &lt;p&gt;  &lt;/p&gt;     &lt;ol&gt;    &lt;li&gt;Bradford Nichols, Dick Buttlar &amp;amp; Jacqueline Proulx Farrell, &lt;i&gt;Pthreads   Programming&lt;/i&gt;, O'Reilly &amp;amp; Associates, Inc.  &lt;/li&gt;    &lt;li&gt;Alessandro Rubini &amp;amp; Jonathan Corbet, &lt;i&gt;Linux Device Drivers, 2nd   Edition&lt;/i&gt;, &lt;a href="http://www.xml.com/ldd/chapter/book"&gt;http://www.xml.com/ldd/chapter/book&lt;/a&gt;   &lt;/li&gt;    &lt;li&gt;เอกสาร&lt;wbr&gt;ที่มา&lt;wbr&gt;กับ RTLinux โดยเฉพาะ&lt;wbr&gt;เอกสาร&lt;wbr&gt;ที่&lt;wbr&gt;ชื่อ Gettingstart.txt  &lt;/li&gt;       &lt;/ol&gt;        &lt;p&gt;  &lt;/p&gt;     &lt;h1&gt;&lt;a name="SECTION00200000000000000000"&gt; About this document ...&lt;/a&gt; &lt;/h1&gt;        &lt;p&gt; This document was generated using the &lt;a href="http://www-texdev.mpce.mq.edu.au/l2h/docs/manual/"&gt;&lt;strong&gt;LaTeX&lt;/strong&gt;2&lt;tt&gt;HTML&lt;/tt&gt;&lt;/a&gt;  translator Version 2K.1beta (1.48) &lt;/p&gt;     &lt;p&gt; Copyright © 1993, 1994, 1995, 1996, &lt;a href="http://cbl.leeds.ac.uk/nikos/personal.html"&gt;Nikos Drakos&lt;/a&gt;,  Computer  Based Learning Unit, University of Leeds. &lt;br&gt;    Copyright © 1997, 1998, 1999, &lt;a href="http://www.maths.mq.edu.au/%7Eross/"&gt;Ross Moore&lt;/a&gt;,  Mathematics Department, Macquarie University, Sydney. &lt;/p&gt;     &lt;p&gt;The translation was initiated by Pished Bunnun on 2003-02-14&lt;/p&gt;     &lt;hr&gt;      &lt;br&gt;        &lt;address&gt; Pished Bunnun 2003-02-14 &lt;/address&gt;    &lt;br&gt;    &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-7076865405540677281?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/7076865405540677281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=7076865405540677281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7076865405540677281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7076865405540677281'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/rtlinux-linux-3.html' title=''/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-3992360094394154889</id><published>2007-04-20T12:00:00.000+01:00</published><updated>2007-04-20T23:39:01.004+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'></title><content type='html'>    &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt; &lt;h1&gt;&lt;a name="SECTION00100000000000000000"&gt;&lt;b&gt;RTLinux: Linux สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง&lt;/b&gt;&lt;/a&gt;&lt;/h1&gt; &lt;h1&gt;&lt;a name="SECTION00100000000000000000"&gt;&lt;b&gt;ตอน&lt;wbr&gt;ที่ 2 การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ระบบปฏิบัติการ RTLinux&lt;/b&gt;&lt;/a&gt; &lt;/h1&gt; &lt;/div&gt; &lt;p align="right"&gt; &lt;a title="พิเชษฐ์ บุญหนุน" href="mailto:p%20i%20s%20h%20e%20d@nectec.or.th"&gt;&lt;font size="+1"&gt;พิเชษฐ์ บุญ&lt;wbr&gt;หนุน&lt;/font&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00110000000000000000"&gt; 1 บทนำ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ใน&lt;wbr&gt;ตอน&lt;wbr&gt;ที่แล้ว&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;ความ&lt;wbr&gt;รู้จัก&lt;wbr&gt;กับ RTLinux กัน&lt;wbr&gt;มา&lt;wbr&gt;พอสมควร ผู้เขียน&lt;wbr&gt;ก็&lt;wbr&gt;หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;มัน&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;สร้าง&lt;wbr&gt;แรงจูงใจ&lt;wbr&gt;ให้&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;สนใจ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ศึกษา&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux ต่อไป มา&lt;wbr&gt;ตอนนี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ทราบ&lt;wbr&gt;ถึง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ตอน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux กัน &lt;/p&gt; &lt;p&gt; การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ระบบปฏิบัติการ RTLinux เป็น&lt;wbr&gt;การ&lt;wbr&gt;เปลี่ยน kernel ของ&lt;wbr&gt;ระบบปฏิบัติการ Linux เดิม ซึ่ง&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ของ&lt;wbr&gt;ผู้&lt;wbr&gt;เผยแพร่&lt;wbr&gt;ราย&lt;wbr&gt;ใด&lt;wbr&gt;ก็ได้&lt;wbr&gt;เช่น RedHat, Mandrake, Debian หรือ TLE มา&lt;wbr&gt;ใช้ kernel ของ RTLinux (ต่อไป&lt;wbr&gt;จะ&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า RT-Kernel) ที่&lt;wbr&gt;พร้อม&lt;wbr&gt;จะ&lt;wbr&gt;แทรก modules การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้&lt;wbr&gt;ใน&lt;wbr&gt;ขณะที่&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ต่างๆ ของ Linux ยังคง&lt;wbr&gt;เหมือน&lt;wbr&gt;เดิม &lt;/p&gt; &lt;p&gt; RTLinux ที่&lt;wbr&gt;เผยแพร่&lt;wbr&gt;ใน&lt;wbr&gt;ระบบ&lt;wbr&gt;อิน&lt;wbr&gt;เตอร์&lt;wbr&gt;เน็ต&lt;wbr&gt;จะ&lt;wbr&gt;อยู่&lt;wbr&gt;ใน&lt;wbr&gt;รูป&lt;wbr&gt;ของ&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;จำเป็น&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;และ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ต่างๆ เอง ดังนั้น&lt;wbr&gt;ผู้&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ควร&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;รู้เรื่อง&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel อยู่&lt;wbr&gt;บ้าง สำหรับ&lt;wbr&gt;ผู้&lt;wbr&gt;ที่&lt;wbr&gt;ไม่&lt;wbr&gt;เคย&lt;wbr&gt;ทำ&lt;wbr&gt;มา&lt;wbr&gt;ก่อน&lt;wbr&gt;ก็&lt;wbr&gt;อย่า&lt;wbr&gt;พึ่ง&lt;wbr&gt;กลัว&lt;wbr&gt;ไป&lt;wbr&gt;ก่อน&lt;wbr&gt;ว่า&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ไม่&lt;wbr&gt;ได้ การ&lt;wbr&gt;คอมไพล์ kernel ไม่&lt;wbr&gt;ได้&lt;wbr&gt;ยาก&lt;wbr&gt;อย่าง&lt;wbr&gt;ที่&lt;wbr&gt;คิด ขอ&lt;wbr&gt;แค่&lt;wbr&gt;เรา&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;อดทน&lt;wbr&gt;และ&lt;wbr&gt;พยายาม&lt;wbr&gt;อ่าน&lt;wbr&gt;คู่มือ&lt;wbr&gt;ช่วยเหลือ ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;คอมไพล์ kernel ให้&lt;wbr&gt;ใช้ได้ &lt;/p&gt; &lt;p&gt; การ&lt;wbr&gt;ติดตั้ง RTLinux ประกอบ&lt;wbr&gt;ด้วย 3 ขั้นตอน&lt;wbr&gt;ใหญ่ๆ ด้วย&lt;wbr&gt;กัน ขั้นแรก คือ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ของ&lt;wbr&gt;ผู้&lt;wbr&gt;เผยแพร่&lt;wbr&gt;ราย&lt;wbr&gt;ใด&lt;wbr&gt;ก็ได้&lt;wbr&gt;แล้วแต่&lt;wbr&gt;ความ&lt;wbr&gt;ชอบใจ&lt;wbr&gt;ของ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;งาน ใน&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;นี้&lt;wbr&gt;อยู่&lt;wbr&gt;นอกเหนือ&lt;wbr&gt;ขอบเขต&lt;wbr&gt;ของ&lt;wbr&gt;บทความ อีก&lt;wbr&gt;ทั้ง&lt;wbr&gt;เอกสาร&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;วิธีการ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ก็&lt;wbr&gt;มี&lt;wbr&gt;อยู่&lt;wbr&gt;ทั่วไป จึง&lt;wbr&gt;จะ&lt;wbr&gt;ขอ&lt;wbr&gt;ไม่&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง ขั้น&lt;wbr&gt;ที่&lt;wbr&gt;สอง คือ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RT-Kernel และ&lt;wbr&gt;ขั้นสุดท้าย คือ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง modules ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง &lt;/p&gt; &lt;p&gt; ใน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;พยายาม&lt;wbr&gt;อธิบาย&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux ทีละ&lt;wbr&gt;ขั้นตอน โดย&lt;wbr&gt;อาศัย&lt;wbr&gt;รูปภาพ&lt;wbr&gt;เพื่อ&lt;wbr&gt;ช่วย&lt;wbr&gt;ให้&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;เข้าใจ&lt;wbr&gt;ได้&lt;wbr&gt;ง่าย&lt;wbr&gt;ขึ้น และ&lt;wbr&gt;ใน&lt;wbr&gt;แต่ละ&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;ได้&lt;wbr&gt;พยายาม&lt;wbr&gt;แทรก&lt;wbr&gt;ข้อ&lt;wbr&gt;ควร&lt;wbr&gt;ระวัง&lt;wbr&gt;เพื่อ&lt;wbr&gt;ไม่&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;ระหว่าง&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00120000000000000000"&gt; 2 เตรียม&lt;wbr&gt;การ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; จาก&lt;wbr&gt;ที่&lt;wbr&gt;เคย&lt;wbr&gt;กล่าว&lt;wbr&gt;มา&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า RTLinux ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;นี้ เป็น&lt;wbr&gt;เพียง&lt;wbr&gt;การ&lt;wbr&gt;เปลี่ยน Linux kernel ให้&lt;wbr&gt;เป็น RT-Kernel เท่านั้น ฉะนั้น&lt;wbr&gt;จำเป็น&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ติดตั้ง Linux ให้&lt;wbr&gt;เสร็จ&lt;wbr&gt;เรียบร้อย&lt;wbr&gt;ก่อน เพื่อ&lt;wbr&gt;ป้องกัน&lt;wbr&gt;ปัญหา&lt;wbr&gt;ที่&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ใน&lt;wbr&gt;ภายหลัง ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้&lt;wbr&gt;พยายาม&lt;wbr&gt;ติดตั้งDevelopment Packages ทุกอย่าง&lt;wbr&gt;ที่&lt;wbr&gt;ผู้&lt;wbr&gt;เผยแพร่&lt;wbr&gt;ได้&lt;wbr&gt;เตรียม&lt;wbr&gt;ให้ &lt;/p&gt; &lt;p&gt; หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux แล้ว ให้&lt;wbr&gt;ไป&lt;wbr&gt;นำ&lt;wbr&gt;ไฟล์&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux ดังต่อไปนี้&lt;wbr&gt;มา &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt;   &lt;li&gt;rtlinux-3.1.tar.gz จาก &lt;a href="http://www.fsmlabs.com"&gt;www.fsmlabs.com&lt;/a&gt; เป็น&lt;wbr&gt;รุ่น&lt;wbr&gt;ล่าสุด&lt;wbr&gt;ของ&lt;wbr&gt;ระบบปฏิบัติการ RTLinux &lt;/li&gt;   &lt;li&gt;linux-2.4.4.tar.gz (หรือ linux-2.2.18.tar.gz) จาก &lt;a href="http://www.kernel.org"&gt;www.kernel.org&lt;/a&gt; เป็น Kernel ที่ RTLinux 3.1 สนับสนุน &lt;/li&gt; &lt;/ol&gt; เมื่อ&lt;wbr&gt;ได้&lt;wbr&gt;ไฟล์&lt;wbr&gt;ตาม&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;มา&lt;wbr&gt;แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คัดลอก&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ไป&lt;wbr&gt;ที่ /usr/src/ แล้ว&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ต่อไปนี้ &lt;div align="left"&gt; &lt;/div&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/&amp;gt; tar zxvf linux-2.4.4.tar.gz &lt;/td&gt;             &lt;td align="left"&gt;คลาย&lt;wbr&gt;การ&lt;wbr&gt;บีบ&lt;wbr&gt;อัด&lt;wbr&gt;ไฟล์ linux-2.4.4.tar.gz &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;             &lt;div align="center"&gt; &lt;/div&gt; /usr/src/&amp;gt; ln -s linux-2.4.4 linux&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;สร้าง symbolic link ของ&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ linux-2.4.4 เป็น linux&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; tar zxvf rtlinux-3.1.tar.gz&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;คลาย&lt;wbr&gt;การ&lt;wbr&gt;บีบ&lt;wbr&gt;อัด&lt;wbr&gt;ไฟล์ rtlinux-3.1.tar.gz&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; cd linux&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ linux&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux&amp;gt; patch -p1 &amp;lt; ../rtlinux-3.1/kernel_patch-2.4.4 &lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;แก้ไข&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ของ kernel ด้วย patch ที่ RTLinux เตรียม&lt;wbr&gt;ไว้&lt;wbr&gt;ให้&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;i&gt;&lt;br&gt; &lt;font color="#3333ff"&gt;ปรับปรุง เพิ่มเติม&lt;/font&gt; &lt;/i&gt; &lt;br&gt; ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ต้องการ&lt;wbr&gt;ใช้ kernel รุ่น 2.4.xx ลอง&lt;wbr&gt;ไป&lt;wbr&gt;หา patch ที่&lt;a href="http://www.fsmlabs.at"&gt;www.fsmlabs.at&lt;/a&gt; ซึ่ง&lt;wbr&gt;จะ&lt;wbr&gt;รวม patch ต่างๆ&lt;wbr&gt;สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux 3.1 ใน kernel ที่&lt;wbr&gt;นอกเหนือ&lt;wbr&gt;จาก&lt;wbr&gt;รุ่น 2.4.4 นอกจากนี้&lt;wbr&gt;ยัง&lt;wbr&gt;มีpatch สำหรับ&lt;wbr&gt;ใช้&lt;wbr&gt;กับ&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์&lt;wbr&gt;รุ่น 3.2 ที่&lt;wbr&gt;มี&lt;wbr&gt;อยู่&lt;wbr&gt;ใน Redhat 7.3 และ Mandrake 9.0 &lt;/p&gt; &lt;p&gt;สมมติ&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;ติดตั้ง RTLinux ใน kernel รุ่น 2.4.18 ให้&lt;wbr&gt;ไป&lt;wbr&gt;นำ patch ชื่อ rt_patch-2.4.18smp-rtl3.1.tar.bz2 มา และ&lt;wbr&gt;อย่า&lt;wbr&gt;ลืม&lt;wbr&gt;ต้อง&lt;wbr&gt;นำ&lt;wbr&gt;แฟ้มข้อมูล linux-2.4.18.tar.bz2 มา&lt;wbr&gt;ด้วย และ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ต่อไปนี้&lt;br&gt; &lt;/p&gt; &lt;table border="1" cellpadding="2" cellspacing="2" width="100%"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;       &lt;table align="center" cellpadding="3" width="100%"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/&amp;gt; tar jxvf linux-2.4.18.tar.bz2&lt;br&gt;             &lt;/td&gt;             &lt;td align="left"&gt;คลาย&lt;wbr&gt;การ&lt;wbr&gt;บีบ&lt;wbr&gt;อัด&lt;wbr&gt;ไฟล์ linux-2.4.18.bz2&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; ln -s linux-2.4.18 linux&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; tar zxvf rtlinux-3.1.tar.gz&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; tar jxvf rt_patch-2.4.18smp-rtl3.1.tar.bz2&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;คลาย&lt;wbr&gt;การ&lt;wbr&gt;บีบ&lt;wbr&gt;อัด&lt;wbr&gt;ไฟล์ rt_patch-2.4.18smp-rtl3.1.tar.bz2&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/&amp;gt; cd linux&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux/&amp;gt; patch -p1 &amp;lt;../patch_rtl-2.4.18-smp&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;แก้ไข&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ของ kernel ด้วย patch ที่&lt;wbr&gt;หา&lt;wbr&gt;มา&lt;wbr&gt;เพ่ิม&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux/&amp;gt; cd ../rtlinux-3.1&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1/&amp;gt; patch -p1 &amp;lt;../patch_rtlinux-3.1-smp&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;แก้ไข&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ของ kernel ด้วย patch ที่&lt;wbr&gt;หา&lt;wbr&gt;มา&lt;wbr&gt;เพ่ิม&lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;div align="center"&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;หลังจาก&lt;wbr&gt;นั้น&lt;wbr&gt;ก็&lt;wbr&gt;ทำ&lt;wbr&gt;ตาม&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;ต่อไป&lt;br&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00130000000000000000"&gt; 3 การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ Kernel&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; เมื่อ&lt;wbr&gt;ถึง&lt;wbr&gt;ขั้น&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ของ kernel ที่ทำการ&lt;wbr&gt;แก้ไข&lt;wbr&gt;บาง&lt;wbr&gt;ส่วน&lt;wbr&gt;ให้&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง พร้อม&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;และ&lt;wbr&gt;คอมไพล์&lt;wbr&gt;ต่อไป การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel จะ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง &lt;i&gt;make config&lt;/i&gt;, &lt;i&gt;make menuconfig&lt;/i&gt; หรือ &lt;i&gt;make xconfig&lt;/i&gt; ก็ได้ สำหรับ&lt;wbr&gt;คำสั่ง &lt;i&gt;make config&lt;/i&gt; และ &lt;i&gt;make menuconfig&lt;/i&gt; เป็น&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ใน Text Mode (Terminal Console) การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ค่อนข้าง&lt;wbr&gt;จะ&lt;wbr&gt;ยุ่งยาก&lt;wbr&gt;มาก&lt;wbr&gt;กว่า&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง &lt;i&gt;make xconfig&lt;/i&gt; ที่ทำงาน&lt;wbr&gt;ใน Graphic Mode (X-Windows) เพื่อให้&lt;wbr&gt;ง่าย&lt;wbr&gt;ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``make xconfig'' ใน&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel แต่&lt;wbr&gt;อย่า&lt;wbr&gt;ลืม&lt;wbr&gt;เข้า X-Windows ก่อน ไม่&lt;wbr&gt;เช่นนั้น&lt;wbr&gt;จะ&lt;wbr&gt;เกิด&lt;wbr&gt;ข้อความ&lt;wbr&gt;ผิดพลาด&lt;wbr&gt;ขึ้น เดี๋ยว&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;ใจไม่ดี&lt;wbr&gt;เสียก่อน &lt;/p&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/linux&amp;gt; make xconfig &lt;/td&gt;             &lt;td align="left"&gt;เมื่อ&lt;wbr&gt;สั่ง&lt;wbr&gt;บน&lt;wbr&gt;เทอร์&lt;wbr&gt;มิ&lt;wbr&gt;นอ&lt;wbr&gt;ล&lt;wbr&gt;ใน X-Windows จะ&lt;wbr&gt;ได้&lt;wbr&gt;หน้าจอ&lt;wbr&gt;หลัก&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;1&lt;/a&gt; &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:main"&gt;&lt;/a&gt;&lt;a name="174"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; หน้าจอ&lt;wbr&gt;หลัก&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 368px; width: 773px;" src="http://docs.google.com/File?id=dhdj5j7_42crx6bc"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; ใน&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel จะ&lt;wbr&gt;มี&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ให้&lt;wbr&gt;เลือก&lt;wbr&gt;มากมาย&lt;wbr&gt;ใน&lt;wbr&gt;หลายๆ หมวดหมู่ ขอ&lt;wbr&gt;ให้&lt;wbr&gt;พยายาม&lt;wbr&gt;เลือก&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ต่างๆ ให้&lt;wbr&gt;เหมาะ&lt;wbr&gt;กับ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;ใช้&lt;wbr&gt;อยู่&lt;wbr&gt;ให้&lt;wbr&gt;มาก&lt;wbr&gt;ที่สุด ตัวเลือก&lt;wbr&gt;ไหน&lt;wbr&gt;ไม่&lt;wbr&gt;เข้าใจ ไม่&lt;wbr&gt;แน่ใจ พยายาม&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม&lt;wbr&gt;ขอ&lt;wbr&gt;ความ&lt;wbr&gt;ช่วยเหลือ (``Help'') เพื่อ&lt;wbr&gt;อ่าน&lt;wbr&gt;ดู&lt;wbr&gt;คำแนะนำ โดย&lt;wbr&gt;ปกติ&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ใน&lt;wbr&gt;แต่ละ&lt;wbr&gt;รายการ&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ทางเลือก&lt;wbr&gt;ให้ 3 ทาง คือ เลือก&lt;wbr&gt;ให้&lt;wbr&gt;อยู่&lt;wbr&gt;ใน kernel(&lt;i&gt;y&lt;/i&gt;), เลือก&lt;wbr&gt;เป็น module(&lt;i&gt;m&lt;/i&gt;) หรือ ไม่&lt;wbr&gt;ต้องการ(&lt;i&gt;n&lt;/i&gt;) ใน&lt;wbr&gt;กรณี&lt;wbr&gt;เลือก&lt;wbr&gt;เป็น module หมายความ&lt;wbr&gt;ว่า&lt;wbr&gt;เมื่อ&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;นั้นๆ เรา&lt;wbr&gt;ค่อย&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แทรก module นั้นๆ เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน kernel วิธี&lt;wbr&gt;นี้&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ตัว kernel มี&lt;wbr&gt;ขนาด&lt;wbr&gt;เล็ก&lt;wbr&gt;และ&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ได้&lt;wbr&gt;เมื่อ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน การ&lt;wbr&gt;จะ&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สามารถ&lt;wbr&gt;แทรก module ได้&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เลือก&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่&lt;a&gt;2&lt;/a&gt; ใน&lt;wbr&gt;หัวข้อ ``Enable loadable modules support'' ให้&lt;wbr&gt;อยู่&lt;wbr&gt;ใน kernel &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:modules"&gt;&lt;/a&gt;&lt;a name="175"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; เลือก&lt;wbr&gt;ให้ Kernel สามารถ&lt;wbr&gt;แทรก&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล&lt;wbr&gt;ได้&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 218px; width: 533px;" src="http://docs.google.com/File?id=dhdj5j7_43djp8tz"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; ใน&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel สำหรับ RTLinux มี&lt;wbr&gt;ข้อแนะนำ&lt;wbr&gt;ใน&lt;wbr&gt;เอกสาร&lt;wbr&gt;ของ RTLinux อยู่&lt;wbr&gt;ว่า อย่า&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ APM BIOS เพราะ&lt;wbr&gt;ไม่&lt;wbr&gt;อาจ&lt;wbr&gt;คาดเดา&lt;wbr&gt;ผลกระทบ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ ดังนั้น&lt;wbr&gt;ควร&lt;wbr&gt;เลือก&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;3&lt;/a&gt; ใน&lt;wbr&gt;หัวข้อ ``Power Management support'' ไม่&lt;wbr&gt;ให้&lt;wbr&gt;อยู่&lt;wbr&gt;ใน kernel &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:general"&gt;&lt;/a&gt;&lt;a name="176"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; ตัวเลือก&lt;wbr&gt;ทั่วไป&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 263px; width: 519px;" src="http://docs.google.com/File?id=dhdj5j7_44rqkr9h"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; โดย&lt;wbr&gt;ส่วนใหญ่&lt;wbr&gt;สำหรับ&lt;wbr&gt;มือใหม่&lt;wbr&gt;ที่&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;เคย&lt;wbr&gt;คอมไพล์ kernel ด้วย&lt;wbr&gt;ตัวเอง&lt;wbr&gt;มา&lt;wbr&gt;ก่อน มักจะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ด้วย kernel ที่&lt;wbr&gt;คอมไพล์&lt;wbr&gt;เอง&lt;wbr&gt;ได้ สาเหตุ&lt;wbr&gt;หลักๆ ที่&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;โดยมาก&lt;wbr&gt;มัก&lt;wbr&gt;มา&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;ประเภท&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ฮาร์ดดิส&lt;wbr&gt;ที่&lt;wbr&gt;เครื่อง&lt;wbr&gt;มี&lt;wbr&gt;อยู่ โดย&lt;wbr&gt;ปกติ&lt;wbr&gt;ทั่วไป&lt;wbr&gt;แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ประเภท ATA/IDE ดังนั้น&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ฮาร์ดดิส&lt;wbr&gt;ประเภท&lt;wbr&gt;นี้&lt;wbr&gt;ด้วย ดังนั้น&lt;wbr&gt;ควร&lt;wbr&gt;เลือก&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;4&lt;/a&gt; ใน&lt;wbr&gt;หัวข้อ ``Inlcude IDE/ATA-2 DISK support'' ให้&lt;wbr&gt;อยู่&lt;wbr&gt;ใน kernel &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:ide"&gt;&lt;/a&gt;&lt;a name="177"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; ตัวเลือก&lt;wbr&gt;ประเภท&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ฮาร์ดดิส&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 388px; width: 680px;" src="http://docs.google.com/File?id=dhdj5j7_45c78vzm"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; และ&lt;wbr&gt;อีก&lt;wbr&gt;ปัญหา&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ที่&lt;wbr&gt;มัก&lt;wbr&gt;พบ&lt;wbr&gt;คือ เรา&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่ Linux เดิม&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;อยู่ เช่น ถ้า&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;ใช้&lt;wbr&gt;อยู่&lt;wbr&gt;เป็น ext2 แต่&lt;wbr&gt;เรา&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ประเภท&lt;wbr&gt;นี้ kernel ก็&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;อ่าน&lt;wbr&gt;ไฟล์&lt;wbr&gt;ใดๆ ใน&lt;wbr&gt;ฮาร์ดดิส&lt;wbr&gt;ได้&lt;wbr&gt;เลย เป็น&lt;wbr&gt;ผล&lt;wbr&gt;ให้&lt;wbr&gt;เครื่อง&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;ได้ ทาง&lt;wbr&gt;แก้ไข&lt;wbr&gt;ก็&lt;wbr&gt;คือ&lt;wbr&gt;ต้อง&lt;wbr&gt;เลือก&lt;wbr&gt;ให้ kernel สนับสนุน&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่ Linux ใช้&lt;wbr&gt;งาน&lt;wbr&gt;อยู่(อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง mount) โดย&lt;wbr&gt;ปกติ&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์ ext2 เลือก&lt;wbr&gt;ตัวเลือก&lt;wbr&gt;ได้&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;5&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:file"&gt;&lt;/a&gt;&lt;a name="178"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; ตัวเลือก&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;a&gt;&lt;img style="height: 274px; width: 634px;" src="http://docs.google.com/File?id=dhdj5j7_46gkn3nj"&gt;&lt;/a&gt;       &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; ส่วน&lt;wbr&gt;ปัญหา&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;มักจะ&lt;wbr&gt;ไม่&lt;wbr&gt;เลวร้าย&lt;wbr&gt;เหมือน&lt;wbr&gt;สอง&lt;wbr&gt;ปัญหา&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา คอมพิวเตอร์&lt;wbr&gt;ยัง&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;ได้ แต่&lt;wbr&gt;อาจ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ฮาร์ดแวร์&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;เรา&lt;wbr&gt;มี ปัญหา&lt;wbr&gt;นี้&lt;wbr&gt;หาก&lt;wbr&gt;ใจเย็นๆ และ&lt;wbr&gt;ค่อยๆ อ่าน&lt;wbr&gt;ข้อความ&lt;wbr&gt;ช่วยเหลือ&lt;wbr&gt;ที่&lt;wbr&gt;มี ก็&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel ให้&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;เหมาะสม&lt;wbr&gt;กับ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ของ&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;มาก&lt;wbr&gt;ที่สุด หลังจาก&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ต่างๆ เสร็จ&lt;wbr&gt;แล้ว ให้&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม ``Save and Exit'' ที่&lt;wbr&gt;หน้า&lt;wbr&gt;หลัก&lt;wbr&gt;เพื่อ&lt;wbr&gt;เตรียม&lt;wbr&gt;ตัว&lt;wbr&gt;คอมไพล์ kernel ต่อไป แต่&lt;wbr&gt;หาก&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;เก็บ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ต่างๆ ที่&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;ไว้&lt;wbr&gt;เพื่อ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;เครื่อง&lt;wbr&gt;อื่น หรือ เพื่อ&lt;wbr&gt;เก็บ&lt;wbr&gt;ไว้&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อๆ ไป ให้&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม ``Store Configuration to File'' ที่&lt;wbr&gt;หน้า&lt;wbr&gt;หลัก เพื่อ&lt;wbr&gt;เก็บ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ต่างๆ ลง&lt;wbr&gt;แฟ้มข้อมูล เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;นำ&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;เก็บ&lt;wbr&gt;ไว้&lt;wbr&gt;ไป&lt;wbr&gt;ใช้ สามารถ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;การ&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม ``Load Configuration from File'' &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00140000000000000000"&gt; 4 การ&lt;wbr&gt;ติดตั้ง Kernel&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; สำหรับ Linux ของ&lt;wbr&gt;ค่าย RedHat และ Mandrake รุ่น&lt;wbr&gt;ใหม่ๆ คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์ gcc จะ&lt;wbr&gt;เป็น&lt;wbr&gt;รุ่น 2.96 ซึ่ง&lt;wbr&gt;มี&lt;wbr&gt;ปัญหา&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel เพื่อ&lt;wbr&gt;แก้&lt;wbr&gt;ปัญหา&lt;wbr&gt;ที่&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;ค่าย&lt;wbr&gt;ได้&lt;wbr&gt;เตรียม&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์&lt;wbr&gt;ไว้&lt;wbr&gt;ให้&lt;wbr&gt;แล้ว&lt;wbr&gt;ใน&lt;wbr&gt;ชื่อ kgcc (อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ชุด&lt;wbr&gt;โปรแกรม egcs, egcs-cpp, และ egcs-c++ จะ&lt;wbr&gt;เป็น&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์ gcc รุ่น 2.91) การ&lt;wbr&gt;เปลี่ยน&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel ให้&lt;wbr&gt;ไป&lt;wbr&gt;แก้&lt;wbr&gt;ที่&lt;wbr&gt;แฟ้ม&lt;wbr&gt;ข้อ&lt;wbr&gt;มุม ``/usr/src/linux/Makefile'' ใน&lt;wbr&gt;บรรทัด&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ข้อความ&lt;wbr&gt;ว่า &lt;i&gt;CC=$(CROSS_COMPILER)gcc&lt;/i&gt; ไป&lt;wbr&gt;เป็น &lt;i&gt;CC=kgcc&lt;/i&gt; ส่วน Linux ของ&lt;wbr&gt;ค่าย&lt;wbr&gt;อื่น&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;รุ่น&lt;wbr&gt;ของ gcc ได้&lt;wbr&gt;จาก&lt;wbr&gt;คำสั่ง &lt;i&gt;gcc -version&lt;/i&gt; หาก&lt;wbr&gt;ต่ำ&lt;wbr&gt;กว่า&lt;wbr&gt;รุ่น 2.96 และ&lt;wbr&gt;สูง&lt;wbr&gt;กว่า&lt;wbr&gt;หรือ&lt;wbr&gt;เท่า&lt;wbr&gt;กับ&lt;wbr&gt;รุ่น 2.91 ก็&lt;wbr&gt;ใช้ได้&lt;/p&gt; &lt;p&gt;&lt;font color="#3366ff"&gt;&lt;i&gt;ปรับปรุง เพิ่มเติม&lt;/i&gt;&lt;/font&gt; &lt;br&gt; สำหรับ&lt;wbr&gt;ผู้&lt;wbr&gt;ที่&lt;wbr&gt;ใช้ Debian Linux Woody 3.0r1 คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์ gcc ที่&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;อยู่&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;รุ่น 2.95 ที่&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ปัญหา&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel จึง&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ความจำ&lt;wbr&gt;เป็น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;เปลี่ยนแปลง&lt;wbr&gt;แฟ้มข้อมูล ``/usr/src/linux/Makefile"&lt;/p&gt; &lt;p&gt; เมื่อ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;เป็น&lt;wbr&gt;ที่&lt;wbr&gt;แน่ใจ&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า&lt;wbr&gt;คอม&lt;wbr&gt;ไพ&lt;wbr&gt;เลอร์ gcc ของ&lt;wbr&gt;เรา&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ปัญหา ให้&lt;wbr&gt;สั่ง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ต่อไปนี้ &lt;/p&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/linux&amp;gt; make dep &lt;/td&gt;             &lt;td align="left"&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ความ&lt;wbr&gt;เกี่ยวเนื่อง&lt;wbr&gt;กัน&lt;wbr&gt;ของ&lt;wbr&gt;แต่&lt;wbr&gt;ล่ะ&lt;wbr&gt;ไฟล์             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux&amp;gt; make modules &lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;สร้าง&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;เลือก&lt;wbr&gt;ให้&lt;wbr&gt;เป็น module&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux&amp;gt; make modules_install &lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;สำเนา&lt;wbr&gt;ไฟล์ module ต่างๆ ไป&lt;wbr&gt;ที่ /lib/modules/2.4.4-rtl&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/linux&amp;gt; make install&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;สร้าง&lt;wbr&gt;ไฟล์&lt;wbr&gt;ต่างๆ สำหรับ&lt;wbr&gt;การ&lt;wbr&gt;บูท และ&lt;wbr&gt;สำเนา&lt;wbr&gt;ไป&lt;wbr&gt;ยัง&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ /boot &lt;br&gt; พร้อมกับ&lt;wbr&gt;ติดตั้ง Lilo Bootloader&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/p&gt; &lt;p&gt; หาก&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ข้อผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;ต่างๆ ก็&lt;wbr&gt;เป็น&lt;wbr&gt;ที่&lt;wbr&gt;อุ่นใจ&lt;wbr&gt;ได้&lt;wbr&gt;ใน&lt;wbr&gt;ระดับ&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;คอมไพล์ kernel สำเร็จ&lt;wbr&gt;แล้ว แต่&lt;wbr&gt;เพื่อ&lt;wbr&gt;ความ&lt;wbr&gt;มั่นใจ&lt;wbr&gt;ว่า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เข้า Linux ได้&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;เพื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;และ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel ใหม่&lt;wbr&gt;ได้&lt;wbr&gt;อีก&lt;wbr&gt;หาก kernel ที่&lt;wbr&gt;เรา&lt;wbr&gt;สร้าง&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ได้&lt;wbr&gt;ให้&lt;wbr&gt;ทำ&lt;wbr&gt;ตาม&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;ต่อไปนี้ &lt;/p&gt; &lt;p&gt; อันดับ&lt;wbr&gt;แรก&lt;wbr&gt;ให้&lt;wbr&gt;ไป&lt;wbr&gt;ตรวจสอบ&lt;wbr&gt;ว่า&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ /boot มี&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่&lt;wbr&gt;ขึ้นต้น&lt;wbr&gt;ด้วย vmlinuz อะไร&lt;wbr&gt;บ้าง โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คำสั่ง ``ls -l vmlinuz*'' ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;6&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:bootvmlinuz"&gt;&lt;/a&gt;&lt;a name="179"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; ไฟล์ kernel ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ /boot&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;a&gt;&lt;img style="height: 161px; width: 680px;" src="http://docs.google.com/File?id=dhdj5j7_47gf28d9"&gt;&lt;/a&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; จะ&lt;wbr&gt;พบ&lt;wbr&gt;ว่า&lt;wbr&gt;มี Symbolic link อยู่ 2 ไฟล์ คือ vmlinuz กับ vmlinuz.old (Linux ของ&lt;wbr&gt;แต่ละ&lt;wbr&gt;ค่าย&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ชื่อ&lt;wbr&gt;ไม่&lt;wbr&gt;เหมือน&lt;wbr&gt;กัน) แล้ว&lt;wbr&gt;ไป&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ไฟล์ /etc/lilo.conf โดย&lt;wbr&gt;แทน&lt;wbr&gt;ชื่อ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่&lt;wbr&gt;เป็น Symbolic link ทั้งหมด&lt;wbr&gt;ด้วย&lt;wbr&gt;ชื่อ&lt;wbr&gt;ไฟล์&lt;wbr&gt;จริง&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;7&lt;/a&gt; สำหรับ&lt;wbr&gt;ไฟล์ initrd ก็&lt;wbr&gt;ทำ&lt;wbr&gt;เช่นเดียวกัน เมื่อ&lt;wbr&gt;แก้&lt;wbr&gt;เสร็จ&lt;wbr&gt;แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;พิมพ์&lt;wbr&gt;คำสั่ง ``lilo'' เพื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Lilo Bootloader &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:lilo"&gt;&lt;/a&gt;&lt;a name="180"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; ข้อความ&lt;wbr&gt;ใน&lt;wbr&gt;ไฟล์ lilo.conf สำหรับ&lt;wbr&gt;ติดตั้ง lilo&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 315px; width: 415px;" src="http://docs.google.com/File?id=dhdj5j7_48gzxtdq"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; หาก&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ถูกต้อง&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ข้อความ&lt;wbr&gt;ผิดพลาด&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น ถึง&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;นี้&lt;wbr&gt;เรา&lt;wbr&gt;ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ได้&lt;wbr&gt;อย่าง&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;กังวล&lt;wbr&gt;ว่า&lt;wbr&gt;เครื่อง&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท Linux ได้&lt;wbr&gt;อีก เพราะ&lt;wbr&gt;หาก kernel ที่&lt;wbr&gt;เรา&lt;wbr&gt;ทำ&lt;wbr&gt;ขึ้น&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ได้ เรา&lt;wbr&gt;ก็&lt;wbr&gt;ยัง&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้ kernel ตัว&lt;wbr&gt;เดิม&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ได้ &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00150000000000000000"&gt; 5 ติดตั้ง modules ของ RTLinux&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; หลังจาก&lt;wbr&gt;ที่&lt;wbr&gt;สามารถ&lt;wbr&gt;บูท&lt;wbr&gt;เครื่อง&lt;wbr&gt;ได้&lt;wbr&gt;โดย RT-Kernel แล้ว อันดับ&lt;wbr&gt;ต่อไป&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง modules ของ RTLinux เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;คุณสมบัติ&lt;wbr&gt;ให้ kernel สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ ขึ้น&lt;wbr&gt;ตอน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ค&lt;wbr&gt;ล้า&lt;wbr&gt;ยๆ กับ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง kernel แต่&lt;wbr&gt;ง่าย&lt;wbr&gt;กว่า&lt;wbr&gt;มาก พิมพ์&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ต่อไปนี้ &lt;/p&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/&amp;gt; cd ../rtlinux-3.1 &lt;/td&gt;             &lt;td align="left"&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ rtlinux-3.1 &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; ln -s ../linux-2.4.4 linux &lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;สร้าง symbolic link ไดเร็กตอ&lt;wbr&gt;รี่ linux-2.4.4 เป็น linux ใน rtlinux-3.1&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; make xconfig&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;หน้าต่าง&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่             &lt;a href="#fig:rt-install:main-rtlinux"&gt;8&lt;/a&gt;&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:main-rtlinux"&gt;&lt;/a&gt;&lt;a name="181"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; หน้าจอ&lt;wbr&gt;หลัก&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ RTLinux&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 150px; width: 368px;" src="http://docs.google.com/File?id=dhdj5j7_499v2wx6"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; จะ&lt;wbr&gt;ได้&lt;wbr&gt;หน้า&lt;wbr&gt;หลัก&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;8&lt;/a&gt; กด&lt;wbr&gt;ปุ่ม ``Support Options'' จะ&lt;wbr&gt;ได้&lt;wbr&gt;หน้าต่าง&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;9&lt;/a&gt; ใน&lt;wbr&gt;ขั้นต้น&lt;wbr&gt;ลอง&lt;wbr&gt;เลือก&lt;wbr&gt;ค่า&lt;wbr&gt;ต่างๆ ตาม&lt;wbr&gt;รูป&lt;wbr&gt;ไป&lt;wbr&gt;ก่อน เมื่อ&lt;wbr&gt;เลือก&lt;wbr&gt;ค่า&lt;wbr&gt;ต่างๆ เสร็จ&lt;wbr&gt;แล้ว กด&lt;wbr&gt;ปุ่ม ``Drivers'' จะ&lt;wbr&gt;มี&lt;wbr&gt;หน้าต่าง&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;10&lt;/a&gt; หน้าต่าง&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;รวม Drivers ต่างๆ ที่มา&lt;wbr&gt;พร้อมกับ RTLinux โดย fifo และ shared memory จะ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;ส่ง&lt;wbr&gt;ผ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง module ที่ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง (อยู่&lt;wbr&gt;ใน kernel space memory) กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;บน Linux (อยู่&lt;wbr&gt;ใน user space memory) ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;ประโยชน์&lt;wbr&gt;อย่าง&lt;wbr&gt;มาก&lt;wbr&gt;เมื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;พัฒนา&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ใน&lt;wbr&gt;บทความ&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อไป เมื่อ&lt;wbr&gt;เลือก&lt;wbr&gt;ค่า&lt;wbr&gt;ต่างๆ แล้ว&lt;wbr&gt;ให้&lt;wbr&gt;กด&lt;wbr&gt;ปุ่ม ``Save and Exit'' ที่&lt;wbr&gt;หน้า&lt;wbr&gt;หลัก&lt;wbr&gt;แล้ว&lt;wbr&gt;สั่ง &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:rtlinux-option"&gt;&lt;/a&gt;&lt;a name="182"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; ตัวเลือก&lt;wbr&gt;ต่างๆ ของRTLinux&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 460px; width: 475px;" src="http://docs.google.com/File?id=dhdj5j7_50r9p42d"&gt;       &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-install:rtlinux-driver"&gt;&lt;/a&gt;&lt;a name="183"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; ตัวเลือก Driver เพื่อ&lt;wbr&gt;เติม&lt;wbr&gt;สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เฉพาะ&lt;wbr&gt;อย่าง&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;img style="height: 294px; width: 467px;" src="http://docs.google.com/File?id=dhdj5j7_51dnm6xw"&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/rtlinux-3.1&amp;gt; make &lt;/td&gt;             &lt;td align="left"&gt;คอมไพล์ modules ต่างๆ &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; make install&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;ติดตั้ง modules ของ RTLinux &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; cp -r doc/man /usr/share&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;ติดตั้ง manual เพื่อ&lt;wbr&gt;ใช้&lt;wbr&gt;สำหรับ&lt;wbr&gt;เรียก&lt;wbr&gt;ดู&lt;wbr&gt;วิธี&lt;wbr&gt;ใช้&lt;wbr&gt;ฟังก์ชัน&lt;wbr&gt;ของ RTLinux ด้วย&lt;wbr&gt;คำสั่ง man&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/p&gt; &lt;p&gt; เมื่อ&lt;wbr&gt;ถึง&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;นี้ ก็&lt;wbr&gt;ถือ&lt;wbr&gt;ว่า&lt;wbr&gt;เสร็จสิ้น&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux แล้ว เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ทดลอง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ที่มา&lt;wbr&gt;กับ RTLinux ได้ โปรแกรม&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;จะ&lt;wbr&gt;อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ examples ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้&lt;wbr&gt;ทดลอง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ frank ใช้&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ต่อไปนี้ &lt;/p&gt; &lt;p&gt; &lt;table border="1" cellpadding="3"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;       &lt;table cellpadding="3"&gt;         &lt;tbody&gt;           &lt;tr&gt;             &lt;td align="left"&gt;/usr/src/rtlinux-3.1&amp;gt; cd examples/frank             &lt;/td&gt;             &lt;td align="left"&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ examples/frank &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; make &lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;คอมไพล์&lt;wbr&gt;โปรแกรม จะ&lt;wbr&gt;ได้ frank_module.o และ frank_app &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;tr&gt;             &lt;td valign="top"&gt;/usr/src/rtlinux-3.1&amp;gt; make test&lt;br&gt;             &lt;/td&gt;             &lt;td valign="top"&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ทดสอบ&lt;wbr&gt;โปรแกรม&lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;       &lt;/table&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/p&gt; &lt;p&gt; เมื่อ&lt;wbr&gt;สั่ง ``make test'' จะ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;แทรก modules เพื่อ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ RT-Kernel สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ แล้ว&lt;wbr&gt;จึง&lt;wbr&gt;แทรก frank_module.o เข้า&lt;wbr&gt;ไป&lt;wbr&gt;เพื่อ&lt;wbr&gt;สร้าง ``thread'' สำหรับ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง โดย&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้ ``thread'' เริ่ม&lt;wbr&gt;ทำงาน&lt;wbr&gt;หรือ&lt;wbr&gt;หยุด&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;โปรแกรม frank_app เมื่อ ``thread'' ทำงาน&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่าน FIFO มา&lt;wbr&gt;ให้&lt;wbr&gt;โปรแกรม frank_app เพื่อ&lt;wbr&gt;แสดง&lt;wbr&gt;ผล&lt;wbr&gt;ที่&lt;wbr&gt;หน้าจอ ที่&lt;wbr&gt;หน้าจอ&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``FIFO 1 ...FIFO 2 ...'' วน&lt;wbr&gt;ไป&lt;wbr&gt;เรื่อยๆ แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;หยุด ถึง&lt;wbr&gt;ตรง&lt;wbr&gt;นี้&lt;wbr&gt;หาก&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ยัง&lt;wbr&gt;ไม่&lt;wbr&gt;เข้าใจ&lt;wbr&gt;กระบวนการ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ก็&lt;wbr&gt;ไม่เป็นไร เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;รายละเอียด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;นี้&lt;wbr&gt;กัน&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ใน&lt;wbr&gt;บทความ&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อ ๆ ไป &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00160000000000000000"&gt; 6 สรุป&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ``ความ&lt;wbr&gt;พยายาม&lt;wbr&gt;อยู่&lt;wbr&gt;ที่ไหน ความ&lt;wbr&gt;สำเร็จ&lt;wbr&gt;อยู่&lt;wbr&gt;ที่นั่น'' เป็น&lt;wbr&gt;คำ&lt;wbr&gt;กว่า&lt;wbr&gt;ว&lt;wbr&gt;ที่&lt;wbr&gt;ยังคง&lt;wbr&gt;ใช้ได้&lt;wbr&gt;เสมอ ไม่&lt;wbr&gt;มี&lt;wbr&gt;ตก&lt;wbr&gt;ยุกต์&lt;wbr&gt;ตก&lt;wbr&gt;สมัย ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ระบบปฏิบัติการ RTLinux ที่&lt;wbr&gt;กล่าว&lt;wbr&gt;มา&lt;wbr&gt;ใน&lt;wbr&gt;บทความ&lt;wbr&gt;นี้ แม้&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ที่&lt;wbr&gt;ไม่&lt;wbr&gt;ง่าย&lt;wbr&gt;นัก เพราะ ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;คอมไพล์ kernel เอง&lt;wbr&gt;แต่&lt;wbr&gt;สิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;กลับ&lt;wbr&gt;มา&lt;wbr&gt;ก็&lt;wbr&gt;คงจะ&lt;wbr&gt;คุ้มค่า&lt;wbr&gt;กับ&lt;wbr&gt;แรง&lt;wbr&gt;กาย แรง&lt;wbr&gt;ใจ ที่&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;พ&lt;wbr&gt;ยาม&lt;wbr&gt;ยาม&lt;wbr&gt;ทุ่ม&lt;wbr&gt;ลง&lt;wbr&gt;ไป&lt;wbr&gt;หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;หมด&lt;wbr&gt;ความ&lt;wbr&gt;พยายาม&lt;wbr&gt;ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;ความ&lt;wbr&gt;สำเร็จ&lt;wbr&gt;จะ&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น ผู้เขียน&lt;wbr&gt;รับรอง&lt;wbr&gt;ได้&lt;wbr&gt;แน่&lt;wbr&gt;ว่า&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ส่วนมาก&lt;wbr&gt;คงจะ&lt;wbr&gt;ต้อง&lt;wbr&gt;มี&lt;wbr&gt;ปัญหา&lt;wbr&gt;ติดขัด&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux ไม่&lt;wbr&gt;มาก&lt;wbr&gt;ก็&lt;wbr&gt;น้อย บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;แต่&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux, บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ติด&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;ลง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ชุด&lt;wbr&gt;พัฒนา&lt;wbr&gt;ไม่&lt;wbr&gt;ครบ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;คอมไพล์ kernel ไม่&lt;wbr&gt;ได้, บาง&lt;wbr&gt;ท่าน&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;ติด&lt;wbr&gt;ที่&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;ค่าตัว&lt;wbr&gt;เลือก&lt;wbr&gt;ของ kernel และ&lt;wbr&gt;อะไร&lt;wbr&gt;อีก&lt;wbr&gt;หลายๆ อย่าง ก็&lt;wbr&gt;ขอ&lt;wbr&gt;ให้&lt;wbr&gt;นึกถึง&lt;wbr&gt;คำกล่าว&lt;wbr&gt;ที่&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;ได้&lt;wbr&gt;อ้าง&lt;wbr&gt;ไว้&lt;wbr&gt;ใน&lt;wbr&gt;ตอน&lt;wbr&gt;ต้น สุดท้าย&lt;wbr&gt;ก็&lt;wbr&gt;หวัง&lt;wbr&gt;อีก&lt;wbr&gt;ครั้ง&lt;wbr&gt;ว่า&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;สนุก&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux และ RTLinux จนกว่า&lt;wbr&gt;จะ&lt;wbr&gt;เจอกัน&lt;wbr&gt;ใน&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อไป&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;เริ่มต้น&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux อย่าง&lt;wbr&gt;ง่าย &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00170000000000000000"&gt; 7 แหล่งข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;ใน&lt;wbr&gt;ไดเร็ก&lt;wbr&gt;ตอ&lt;wbr&gt;รี่ doc ที่มา&lt;wbr&gt;พร้อมกับ RTLinux &lt;/li&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ kernel ของ Linux &lt;a href="http://www.tldp.org/HOWTO/Kernel-HOWTO.html"&gt;http://www.tldp.org/HOWTO/Kernel-HOWTO.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;อีก&lt;wbr&gt;ชุด&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ kernel ของ Linux &lt;a href="http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO.html"&gt;http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;โม&lt;wbr&gt;ดู&lt;wbr&gt;ล &lt;a href="http://www.tldp.org/HOWTO/Module-HOWTO/index.html"&gt;http://www.tldp.org/HOWTO/Module-HOWTO/index.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;ที่&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ LILO Bootloader &lt;a href="http://www.tldp.org/HOWTO/mini/LILO.html"&gt;http://www.tldp.org/HOWTO/mini/LILO.html&lt;/a&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00200000000000000000"&gt; About this document ...&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; This document was generated using the &lt;a href="http://www-texdev.mpce.mq.edu.au/l2h/docs/manual/"&gt;&lt;strong&gt;LaTeX&lt;/strong&gt;2&lt;tt&gt;HTML&lt;/tt&gt;&lt;/a&gt; translator Version 2K.1beta (1.48) &lt;/p&gt; &lt;p&gt; Copyright © 1993, 1994, 1995, 1996, &lt;a href="http://cbl.leeds.ac.uk/nikos/personal.html"&gt;Nikos Drakos&lt;/a&gt;, Computer Based Learning Unit, University of Leeds. &lt;br&gt; Copyright © 1997, 1998, 1999, &lt;a href="http://www.maths.mq.edu.au/%7Eross/"&gt;Ross Moore&lt;/a&gt;, Mathematics Department, Macquarie University, Sydney. &lt;/p&gt; &lt;p&gt;The translation was initiated by Pished Bunnun on 2003-02-14&lt;/p&gt; &lt;hr&gt; &lt;address&gt; Pished Bunnun 2003-02-14 &lt;/address&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-3992360094394154889?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/3992360094394154889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=3992360094394154889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3992360094394154889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3992360094394154889'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/rtlinux-linux-2-rtlinux-1-rtlinux.html' title=''/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-4517126541151417832</id><published>2007-04-20T11:51:00.000+01:00</published><updated>2007-04-20T23:39:01.005+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTLinux'/><title type='text'></title><content type='html'>     &lt;p&gt; &lt;/p&gt; &lt;h1 style="text-align: center;"&gt;&lt;a name="SECTION00100000000000000000"&gt;RTLinux : Linux สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;เวลาจริง &lt;/a&gt;&lt;/h1&gt; &lt;h1 style="text-align: center;"&gt;&lt;a name="SECTION00100000000000000000"&gt;ตอน&lt;wbr&gt;ที่ 1. แนะนำ&lt;wbr&gt;ระบบปฏิบัติการ RTLinux&lt;/a&gt;&lt;/h1&gt; &lt;h1 align="center"&gt; &lt;/h1&gt; &lt;p align="right"&gt; &lt;font size="+1"&gt;&lt;a title="พิเชษฐ์ บุญหนุน" href="mailto:p%20i%20s%20h%20e%20d@nectec.or.th"&gt;พิเชษฐ์ บุญ&lt;wbr&gt;หนุน&lt;/a&gt; , ดร. มานพ วงศ์&lt;wbr&gt;สาย&lt;wbr&gt;สุวรรณ และ ธเนศ ธีรศักดา&lt;wbr&gt;นนท์&lt;/font&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00110000000000000000"&gt; 1 บทนำ&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ใน&lt;wbr&gt;ปัจจุบัน&lt;wbr&gt;ถ้า&lt;wbr&gt;เอ่ยถึง&lt;wbr&gt;คำ&lt;wbr&gt;ว่า ``Linux" คน&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;แทบ&lt;wbr&gt;ทุกคน&lt;wbr&gt;ใน&lt;wbr&gt;บ้าน&lt;wbr&gt;เรา&lt;wbr&gt;คง&lt;wbr&gt;รู้จัก คุ้นเคย&lt;wbr&gt;กับ&lt;wbr&gt;คำ&lt;wbr&gt;นี้&lt;wbr&gt;ดี&lt;wbr&gt;ขึ้น&lt;wbr&gt;กว่า เมื่อก่อน&lt;wbr&gt;มาก&lt;wbr&gt;ใน&lt;wbr&gt;ฐานะ&lt;wbr&gt;ของ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;สำหรับ&lt;wbr&gt;คอมพิวเตอร์ เนื่องจาก&lt;wbr&gt;ความ&lt;wbr&gt;ขึ้นชื่อ&lt;wbr&gt;เรื่อง&lt;wbr&gt;เสถียรภาพ&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน และ&lt;wbr&gt;โดยเฉพาะอย่างยิ่ง&lt;wbr&gt;ที่ Linux เป็น&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ที่&lt;wbr&gt;สามารถ&lt;wbr&gt;นำมา&lt;wbr&gt;ใช้ได้&lt;wbr&gt;ฟรี&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;จำเป็น&lt;wbr&gt;ต้อง&lt;wbr&gt;เสีย&lt;wbr&gt;ค่าใช้จ่าย ใดๆ ที่&lt;wbr&gt;ผ่านๆ มา&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;คงจะ&lt;wbr&gt;คุ้น&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;นำ Linux ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;งาน&lt;wbr&gt;ด้าน Server ต่างๆ หรือ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;งาน&lt;wbr&gt;ด้าน&lt;wbr&gt;เอกสาร ทั้งที่&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ แล้ว&lt;wbr&gt;ไม่&lt;wbr&gt;ใช่&lt;wbr&gt;เฉพาะ&lt;wbr&gt;สอง&lt;wbr&gt;อย่าง&lt;wbr&gt;นี้&lt;wbr&gt;เท่านั้น&lt;wbr&gt;ที่ Linux สามารถ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;ดี งาน&lt;wbr&gt;ที่&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;เชื่อมต่อ&lt;wbr&gt;และ&lt;wbr&gt;ควบคุม ฮาร์ดแวร์&lt;wbr&gt;ภายนอก Linux ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;นำมา&lt;wbr&gt;พัฒนา&lt;wbr&gt;ใช้ได้&lt;wbr&gt;ดี&lt;wbr&gt;ไม่&lt;wbr&gt;แพ้&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;อื่น&lt;wbr&gt;เช่นกัน บทความ&lt;wbr&gt;ใน&lt;wbr&gt;ตอนนี้&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้ ผู้อ่าน&lt;wbr&gt;รู้จัก&lt;wbr&gt;กับ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;เวลาจริง, ระบบปฏิบัติการ RTLinux และ&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux ส่วน&lt;wbr&gt;ใน&lt;wbr&gt;บท&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;จะ&lt;wbr&gt;ตาม&lt;wbr&gt;มา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux, การ&lt;wbr&gt;เขียน&lt;wbr&gt;โปรแกรม&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง, ตัวอย่าง&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;สุดท้าย แล้ว&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;หวัง&lt;wbr&gt;ว่า&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;นำ RTLinux ไป&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;กับ&lt;wbr&gt;งาน&lt;wbr&gt;ต่างๆ&lt;wbr&gt;ได้&lt;wbr&gt;จ&lt;wbr&gt;ริงๆ &lt;/p&gt; &lt;p&gt; RTLinux เป็น&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ที่&lt;wbr&gt;รวม&lt;wbr&gt;เอา&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ทั่วไป (general-purpose OS) ซึ่ง&lt;wbr&gt;ก็&lt;wbr&gt;คือ Linux เข้า&lt;wbr&gt;กับ&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง (real time) ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้RTLinux ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ความ เที่ยงตรง&lt;wbr&gt;ของ&lt;wbr&gt;เวลา&lt;wbr&gt;ตอบสนอง เช่น ใน&lt;wbr&gt;การ&lt;wbr&gt;เก็บ&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;หรือ&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;วง&lt;wbr&gt;ปิด&lt;wbr&gt;โดย&lt;wbr&gt;ใช้&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;และ&lt;wbr&gt;ยัง&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้ ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ Linux เช่น ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;ด้าน&lt;wbr&gt;เครือข่าย (networking) หรือ การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;แบบ&lt;wbr&gt;กราฟิก (GUI) ได้&lt;wbr&gt;อีก&lt;wbr&gt;ด้วย &lt;/p&gt; &lt;p&gt; เช่นเดียวกับ Linux, RTLinux เป็น&lt;wbr&gt;ซอ&lt;wbr&gt;ฟแวร์&lt;wbr&gt;ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ลิขสิทธ์&lt;wbr&gt;แบบ GPL ผู้ใช้&lt;wbr&gt;สามารถ&lt;wbr&gt;นำ&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส (source code) ไป&lt;wbr&gt;พัฒนา&lt;wbr&gt;ต่อ&lt;wbr&gt;ให้&lt;wbr&gt;เหมาะสม&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ยิ่ง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ได้ และ&lt;wbr&gt;ผู้ใช้ ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;เสีย&lt;wbr&gt;ค่าใช้จ่าย&lt;wbr&gt;ให้&lt;wbr&gt;ผู้ทำ RTLinux แต่อย่างใด แต่&lt;wbr&gt;หาก&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;ต้องการ&lt;wbr&gt;เก็บ&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ไว้ หรือ ต้องการ&lt;wbr&gt;ขาย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;พัฒนา&lt;wbr&gt;ขึ้น&lt;wbr&gt;มา ผู้ใช้&lt;wbr&gt;สามารถ&lt;wbr&gt;ซื้อ&lt;wbr&gt;ลิขสิทธิ์&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;ผู้&lt;wbr&gt;ที่&lt;wbr&gt;ทำ RTLinux สำหรับ&lt;wbr&gt;ใน&lt;wbr&gt;รุ่น&lt;wbr&gt;ที่&lt;wbr&gt;ขาย นอกจาก&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;เหมือน RTLinux รุ่น&lt;wbr&gt;ที่&lt;wbr&gt;เป็น GPL แล้ว ยัง&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;บาง&lt;wbr&gt;อย่าง&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ด้วย แต่ สำหรับ&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;แล้ว&lt;wbr&gt;คิด&lt;wbr&gt;ว่า&lt;wbr&gt;ส่วน&lt;wbr&gt;ที่&lt;wbr&gt;เพิ่ม&lt;wbr&gt;เข้า&lt;wbr&gt;มา&lt;wbr&gt;นี้&lt;wbr&gt;ไม่&lt;wbr&gt;จำเป็น&lt;wbr&gt;นัก&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ทั่วๆ ไป &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00120000000000000000"&gt; 2 ระบบปฏิบัติการ&lt;wbr&gt;เวลาจริง (real time OS) คือ&lt;wbr&gt;อะไร&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ใน&lt;wbr&gt;การ&lt;wbr&gt;นำ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ไป&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;บาง&lt;wbr&gt;ประเภท เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;มาก&lt;wbr&gt;กว่า&lt;wbr&gt;การ&lt;wbr&gt;ได้&lt;wbr&gt;ผลลัพธ์ ที่&lt;wbr&gt;ถูกต้อง เรา&lt;wbr&gt;อาจ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ภายใน&lt;wbr&gt;ระยะ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เรา กำหนด หรือ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;กำหนด&lt;wbr&gt;โดย&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ทาง&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;ยอมรับ&lt;wbr&gt;ได้&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;น้อย&lt;wbr&gt;มาก อาจ&lt;wbr&gt;จะ&lt;wbr&gt;เป็น&lt;wbr&gt;มิ&lt;wbr&gt;ลลิ&lt;wbr&gt;วินาที&lt;wbr&gt;หรือ น้อย&lt;wbr&gt;กว่า&lt;wbr&gt;นั้น งาน&lt;wbr&gt;ประเภท&lt;wbr&gt;ที่&lt;wbr&gt;ว่า&lt;wbr&gt;นี้&lt;wbr&gt;ก็&lt;wbr&gt;เช่น ใน&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;เครื่องจักรกล เรา&lt;wbr&gt;ต้อง&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;สถานะ&lt;wbr&gt;ของ&lt;wbr&gt;เครื่องจักรกล&lt;wbr&gt;เพื่อ ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;คำนวณ&lt;wbr&gt;สัญญา&lt;wbr&gt;น&lt;wbr&gt;ควบคุม และ&lt;wbr&gt;ต้อง&lt;wbr&gt;ส่ง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ควบคุม&lt;wbr&gt;ที่&lt;wbr&gt;คำนวณ&lt;wbr&gt;ได้&lt;wbr&gt;ไป&lt;wbr&gt;ควบคุม&lt;wbr&gt;เครื่อง จักร&lt;wbr&gt;กล&lt;wbr&gt;นั้น ทั้งหมด&lt;wbr&gt;นี้&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;ภายใน&lt;wbr&gt;ระยะ&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด&lt;wbr&gt;แน่นอน ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;จาก&lt;wbr&gt;เวลา&lt;wbr&gt;ที่&lt;wbr&gt;กำหนด อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;สมรรถนะ&lt;wbr&gt;ตาม&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ หรือ&lt;wbr&gt;อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ระบบ&lt;wbr&gt;ขาด&lt;wbr&gt;เสถียรภาพ&lt;wbr&gt;และ&lt;wbr&gt;เกิด&lt;wbr&gt;ความ&lt;wbr&gt;เสียหาย&lt;wbr&gt;ได้ เรา&lt;wbr&gt;เรียก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;นี้&lt;wbr&gt;ว่า&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง &lt;/p&gt; &lt;p&gt; จาก&lt;wbr&gt;ความ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ดังกล่าว&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ส่วนใหญ่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ฮาร์ดแวร์&lt;wbr&gt;และ&lt;wbr&gt;ซอฟท์แวร์&lt;wbr&gt;ที่&lt;wbr&gt;ออกแบบ&lt;wbr&gt;มา&lt;wbr&gt;โดยเฉพาะ&lt;wbr&gt;สำหรับ&lt;wbr&gt;งาน&lt;wbr&gt;นั้นๆ ทำ&lt;wbr&gt;ให้การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ระบบ&lt;wbr&gt;และ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;ยุ่งยาก&lt;wbr&gt;และ&lt;wbr&gt;อาจ&lt;wbr&gt;เสีย&lt;wbr&gt;ค่าใช้จ่าย&lt;wbr&gt;สูง นอกจากนั้น การ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ให้แก่&lt;wbr&gt;ระบบ&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;อยู่&lt;wbr&gt;เดิม เช่น การ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;เชื่อมต่อ&lt;wbr&gt;กับ&lt;wbr&gt;เครือข่าย การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;แบบ&lt;wbr&gt;กราฟิก&lt;wbr&gt;หรือ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ระบบ&lt;wbr&gt;ฐานข้อมูล จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;ยาก&lt;wbr&gt;หรือ&lt;wbr&gt;ทำ&lt;wbr&gt;ไม่&lt;wbr&gt;ได้ ทั้งที่&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;เหล่านี้&lt;wbr&gt;มี&lt;wbr&gt;อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ทั่วไป&lt;wbr&gt;อยู่&lt;wbr&gt;แล้ว &lt;/p&gt; &lt;p&gt; ดังนั้น&lt;wbr&gt;จึง&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ที่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;และ&lt;wbr&gt;ยัง&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน อื่นๆ ที่&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ทั่วไป&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้ รวม&lt;wbr&gt;ทั้ง&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;บน&lt;wbr&gt;เครื่อง คอมพิวเตอร์&lt;wbr&gt;มาตรฐาน&lt;wbr&gt;เช่น IBM PC compatible ซึ่ง&lt;wbr&gt;มี&lt;wbr&gt;ใช้&lt;wbr&gt;กัน&lt;wbr&gt;อย่าง&lt;wbr&gt;แพร่หลาย&lt;wbr&gt;และ&lt;wbr&gt;ราคา&lt;wbr&gt;ถูก การ&lt;wbr&gt;มี&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;เวลาจริง ทำ&lt;wbr&gt;ให้&lt;wbr&gt;สามารถ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ระบบ&lt;wbr&gt;และ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ได้&lt;wbr&gt;อย่าง&lt;wbr&gt;รวดเร็ว มี&lt;wbr&gt;ค่าใช้จ่าย&lt;wbr&gt;ต่ำ รวม&lt;wbr&gt;ทั้ง&lt;wbr&gt;เรา&lt;wbr&gt;ยัง&lt;wbr&gt;ใช้&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ทั่วไป&lt;wbr&gt;ได้&lt;wbr&gt;อย่าง&lt;wbr&gt;สะดวก &lt;/p&gt; &lt;p&gt; ระบบปฏิบัติการ&lt;wbr&gt;เวลาจริง&lt;wbr&gt;มี&lt;wbr&gt;ให้&lt;wbr&gt;เลือก&lt;wbr&gt;ใน&lt;wbr&gt;ท้อง&lt;wbr&gt;ตลาด&lt;wbr&gt;อยู่&lt;wbr&gt;หลาย&lt;wbr&gt;ผลิต&lt;wbr&gt;พันธ์ เช่น VxWorks, QNX, LynxOS หรือ Windows NT ที่&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ด้าน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เวลา จริง&lt;wbr&gt;ด้วย INTime, Hyperkernel หรือ RTX ส่วน RTLinux ก็&lt;wbr&gt;เป็น&lt;wbr&gt;อีก&lt;wbr&gt;ทางเลือก&lt;wbr&gt;หนึ่ง ที่&lt;wbr&gt;น่า&lt;wbr&gt;สนใจ&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;ใช้&lt;wbr&gt;ลิขสิทธ์&lt;wbr&gt;แบบ GPL สามารถ&lt;wbr&gt;นำมา&lt;wbr&gt;ใช้ได้&lt;wbr&gt;ฟรี&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;เสีย&lt;wbr&gt;ค่าใช้จ่าย และ&lt;wbr&gt;สามารถ&lt;wbr&gt;นำ&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ไป&lt;wbr&gt;พัฒนา&lt;wbr&gt;ต่อ&lt;wbr&gt;ให้&lt;wbr&gt;ดี&lt;wbr&gt;ยิ่ง&lt;wbr&gt;ขึ้น&lt;wbr&gt;ได้ โดย&lt;wbr&gt;มี&lt;wbr&gt;ข้อแม้&lt;wbr&gt;เพียง&lt;wbr&gt;ว่า&lt;wbr&gt;ต้น&lt;wbr&gt;รหัส&lt;wbr&gt;ที่&lt;wbr&gt;พัฒนา&lt;wbr&gt;ต่อ&lt;wbr&gt;นั้น&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;ลิขสิทธ์&lt;wbr&gt;แบบ GPL ด้วย &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00130000000000000000"&gt; 3 เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;แข็ง&lt;wbr&gt;กับ&lt;wbr&gt;แบบ&lt;wbr&gt;อ่อน (Hard and Soft Realtime)&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; โดย&lt;wbr&gt;ทั่วไป&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;แบ่ง&lt;wbr&gt;ประเภท&lt;wbr&gt;ของ&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้&lt;wbr&gt;เป็น 2 ประเภท&lt;wbr&gt;คือ เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;แข็ง (Hard Realtime) กับ เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;อ่อน (Soft Realtime) &lt;/p&gt; &lt;p&gt; เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;แข็ง หมายถึง งาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;ความ&lt;wbr&gt;เที่ยงตรง และ&lt;wbr&gt;แม่นยำ&lt;wbr&gt;สูง&lt;wbr&gt;ใน&lt;wbr&gt;เรื่อง&lt;wbr&gt;ของ&lt;wbr&gt;เวลา เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;สั่ง&lt;wbr&gt;ให้&lt;wbr&gt;ทำงาน ต้อง&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;นั้นๆ ได้&lt;wbr&gt;ทันที งาน&lt;wbr&gt;ประเภท&lt;wbr&gt;นี้ เช่น การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;เครื่องจักรกล&lt;wbr&gt;หรือ&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;อากาศยาน ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ทาง&lt;wbr&gt;เวลา&lt;wbr&gt;เกิน&lt;wbr&gt;กว่า&lt;wbr&gt;ค่า&lt;wbr&gt;ที่&lt;wbr&gt;ยอมรับ&lt;wbr&gt;ได้&lt;wbr&gt;อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ความ&lt;wbr&gt;เสียหาย&lt;wbr&gt;หรือ&lt;wbr&gt;อุบัติเหตุ&lt;wbr&gt;ได้ &lt;/p&gt; &lt;p&gt; เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;อ่อน หมายถึง งาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;รวดเร็ว&lt;wbr&gt;พอ แต่&lt;wbr&gt;อาจ&lt;wbr&gt;มี&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ใน&lt;wbr&gt;เรื่อง&lt;wbr&gt;ของ&lt;wbr&gt;เวลา&lt;wbr&gt;ได้ เป็น&lt;wbr&gt;บาง&lt;wbr&gt;ครั้ง งาน&lt;wbr&gt;ประเภท&lt;wbr&gt;นี้ เช่น ใน&lt;wbr&gt;การ&lt;wbr&gt;ประมวลผล&lt;wbr&gt;ภาพ&lt;wbr&gt;เคลื่อนไหว เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;ให้&lt;wbr&gt;ความ&lt;wbr&gt;เร็ว&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ประมวล ผล&lt;wbr&gt;มาก&lt;wbr&gt;กว่า 30 เฟรม&lt;wbr&gt;ต่อ&lt;wbr&gt;วินาที การ&lt;wbr&gt;ประมวลผล&lt;wbr&gt;ที่&lt;wbr&gt;ช้า&lt;wbr&gt;เกิน&lt;wbr&gt;ไป&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ภาพ&lt;wbr&gt;เคลื่อนไหว&lt;wbr&gt;ที่&lt;wbr&gt;ได้ มี&lt;wbr&gt;คุณภาพ&lt;wbr&gt;ลด&lt;wbr&gt;ลง แต่&lt;wbr&gt;เรา&lt;wbr&gt;อาจ&lt;wbr&gt;ยอมรับ&lt;wbr&gt;ได้&lt;wbr&gt;ถ้า&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;ไม่&lt;wbr&gt;บ่อย&lt;wbr&gt;นัก โดย&lt;wbr&gt;ปกติ&lt;wbr&gt;แล้ว Linux และ MS-Windows ใน&lt;wbr&gt;ตระกูล NT จะ&lt;wbr&gt;ให้&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ด้าน&lt;wbr&gt;เวลา&lt;wbr&gt;ได้&lt;wbr&gt;เพียง&lt;wbr&gt;ระดับ&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;อ่อน&lt;wbr&gt;นี้&lt;wbr&gt;เท่านั้น &lt;/p&gt; &lt;p&gt; เนื่องจาก RTLinux ได้&lt;wbr&gt;รับ&lt;wbr&gt;การ&lt;wbr&gt;ออกแบบ&lt;wbr&gt;มา&lt;wbr&gt;เพื่อ&lt;wbr&gt;แก้&lt;wbr&gt;ปัญหา&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;แข็ง ดังนั้น&lt;wbr&gt;ถ้า&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ไว้&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;เฉพาะ คำ&lt;wbr&gt;ว่า ``เวลาจริง'' จะ&lt;wbr&gt;หมายถึง เวลาจริง&lt;wbr&gt;แบบ&lt;wbr&gt;แข็ง &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00140000000000000000"&gt; 4 Linux กับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; Linux เป็น&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;ที่&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้ได้&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;ต้อง&lt;wbr&gt;เสีย&lt;wbr&gt;ค่าใช้จ่าย สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ดี&lt;wbr&gt;กับ&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์ ทั้ง&lt;wbr&gt;รุ่น&lt;wbr&gt;ใหม่&lt;wbr&gt;และ&lt;wbr&gt;เก่า และ&lt;wbr&gt;จำนวน&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;ก็&lt;wbr&gt;มี&lt;wbr&gt;มาก&lt;wbr&gt;ขึ้น&lt;wbr&gt;เรื่อยๆ ดังนั้น&lt;wbr&gt;จึง&lt;wbr&gt;ไม่&lt;wbr&gt;ใช่&lt;wbr&gt;เรื่อง&lt;wbr&gt;แปลก&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ลอง&lt;wbr&gt;นำ Linux มา&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง แต่&lt;wbr&gt;เรา&lt;wbr&gt;พบ&lt;wbr&gt;ว่า Linux (และ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;แบบ&lt;wbr&gt;ทั่วไป&lt;wbr&gt;อื่นๆ) อาจ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ ให้&lt;wbr&gt;ควาน&lt;wbr&gt;เที่ยงตรง&lt;wbr&gt;ได้&lt;wbr&gt;อย่าง&lt;wbr&gt;เพียงพอ เช่น&lt;wbr&gt;ถ้า&lt;wbr&gt;เรา&lt;wbr&gt;ต้องการ&lt;wbr&gt;อ่าน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก&lt;wbr&gt;อุปกรณ์&lt;wbr&gt;ภายนอก คอมพิวเตอร์&lt;wbr&gt;ทุกๆ 10 มิ&lt;wbr&gt;ลลิ&lt;wbr&gt;วินาที&lt;wbr&gt;และ&lt;wbr&gt;นำมา&lt;wbr&gt;เก็บ&lt;wbr&gt;ไว้&lt;wbr&gt;ใน&lt;wbr&gt;ฮาร์ดดิสค์ เรา&lt;wbr&gt;จะ&lt;wbr&gt;พบ&lt;wbr&gt;ว่า Linux ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ให้&lt;wbr&gt;ความ&lt;wbr&gt;เที่ยงตรง&lt;wbr&gt;ใน&lt;wbr&gt;ระดับ&lt;wbr&gt;นี้&lt;wbr&gt;ได้&lt;wbr&gt;ทั้งที่&lt;wbr&gt;ใน&lt;wbr&gt;ทฤษฎี&lt;wbr&gt;แล้ว&lt;wbr&gt;ฮาร์ดแวร์ ของ&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;ตอบสนอง&lt;wbr&gt;ที่&lt;wbr&gt;ความ&lt;wbr&gt;เร็ว&lt;wbr&gt;ระดับ&lt;wbr&gt;นี้&lt;wbr&gt;ได้ &lt;/p&gt; &lt;p&gt; สาเหตุ&lt;wbr&gt;ที่&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ Linux ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ตอบสนอง&lt;wbr&gt;ความ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;มี อยู่&lt;wbr&gt;ด้วย&lt;wbr&gt;กัน&lt;wbr&gt;หลาย&lt;wbr&gt;ประการ เช่น &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;ul&gt;   &lt;li&gt;context switch time เมื่อ Linux ต้องการ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;หนึ่ง&lt;wbr&gt;เพื่อให้&lt;wbr&gt;อีก&lt;wbr&gt;โปรแกรม&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน จะ&lt;wbr&gt;มี&lt;wbr&gt;ช่วง&lt;wbr&gt;เวลา&lt;wbr&gt;ระยะ&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ที่ Linux จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ใช้&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;สถานะ&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;เดิม ซึ่ง&lt;wbr&gt;อาจ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;เรา&lt;wbr&gt;ไม่&lt;wbr&gt;ทัน&lt;wbr&gt;ตาม&lt;wbr&gt;กำหนด   &lt;/li&gt;   &lt;li&gt;interrupt disabled delay บางขณะ Linux จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ disable Interrupt เป็น&lt;wbr&gt;ช่วง&lt;wbr&gt;ระยะ&lt;wbr&gt;เวลา&lt;wbr&gt;หนึ่ง&lt;wbr&gt;เพื่อ&lt;wbr&gt;แก้ไข&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ที่&lt;wbr&gt;อาจ&lt;wbr&gt;มี Interrupt routine อื่น&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ต้องการ&lt;wbr&gt;ใช้ Interrupt เพื่อ&lt;wbr&gt;กำหนด&lt;wbr&gt;เวลา (Timer Interrupt) หรือ&lt;wbr&gt;ใช้ Interrupt จาก&lt;wbr&gt;ฮาร์ดแวร์&lt;wbr&gt;ภายนอก&lt;wbr&gt;เพื่อ&lt;wbr&gt;เป็น&lt;wbr&gt;สัญญาณ&lt;wbr&gt;บอก&lt;wbr&gt;ให้&lt;wbr&gt;เริ่ม&lt;wbr&gt;ทำงาน การ&lt;wbr&gt;ที่Linux ทำ&lt;wbr&gt;การ disable Interrupt ไว้&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ทาง&lt;wbr&gt;เวลา   &lt;/li&gt;   &lt;li&gt;non-preemptive kernel โดย&lt;wbr&gt;ปกติ Linux สามารถ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;กำลัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่&lt;wbr&gt;เพื่อให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;กว่า&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน แต่&lt;wbr&gt;ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;กำลัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่&lt;wbr&gt;นั้น อยู่&lt;wbr&gt;ใน&lt;wbr&gt;ระหว่าง&lt;wbr&gt;การ&lt;wbr&gt;ทำ system call เช่น &lt;code&gt;fork()&lt;/code&gt;,     &lt;code&gt;exec()&lt;/code&gt; Linux จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;นั้น&lt;wbr&gt;ได้ (เนื่องจาก&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;ตัว Linux เอง) จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;รอ&lt;wbr&gt;ให้&lt;wbr&gt;ออก&lt;wbr&gt;จาก system call ก่อน ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เกิด&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ทาง&lt;wbr&gt;เวลา&lt;wbr&gt;ได้&lt;wbr&gt;เช่นกัน   &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00150000000000000000"&gt; 5 โครงสร้าง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ RTLinux&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ดังที่&lt;wbr&gt;กล่าว&lt;wbr&gt;ใน&lt;wbr&gt;หัวข้อ&lt;wbr&gt;ที่&lt;wbr&gt;ผ่าน&lt;wbr&gt;มา&lt;wbr&gt;ว่า Linux โดย&lt;wbr&gt;ตัว&lt;wbr&gt;ของ&lt;wbr&gt;มัน&lt;wbr&gt;เอง&lt;wbr&gt;ไม่&lt;wbr&gt;เหมาะ&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;นำมา&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง ดังนั้น&lt;wbr&gt;จึง&lt;wbr&gt;ได้&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ระบบปฏิบัติการ RTLinux ขึ้น&lt;wbr&gt;โดย&lt;wbr&gt;กลุ่ม&lt;wbr&gt;นักวิจัย ที่ New Mexico Institute of Technology ซึ่ง&lt;wbr&gt;มี Dr. Victor Yodaiken เป็น&lt;wbr&gt;หัวหน้า โครงการ การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;ได้&lt;wbr&gt;เริ่ม&lt;wbr&gt;มา&lt;wbr&gt;ตั้งแต่&lt;wbr&gt;ปี คศ. 1996 ใน&lt;wbr&gt;ขณะนี้&lt;wbr&gt;ได้&lt;wbr&gt;พัฒนา&lt;wbr&gt;ถึง&lt;wbr&gt;รุ่น&lt;wbr&gt;ที่ 3.1 &lt;/p&gt; &lt;p&gt; โครงสร้าง&lt;wbr&gt;ของ RTLinux ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ Linux มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ จะ&lt;wbr&gt;ทำ&lt;wbr&gt;โดย&lt;wbr&gt;การ&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ชั้น&lt;wbr&gt;ของ&lt;wbr&gt;ซอฟท์แวร์&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ฮาร์ดแวร์&lt;wbr&gt;ของ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;กับ Linux kernel ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;1&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-intro:rt-art"&gt;&lt;/a&gt;&lt;a name="87"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; โครงสร้าง&lt;wbr&gt;ของ RTLinux&lt;/caption&gt; &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;p&gt;&lt;a&gt;&lt;img style="height: 203px; width: 603px;" src="http://docs.google.com/File?id=dhdj5j7_32gt6h32"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; RTLinux จะ&lt;wbr&gt;มอง Linux kernel เป็น&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;ต่ำ จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ได้&lt;wbr&gt;ก็&lt;wbr&gt;ต่อเมื่อ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;งาน ใน&lt;wbr&gt;เวลาจริง (RT Tasks) ต้องการ&lt;wbr&gt;ทำงาน&lt;wbr&gt;เท่านั้น และ&lt;wbr&gt;เมื่อ&lt;wbr&gt;มี&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ต้องการ ทำงาน RTLinux จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ Linux kernel ได้&lt;wbr&gt;ตลอดเวลา ไม่ว่า Linux จะ&lt;wbr&gt;ทำ&lt;wbr&gt;อะไร อยู่&lt;wbr&gt;ก็ตาม ส่วนตัว Linux เอง&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;เห็น&lt;wbr&gt;ความ&lt;wbr&gt;แตกต่าง&lt;wbr&gt;ไป&lt;wbr&gt;จาก&lt;wbr&gt;การ&lt;wbr&gt;ที่ Linux ทำงาน&lt;wbr&gt;บน ฮาร์ดแวร์&lt;wbr&gt;โดย&lt;wbr&gt;ตรง จาก&lt;wbr&gt;จุด&lt;wbr&gt;นี้&lt;wbr&gt;เอง&lt;wbr&gt;ที่&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เรา&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;เดิม&lt;wbr&gt;ของ Linux ได้&lt;wbr&gt;ทุกอย่าง ไม่ว่า&lt;wbr&gt;จะ เป็น&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ด้าน&lt;wbr&gt;เครือข่าย&lt;wbr&gt;หรือ&lt;wbr&gt;ด้าน&lt;wbr&gt;กราฟิก &lt;/p&gt; &lt;p&gt; ใน&lt;wbr&gt;กรณี&lt;wbr&gt;ที่&lt;wbr&gt;เกิด Interrupt จาก&lt;wbr&gt;ฮาร์ดแวร์ RTLinux จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ดัก&lt;wbr&gt;สัญญาณ Interrupt นั้น&lt;wbr&gt;ไว้ ถ้า&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;อื่นๆ ต้องการ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ที่&lt;wbr&gt;ดัก&lt;wbr&gt;ได้&lt;wbr&gt;นี้&lt;wbr&gt;จึง&lt;wbr&gt;จะ&lt;wbr&gt;ส่ง&lt;wbr&gt;ต่อไป&lt;wbr&gt;ให้ Linux และ&lt;wbr&gt;กรณี&lt;wbr&gt;ที่ Linux ทำ&lt;wbr&gt;การ disable Interrupt เพื่อ&lt;wbr&gt;เหตุผล&lt;wbr&gt;ใด&lt;wbr&gt;ก็ตาม RTLinux จะ&lt;wbr&gt;ไม่&lt;wbr&gt;ทำ&lt;wbr&gt;การ disable Interrupt จริงๆ เพียงแต่ จะ&lt;wbr&gt;ไม่&lt;wbr&gt;ส่ง&lt;wbr&gt;สัญญาณ Interrupt นั้น&lt;wbr&gt;ให้&lt;wbr&gt;กับ Linux kernel เท่านั้น &lt;/p&gt; &lt;p&gt; เพื่อ&lt;wbr&gt;ความ&lt;wbr&gt;รวดเร็ว&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน RTLinux จึง&lt;wbr&gt;เป็น&lt;wbr&gt;ชั้น&lt;wbr&gt;ของ&lt;wbr&gt;ซอฟท์แวร์&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ขนาด&lt;wbr&gt;เล็ก ใช้ scheduler แบบ&lt;wbr&gt;ง่ายๆ โดย&lt;wbr&gt;จะ&lt;wbr&gt;ให้&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สำคัญ&lt;wbr&gt;มาก&lt;wbr&gt;กว่า&lt;wbr&gt;ได้&lt;wbr&gt;ทำงาน&lt;wbr&gt;ก่อน&lt;wbr&gt;เสมอ และ&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ถูก&lt;wbr&gt;สลับ&lt;wbr&gt;ลง ฮาร์ดดิสก์ อีก&lt;wbr&gt;ทั้ง&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ทั้งหมด&lt;wbr&gt;จะ&lt;wbr&gt;ใช้ memory space เดียวกัน&lt;wbr&gt;กับ Linux kernel (เรา&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน kernel space) จึง&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ไม่&lt;wbr&gt;เสียเวลา&lt;wbr&gt;มาก&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;หยุด&lt;wbr&gt;การ ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;งาน&lt;wbr&gt;หนึ่ง&lt;wbr&gt;และ&lt;wbr&gt;ให้&lt;wbr&gt;อีก&lt;wbr&gt;งาน&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ทำ&lt;wbr&gt;ต่อ (fast context switch time) จาก&lt;wbr&gt;เหตุผล&lt;wbr&gt;ดังที่&lt;wbr&gt;กล่าว&lt;wbr&gt;มา&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ RTLinux สามารถ&lt;wbr&gt;ให้&lt;wbr&gt;ความ&lt;wbr&gt;เที่ยงตรง&lt;wbr&gt;ใน&lt;wbr&gt;ระดับ&lt;wbr&gt;ไม&lt;wbr&gt;โค&lt;wbr&gt;ร&lt;wbr&gt;วินาที&lt;wbr&gt;บน&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ระดับ Pentium Class ได้ &lt;/p&gt; &lt;p&gt; ข้อแตกต่าง&lt;wbr&gt;อย่างหนึ่ง&lt;wbr&gt;ของ&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ทั่วไป&lt;wbr&gt;บน Linux คือ งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง จะ&lt;wbr&gt;ไม่&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;การ&lt;wbr&gt;ป้องกัน&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ใดๆ จาก Linux ดังนั้น&lt;wbr&gt;ความผิด&lt;wbr&gt;พลาด&lt;wbr&gt;ของ&lt;wbr&gt;ซอฟท์แวร์ เช่น&lt;wbr&gt;การ&lt;wbr&gt;หาร&lt;wbr&gt;ด้วย&lt;wbr&gt;ศูนย์ จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;หยุด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ทันที ซึ่ง&lt;wbr&gt;ต่าง&lt;wbr&gt;จาก โปรแกรม&lt;wbr&gt;ทั่วไป&lt;wbr&gt;บน Linux (เรา&lt;wbr&gt;เรียก&lt;wbr&gt;ว่า&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน user space) ซึ่ง Linux จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;หยุด การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;นั้น&lt;wbr&gt;โดย&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ผลกระทบ&lt;wbr&gt;ต่อ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;อื่นๆ ที่&lt;wbr&gt;กำลัง&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่ คอมพิวเตอร์&lt;wbr&gt;จะ&lt;wbr&gt;ยังคง&lt;wbr&gt;สามารถ ทำงาน&lt;wbr&gt;ต่อไป&lt;wbr&gt;ได้&lt;wbr&gt;อย่าง&lt;wbr&gt;ปกติ จะ&lt;wbr&gt;มี&lt;wbr&gt;เพียง&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ผิดพลาด&lt;wbr&gt;เท่านั้น&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;หยุด&lt;wbr&gt;ทำงาน ตรง&lt;wbr&gt;จุด&lt;wbr&gt;นี้&lt;wbr&gt;จึง&lt;wbr&gt;เป็น&lt;wbr&gt;ข้อ&lt;wbr&gt;พึง&lt;wbr&gt;ระวัง&lt;wbr&gt;อย่าง&lt;wbr&gt;มาก&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;พัฒนา&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00160000000000000000"&gt; 6 การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;แลกเปลี่ยน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ระหว่าง&lt;wbr&gt;กระบวนการ&lt;wbr&gt;ของ RTLinux (RTLinux Interprocess Communication Mechanism)&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; RTLinux ได้&lt;wbr&gt;รับ&lt;wbr&gt;การ&lt;wbr&gt;ออกแบบ&lt;wbr&gt;ให้&lt;wbr&gt;มี&lt;wbr&gt;ขนาด&lt;wbr&gt;เล็ก&lt;wbr&gt;และ&lt;wbr&gt;ไม่&lt;wbr&gt;ซับซ้อน ดังนั้น&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง จึง&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;การ&lt;wbr&gt;บริการ&lt;wbr&gt;ของ Linux ได้ เช่น การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;ผู้ใช้&lt;wbr&gt;งาน การ&lt;wbr&gt;อ่าน&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ใน&lt;wbr&gt;ฮาร์ดดิกส์ หรือ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;เครือข่าย งาน&lt;wbr&gt;ดังกล่าว&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;โดย&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน Linux &lt;/p&gt; &lt;p&gt; RTLinux ได้&lt;wbr&gt;จัดเตรียม&lt;wbr&gt;ช่องทาง&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ให้&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;สามารถ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน Linux ไว้ 2 วิธี คือ การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง FIFO ซึ่ง&lt;wbr&gt;มี&lt;wbr&gt;ลักษณะ&lt;wbr&gt;คล้าย&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;อ่าน เขียน&lt;wbr&gt;แฟ้มข้อมูล และ&lt;wbr&gt;อีก&lt;wbr&gt;ช่องทาง คือ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง Shared Memory &lt;/p&gt; &lt;p&gt; การ&lt;wbr&gt;สื่อสาร&lt;wbr&gt;ระหว่าง&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ด้วย&lt;wbr&gt;กัน&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำ&lt;wbr&gt;ได้&lt;wbr&gt;ง่าย&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ทั้งหมด&lt;wbr&gt;ใช้ Memory Space เดียวกัน ทำ&lt;wbr&gt;ให้&lt;wbr&gt;สามารถ&lt;wbr&gt;เห็น&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ของ&lt;wbr&gt;กันและกัน&lt;wbr&gt;ได้&lt;wbr&gt;หมด งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;สามารถ&lt;wbr&gt;จัดสรร&lt;wbr&gt;เวลา&lt;wbr&gt;การ&lt;wbr&gt;เข้าถึง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;โดย&lt;wbr&gt;ใช้ semaphores และ mutex ซึ่ง&lt;wbr&gt;เป็น&lt;wbr&gt;วิธี&lt;wbr&gt;มาตรฐาน&lt;wbr&gt;ของ&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;แบบ UNIX (และ POSIX) &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00170000000000000000"&gt; 7 ทางเลือก&lt;wbr&gt;อื่น&lt;wbr&gt;นอกจาก RTLinux&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ความ&lt;wbr&gt;พยายาม&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ Linux สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ นอกจาก RTLinux แล้ว&lt;wbr&gt;ยัง&lt;wbr&gt;มี RTAI ที่&lt;wbr&gt;พยายาม&lt;wbr&gt;ทำ&lt;wbr&gt;เช่นกัน โดย&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;พัฒนา มา&lt;wbr&gt;จาก&lt;wbr&gt;แนว&lt;wbr&gt;คิด&lt;wbr&gt;ของ RTLinux ที่ทำการ&lt;wbr&gt;แทรก&lt;wbr&gt;ชั้น&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;เข้า&lt;wbr&gt;ไป&lt;wbr&gt;ขั้น&lt;wbr&gt;กลาง&lt;wbr&gt;ระหว่าง&lt;wbr&gt;ฮาร์ดแวร์&lt;wbr&gt;กับ Linux kernel  ใน&lt;wbr&gt;รุ่น&lt;wbr&gt;แรกๆ ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;กลุ่ม&lt;wbr&gt;จะ&lt;wbr&gt;มี&lt;wbr&gt;ชุดคำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ค&lt;wbr&gt;ล้า&lt;wbr&gt;ยๆ กัน แทบ&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;แทน&lt;wbr&gt;กัน&lt;wbr&gt;ได้ แต่&lt;wbr&gt;ต่อมา&lt;wbr&gt;ใน&lt;wbr&gt;รุ่น&lt;wbr&gt;หลังๆ RTLinux ได้&lt;wbr&gt;เน้น&lt;wbr&gt;พัฒนา&lt;wbr&gt;ชุดคำสั่ง ให้&lt;wbr&gt;สอดคล้อง&lt;wbr&gt;กับ&lt;wbr&gt;มาตรฐานPOSIX 1003.13 PES51 และ&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;เป็น&lt;wbr&gt;ธุรกิจ&lt;wbr&gt;มาก&lt;wbr&gt;ขึ้น ใน&lt;wbr&gt;ขณะที่ RTAI ยัง&lt;wbr&gt;ใช้&lt;wbr&gt;ชุดคำสั่ง&lt;wbr&gt;เดิม และ&lt;wbr&gt;ยังคง&lt;wbr&gt;ความ&lt;wbr&gt;เป็น GPL ต่อไป นอกจากนั้น RTAI ยัง&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;อยู่&lt;wbr&gt;บน Linux หรือ&lt;wbr&gt;ทำงาน&lt;wbr&gt;อยู่ ใน user space memory ซึ่ง RTLinux ก็ได้&lt;wbr&gt;เพิ่ม&lt;wbr&gt;ส่วน&lt;wbr&gt;นี้&lt;wbr&gt;ด้วย&lt;wbr&gt;เช่นกัน&lt;wbr&gt;แต่&lt;wbr&gt;มี&lt;wbr&gt;เฉพาะ&lt;wbr&gt;ใน&lt;wbr&gt;รุ่น&lt;wbr&gt;ที่&lt;wbr&gt;ขาย&lt;wbr&gt;เท่านั้น &lt;/p&gt; &lt;p&gt; นอกจาก&lt;wbr&gt;แนวทาง&lt;wbr&gt;ที่ RTLinux ใช้&lt;wbr&gt;แล้ว&lt;wbr&gt;ยัง&lt;wbr&gt;มี&lt;wbr&gt;อีก&lt;wbr&gt;แนวทาง&lt;wbr&gt;หนึ่ง&lt;wbr&gt;ที่&lt;wbr&gt;พยายาม&lt;wbr&gt;ทำ&lt;wbr&gt;ให้ Linux สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ได้ โดย&lt;wbr&gt;แนว ทาง&lt;wbr&gt;นี้&lt;wbr&gt;ได้&lt;wbr&gt;พยายาม&lt;wbr&gt;พัฒนา&lt;wbr&gt;ให้ Linux kernel จาก&lt;wbr&gt;ที่&lt;wbr&gt;เป็น non-preemptive kernel ไป&lt;wbr&gt;เป็น preemptive kernel สำหรับ&lt;wbr&gt;ใน&lt;wbr&gt;แนวทาง&lt;wbr&gt;นี้ ผู้&lt;wbr&gt;สนใจ&lt;wbr&gt;สามารถ&lt;wbr&gt;หา&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;เพิ่มเติม&lt;wbr&gt;จาก&lt;wbr&gt;เอกสารอ้างอิง &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00180000000000000000"&gt; 8 ตัวอย่าง&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; ก่อน&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ลง&lt;wbr&gt;ลึก&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux ใน&lt;wbr&gt;ครั้ง&lt;wbr&gt;ต่อๆ ไป คงจะ&lt;wbr&gt;เป็น&lt;wbr&gt;การ&lt;wbr&gt;ดี&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;พูด&lt;wbr&gt;ถึง&lt;wbr&gt;ตัวอย่าง การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน เพื่อ&lt;wbr&gt;เป็น&lt;wbr&gt;แรงจูงใจ&lt;wbr&gt;ให้&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;พยายาม&lt;wbr&gt;ศึกษา&lt;wbr&gt;การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน Linux และ RTLinux ไม่&lt;wbr&gt;ท้อใจ&lt;wbr&gt;ไป&lt;wbr&gt;เสียก่อน ดัง ที่&lt;wbr&gt;กล่าว&lt;wbr&gt;มา&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า งาน&lt;wbr&gt;ที่&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้RTLinux จะ&lt;wbr&gt;เป็น&lt;wbr&gt;งาน&lt;wbr&gt;ประเภท&lt;wbr&gt;การ&lt;wbr&gt;เก็บ&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ข้อมูล หรือ การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;วง&lt;wbr&gt;ปิด&lt;wbr&gt;โดย คอมพิวเตอร์&lt;wbr&gt;ดังนั้น&lt;wbr&gt;จะ&lt;wbr&gt;ขอ&lt;wbr&gt;ยก&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;งาน&lt;wbr&gt;ที่&lt;wbr&gt;เคย&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;มา&lt;wbr&gt;แล้ว&lt;wbr&gt;ทั้ง&lt;wbr&gt;สอง&lt;wbr&gt;กลุ่ม&lt;wbr&gt;นี้ &lt;/p&gt; &lt;p&gt; ตัวอย่าง&lt;wbr&gt;แรก เป็น&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux ใน&lt;wbr&gt;การ&lt;wbr&gt;เก็บ&lt;wbr&gt;ตัวอย่าง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์ โครงการ&lt;wbr&gt;นี้&lt;wbr&gt;เป็น&lt;wbr&gt;ความ&lt;wbr&gt;ร่วมมือ&lt;wbr&gt;ระหว่าง นพ.ทายาท ดี&lt;wbr&gt;สุดจิต อาจารย์&lt;wbr&gt;ประจำ&lt;wbr&gt;คณะ&lt;wbr&gt;แพทยศาสตร์, อ.เจิด&lt;wbr&gt;กุล โสภา&lt;wbr&gt;วนิตย์ และ อ.มานพ วงศ์&lt;wbr&gt;สาย&lt;wbr&gt;สุวรรณ อาจารย์&lt;wbr&gt;ประจำ&lt;wbr&gt;ภาควิชา&lt;wbr&gt;วิศวกรรม&lt;wbr&gt;ไฟฟ้า จุฬาลงกรณ์มหาวิทยาลัย ได้ จัดทำ&lt;wbr&gt;เครื่อง&lt;wbr&gt;อ่าน&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;ขึ้น เครื่อง&lt;wbr&gt;นี้&lt;wbr&gt;สามารถ&lt;wbr&gt;อ่าน&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง ได้&lt;wbr&gt;จำนวน 32 ช่องสัญญาณ ที่&lt;wbr&gt;ความ&lt;wbr&gt;ถี่ 200 Hz ต่อ&lt;wbr&gt;ช่องสัญญาณ โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;เครื่อง&lt;wbr&gt;เป็น&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;2&lt;/a&gt; หลังจาก&lt;wbr&gt;ที่ ไม&lt;wbr&gt;โค&lt;wbr&gt;ร&lt;wbr&gt;คอน&lt;wbr&gt;โทร&lt;wbr&gt;ลเลอร์&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;จาก&lt;wbr&gt;ภาค&lt;wbr&gt;ขยาย&lt;wbr&gt;สัญญาณ&lt;wbr&gt;แล้ว จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;ต่อ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง RS-232 หลังจาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;แล้ว&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;แสดง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;เป็น&lt;wbr&gt;กราฟ ใน&lt;wbr&gt;ขณะเดียวกัน&lt;wbr&gt;ก็&lt;wbr&gt;เก็บ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์ เพื่อ&lt;wbr&gt;ที่&lt;wbr&gt;แพทย์&lt;wbr&gt;จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;นำ&lt;wbr&gt;ไป&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;วินิจฉัย&lt;wbr&gt;โรค&lt;wbr&gt;ต่อไป สิ่ง&lt;wbr&gt;ที่&lt;wbr&gt;ต้องการ&lt;wbr&gt;จาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;คือ&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-intro:eeg"&gt;&lt;/a&gt;&lt;a name="88"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; โครงสร้าง&lt;wbr&gt;เครื่องวัด&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;p&gt;&lt;img style="height: 317px; width: 473px;" src="http://docs.google.com/File?id=dhdj5j7_33g5qd9w"&gt; &lt;/p&gt;  &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt;   &lt;li&gt;สามารถ&lt;wbr&gt;รับ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;ทั้งหมด โดย&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ข้อมูล&lt;wbr&gt;สูญหาย ปัญหา&lt;wbr&gt;ตรง&lt;wbr&gt;จุด&lt;wbr&gt;นี้&lt;wbr&gt;คือ&lt;wbr&gt;ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ของ&lt;wbr&gt;ไม&lt;wbr&gt;โค&lt;wbr&gt;ร&lt;wbr&gt;คอ&lt;wbr&gt;ล&lt;wbr&gt;โทร&lt;wbr&gt;ลเลอร์ จะ&lt;wbr&gt;ไม่&lt;wbr&gt;มี&lt;wbr&gt;ที่พัก&lt;wbr&gt;ข้อมูล&lt;wbr&gt;หาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ไม่&lt;wbr&gt;พร้อม&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;รับ กล่าวคือ&lt;wbr&gt;ไม&lt;wbr&gt;โค&lt;wbr&gt;ร&lt;wbr&gt;คอ&lt;wbr&gt;ล&lt;wbr&gt;โทร&lt;wbr&gt;ลเลอร์&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ตลอดเวลา   &lt;/li&gt;   &lt;li&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ด้าน&lt;wbr&gt;กราฟิก เพื่อ&lt;wbr&gt;แสดง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;เป็น&lt;wbr&gt;กราฟ&lt;wbr&gt;ได้&lt;wbr&gt;ใน&lt;wbr&gt;ขณะที่&lt;wbr&gt;รับ&lt;wbr&gt;ข้อมูล   &lt;/li&gt;   &lt;li&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ด้าน&lt;wbr&gt;เครือข่าย เพื่อที่จะ&lt;wbr&gt;สามารถ&lt;wbr&gt;เรียก&lt;wbr&gt;ดู&lt;wbr&gt;ลักษณะ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง&lt;wbr&gt;ระบบเครือข่าย&lt;wbr&gt;ได้   &lt;/li&gt;   &lt;li&gt;มี&lt;wbr&gt;ราคา&lt;wbr&gt;ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;ของ&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;ไม่&lt;wbr&gt;สูง&lt;wbr&gt;มาก&lt;wbr&gt;นัก   &lt;/li&gt; &lt;/ol&gt; จาก&lt;wbr&gt;เงื่อนไข&lt;wbr&gt;ความ&lt;wbr&gt;ต้องการ&lt;wbr&gt;ทั้งหมด&lt;wbr&gt;จึง&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;ใช้ RTLinux เป็น&lt;wbr&gt;ระบบปฏิบัติการ คอมพิวเตอร์&lt;wbr&gt;สามารถ&lt;wbr&gt;รับ&lt;wbr&gt;สัญญาณ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง RS-232 โดย&lt;wbr&gt;ใช้&lt;wbr&gt;วิธี Interrupt ที่&lt;wbr&gt;โหมด&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ด้วย&lt;wbr&gt;อัตรา&lt;wbr&gt;ส่ง&lt;wbr&gt;สูงสุด&lt;wbr&gt;ของ RS-232 ใน&lt;wbr&gt;ส่วน&lt;wbr&gt;นี้&lt;wbr&gt;จะ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง จาก&lt;wbr&gt;ที่&lt;wbr&gt;กล่าว&lt;wbr&gt;มา&lt;wbr&gt;แล้ว งาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์&lt;wbr&gt;ได้ แต่&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ส่ง&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง FIFO ให้&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่ทำงาน&lt;wbr&gt;ใน Linux ทำ&lt;wbr&gt;หน้าที่ เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์&lt;wbr&gt;แทน นอกจาก&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;วิธีการ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์&lt;wbr&gt;แล้ว การ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง FIFO ยัง&lt;wbr&gt;ทำ&lt;wbr&gt;ให้&lt;wbr&gt;เรา&lt;wbr&gt;ได้&lt;wbr&gt;ที่ พัก&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ตาม&lt;wbr&gt;ขนาด&lt;wbr&gt;หน่วยความจำ&lt;wbr&gt;ที่&lt;wbr&gt;เรา&lt;wbr&gt;นำมา&lt;wbr&gt;สร้าง&lt;wbr&gt;เป็น FIFO อีก&lt;wbr&gt;ด้วย ทำ&lt;wbr&gt;ให้&lt;wbr&gt;ถึงแม้ว่า&lt;wbr&gt;โปรแกรม&lt;wbr&gt;ที่&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ลง&lt;wbr&gt;ฮาร์ด&lt;wbr&gt;ดิสก์ จะ&lt;wbr&gt;ไม่&lt;wbr&gt;สามารถ&lt;wbr&gt;เขียน&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;ทันที&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จาก FIFO เนื่องจาก&lt;wbr&gt;อาจ&lt;wbr&gt;จะ&lt;wbr&gt;โดน&lt;wbr&gt;งาน&lt;wbr&gt;อื่น&lt;wbr&gt;แย่ง&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ของ CPU ไป ข้อมูล&lt;wbr&gt;ก็&lt;wbr&gt;จะ&lt;wbr&gt;ยัง ค้าง&lt;wbr&gt;อยู่&lt;wbr&gt;ที่ FIFO ไม่&lt;wbr&gt;โดน&lt;wbr&gt;เขียน&lt;wbr&gt;ทับ&lt;wbr&gt;จนกว่า&lt;wbr&gt;ที่พัก&lt;wbr&gt;ข้อมูล&lt;wbr&gt;จะ&lt;wbr&gt;เต็ม เครื่อง&lt;wbr&gt;นี้&lt;wbr&gt;ปัจจุบัน&lt;wbr&gt;สามารถ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ได้&lt;wbr&gt;จริง และ&lt;wbr&gt;ยัง&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;รางวัล&lt;wbr&gt;สิ่งประดิษฐ์&lt;wbr&gt;ยอดเยี่ยม&lt;wbr&gt;ของ&lt;wbr&gt;สำนักงาน&lt;wbr&gt;คณะ&lt;wbr&gt;กรรมการ&lt;wbr&gt;การ&lt;wbr&gt;วิจัย&lt;wbr&gt;แห่งชาติ ประจำปี พ.ศ. 2543 สำหรับ&lt;wbr&gt;กราฟิก ที่&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;แสดง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ดู&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;3&lt;/a&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-intro:cuview"&gt;&lt;/a&gt;&lt;a name="89"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; โปรแกรม&lt;wbr&gt;แสดง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;คลื่น&lt;wbr&gt;สมอง&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;a&gt;&lt;img style="height: 581px; width: 800px;" src="http://docs.google.com/File?id=dhdj5j7_349tcrk4" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; ตัวอย่าง&lt;wbr&gt;ที่&lt;wbr&gt;สอง เป็น&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน RTLinux ใน&lt;wbr&gt;งาน&lt;wbr&gt;ควบคุม&lt;wbr&gt;วง&lt;wbr&gt;ปิด&lt;wbr&gt;ด้วย&lt;wbr&gt;คอมพิวเตอร์ โครง&lt;wbr&gt;งาน&lt;wbr&gt;นี้&lt;wbr&gt;เกิด&lt;wbr&gt;ขึ้น&lt;wbr&gt;เนื่องจาก&lt;wbr&gt;ทาง ศูนย์&lt;wbr&gt;เทคโนโลยี&lt;wbr&gt;อิเล็กทรอนิกส์&lt;wbr&gt;และ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;แห่งชาติ โดย กฤษณ์ จง&lt;wbr&gt;สฤษดิ์, อมร ช่วย&lt;wbr&gt;ชู และ ปณิธิ พุ่ม&lt;wbr&gt;วิเศษ ได้ ประดิษฐ์&lt;wbr&gt;การ์ด Motion I/O ขึ้น แล้ว&lt;wbr&gt;ต้องการ&lt;wbr&gt;แสดง&lt;wbr&gt;ให้&lt;wbr&gt;เห็น&lt;wbr&gt;ถึง&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;การ์ด&lt;wbr&gt;นี้ การ์ด Motion I/O เป็น&lt;wbr&gt;การ์ด&lt;wbr&gt;ที่ ใช้&lt;wbr&gt;เชื่อมต่อ&lt;wbr&gt;กับ&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง&lt;wbr&gt;ช่อง ISA ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;อ่าน&lt;wbr&gt;ค่า&lt;wbr&gt;ตำแหน่ง&lt;wbr&gt;ของ&lt;wbr&gt;เซอร์&lt;wbr&gt;โว&lt;wbr&gt;มอเตอร์&lt;wbr&gt;ให้&lt;wbr&gt;กับ&lt;wbr&gt;คอมพิวเตอร์ ขณะเดียวกัน&lt;wbr&gt;ก็&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;แปลง&lt;wbr&gt;คำสั่ง&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;ให้&lt;wbr&gt;เป็น&lt;wbr&gt;สัญญาณ PWM เพื่อ&lt;wbr&gt;ส่ง&lt;wbr&gt;ให้&lt;wbr&gt;ชุด&lt;wbr&gt;ขับ&lt;wbr&gt;มอเตอร์&lt;wbr&gt;ใช้&lt;wbr&gt;ควบคุม เซอร์โว&lt;wbr&gt;มอเตอร์ ตัว&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;จะ&lt;wbr&gt;ทำ&lt;wbr&gt;หน้าที่&lt;wbr&gt;คอย&lt;wbr&gt;สร้าง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ควบคุม&lt;wbr&gt;จาก&lt;wbr&gt;ค่า&lt;wbr&gt;ตำแหน่ง&lt;wbr&gt;ของ&lt;wbr&gt;เซอร์&lt;wbr&gt;โว&lt;wbr&gt;มอเตอร์&lt;wbr&gt;ที่&lt;wbr&gt;ได้&lt;wbr&gt;รับ&lt;wbr&gt;ผ่าน&lt;wbr&gt;ทาง&lt;wbr&gt;การ์ด Motion I/O ลักษณะ&lt;wbr&gt;โครงสร้าง&lt;wbr&gt;ของ&lt;wbr&gt;ระบบ&lt;wbr&gt;นี้&lt;wbr&gt;เป็น&lt;wbr&gt;ดัง&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;4&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-intro:motionio"&gt;&lt;/a&gt;&lt;a name="90"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; โครงสร้าง&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;ระบบ&lt;wbr&gt;เซอร์&lt;wbr&gt;โว&lt;wbr&gt;มอเตอร์&lt;wbr&gt;ด้วย&lt;wbr&gt;คอมพิวเตอร์&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;a&gt;&lt;img style="height: 261px; width: 500px;" src="http://docs.google.com/File?id=dhdj5j7_35chjh4r" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; ใน&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;วง&lt;wbr&gt;ปิด&lt;wbr&gt;ด้วย&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;สำหรับ&lt;wbr&gt;การ์ด Motion I/O นี้&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;ตำแหน่ง หรือ ความ&lt;wbr&gt;เร็ว&lt;wbr&gt;ของ&lt;wbr&gt;เซอร์&lt;wbr&gt;โว&lt;wbr&gt;มอเตอร์ ผล&lt;wbr&gt;ตอบ&lt;wbr&gt;ของ&lt;wbr&gt;การ&lt;wbr&gt;ควบคุม&lt;wbr&gt;นอกจาก&lt;wbr&gt;จะ&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;วิธี&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;สร้าง&lt;wbr&gt;สัญญาณ&lt;wbr&gt;ควบคุม&lt;wbr&gt;แล้ว ยัง&lt;wbr&gt;ขึ้น&lt;wbr&gt;กับ&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ของ คอมพิวเตอร์&lt;wbr&gt;ด้วย คอมพิวเตอร์&lt;wbr&gt;จะ&lt;wbr&gt;ต้อง&lt;wbr&gt;สามารถ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ใน&lt;wbr&gt;ลักษณะ&lt;wbr&gt;ที่&lt;wbr&gt;เป็น&lt;wbr&gt;ราย&lt;wbr&gt;คาบ&lt;wbr&gt;แน่นอน&lt;wbr&gt;ได้ ดังนั้น&lt;wbr&gt;จึง&lt;wbr&gt;ได้&lt;wbr&gt;เลือก&lt;wbr&gt;ใช้ RTLinux เป็น&lt;wbr&gt;ระบบปฏิบัติการ นอกจาก&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ประโยชน์&lt;wbr&gt;จาก&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;แล้ว ยัง ได้&lt;wbr&gt;การ&lt;wbr&gt;แสดง&lt;wbr&gt;ผล&lt;wbr&gt;แบบ&lt;wbr&gt;กราฟิก&lt;wbr&gt;ของ Linux อีก&lt;wbr&gt;ด้วย ดัง&lt;wbr&gt;แสดง&lt;wbr&gt;ใน&lt;wbr&gt;รูป&lt;wbr&gt;ที่ &lt;a&gt;5&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;&lt;a name="fig:rt-intro:rt-main"&gt;&lt;/a&gt;&lt;a name="91"&gt;&lt;/a&gt; &lt;table&gt;   &lt;caption align="bottom"&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; โปรแกรมควบคุม&lt;wbr&gt;การ&lt;wbr&gt;เคลื่อนที่&lt;wbr&gt;ของ&lt;wbr&gt;เซอร์&lt;wbr&gt;โว&lt;wbr&gt;มอเตอร์&lt;/caption&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;       &lt;div align="center"&gt; &lt;a&gt;&lt;img style="height: 449px; width: 800px;" src="http://docs.google.com/File?id=dhdj5j7_36dmzrjt" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00190000000000000000"&gt; 9 สรุป&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; มา&lt;wbr&gt;ถึง&lt;wbr&gt;จุด&lt;wbr&gt;นี้ ผู้อ่าน&lt;wbr&gt;คงจะ&lt;wbr&gt;เข้าใจ&lt;wbr&gt;ความหมาย ความ&lt;wbr&gt;สำคัญ และ แนวทาง&lt;wbr&gt;การ&lt;wbr&gt;ประยุกต์&lt;wbr&gt;ใช้&lt;wbr&gt;งาน&lt;wbr&gt;ระบบปฏิบัติการ&lt;wbr&gt;เวลาจริง&lt;wbr&gt;ไม่&lt;wbr&gt;มาก&lt;wbr&gt;ก็&lt;wbr&gt;น้อย โดยเฉพาะ RTLinux ครั้ง&lt;wbr&gt;หน้า&lt;wbr&gt;เรา&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;กล่าว&lt;wbr&gt;ถึง&lt;wbr&gt;วิธีการ&lt;wbr&gt;ติดตั้ง RTLinux กัน อย่าง&lt;wbr&gt;ที่&lt;wbr&gt;กล่าว&lt;wbr&gt;ไว้&lt;wbr&gt;แล้ว&lt;wbr&gt;ว่า RTLinux ก็&lt;wbr&gt;คือ Linux ที่&lt;wbr&gt;มี&lt;wbr&gt;การ&lt;wbr&gt;ปรับ&lt;wbr&gt;แก้ kernel ให้&lt;wbr&gt;มี&lt;wbr&gt;ความ&lt;wbr&gt;สามารถ&lt;wbr&gt;เวลาจริง ดังนั้น&lt;wbr&gt;ก่อน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux ก็&lt;wbr&gt;ขอ&lt;wbr&gt;ให้&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;ได้&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux ที่&lt;wbr&gt;เครื่อง&lt;wbr&gt;คอมพิวเตอร์&lt;wbr&gt;เสียก่อน จะ&lt;wbr&gt;เป็น Linux ของ&lt;wbr&gt;ผู้&lt;wbr&gt;เผยแพร่&lt;wbr&gt;ราย&lt;wbr&gt;ใด&lt;wbr&gt;ก็ได้ สำหรับ&lt;wbr&gt;วิธีการ&lt;wbr&gt;ติดตั้ง การ&lt;wbr&gt;ใช้&lt;wbr&gt;งาน Linux เบื้องต้น ก็&lt;wbr&gt;คง&lt;wbr&gt;หา&lt;wbr&gt;ได้&lt;wbr&gt;จาก&lt;wbr&gt;หนังสือ หรือ Internet ซึ่ง&lt;wbr&gt;มี&lt;wbr&gt;อยู่&lt;wbr&gt;ทั่วไป&lt;wbr&gt;แล้ว&lt;wbr&gt;ใน&lt;wbr&gt;ปัจจุบัน คง&lt;wbr&gt;หา&lt;wbr&gt;ข้อมูล&lt;wbr&gt;ได้&lt;wbr&gt;ไม่&lt;wbr&gt;ยาก&lt;wbr&gt;นัก และ&lt;wbr&gt;ใน&lt;wbr&gt;ระหว่าง การ&lt;wbr&gt;ติดตั้ง&lt;wbr&gt;ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้&lt;wbr&gt;เลือก&lt;wbr&gt;ระบบ&lt;wbr&gt;ไฟล์&lt;wbr&gt;ที่&lt;wbr&gt;จะ&lt;wbr&gt;ใช้&lt;wbr&gt;เป็น ext2, ext3 หรือ ReiserFS และ&lt;wbr&gt;ใน&lt;wbr&gt;ขั้นตอน&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Boot Loader ก็&lt;wbr&gt;ขอ&lt;wbr&gt;แนะนำ&lt;wbr&gt;ให้ ติดตั้ง LILO เพื่อ&lt;wbr&gt;จะ&lt;wbr&gt;ได้&lt;wbr&gt;ง่าย&lt;wbr&gt;เมื่อ&lt;wbr&gt;ต้อง&lt;wbr&gt;ทำ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง RTLinux สุดท้าย&lt;wbr&gt;ก็&lt;wbr&gt;ขอ&lt;wbr&gt;ให้&lt;wbr&gt;ท่าน&lt;wbr&gt;ผู้อ่าน&lt;wbr&gt;สนุก&lt;wbr&gt;กับ&lt;wbr&gt;การ&lt;wbr&gt;ติดตั้ง Linux นะ&lt;wbr&gt;ครับ อย่า&lt;wbr&gt;พึ่ง&lt;wbr&gt;ท้อ&lt;wbr&gt;ก่อน มี&lt;wbr&gt;ปัญหา สงสัย&lt;wbr&gt;อะไร&lt;wbr&gt;ก็&lt;wbr&gt;สามารถ&lt;wbr&gt;ติดต่อ&lt;wbr&gt;ผู้เขียน&lt;wbr&gt;ได้&lt;wbr&gt;ทาง&lt;wbr&gt;เมลล์&lt;wbr&gt;พร้อม&lt;wbr&gt;จะ&lt;wbr&gt;ช่วย&lt;wbr&gt;เต็มที่&lt;wbr&gt;หาก&lt;wbr&gt;ช่วย&lt;wbr&gt;ได้&lt;wbr&gt;ครับ ไว้&lt;wbr&gt;พบ&lt;wbr&gt;กัน&lt;wbr&gt;ใหม่ ใน&lt;wbr&gt;ฉบับ&lt;wbr&gt;ต่อไป &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION001100000000000000000"&gt; 10 แหล่งข้อมูล&lt;wbr&gt;เพิ่มเติม&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt;   &lt;li&gt;FSMLabs, Inc. บริษัท&lt;wbr&gt;ที่ทำการ&lt;wbr&gt;พัฒนา RTLinux &lt;a href="http://www.fsmlabs.com/"&gt;http://www.fsmlabs.com/&lt;/a&gt; &lt;/li&gt;   &lt;li&gt;เอกสาร&lt;wbr&gt;ต่างๆ เกี่ยวกับ RTLinux จาก FSMLabs &lt;a href="http://www.fsmlabs.com/developers/man_pages/"&gt;http://www.fsmlabs.com/developers/man_pages/&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;บทความ&lt;wbr&gt;อธิบาย&lt;wbr&gt;เกี่ยวกับ&lt;wbr&gt;การ&lt;wbr&gt;ทำงาน&lt;wbr&gt;ใน&lt;wbr&gt;เวลาจริง&lt;wbr&gt;กับ Linux &lt;a href="http://www.linuxdevices.com/articles/AT5997007602.html"&gt;http://www.linuxdevices.com/articles/AT5997007602.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;แหล่งข้อมูล&lt;wbr&gt;ของ RTAI &lt;a href="http://www.aero.polimi.it/%7Ertai"&gt;http://www.aero.polimi.it/~rtai&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;แหล่งข้อมูล&lt;wbr&gt;ของ preemptive kernel &lt;a href="http://kpreemptive.sourceforge.net"&gt;http://kpreemptive.sourceforge.net&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;แหล่งข้อมูล&lt;wbr&gt;อีก&lt;wbr&gt;แหล่ง&lt;wbr&gt;ของ preemptive kernel &lt;a href="http://www.timesys.com"&gt;http://www.timesys.com&lt;/a&gt; &lt;/li&gt;   &lt;li&gt;บทความ&lt;wbr&gt;ที่&lt;wbr&gt;น่า&lt;wbr&gt;สนใจ &lt;a href="http://www.linuxdevices.com/articles/AT7005360270.html"&gt;http://www.linuxdevices.com/articles/AT7005360270.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;บทความ&lt;wbr&gt;ที่&lt;wbr&gt;น่า&lt;wbr&gt;สนใจ &lt;a href="http://www.linuxdevices.com/articles/AT4503827066.html"&gt;http://www.linuxdevices.com/articles/AT4503827066.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;บทความ&lt;wbr&gt;เปรียบเทียบ&lt;wbr&gt;ระหว่าง RTLinux กับ RTAI &lt;a href="http://bernia.disca.upr.es/rtportal/comparative/rtl_vs_rtai.html"&gt;http://bernia.disca.upr.es/rtportal/comparative/rtl_vs_rtai.html&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;รวม&lt;wbr&gt;บทความ&lt;wbr&gt;ที่&lt;wbr&gt;น่า&lt;wbr&gt;สนใจ &lt;a href="http://www.realtimelinuxfoundation.org/events/rtlws-2001/papers.html"&gt;http://www.realtimelinuxfoundation.org/events/rtlws-2001/papers.html&lt;/a&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;&lt;a name="SECTION00200000000000000000"&gt; About this document ...&lt;/a&gt; &lt;/h1&gt; &lt;p&gt; This document was generated using the &lt;a href="http://www-texdev.mpce.mq.edu.au/l2h/docs/manual/"&gt;&lt;strong&gt;LaTeX&lt;/strong&gt;2&lt;tt&gt;HTML&lt;/tt&gt;&lt;/a&gt; translator Version 2K.1beta (1.48) &lt;/p&gt; &lt;p&gt; Copyright © 1993, 1994, 1995, 1996, &lt;a href="http://cbl.leeds.ac.uk/nikos/personal.html"&gt;Nikos Drakos&lt;/a&gt;, Computer Based Learning Unit, University of Leeds. &lt;br&gt; Copyright © 1997, 1998, 1999, &lt;a href="http://www.maths.mq.edu.au/%7Eross/"&gt;Ross Moore&lt;/a&gt;, Mathematics Department, Macquarie University, Sydney. &lt;/p&gt; &lt;p&gt; The translation was initiated by Pished Bunnun on 2003-02-14&lt;/p&gt; &lt;hr&gt; &lt;address&gt; Pished Bunnun 2003-02-14 &lt;/address&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-4517126541151417832?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/4517126541151417832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=4517126541151417832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4517126541151417832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4517126541151417832'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/04/rtlinux-linux-1.html' title=''/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-6815102460048493286</id><published>2007-03-07T16:05:00.000Z</published><updated>2007-03-07T16:06:45.415Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu Edgy 6.10+WPN111 USB Wireless.</title><content type='html'>Ubuntu Edgy 6.10+WPN111 USB Wireless.&lt;br /&gt;&lt;br /&gt;ndiswrapper version which's come along with Edgy 6.10 does't work. After installing and setting a wireless up, a computer freeze and we have to unplug USB wireless first before USB wireless can work properly. To solve this just uninstall all ndiswrapper package and download newer version of ndiswrapper(&lt;a title="http://ndiswrapper.sourceforge.net/" href="http://ndiswrapper.sourceforge.net/"&gt;http://ndiswrapper.sourceforge.net/&lt;/a&gt;) i.e. 1.38. Then install ndiswrapper and set a wireless network as usual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-6815102460048493286?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/6815102460048493286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=6815102460048493286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6815102460048493286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/6815102460048493286'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/03/ubuntu-edgy-6.html' title='Ubuntu Edgy 6.10+WPN111 USB Wireless.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-2347008573639589310</id><published>2007-03-05T16:13:00.000Z</published><updated>2007-03-05T16:18:00.954Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Changing a firewire camera mode in OpenCV.</title><content type='html'>Changing a firewire camera mode in OpenCV.&lt;br /&gt;&lt;br /&gt;All mode define in &lt;span style="color: rgb(204, 0, 0);"&gt;libdc1394/dc1394_control.h&lt;/span&gt;&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt;   MODE_160x120_YUV444= 64,&lt;br /&gt;   MODE_320x240_YUV422,&lt;br /&gt;   MODE_640x480_YUV411,&lt;br /&gt;   MODE_640x480_YUV422,&lt;br /&gt;   MODE_640x480_RGB,&lt;br /&gt;   MODE_640x480_MONO,&lt;br /&gt;   MODE_640x480_MONO16&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;We can use cvSetCaptureProperty() to change a firewire camera mode, for example,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;cvSetCaptureProperty&lt;/span&gt;( capture, CV_CAP_PROP_MODE, MODE_320x240_YUV422 );&lt;br /&gt;or&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;cvSetCaptureProperty&lt;/span&gt;( capture, CV_CAP_PROP_MODE, 65 );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-2347008573639589310?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/2347008573639589310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=2347008573639589310' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2347008573639589310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2347008573639589310'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/03/changing-firewire-camera-mode-in-opencv.html' title='Changing a firewire camera mode in OpenCV.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-1463238327589659205</id><published>2007-03-05T16:08:00.000Z</published><updated>2007-06-02T18:55:24.409+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ch'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>ChOpenCV 2.3 with OpenCV 1.0 in Linux</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);"&gt;You do not need to follow the instruction for using Ch and OpenCV 1.0 together cos. there is &lt;a href="http://www.softintegration.com/products/thirdparty/opencv/"&gt;ChOpenCV version 2.5&lt;/a&gt; with is working with OpenCV 1.0.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Installing ChOpenCV 2.3 with OpenCV 1.0 in Linux (Redhat WS 4 and Ubuntu 6.10).&lt;br /&gt;&lt;br /&gt;Download OpenCV from &lt;a title="http://sourceforge.net/projects/opencvlibrary/" href="http://sourceforge.net/projects/opencvlibrary/"&gt;http://sourceforge.net/projects/opencvlibrary/&lt;/a&gt; and install as usual.&lt;br /&gt;&lt;br /&gt;Download ChOpenCV from &lt;a title="http://www.softintegration.com/products/thirdparty/opencv/" href="http://www.softintegration.com/products/thirdparty/opencv/"&gt;http://www.softintegration.com/products/thirdparty/opencv/&lt;/a&gt; and uncompress in to OpenCV build directory.&lt;br /&gt;&lt;br /&gt;Assume OpenCV build directory is opencv-1.0 and copy ChOpenCV source into this directory.&lt;br /&gt;&lt;br /&gt;$cd opencv-1.0&lt;br /&gt;$tar zxvf chopencv-2.3.0.tar.gz&lt;br /&gt;$cd ch&lt;br /&gt;&lt;br /&gt;Create pkgcreate.ch.patch text file which contains&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;161a162&lt;/span&gt; &lt;span style="color: rgb(153, 51, 153);"&gt;&amp;gt; patch cxcore_chdl.c ../cxcore_chdl.c.patch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create cxcore_chdl.c.patch text file which contains&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 204);"&gt;1088c1088&lt;/span&gt; &lt;span style="color: rgb(204, 102, 204);"&gt;&amp;lt;     cvMixChannels(src, src_count, dst, dst_count, from_to, pair_count);&lt;/span&gt; &lt;span style="color: rgb(204, 102, 204);"&gt;---&lt;/span&gt; &lt;span style="color: rgb(204, 102, 204);"&gt;&amp;gt;     cvMixChannels((const CvArr**)src, src_count, dst, dst_count, from_to, pair_count);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$patch pkgcreate.ch pkgcreate.ch.patch&lt;br /&gt;$make&lt;br /&gt;$make install&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-1463238327589659205?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/1463238327589659205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=1463238327589659205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1463238327589659205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1463238327589659205'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/03/installing-chopencv-2.html' title='ChOpenCV 2.3 with OpenCV 1.0 in Linux'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-1773282528118870804</id><published>2007-03-05T15:56:00.000Z</published><updated>2007-03-05T16:19:04.563Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ch'/><title type='text'>Installing Ch by using non-root user.</title><content type='html'>How to install Ch (&lt;a title="http://www.softintegration.com/" href="http://www.softintegration.com/"&gt;http://www.softintegration.com/&lt;/a&gt; ) by using non-root user in Linux.&lt;br /&gt;&lt;br /&gt;If we install Ch by using non-root user, we might be faced a library linking problem. Solving the problem is simply by adding&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;export&lt;/span&gt; LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CHHOME/extern/lib&lt;br /&gt;&lt;br /&gt;into the end of .bashrc or .bash_profile in home directory.&lt;br /&gt;&lt;br /&gt;In case we installed many programs and libraries into non-standard directory, we might be faced both linking and running problem when we run script under ch shell. We have to add library and bin path to ch shell by adding&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;_path&lt;/span&gt; = stradd(_path, "none standard path i.e. /home/xxx/bin:/home/yyy/bin");&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;putenv&lt;/span&gt;("LD_LIBRARY_PATH=none standard + standard library path i.e. /usr/lib:/usr/local/lib:/home/xxx/lib:/home/yyy/lib:$CHHOME/extern/lib")&lt;br /&gt;&lt;br /&gt;into .chrc file in home directory. (We can copy a sample .chrc by using 'ch -d' command.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-1773282528118870804?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/1773282528118870804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=1773282528118870804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1773282528118870804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/1773282528118870804'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/03/how-to-install-ch-httpwww.html' title='Installing Ch by using non-root user.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-3918021445505108398</id><published>2007-01-14T03:02:00.000Z</published><updated>2007-01-14T03:10:04.785Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gtk'/><title type='text'>Change to full screen mode in Gtkmm</title><content type='html'>Change Gtk::Window to full screen mode by calling &lt;span style="color: rgb(51, 51, 255);"&gt;fullscreen()&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255); color: rgb(51, 51, 255);"&gt;&lt;/span&gt; and change it back to normal mode by calling &lt;span style="color: rgb(51, 51, 255);"&gt;unfullscreen()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/span&gt;. It works since version 2.2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-3918021445505108398?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/3918021445505108398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=3918021445505108398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3918021445505108398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3918021445505108398'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2007/01/change-gtkwindow-to-full-screen-mode-by_14.html' title='Change to full screen mode in Gtkmm'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-2686610980676232448</id><published>2006-12-30T00:46:00.000Z</published><updated>2006-12-30T01:24:41.992Z</updated><title type='text'>How to record a screen into swf video file.</title><content type='html'>Look into &lt;a href="http://www.unixuser.org/%7Eeuske/vnc2swf/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://www.unixuser.org/~euske&lt;wbr&gt;/&lt;span id="st" name="st" class="st"&gt;vnc2swf&lt;/span&gt;/&lt;/a&gt;. Python version works well in Ubunto without compilation and it can include sound with video file, I haven't test it yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-2686610980676232448?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/2686610980676232448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=2686610980676232448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2686610980676232448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2686610980676232448'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/12/how-to-generate-swf-video-file.html' title='How to record a screen into swf video file.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-2309331537881857346</id><published>2006-12-10T01:50:00.000Z</published><updated>2007-07-07T20:01:23.239+01:00</updated><title type='text'>Call to Thailand with VOIP.</title><content type='html'>Calling to Thailand via &lt;a href="http://www.voipdiscount.com/"&gt;www.voipdiscount.com&lt;/a&gt; is dirt cheap. We can use Twinkle in Ubuntu Edgy with G.711 codec instead of the provider's program. (Ekiga's not work cos it doesn't support required codecs.)&lt;br /&gt;&lt;br /&gt;The method above works very well in Ubuntu 6.10 but when I upgraded it to Ubuntu 7.04 , Twinkle doesn't work properly. Instead of using Twinkle, I'm now happy with a free softphone from &lt;a href="http://www.sjlabs.com/sjp.html"&gt;http://www.sjlabs.com/sjp.html&lt;/a&gt;. Even it's display font is quite ugly, it does work out of a box. Do not have any problem with a sound setting, give a acceptable sound quality, and a simple address book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-2309331537881857346?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/2309331537881857346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=2309331537881857346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2309331537881857346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/2309331537881857346'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/12/call-to-thailand-with-voip.html' title='Call to Thailand with VOIP.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-4765127476559538215</id><published>2006-11-26T18:19:00.000Z</published><updated>2006-12-10T02:05:07.334Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>How to compile a custom kernel on Ubuntu Edgy for my R50e.</title><content type='html'>Install necessary program for compiling a custom kernel.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo aptitude install fakeroot bzip2 kernel-package initramfs-tools linux-source&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After installing them all.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ cd /usr/src&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo tar jxf linux-source-2.6.17.tar.bz2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ cd /usr/src/linux-source-2.6.17&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo cp /boot/config-$(uname -r) .config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo make oldconfig&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo make gconfig --or-- make xconfig --or-- make menuconfig&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Remove all unnecessary modules/function from the kernel to improve computer speed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo fakeroot make-kpkg clean&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo fakeroot make-kpkg --append-to-version "-r50e" --revision "261106" --us --uc --initrd kernel_image kernel_headers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After successful compiling, they should have linux-headers-2.6.17.13-r50e_2.6.17.13-r50e-261106_i386.deb  and&lt;br /&gt;linux-image-2.6.17.13-r50e_2.6.17.13-r50e-261106_i386.deb.&lt;br /&gt;&lt;br /&gt;Installing the custom kernel by&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo dpkg -i linux-image-2.6.17.13-r50e_2.6.17.13-r50e-261106_i386.deb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prepare a firmware for ipw2200 (and others) by&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo cp -R /lib/firmware/$(uname -r) /lib/firmware/2.6.17.13-r50e&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now it's time to reboot the computer with the custom kernel.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.bris.ac.uk/home/pbunnun/PublicFiles/kernel-config-r50e"&gt;kernel-config-r50e&lt;/a&gt; is my kernel configuration file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-4765127476559538215?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/4765127476559538215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=4765127476559538215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4765127476559538215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4765127476559538215'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/how-to-compile-custom-kernel-on-ubuntu_26.html' title='How to compile a custom kernel on Ubuntu Edgy for my R50e.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-7521565849938928051</id><published>2006-11-26T01:19:00.001Z</published><updated>2007-02-02T14:13:54.934Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='RTAI'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>RTAI 3.4 + Ubuntu Edgy</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Get a kernel source linux-2.6.17.tar.bz2 from www.kernel.org and rtai-3.4.tar.bz2 from www.rtai.org. Assume both of them are in /usr/src directory.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ cd /usr/src&lt;br /&gt;$ sudo tar jxf rtai-3.4.tar.bz2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo tar linux-2.6.17.tar.bz2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ cd linux-2.6.17&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo patch -p1  &lt;../rtai-3.4/base/arch/i386/patches/hal-linux-2.6.17-i386-1.3-08.patch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then following the procedure in How to compile .... except&lt;br /&gt;&lt;br /&gt;1. Selecting the following kernel configuration options&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Disable "Module versioning support" under "Loadable module support".&lt;/li&gt;&lt;li&gt;Enable "Interrupt pipeline" under "Processor type and features".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Disable "Use register arguments" under "Processor type and features".&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &lt;/span&gt;2. Editing Makefile a little bit to make sure we will get smooth compiling without any error. Change Makefile from the line &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;CC = $(CROSS_COMPILE)gcc &lt;/span&gt;to &lt;span style="color: rgb(255, 0, 0);"&gt;CC = $(CROSS_COMPILE)gcc-3.4 &lt;/span&gt;&lt;br /&gt;before running&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo fakeroot make-kpkg --append-to-version "-rtai3.4" --revision "261106" --us --uc --initrd kernel_image kernel_headers&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Then reboot your computer with the new kernel.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo mkdir rtai-build&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ cd rtai-build&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo make -f ../rtai-3.4/makefile srctree=../rtai-3.4 gconfig&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After configuring RTAI, edit ../rtai-3.4/makefile by changing &lt;span style="color: rgb(255, 0, 0);"&gt;CC=gcc&lt;/span&gt; to &lt;span style="color: rgb(255, 0, 0);"&gt;CC=gcc-3.4&lt;/span&gt; in the second line and replace rtai-3.4/base/include/rtai_posix.h by rtai_posix.h from&lt;br /&gt;&lt;a href="http://cvs.gna.org/cvsweb/vulcano/base/include/rtai_posix.h?rev=1.19;content-type=text%2Fplain;cvsroot=rtai"&gt;http://cvs.gna.org/cvsweb/vulcano/base/include/rtai_posix.h?rev=1.19;content-type=text%2Fplain;cvsroot=rtai&lt;/a&gt;&lt;br /&gt;because rtai_posix.h coming with rtai-3.4.tar.bz2 conflicts  with  /usr/include/pthread.h.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo make&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For making device file in /dev for share memory and fifos application, run&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;sudo mknod -m 666 /lib/udev/devices/rtai_shm c 10 254&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;$ sudo for n in `seq 0 9`; do f=/lib/udev/devices/rtf$n; mknod -m 666 $f c 150 $n;done;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It will generate /dev/rtai_shm and /dev/rtf* after you reboot your computer.&lt;br /&gt;&lt;br /&gt;Checking RTAI by running programs in /usr/realtime/testsuit.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-7521565849938928051?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/7521565849938928051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=7521565849938928051' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7521565849938928051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7521565849938928051'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/how-to-compile-custom-kernel-on-ubuntu.html' title='RTAI 3.4 + Ubuntu Edgy'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-7559513249585982415</id><published>2006-11-18T03:17:00.000Z</published><updated>2006-11-21T12:50:31.695Z</updated><title type='text'>Oh! filenames and variables. I've changed my mind.</title><content type='html'>Replace "OLDword" in all files including in subdirectory by "NEWword".&lt;br /&gt;$find -type f|xargs sed -i 's/OLDword/NEWword/g'&lt;br /&gt;&lt;br /&gt;Delete all directory with "DirectoryName" including in subdirectory.&lt;br /&gt;$find -name DirectoryName -type d|xargs rm -fr&lt;br /&gt;&lt;br /&gt;Bash script below is used to change all filenames including in subdirectory containing *$original* to filenames containing *$replace* .&lt;br /&gt;&lt;br /&gt;$chfilename before after&lt;br /&gt;#!/bin/sh&lt;br /&gt;#chfilename.sh&lt;br /&gt;IN=INtxt&lt;br /&gt;original=$1&lt;br /&gt;replace=$2&lt;br /&gt;find -name "*$original*" -type f &gt; $IN&lt;br /&gt;while read infilename&lt;br /&gt;do&lt;br /&gt; src=$infilename&lt;br /&gt; tgt=$(echo $infilename | sed -e "s/$original/$replace/")&lt;br /&gt; mv $src $tgt&lt;br /&gt;done &lt; $IN&lt;br /&gt;rm -f $IN&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-7559513249585982415?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/7559513249585982415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=7559513249585982415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7559513249585982415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/7559513249585982415'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/very-useful-linux-command-line-and-bash.html' title='Oh! filenames and variables. I&apos;ve changed my mind.'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-3265102401196388338</id><published>2006-11-17T12:54:00.000Z</published><updated>2006-11-17T13:06:52.329Z</updated><title type='text'>Stronger file protection than zip/unzip</title><content type='html'>Using GnuPG to protect a file is a stronger file protection than zip/unzip with password.&lt;br /&gt;&lt;br /&gt;Generating our own keys by running $gpg --gen-key. It will generate .gnupg in home directory with key files inside.&lt;br /&gt;$gpg -e filename --&gt; it will generate filename.gpg and if someone wanna get filename back, one must have the keys and the password.&lt;br /&gt;$gpg -s -e filename --&gt; it will generate filename.gpg like above command but including a signature to the output.&lt;br /&gt;$gpg filename.gpg --&gt; decrypt filename.gpg to filename.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-3265102401196388338?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/3265102401196388338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=3265102401196388338' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3265102401196388338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3265102401196388338'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/stronger-file-protection-than-zipunzip.html' title='Stronger file protection than zip/unzip'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-5251028034190788225</id><published>2006-11-17T12:44:00.000Z</published><updated>2006-11-17T13:11:49.657Z</updated><title type='text'>screen - screen manager with VT100/ANSI terminal emulation</title><content type='html'>It's very useful when working at home and work place with the same sever.&lt;br /&gt;In work place after ssh to the server, run $screen and then press Ctr-a+c to create a terminal. Changing to others terminal by pressing Ctr-a+n or Ctr-a+p or Ctr-a Ctr-a or Ctr-a "number of terminal".&lt;br /&gt;&lt;br /&gt;At home, ssh to the server and resume the screen by $screen -d -r.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://www.debianclub.com/node/22"&gt;http://www.debianclub.com/node/22&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mm.co.th/poonlap/node/251"&gt;http://mm.co.th/poonlap/node/251&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-5251028034190788225?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/5251028034190788225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=5251028034190788225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5251028034190788225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/5251028034190788225'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/screen-screen-manager-with-vt100ansi.html' title='screen - screen manager with VT100/ANSI terminal emulation'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-8731816918591776269</id><published>2006-11-13T16:07:00.000Z</published><updated>2006-11-13T16:12:05.553Z</updated><title type='text'>GSpace and Zip</title><content type='html'>Using GSpace extension in Firefox to backup files in gamil account is very interesting option. We've got more than 2.7 GB space for one gmail account.&lt;br /&gt;&lt;br /&gt;Using zip/unzip with password protection is very easy. For example, if we wanna compress directory XXX-directory and use password protection, we can use&lt;br /&gt;zip -r XXX-filename.zip XXX-directory -e&lt;br /&gt;.&lt;br /&gt;Zip will ask us to type a password.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-8731816918591776269?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/8731816918591776269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=8731816918591776269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/8731816918591776269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/8731816918591776269'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/gspace-and-zip.html' title='GSpace and Zip'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-4797573332147233337</id><published>2006-11-01T11:44:00.000Z</published><updated>2006-11-01T11:47:34.101Z</updated><title type='text'>Eclipse's shortcut</title><content type='html'>Ctrl+PgUp/PgDown : used to switch left and right between tabs.&lt;br /&gt;Ctrl+F6          : switched between the files opened in the editor's tab.&lt;br /&gt;Ctrl+SpaceBar    : complete typing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-4797573332147233337?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/4797573332147233337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=4797573332147233337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4797573332147233337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4797573332147233337'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/11/eclipses-shortcut.html' title='Eclipse&apos;s shortcut'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-9142066071585679331</id><published>2006-10-28T18:50:00.000+01:00</published><updated>2006-11-17T12:52:37.443Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>No sound in Ubuntu Edgy (IBM R50e)</title><content type='html'>The solution is here &lt;a href="http://www.ubuntux.org/no-sound-on-ubuntu-dapper"&gt;http://www.ubuntux.org/no-sound-on-ubuntu-dapper&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-9142066071585679331?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/9142066071585679331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=9142066071585679331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/9142066071585679331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/9142066071585679331'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/10/no-sound-in-ubuntu-edgy-ibm-r50e.html' title='No sound in Ubuntu Edgy (IBM R50e)'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-3512734184765475545</id><published>2006-10-27T23:56:00.000+01:00</published><updated>2006-11-18T16:36:34.251Z</updated><title type='text'>Cool pictures</title><content type='html'>&lt;div style="text-align:center;width:194px;font-family:arial,sans-serif;font-size:83%"&gt;&lt;div style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/pished.bunnun/FriendsOfMine"&gt;&lt;img src="http://lh5.google.com/image/pished.bunnun/RUKODiqFABE/AAAAAAAAABM/ChVHlRnAPpE/s160-c/FriendsOfMine.jpg" width="160" height="160" style="border:none;padding:0px;margin-top:16px;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://picasaweb.google.com/pished.bunnun/FriendsOfMine"&gt;&lt;div style="color:#4D4D4D;font-weight:bold;text-decoration:none;"&gt;Friends of mine&lt;/div&gt;&lt;/a&gt;&lt;div style="color:#808080"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-3512734184765475545?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/3512734184765475545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=3512734184765475545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3512734184765475545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/3512734184765475545'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/10/cool-pictures.html' title='Cool pictures'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-4312213549357148349</id><published>2006-10-16T01:42:00.000+01:00</published><updated>2006-10-16T01:48:50.120+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>OpenOffice.org in Ubuntu 6.06</title><content type='html'>If you want to use Thai feature in OpenOffice.org 2.0, click Tools-&gt;Options and select  Language Settings -&gt; Language Tab . Choose Thai for CTL as in the image below.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/289/4192/1600/OOo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/289/4192/400/OOo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-4312213549357148349?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/4312213549357148349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=4312213549357148349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4312213549357148349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/4312213549357148349'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/10/openofficeorg-in-ubuntu-606.html' title='OpenOffice.org in Ubuntu 6.06'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-115918980367934655</id><published>2006-09-25T14:06:00.000+01:00</published><updated>2006-11-22T18:54:42.117Z</updated><title type='text'>Do not move /var directory ...?</title><content type='html'>Do not move /var directory into another partition and make a link to it cos Gnome Desktop will be delay for a long time before starting a GUI screen.&lt;br /&gt;&lt;br /&gt;When /var is moved to another partition, lo ( locale network ) will not start correctly and affect to Gnome Desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-115918980367934655?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/115918980367934655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=115918980367934655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/115918980367934655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/115918980367934655'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/09/do-not-move-var-directory.html' title='Do not move /var directory ...?'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34341153.post-115816040265473451</id><published>2006-09-13T16:11:00.000+01:00</published><updated>2006-10-16T01:40:03.246+01:00</updated><title type='text'>Start date on Blogger</title><content type='html'>Today is Wednesday, 13 September 2006.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34341153-115816040265473451?l=pbunnun.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pbunnun.blogspot.com/feeds/115816040265473451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34341153&amp;postID=115816040265473451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/115816040265473451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34341153/posts/default/115816040265473451'/><link rel='alternate' type='text/html' href='http://pbunnun.blogspot.com/2006/09/start-date-on-blogger.html' title='Start date on Blogger'/><author><name>pbunnun</name><uri>http://www.blogger.com/profile/16136335171042355773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
