Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - s4m3l0

#9
Quote from: ROM on October 01, 2013, 04:49:57 PM
Quote from: s4m3l0 on October 01, 2013, 04:32:52 PM
GNU/Linux ไม่ได้มีแต่ใน PC น่ะครับ(แอบเศร้า) :'(
ผมหมายถึง Computer มากกว่านะครับ อาจรวมไปถึง embedded linux ด้วยครับ
ขออภัยอาจจะใช้คำไม่ถูก อย่าเศร้าน่า
แต่ขอแยกกันกับ MCU เพราะเล็กกว่า ที่กล่าวอาจจะอิงกับ 8 bit ด้วยซ้ำนะครับ

Quote from: s4m3l0 on October 01, 2013, 04:34:50 PM
Quote from: ROM on October 01, 2013, 04:30:36 PM
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 แรกแล้วครับ = =" หรือว่าไม่ใช่หว่า

#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 เผื่อมีคนมาอ่าน
เข้าว่าโดยพื้นฐาน การทำงานน่าจะเหมือนกันน่ะครับ
#10
Quote from: ROM on October 01, 2013, 04:30:36 PM
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 แรกแล้วครับ = =" หรือว่าไม่ใช่หว่า

#include <intrins.h>

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

while (us--)
  {
  _nop_();
  }
}
#11
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 น่ะครับ(แอบเศร้า) :'(
#12
Quote from: ROM on October 01, 2013, 04:10:34 PM
แต่ตัว MCU ยังทำงานอยู่น่ะ(ประมาณยังคำนวณตัวเลข) มันไม่ได้แบบ NOP จริงๆ หรือผมเข้าใจอะไรผิดหว่า = ="
http://www.keil.com/forum/2938/


MCU ยังทำงานครับ แต่นับตัวแปรเล่นอยู่ ส่วนจะได้เวลาในการทำงานเท่าใด ก็คงดูที่ asm listing ว่ามี คำสั่งภาษา assembly อะไรบ้่าง ทำไปกี่รอบ แล้วเอาไปคำนวณดู ซึ่งอาจเกิดจากปัจจัยหลายอย่าง ในการเกิดคำสั่งของ asm นี้ โดยอาจเกี่ยวข้องกับ compiler ในแต่ละ version การตั้ง optimizer หรือ อื่นๆ หรือถ้าจะให้ชัดเจนไปคงต้องเขียน assembly ในส่วน delay นี้เอาเองครับ
ผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm
#13
Quote from: ROM on October 01, 2013, 03:18:50 PM
Quote from: s4m3l0 on October 01, 2013, 01:00:38 PM
สงสัยว่าโค้ดนี้เอาไว้ทำอะไร...

void delay(unsigned int n){
  int x,y;
    for(x=0;x<n;x++){
      for(y=0;y<150;y++){
    }
  }
}


คงเป็น Soft delay ในการ วน Loop เพื่อให้ MCU หน่วงเวลาออกไป โดยให้ MCU มานับตัวแปร x,y เล่น
http://geniusdevils.com/2013/03/1-millisecond-delay-in-8051-c-program/
ซึ่งเป็นการเขียน function หน่วงเวลาแบบง่ายๆ อาจไม่ค่อยแม่นยำนัก แต่ก็ง่ายในการทำงานในการหน่วงเวลา
แต่ตัว MCU ยังทำงานอยู่น่ะ(ประมาณยังคำนวณตัวเลข(ALU)) มันไม่ได้แบบ NOP จริงๆ หรือผมเข้าใจอะไรผิดหว่า = ="
http://www.keil.com/forum/2938/
#14
อย่างตามที่ท่าน wozniak ว่าในเคสนี้ก็ทำ macro อย่างเดียวก็ได้ครับ การทำงานอาจจะเร็วกว่า(ถ้าเขียนโค้ดไม่ผิดน่ะ)

ปล.อยากเห็นโค้ดที่เหลือเลยให้เค้าโพสทั้งหมดดีกว่า อ่ะครับ
เช่น สงสัยว่าโค้ดนี้เอาไว้ทำอะไร...

void delay(unsigned int n){
  int x,y;
    for(x=0;x<n;x++){
      for(y=0;y<150;y++){
    }
  }
}
#15
เอาโค้ดไปโพสที่ http://pastebin.com/ ก็ได้ครับแล้วเอาลิงค์มาแปะ
ถ้าการทำงาน มันซ้ำๆ กันไปมา ทำเป็น function อีก function ก็ได้ครับ ไม่จำเป้นต้องมี main loop อย่างเดียว แล้วก็เรียก function นั้นมาทำงาน... อ่ะคับ
#16
ป้องกันแบบไหน อธิบาย ยกตัวอย่างเพิ่มเติมหน่อย? ประมาณ พอเอา sdcard ไปเสียบที่อื่นก็ไม่สามารถเข้าถึงข้อมูลได้? เข้าได้แต่เครื่องตนเอง?
ประมาณทำ Disk encryption รึป่าวหว่า?
https://en.wikipedia.org/wiki/Disk_encryption
แต่เวลาทำ Disk encryption แบบ software ประสิทธิภาพในการ อ่านข้อมูล เขียนข้อมูล จะต่ำลง(ไม่เยอะ แต่ถ้าไม่จำเป็นจริงๆ ก็ไม่ควรทำครับ) ยิ่ง SDCard อ่านเขียน ยิ่งต่ำๆ อยู่แล้ว - -"