C18 - Storage Class
วันที่โพสต์: Jan 11, 2011 2:45:4 PM
C18 - Storage Class
Storage class ของตัวแปร เป็นสิ่งที่ใช้ในการบอกให้ Compiler รู้ว่าจะต้องจัดเก็บตัวแปรที่ตามหลังมาอย่างไร ซึ่งมีผลถึง
การคงอยู่ของข้อมูลของตัวแปรนั้น ๆ เช่น อยู่ตลอดเวลาหรืออยู่เฉพาะบางเวลา
ขอบเขตของการอ้างถึงหรือมองเห็นของตัวแปรนั้น ๆ ว่าสามารถจะเรียกใช้ได้ที่ใดได้บ้าง และโดย functions ใดได้บ้าง
ทำไมต้องมี Storage class ???
เนื่องจากภาษาซีเอื้ออำนวยให้สามารถเขียนโปรแกรมและคอมไพล์เป็นส่วนย่อย ๆ ก่อนที่จะนำมาลิงค์เป็นโปรแกรมใหญ่ ภาษาซียอมให้ตั้งชื่อตัวแปรซ้ำกันได้ในต่างฟังก์ชัน ดังนั้นส่วน storage class จะช่วยให้ compiler รู้ว่าควรจะจัดการกับตัวแปรต่าง ๆ อย่างไรจึงจะตรงกับความต้องการในการใช้งานของโปรแกรมเมอร์และหลีกเลี่ยงความผิดพลาดต่าง ๆ ที่อาจเกิดขึ้นได้
ใน C18 complier ของ MPLAB รองรับ ANSI standard storage classes ตัวแปร เช่นกัน ได้แก่ auto , extern, register, static และ typedef ซึ่งแต่ละคำ มาจากคำว่า
auto ย่อมาจาก automatic
extern ย่อมาจาก external
static
register
รูปแบบการใช้ ตัวแปร Storage Class
ตัวบ่งบอกStorage_Class ชนิดตัวแปร ตัวแปร
ตัวแปรแบบ Automatic
โดยปกติ ตัวแปรที่ประกาศภายใน function จะเป็นตัวแปร automatic ทุกตัว ไม่เว้นกระทั่งภายใน function main() เมื่อ function ทำงานสิ้นสุดลง ตัวแปรภายใน function ก็จะหมดหน้าที่ลง ถูกทำลายไปโดยอัตโนมัติ หรือที่เราเรียกว่า ตัวแปรแบบ local นั่นแหละ เราสามารถประกาศตัวแปร พวกนี้ โดยใส่คำว่า auto นำหน้าตัวแปร หรือไม่้ใส่ก็ได้ ซึ่งการประกาศตัวแปรพวกนี้ จะไม่ได้ถูกตั้งค่าเริ่มต้นให้ เราจะต้องตั้งค่าเริ่้มต้นเอาเอง และค่าเริ่มต้น ที่ไม่ได้กำหนด ก็ไม่ใช่ค่าศูนย์ เสีียด้วย เพราะฉะนั้น ตรงนี้ให้ระวังไว้ พิจรณา ตัวอย่าง
ตัวแปร external หรือตัวแปร extern
เป็นลักษณะการแก้ปัญหา การประกาศตัวแปร ที่เป็น global ที่มีชื่อซ้ำกัน แต่อยู่กันคนละไฟล์ ในโปรเจคเดียวกัน ถ้าเราไม่ได้ใช้ keyword extern ในการแก้ปัญหานี้ เวลาที่คอมไำพล์จะไม่มีปัญหา แต่เวลาที่ linker จะต้องเอาแต่ละไฟล์ที่โปรเจคอ้างถึง จะเกิดปัญหาแจ้ง error message ออกมา
ตัวแปร static
ตัวแปรใดๆ ที่ถูกระบุว่าเป็น static ตัวแปรนี้ จะมีความพิเศษคือ จะสามารถคงค่าล่าสุดไว้ภายในไฟล์ที่ถูกประกาศไว้ การทำการกำหนดค่าเริ่มต้นจะมีผลแค่ครั้งแรกที่ตัวแปรนี้ถูกเรียกใช้เท่านั้น หากมีการเรียกใช้อีกครั้ง การกำหนดค่าเริ่มต้นจะไม่มีผลใดๆ เรามักใช้ตัวแปร static ในฟังก์ชั่น เพื่อที่จะคงค่าของตัวแปรไว้ เพราะว่า เมื่อฟังก์ชั่นใดๆ ถูกเรียกใช้ หลังจากฟังก์ชั่นทำงานเสร็จแล้ว จะทำให้ตัวแปรที่ถูกประกาศอยู่ภายในฟังก์ชั่นถูกทำลายทิ้ง ยกเว้นตัวแปร static ที่ยังคงค่าไว้
ตัวแปร register
เราใช้การระบุ register หน้าตัวแปรทีเป็นตัวแปร local ที่เราต้องการให้เก็บค่าตัวแปรนั้นไว้ที่ register แทนที่เราจะเก็บไว้ที่ RAM นั่นหมายความว่า ขนาดของตัวแปรจะมีขนาดใหญ่เท่ากับขนาดของรีจิสเตอร์ (โดยทั่วไปก็ 1 word) และไม่สามารถใช้การอ้างอิงแบบแอดเดรสได้ (ไม่สามารถใช้ & หน้าตัวแปรได้) เพราะมันไม่ได้มีที่อยู่ในหน่วยความจำนั่นเอง เรามักใช้ register หน้าตัวแปรที่เราต้องการให้มีการเข้าถึงอย่างรวดเร็ว เช่น ตัวแปร counter ที่เก็บค่าการนับ แต่ทั้งนี้ ทั้งนั้นไม่ใช่ว่าเราจะสามารถประกาศตัวแปรที่เป็น register ได้ทุกตัวที่เราต้องการ เพราะขึ้นอยู่กับฮาร์ดแวร์ของระบบและกฏของ complier นั้นๆ ด้วย
ดูรูปประกอบ เพื่อความเข้าใจครับ