ช่วยย่อโค้ดหน่อยครับ ภาษาซี เขียนใน Keil

  • 21 Replies
  • 6514 Views
*

Offline ROM

  • ***
  • 167
    • View Profile
Quote
ผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm

แล้ว ต้องใช้  _nop_ (); เท่าไหร่ครับ ถึงจะ delay ได้นานๆ
อย่างสัก 10  millisecond ครับ ที่เขาเขียนนับตัวแปรก็ด้วยเรื่องนี้ครับ
เพราะ _nop_(); มัน delay ได้สั้นมาก
ลองดู
http://www.keil.com/support/man/docs/is51/is51_nop.htm
มันใช้  delay แค่ 1 cycle ของ MCU เองนะ

Quote
การเขียนแบบนี้บน PC (เดาจาก Signature ของท่านเว่า GNU/Linux User เป็นกลุ่ม PC ) คงจะไม่ค่อยเห็นใครเขียนแบบนี้ เพราะมี function ให้ใช้ อย่าง sleep หรือ delay เลย เนื่องเพราะมี library ให้พร้อมมาจาก OS เลยได้ใช้ง่ายๆ
แต่ใน Micro controller ที่มักไม่ค่อยมี OS อะไรกับเขา (มีก็อาจใช้ และติดตั้งไม่ง่ายนัก หรือไม่พอลงกับ MCU ได้)
มักต้องมาเขียนมาทำทุกอย่างเองสารพัดโดยลำพัง มี Lib มาจาก Compiler ก็นิดๆหน่อยๆ ต้องไปหาเอาเองจากพวกข้างนอกมาใช้ ใช้ได้มั้งไม่ได้มั้ง สุดแท้แต่จะแปลงกันมา ดังนั้นอย่าแปลกใจครับ หากเห็นเขียน Code กันแปลกๆ สำหรับพวก embedded เล็กๆ อย่าง MCU พวกนี้ ยิ่ง 8 bit นี้ บางตัว malloc ยังทำไม่ได้เลย resource น้อยเกิน อะไรๆ ก็เลยลำบาก  :'(
GNU/Linux ไม่ได้มีแต่ใน PC น่ะครับ(แอบเศร้า) :'(
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

Quote
ผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm

แล้ว ต้องใช้  _nop_ (); เท่าไหร่ครับ ถึงจะ delay ได้นานๆ
อย่างสัก 10  millisecond ครับ ที่เขาเขียนนับตัวแปรก็ด้วยเรื่องนี้ครับ
เพราะ _nop_(); มัน delay ได้สั้นมาก
ลองดู
http://www.keil.com/support/man/docs/is51/is51_nop.htm
มันใช้  delay แค่ 1 cycle ของ MCU เองนะ
คำตอบอยู่ใน link แรกแล้วครับ = =" หรือว่าไม่ใช่หว่า
Code: [Select]
#include <intrins.h>

void DelayMS(unsigned char ms)
{
unsigned long us = 1000*ms;

while (us--)
  {
  _nop_();
  }
}
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

*

Offline ROM

  • ***
  • 167
    • View Profile
GNU/Linux ไม่ได้มีแต่ใน PC น่ะครับ(แอบเศร้า) :'(
ผมหมายถึงประเภท Computer มากกว่านะครับ อาจรวมไปถึง embedded linux และอื่นๆ ด้วยครับ
ที่ไม่ค่อยมีข้อจำกัดอะไรนัก ทั้งเร็ว ทั้งแรง resource มาก ขออภัยอาจจะใช้คำไม่ถูก อย่าเศร้าน่า  :)
แต่ขอแยกกันกับ MCU เพราะเล็กกว่ามาก ข้อจำกัดมากกว่า และที่กล่าวอาจก็จะอ้างอิงกับ 8 bit บางตัวด้วยซ้ำนะครับ
เศร้ากว่ากันเยอะ  :'(

Quote
ผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm

แล้ว ต้องใช้  _nop_ (); เท่าไหร่ครับ ถึงจะ delay ได้นานๆ
อย่างสัก 10  millisecond ครับ ที่เขาเขียนนับตัวแปรก็ด้วยเรื่องนี้ครับ
เพราะ _nop_(); มัน delay ได้สั้นมาก
ลองดู
http://www.keil.com/support/man/docs/is51/is51_nop.htm
มันใช้  delay แค่ 1 cycle ของ MCU เองนะ
คำตอบอยู่ใน link แรกแล้วครับ = =" หรือว่าไม่ใช่หว่า
Code: [Select]
#include <intrins.h>

void DelayMS(unsigned char ms)
{
unsigned long us = 1000*ms;

while (us--)
  {
  _nop_();
  }
}

มันก็มี ตัวแปรชื่อ us ให้ MCU คอยนับอยู่นี่ครับ MCU ก็นับตัวแปรเล่นเหมือนกัน ก็ใช้ resource เหมือนกัน
แม้จะเขียนต่างกันไปบ้าง แต่หลักการก็คล้ายๆกัน
ผมก็เลยยังสงสัยว่า ท่านงงตรงไหน ? หรือผมพลาดตรงไหน ?

GNU/Linux ไม่ได้มีแต่ใน PC น่ะครับ(แอบเศร้า) :'(
ผมหมายถึง Computer มากกว่านะครับ อาจรวมไปถึง embedded linux ด้วยครับ
ขออภัยอาจจะใช้คำไม่ถูก อย่าเศร้าน่า
แต่ขอแยกกันกับ MCU เพราะเล็กกว่า ที่กล่าวอาจจะอิงกับ 8 bit ด้วยซ้ำนะครับ

Quote
ผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm

แล้ว ต้องใช้  _nop_ (); เท่าไหร่ครับ ถึงจะ delay ได้นานๆ
อย่างสัก 10  millisecond ครับ ที่เขาเขียนนับตัวแปรก็ด้วยเรื่องนี้ครับ
เพราะ _nop_(); มัน delay ได้สั้นมาก
ลองดู
http://www.keil.com/support/man/docs/is51/is51_nop.htm
มันใช้  delay แค่ 1 cycle ของ MCU เองนะ
คำตอบอยู่ใน link แรกแล้วครับ = =" หรือว่าไม่ใช่หว่า
Code: [Select]
#include <intrins.h>

void DelayMS(unsigned char ms)
{
unsigned long us = 1000*ms;

while (us--)
  {
  _nop_();
  }
}

มันก็มี ตัวนับ us อยู่นะครับ MCU ก็นับตัวแปรเล่นเหมือนกัน ก็ใช้ resource เหมือนกัน
ผมไม่เข้าใจ ว่าท่านงงอะไร ?
จะว่านับก็ได้ครับ แต่เวลาใน asm จริงๆ มันไม่เหมือนกันน่ะครับ ผมอธิบายตามที่ผมเข้าใจก่อนน่ะ
จากโค้ดของ NOP
ใน loop while
เซ็ตค่า us แล้วจะมีการเช็ค us ว่าเป็น 0 รึเปล่า แล้วทำการลดค่า us โดย 1 ประมาณ us-1 แล้วทำการ NOP แล้วมาเช็คใหม่
ใน asm ก็ประมาณ 4 instuction(เซ็ต us ผมไม่นับเพราะอยู่นอกลูป)

ถ้าเป้น for loop ดังเดิม
- ตัวแปรเพิ่ม
ให้ x=0,y=0 ประมาณ 2 instuction(นับแต่ y ก็ 1 instuction เพราะมีการกำหนดใหม่ทุกครั้ง (mov))
เช็ค x<n และ y<150 ประมาณ 2 instuction + jump อีก 2 instuction
x++,y++ ประมาณ 2 instuction
รวม 1+2+2+2 = 7

ค่าต่างๆ เป็นค่าประมาณน่ะครับ

ส่วนที่มันเหมือนกันนี่ไปไม่ถูกเลย lolz
http://stackoverflow.com/questions/17896714/why-would-introducing-useless-mov-instructions-speed-up-a-tight-loop-in-x86-64-a
เจอลิงค์ที่อธิบายที่ดีกว่า http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51nop เผื่อมีคนมาอ่าน
เข้าว่าโดยพื้นฐาน การทำงานน่าจะเหมือนกันน่ะครับ
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

Quote
ผมหมายถึงประเภท Computer มากกว่านะครับ อาจรวมไปถึง embedded linux และอื่นๆ ด้วยครับ
ที่ไม่ค่อยมีข้อจำกัดอะไรนัก ทั้งเร็ว ทั้งแรง resource มาก ขออภัยอาจจะใช้คำไม่ถูก อย่าเศร้าน่า  :)
แต่ขอแยกกันกับ MCU เพราะเล็กกว่ามาก ข้อจำกัดมากกว่า และที่กล่าวอาจก็จะอ้างอิงกับ 8 bit บางตัวด้วยซ้ำนะครับ
เศร้ากว่ากันเยอะ  :'(
embedded linux ที่นี่ ไม่มี 8 bit บ้างรึครับ?  เศร้า :'(
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
คุยไรกันครับนี่ ...  ;D
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

*

Offline ROM

  • ***
  • 167
    • View Profile
Quote
embedded linux ที่นี่ ไม่มี 8 bit บ้างรึครับ?  เศร้า
ท่านนี่เศร้าง่ายนะ 8 bit ก็มีสิครับ สมัยก่อนผมก็ใช้อยู่ แต่ตอนนี้ ผมหมายถึง MCU เล็กๆกว่านั้นครับ
ที่ไม่มี resource อะไรมาก ทำอะไรก็ไม่ค่อยได้มากนักนะ

จะว่านับก็ได้ครับ แต่เวลาใน asm จริงๆ มันไม่เหมือนกันน่ะครับ ผมอธิบายตามที่ผมเข้าใจก่อนน่ะ
จากโค้ดของ NOP
ใน loop while
จะมีการเช็ค us ว่าเป็น 0 รึเปล่า แล้วทำการลดค่า us โดย 1 ประมาณ us-1 แล้วทำการ NOP แล้วมาเช็คใหม่
ใน asm ก็ประมาณ 3 instuction

ถ้าเป้น for loop ดังเดิม
- ตัวแปรเพิ่ม
ให้ x=0,y=0 ประมาณ 2 instuction
เช็ค x<n และ y<150 ประมาณ 2 instuction + jump อีก 2 instuction
x++,y++ ประมาณ 2 instuction

ส่วนที่มันเหมือนกันนี่ไปไม่ถูกเลย lolz
http://stackoverflow.com/questions/17896714/why-would-introducing-useless-mov-instructions-speed-up-a-tight-loop-in-x86-64-a
เข้าว่าโดยพื้นฐาน การทำงานน่าจะเหมือกันน่ะครับ

พยายามจะทำให้ท่านเข้่าใจนะ บางที ผมอาจใช้คำว่า เหมือนบ้าง คล้ายบ้าง อย่าเพิ่งสับสนนะ
คือทั้ง 2 code เป็นการ delay ทั้งคู่ก็เหมือนกันนะ ใช้ตัวแปรนับเหมือนกัน (แม้อาจมีความแตกต่างในการมาคำนวณก่อน แต่สุดท้ายก็เกิดการนับ ) และก็อาจจะได้ ชุดคำสั่งของ asm แตกต่างกันอยู่บ้างครับ ผมก็เลยไม่รู้ว่าเป็นประเด็๋นสำหรับท่านตรงไหนหรือเปล่าครับ