ตุลาคม 18, 2017, 11:39:02 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: idata vs xdata for Optimization Technique (Keil C51)  (อ่าน 7672 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« เมื่อ: มกราคม 03, 2012, 10:42:16 am »

idata vs xdata for Optimization Technique (Keil C51)

การเขียนโปรแกรมในระบบ Embedded เป็นเรื่องที่ละเอียดอ่อนมากเมื่อเทียบกับการเขียนโปรแกรมบนคอมพิวเตอร์ Embedded Programmer พันธ์แท้จะให้ความสำคัญกับทุกรายละเอียดที่ละเอียดอ่อนและดูเหมือนจะเป็นเรื่องลึกลับ สำหรับนักเล่น CPU/MCU มือใหม่ หรือมือสมัครเล่น ความลึกลับไม่ได้เป็นด้วยตัวของมัน แต่เป็นที่ Programmer ว่า เขาเหล่านั้นมีความรู้พื้นฐานมากเท่าไร่ ใด้ผ่านร้อนผ่านหนาวมามากแค่ไหน และสิ่งที่เขากำลังสนใจอยู่คืออะไร ทุกสิ่งทุกอย่างประกอบกันเข้าจะทำให้การมองเห็น และมองไม่เห็น ของแต่ละคนแตกต่างกันออกไป การมองไม่เห็นในสิ่งที่ไม่ควรเห็น หรือไม่จำเป็นต้องเห็น ไม่มีอะไรเสียหาย แต่หากมองไม่เห็นในสิ่งที่จะต้องเห็น อาจจะส่งผลเสียต่อระบบโดยที่ไม่รู้ตัวเลยก็เป็นไปได้

บทความนี้พุ่งเป้าไปที่หน่วยความจำแบบ idata และ xdata ภายใต้โครงสร้างทาง hardware ของ MCS-51 ท่านใดที่ผ่านการเขียนโปรแกรมภาษา Assembly มาจะรู้ว่า idata จะถูกเข้าถึงได้แบบตรงๆ (direct addressing) ในขณะที่ xdata จะถูกเข้าถึงแบบโดยอ้อม  (indirect addressing) นั่นหมายความว่าการใช้งาน idata ย่อมเร็วกว่า และต้องการ Program Memory น้อยกว่า แต่น่าเสียดายที่ idata มีขนาดจำกัด (สูงสุดที่เป็นไปได้คือ 255 ไบต์เท่านั้น) นั่นหมายความว่าถ้าหากโปรแกรมมีขนาดใหญ่ขึ้นหรือซับซ้อนขึ้นจน idata ไม่เพียงพอต่อการใช้งาน ก็จำเป็นต้องหันไปใช้ในส่วนของ xdata แทน แล้วเราจะรักษาความเร็วของการเข้าถึงหน่วยความจำ xdata ไว้ได้อย่างไร มาดูกันครับ

ในที่นี้ผมจะยกตัวอย่างฟังก์ชั่นสองฟังก์ชั่น ทั้งสองฟังก์ชั่นทำหน้าที่เหมือนกันคือ การเขียนข้อมูลลงหน่วยความจำ ที่อยู้ในส่วนของ xdata (ฟังก์ชั่นลักษณะนี้เหมาะกับโปรแกรมที่มีการทำงานแบบ Dynamic เท่านั้น)


แบบที่ 1: แบบธรรมดา
Code: (c)
void MemSetSlow(BYTE xdata* mem, BYTE idata d, BYTE idata n){
   BYTE idata idx;
   for(idx=0; idx<n; idx++)
      *mem++=d;
}

Code:
Program Size: data=10.0 xdata=18 code=93
CPU Cycle: 747

แบบที่ 2: แบบพิเศษ
Code: (c)
void MemSetFast(BYTE xdata* mem, BYTE idata d, BYTE idata n){
   BYTE idata idx;
   BYTE xdata* idata Prt = mem;
   for(idx=0; idx<n; idx++)
      *Prt++=d;
}

Code:
Program Size: data=12.0 xdata=16 code=70
CPU Cycle: 439

ชัดเจนว่า แบบที่ 2 กินขาด แล้วมันเป็นเพราะอะไรกันล่ะ?
หัวใจหลักอยู่ที่การใช้ Pointer แบบ xdata* idata (BYTE xdata* idata Prt) นั่นเอง ความหมายคือ Pointer ตัวนี้ถูกเก็บใน idata และถูกบังคับให้เข้าถึง xdata และด้วยโครงสร้างทาง hardware เรารู้เป็นอย่างดีว่า idata ถูกเข้าถึงได้เร็วกว่า และใช้ Program Memory น้อยกว่า นั่นคือการเปลี่ยนแปลงค่าของ Pointer จะเเกิดขึ้นแบบ direct addressing นั่นเอง
นั่นเป็นเหตุผลว่า ทำไมพื้นฐานสำคัญ ทำไมต้องเรียนรู้ภาษาซีให้แตกฉานเรื่อง Pointer และทำไมต้องรู้เท่าทัน Compiler
มองให้รู้เช่นเห็นชาติ ตีให้ขาดทุกรูปแบบ นั่นคือหัวใจของ Embedded Programmer
 wink
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
dogissad
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #1 เมื่อ: ตุลาคม 29, 2014, 03:54:39 pm »

อ่านเเล้วได้ความรู้มากเลยอ่าครับ
บันทึกการเข้า

Yasawasung
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #2 เมื่อ: ธันวาคม 08, 2014, 03:37:03 pm »

ได้รับความรู้เพิ่มอีก1เรื่องแล้วครับท่าน เป็นประโยชน์มากครับ
บันทึกการเข้า

Boonnom
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 1


| |
« ตอบ #3 เมื่อ: กรกฎาคม 13, 2015, 12:14:51 pm »

ช่วยแปลให้ผมหน่อยได้ไหมครับ ผมอ่านแล้วไม่ได้ใจความเลยครับ
บันทึกการเข้า
Mesuke
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #4 เมื่อ: กันยายน 13, 2017, 10:36:03 am »

ได้ความรู้มากเลยครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: