Skip to content

เบื้องหลัง Senior Project ของผม [ภาค"พยายาม"จบ]

April 6, 2009

ทบทวนกันหน่อยครับ ตอนนี้พวกผมสามารถเขียนโปรแกรมลงบนบอร์ด Robostix ทำให้ไฟวิ่งได้แล้ว และเรียนรู้เรื่องการเขียน Driver คร่าวๆ ณ ตอนนั้น คือช่วงวันที่ 26 ธ.ค. ครับ โดยกำหนดส่งรายงานฉบับสมบูรณ์คือ 21 ม.ค. !! นั่นคือเวลาเหลือน้อยลงทุกที

เข้าช่วงปีใหม่ พวกผมก็ขอแยกย้ายไปเที่ยวกับครอบครัวและกลับมาทำต่อหลังปีใหม่ครับ ช่วงปีใหม่นั้นเอง ที่ chip ที่สั่งไว้มาส่งถึงบ้านผม รวมทั้งหนังสือที่สั่งไป มาถึงไปรษณีย์แถวบ้าน (และมารู้ภายหลังว่า มันมาตกค้างที่ไปรษณีย์นานแล้ว)

หลังปีใหม่ พวกผมทำงานกันต่อครับ หลังจากที่ทำไฟวิ่งได้ ผมก็ตระหนักว่า นี่พวกเราต้อง debug โปรแกรมบน Robostix ด้วย ไฟ LED เพียง 3 ดวงงั้นเหรอ (ในหัวตอนนั้นคิดวิธีแปลกๆออกมาเต็มไปหมด)? ทำยังไง จะให้ใช้ printf พิมพ์ข้อมูลออก console ของ HyperTeminal ได้ เหมือนใน Lab PIC?? ก็หาๆๆ จนเจอวิธีครับ ซึ่งมันต้องทำวงจรเล็กๆที่ใช้ชิพ Max232 เป็นตัวช่วย วงจรนี้มีแจกบนเน็ตครับ และก็เป็นฝีมือคุณเอก ที่เผอิญมีอุปกรณ์ และชิพพร้อมสรรพ อยุ่ที่บ้าน (มันเคยคิดจะต่อใช้เองมาแล้ว)? บัดกรีต่อมาให้ และเอาไปจิ้มๆบนบอร์ด เทสต์ และมัน Work!!!

ช่วงเวลาเดียวกัน ก็หาวิธี เขียนโปรแกรมควบคุม 0/1 ขาต่างๆ เพื่อคุยกับ ฮาร์ดดิสก์ตามมาตรฐาน ATA ที่ไอเอกเข้าใจระดับนึงแล้ว และโชคดีไปเจอ Library ครับ ชื่อ Procyon AVRlib ครับ เป็นไลบรารีสำหรับ micro ตระกูลนี้ และทำสำคัญ มันมีไลบรารี เกี่ยวกับต่อต่อ IDE/ATA ด้วย!!!? ผมก็โหลดมาอ่านๆ แกะๆ และดึงเฉพาะส่วนที่ต้องใช้ออกมา เอาไปรวมในโปรเจค และให้เอกทดลองดู

บนมาตรฐาน IDE/ATA กลไกง่ายๆ จะเป็นการ ส่งคำสั่งไปเก็บไว้บน register บน ฮาร์ดดิสก์ครับ แล้วก็รอผลลัพธ์ครับ(เอาละเอียดกว่านี้ต้องถามเอก) โดยคำสั่งพวกผมใช้ คือคำสั่ง หลักๆ 3 คำสั่งครับ (จริงๆมีเยอะกว่านี้มาก แต่ optional ก็เยอะ)

  • IDENTIFY DEVICE เป็นคำสั่ง ขอค่าเฉพาะต่างๆ บน harddisk เช่นพวก ขนาดเท่าไหร่ blocksize เท่าไหร่ model รุ่นอะไร บลาๆ ครับ
  • READ SECTOR เป็นคำสั่ง อ่านข้อมูล 1 sector (โดยทั่วไปขนาด 512 bytes)
  • WRITE SECTOR เป็นคำสั่ง เขียนข้อมูล 1 sector (ดดยทั่วไปขนาด 512 bytes)

ให้ไอเอกลองครับ แต่ผมกับสร้อยก็อยุ่ข้างๆอะนะ บวกกับต่อวงจร printf เข้าไปด้วยเลยเพื่อดูค่า ที่ดึงมาได้ จาก IDENTIFY DEVICE แล้วมันก็ทำงานได้อย่างน่ามหัศจรรย์ครับ!

All circuits

รูปอุปกรณ์และวงจรทั้งหมดตอนทดลอง (รุงรังพอสมควร)

หลังจากนั้นก็ลองพวกคำสั่ง read/write ดูครับ ก็ทำงานได้ ลองอ่าน partition table ออกมา ลองพยายามแก้ขนาด partition อะไรแบบนี้ครับ ตรงนี้เป็นอีก checkpoint ที่ รู้สึกดี ทดลองเสร็จ ก็ส่งเมล์รูปด้านบน ไปรายงานอ.เกริก ทันที

ตอนนี้ก็เหลือ ภาพกว้างๆคือ เขียน driver บน gumstix ให้ mount ได้ โดยภายใน driver จะไปทำการ รับ/ส่ง ข้อมุลผ่าน I2C bus ไปหา Robostix ไปรับ/ส่ง คำสั่งและข้อมูลกับ harddisk ที่ทำได้แล้วด้านบน อีกที? จริงๆกว่าจะได้ภาพกว้างๆ อย่างที่ว่าก็ ถกเถียง หาข้อมุลและทดลองอยู่หลายวันทีเดียว และเวลาก็ใกล้เข้ามาทุกทีๆ

การทำงานช่วงเวลานั้นบนชั้น 20 ก็สนุกสนานผสมเครียดครับ เป็นแบบนี้ วนๆ ไปทุกวัน จะเริ่มงานประมาณ 10-11 โมงแล้วแต่ ทำไปนิดหน่อยหรือไม่ได้ทำเลยแล้วก็จะลงไปกินข้าวเที่ยงกับเพื่อนๆ กลุ่มอื่นๆ ที่มาทำบนชั้น 20 เหมือนกัน แล้วก็กลับมาทำกันต่อช่วงบ่าย ทำจนถึง ช่วง หกโมงลงไปกินข้าวอักษร แล้วก็ขึ้นมาทำถึง 2 ทุ่มแล้วก็กลับบ้าน? ทำไปก็นั่งคุยไป เพื่อนประสบชะตากรรมเดียวกันเต็มไปหมด บรรยากาศดีทีเดียว ทำอะไรสำเร็จซักอย่าง หยุดพักและเล่นเกมส์ ช่วงนั้น Red alert2 เป็นที่นิยมมาก 😛

เรื่องของเขียน driver เป็นหน้าที่หลักของผมครับ ผมก็เริ่มอ่านหนังสือที่ได้รับมา และก็ทำไปแก้ปัญหาไปเรื่อยๆ โดยใช้ชีวิตตามย่อหน้าบน

เริ่มแรกคือ ทำยังไงถึงจะติดต่อ ผ่าน I2C bus ส่งอะไรซักอย่างไปมาระหว่าง Gumstix และ Robostix ได้ ก็หาข้อมูล ทดลอง และแก้ปัญหาครับ เจอปัญหามากมาย ตอนแรกลองส่ง I2C bus ในระดับ application ครับ อันนี้ใช้ ioctl ทำได้ไม่ยาก เหมือนเปิดอ่าน/เขียน file เลย ตรงนี้ทำให้ได้เทสต์โค้ดการรับ/ส่ง I2C บน Robostix ที่เอกดูและอยุ่ด้วย? จากนั้นผมก็ต้องมาลอง I2C ในระดับ driver ครับ ซึ่งมันต่างจากระดับ application ค่อนข้างมาก? สิ่งที่ทำคือ ต้องให้ driver ของผม ไปเรียก i2c driver (ซึ่งตาม architecture แล้วอยู่ระดับเดียวกัน) ขึ้นมาทำงานครับ เหมือน ไดร์เวอร์ผม “ขี่” i2c driver อีกที (stack up)? กว่าจะทำได้ ก็เล่นเอาเหนื่อยครับ? ทำได้ก็ดีใจ และเล่น 1 เกมส์

จากนั้น ก็มาเริ่มเขียน driver อย่างจริงจัง สำหรับ การเขียน block device driver นั้น นอกจาก เรื่องจุกจิกพวกการ register driver ของตัวเองเข้าสู่ระบบแล้ว สิ่งที่สำคัญและเป็นตัวหลักของ driver ชนิด block device คือ Request function ครับ

โดยหลักการคือ function นึง ที่ถูกเรียกให้ทำงานโดย filesystem? ทำหน้าที่รับ request queue มาดำเนินการ ซึ่ง request queue ภายในจะประกอบด้วย ก้อน request ที่ระบุหมายเลข sector ที่ต้องการอ่าน/เขียน และ address สำหรับเก็บข้อมุลที่อ่านมาหรือสำหรับอ่านข้อมูลเพื่อเอาไปเก็บใน harddisk โดย ก้อน request ในคิวจะถูกเรียง ให้เหมาะสมกับการหมุนของฮาร์ดดิสก์ด้วย (สามารถ override ตรงนี้ได้ สำหรับ storage พิเศษ แต่ของพวกผม เรื่องอะไรจะแก้ล่ะ)? ตัว request function นี้เป็นตัวกำหนด ประสิทธิภาพของ driver เลยล่ะครับ

นอกจากนี้ ก่อนที่ request function นี้จะถูกเรียก ระบบจะทำการ locking ให้เรียบร้อย เพื่อกำจัดปัญหา concurrency ให้เลย ไม่ต้องกังวลอีก นั่นคือฟังก์ชั่นนี้จะถูกเรียกและต้องทำงานจนจบถึงจะมีคนอื่นมาเรียกฟังก์ชันนี้ได้? ดูเหมือนดีนะครับ แต่ตรงนี้ก่อปัญหาให้ผมพอสมควรเลย เพราะ พอเอาเรื่อง รับ/ส่ง I2C มา ใส่ไว้ใน ฟังก์ชันนี้ ในตัว I2C driver มีการทำ sleep เกิดขึ้น (เพราะรอข้อมูลจาก robostix ส่งกลับมา) ทำให้ kernel เกิด panic เพระา kernel กลัวว่า จะไม่มีการตื่น พอไม่มีการตื่น ทำให้ request function จบการทำงานไม่ได้ ค้างเติ่งไว้ และก็ทำให้คนอื่นเรียก request function ไม่ได้อีก แล้วระบบ ก็เจ๊ง ….. (kernel มันเลย ตัดจบการทำงาน request function อย่างเร้ว ทั้งที่ผมยังรอข้อมุลจากฮาร์ดดิสก์อยู่เลย)

วิธีแก้คือ ดังรูปครับ ไปใช้งานกลไก? Workqueue ใน kernel (คล้ายๆ thread ระดับ kernel) โดยโยนงานที่ต้องทำ เอาเข้าคิวไปให้ workqueue ทำงานให้แทน ? และ workqueue ก้ค่อยๆ ทยอยๆทำจนเสร็จ ส่วนผมก็จะจบ request function อย่างรวดเร็ว

วาดเองเลยนะเนี่ย

วาดเองเลยนะเนี่ย

นั่นล่ะครับ จากนั้นก็เจอปัญหาเรื่อง Big Endian/Little Endian ไป 1 ที งงเป็นวัน เพราะ อ่านข้อมูล sector 0 ได้ แต่ sector อื่นๆไม่ได้ งงมาก จน ลองเอา calculator มาแปลง address เป็น binary ดู จึง อ๋อออ? เป็นปัญหาอีกอันนึงที่ประทับใจ (ได้ยินมานาน ไม่เคยเจอกะตัว)

ช่วงหลังๆ ผมจะบอกเพื่อนบนชั้น 20 ว่า ปัญหาสุดท้ายและๆๆๆ จะเสร็จและๆๆๆ แต่สุดท้ายไม่เสร็จซักทีครับ จนมี “ปัญหาสุดท้ายตัวที่ 5” คือนึกว่าแก้นี่ได้ ก็น่าจะทำงานได้แล้ว เพราะตามคอนเซปต์ไม่น่าจะมีอะไรแล้ว แต่ก็เกิด เซอร์ไพรส์ได้ทุกทีเช่น mount ได้แล้ว (อีกหนึ่ง checkpoint ที่ดีใจสุดๆ) กับเห็น directory เป็นภาษาบ้าบอ และค้างไปเลย บลาๆ ก็แก้ไปเรื่อยๆครับ เจอปัญหาวันนี้ตอนบ่าย ก็จะแก้ได้ในบ่ายวันถัดไป แล้วก็เจอปัญหาใหม่ทันที เวลาก้น้อยลงทุกทีครับ เครียดพอสมควรว่าทำไมไม่เสร็จซํกที

สุดท้าย mount ได้ copy file ได้ อ่าน/เขียน ได้ โอ้วววววววว เสร็จแลววววววว ดีใจมาก แม้จะประสิทธิภาพต่ำมากก็ตาม (แต่พอจะเดาได้ว่าทำไมมันช้า) ดีใจมากครับ ตอนนั้นเหลืออีกประมาณ 2 วัน แล้วก็ไปลองต่อกับ samba ตั้ง folder ให้แชร์โฟลเดอร์บนฮาร์ดดิสก์ไว้ ปรากฏว่า….

โฟลเดอร์เปล่า....(และเข้าไปได้เรื่อยๆ)

โฟลเดอร์เปล่า....(และเข้าไปได้เรื่อยๆ)

หึหึ งง ขอรับ ก็พยายามแก้อยุ่หลายวันมาก จนต้องส่ง รายงานฉบับแรกไปให้อาจารย์ก่อน โดยแนบไปบอกว่า ยังทำส่วนนี้ไม่ได้ สุดท้ายก็ไปปรึกษาอ.เกริก อาจารย์ฟังปัญหาทางโทรศัพท์และตอบกลับมาในทันใดว่า น่าจะเป็นเรื่อง encoding นะ ลองไปหาโค้ดอ่านดู อืมมมม ไวมาก

ก็ลองมุ่งเป้าไปที่เรื่องนี้ครับผม และสุดท้ายก็แก้ปัญหาด้วยการอัพเกรด เป็น samba 3 ที่ และใช้งานได้สำเร็จ…. จบงาน…..

ที่เหลือนั้น ก็ทำตาม step ทั่วไปครับ ทำโปสเตอร์และก็สอบพรีเซนท์ ซึ่งผ่านไปได้ ไม่มีปัญหาอะไร ตอนที่เอกกับสร้อยไปโชว์งานหลังจากทำเสร็จทั้งหมดกับอ.เกริก (ผมนอนโรงพยาบาลอยู่) อ. ก็บอกว่า ดี ไม่มีปัญหาอะไร วิธีการตรงไปตรงมาดี แล้วก็บอกว่า “ตอนแรก ถ้าพวกคุณทำ SATA ได้นี่ ผมให้โทไปเลย” o_O!

ช่วงระหว่างที่ทำงานทั้งหมดนี ก็มีไปสัมภาษณ์งานหลายที่ครับ และเค้าก็มักจะถามว่าทำ senior project อะไร ผมก็อธิบายไปครับ ทุกๆที่ คนสัมภาษณ์ดู ไม่ค่อยสนใจเท่าที่ควร และจะถามคำถามสุดท้ายเหมือนกันคือ แล้วมันมีประโยชน์อะไร มันมีอยุ่แล้วไม่ใช่เหรอ? ผมอาจจะอธิบายไม่ดีเองล่ะมั้ง มีบ.ซอฟต์แวร์แห่งหนึ่ง ผมเริ่มพูดคำว่า embedded system ออกมา สายตาเค้าก็เปลี่ยนไปครับ 555+ และอีกหลายๆที่ก็คล้ายๆกัน ไอเอกที่อยุ่กลุ่มเดียวกันก็มีเจอเหมือนกัน ช่วยไม่ได้ครับผม

แต่พองานเสร็จ ดูสิ่งที่ตัวเองและเพื่อนในกลุ่มทำมา ค้นคว้า และแก้ปัญหามาทั้งหมด ก้รู้สึกสะใจดี ได้ทำอะไรเยอะมาก และบรรลุจุดประสงค์ที่ตั้งไว้ตอนแรกว่า อยากทำอะไรที่ไม่เคยทำมาก่อน? และพองานสำเร็จ ก็เพิ่มความมั่นใจให้ตัวเอง และเพิ่มความคิดที่ว่า “เราสามารถทำอะไรก็ได้ ถ้ามีแรงและเวลา” เข้าไปอีก

5 นิ้วนี่คือคิดว่าจะจะต้อง 5 ปี ซะแล้ว แต่สุดท้ายทำไม่ได้สำเร็จ :P

5 นิ้วนี่คือคิดว่าจะจะต้อง 5 ปี ซะแล้ว แต่สุดท้ายทำไม่สำเร็จ 😛

ขอบคุณ เอกกะสร้อยที่มาช่วยทำโปรเจคนี้ด้วยกัน มาแบ่งปันความเครียดๆ เสี่ยงๆ เสียวๆว่าจะจบ 4 ปีรึเปล่า ด้วยกัน 😛
ขอบคุณ อ.เกริก ที่ให้โอกาสทำงานชิ้นนี้ ให้คำปรึกษาดีๆ และไม่มากจนเกินไป ชอบที่อาจารย์บอกครั้งแรกๆว่า “ถ้าผมแนะคุณมาก มันก็ไม่ใช่ซีเนียร์โปรเจคของคุณสิ” ขอบคุณครับผม
ขอบคุณเพื่อนๆกลุ่มอื่นๆที่มานั่งทำ โปรเจคบนชั้น 20 ด้วยกัน ลดความเครียดได้มากสมควร เล่นเกมส์ด้วยกัน ไปกินข้าวเที่ยง/เย็น ด้วยกัน
ขอบคุณ internet และ คนหลายๆคน ที่โพสข้อมุล คำถาม/คำตอบ และความรุ้มากมาย ให้ได้อ่านค้นคว้า และหลงทาง

จบปีสี่แล้วววว…. 😀

Advertisements

From → diary

7 Comments
  1. Rutz permalink

    เป็นซีเนียร์โปรเจ็คที่ดูทรหดเอาเรื่องเลยนะคับเนี่ย!!!

    ^^

  2. ยินดีด้วย เป็นซีรีส์ที่สนุกชะมัด

    คราวหน้าทำซีเนียร์โปรเจคต์อีกนะ จะได้มีเรื่องสนุกๆ มาเขียน 555555

  3. ????????????????? soy?
    ???????????

    อ่านแล้วรู้สึกดีจัง 🙂
    ขอบใจนะนาย
    ไว้มาเล่นเกมส์กันอีกดีกว่า 555

  4. ไม่รุเรื่องซักเท่าไรแต่ ว่าน่าสนใจดีอาจะเป็นเพราะภาพประกอบแล้วก็จังหวะและลักษณะการเล่ามั้ง ฮิฮิ

  5. wutthanat permalink

    สวัสดีครับ

    ทำโปรเจคคล้ายๆกันอยู่ครับ ขอโค้ดได้ไหมครับ

Trackbacks & Pingbacks

  1. ชีวิตในปีที่ 23 ทำอะไรไปและมีอะไรต้องทำ « Teerapap Blog

Leave a Reply to planaruk Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: