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

  • 21 Replies
  • 6158 Views
ผมทำโปรเจคจบเสดแล้ว  ตอนทำเล่ม อาจารย์เห็น โค้ด แล้วเค้าบอกให้มาแก้โดยการ ย่อโค้ดได้มั้ย  ผม ไม่ค่อยเก่งคับ เลย เขียน ตรง ๆ พี่ ๆ ในนี้ มีใครช่วยหน่อยครับ ย่อโค้ด หรือใช้เทคนิคอะไร แนะนำหน่อยครับ

ใกล้ผ่านแล้ว  เป็นโค้ด สั่งงานมอเตอร์ 2 ตัว หน่วงเวลาหยุดครับ แล้ว จะมีมอเตอร์อีก 1 ตัว หยุดโดย ใช้ เซนเซอร์

Code: [Select]
#include <reg51.h>
#include <stdio.h>

sbit DCCR=P0^0; // DC Chanal Right
sbit DCCL=P0^1; // DC Chanal Left
sbit DCTG=P0^2; // DC Transfer Right
sbit DCTB=P0^3; // DC Transfer Left
sbit DCFU=P0^4; // DC Floor UP
sbit DCFD=P0^5; // DC Floor DOWN
sbit sen1=P1^0; //
sbit sen2=P1^1; //
sbit sen3=P1^2; //
sbit sen4=P1^3; //
sbit sen5=P1^4; //
sbit sen6=P1^5; //
sbit sen7=P1^6; //
sbit sen8=P1^7; //

void init_time0(void){
ET0=1;   //Enable Timer 0 Interrupts
TR0=1;   //Start Timer 0 Running
EA=1;   // Start Interrupt Enable
}


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

}
}       


void main(){
 
char a;
TR1=1;   // Timer1 Disable
TMOD=0x21;    // Set Timer1 as Mode 2
TH1=0xFD;   // Set buad rate 9600 bps
SCON=0x50; //registor control serial port   // Uart Enable and Set Uart as Mode1
DCFU=0;
DCFD=0;
DCCR=0;
DCCL=0;
DCTB=0;
DCTG=0;
sen1=1;
sen2=1;
sen3=1;
sen4=1;
sen5=1;
sen6=1; sen7=1; sen8=1;

 

while(1){
a=_getkey();
switch(a){


//////////////// /////////////
case 'A':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen2==0);
DCCL=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
break;

case 'a':

do{
DCCL=1;}
while(sen2==0);
DCCL=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;


break;

case 'B':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen3==0);
DCCL=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
break;

case 'b':
do{
DCCL=1;}
while(sen3==0);
DCCL=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;

case 'C':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen4==0);
DCCL=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;

break;

case 'c':
do{
DCCL=1;}
while(sen4==0);
DCCL=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;
 
case 'D':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen5==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCL=1;}
while(sen1==0);

DCCL=0;

break;

case 'd':
do{
DCCR=1;}
while(sen5==0);
DCCR=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen1==0);
DCCL=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;

case 'E':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen6==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCL=1;}
while(sen1==0);

DCCL=0;

break;

case 'e':
do{
DCCR=1;}
while(sen6==0);
DCCR=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen1==0);
DCCL=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;

case 'F': 
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen7==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCL=1;}
while(sen1==0);

DCCL=0;

break;

case 'f':
do{
DCCR=1;}
while(sen7==0);
DCCR=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen1==0);
DCCL=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;

case 'G':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCR=1;}
while(sen8==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;
delay (1000);
do{
DCCL=1;}
while(sen1==0);

DCCL=0;

break;

case 'g':
do{
DCCR=1;}
while(sen8==0);
DCCR=0;
delay (1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
  delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
do{
DCCL=1;}
while(sen1==0);
DCCL=0;
delay (1000);

DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay (3500);
DCTB=0;

break;
   ////////////Floor 2
case 'H':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFU=1;
delay (8000);
DCFU=0;
delay (1000);
DCTG=1;
delay(3500);
DCTG=0;
delay(1000);
DCFD=1;
delay(2500);
DCFD=0;
delay(1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8500);
DCFD=0;
delay (1000);
break;

case 'h':
DCFU=1;
delay(8000);
DCFU=0;
delay(1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8000);
DCFD=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;

break;

case 'I':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);

DCFU=1;
delay (8000);
DCFU=0;
delay (1000);
do{
DCCL=1;}
while(sen2==0);
DCCL=0;
delay (1000);
DCTG=1;
delay(3500);
DCTG=0;
delay(1000);
DCFD=1;
delay(2500);
DCFD=0;
delay(1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8500);
DCFD=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;

break;

case 'i':
DCFU=1;
delay(8000);
DCFU=0;
delay(1000);
do{
DCCL=1;}
while(sen2==0);
DCCL=0;
delay(1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8000);
DCFD=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);
DCFD=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;

break;

case 'J':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);

DCFU=1;
delay (8000);
DCFU=0;
delay (1000);
do{
DCCL=1;}
while(sen3==0);
DCCL=0;
delay (1000);
DCTG=1;
delay(3500);
DCTG=0;
delay(1000);
DCFD=1;
delay(2500);
DCFD=0;
delay(1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8500);
DCFD=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;

break;

case 'j':

DCFU=1;
delay(8000);
DCFU=0;
delay(1000);
do{
DCCL=1;}
while(sen3==0);
DCCL=0;
delay(1000);
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8000);
DCFD=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;
delay (1000);
DCTG=1;
delay (3500);
DCTG=0;
delay (1000);
DCFD=1;  
delay (3000);DCFD=0;delay (1000);


DCTB=1;
delay(3500);
DCTB=0;

break;

case 'K':
DCTG=1;  
delay (3500);
DCTG=0;
delay (1000);
DCFU=1;
delay (3000);
DCFU=0;
delay (1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);

DCFU=1;
delay (8000);
DCFU=0;
delay (1000);
do{
DCCL=1;}
while(sen4==0);
DCCL=0;
delay (1000);
DCTG=1;
delay(3500);
DCTG=0;
delay(1000);
DCFD=1;
delay(2500);
DCFD=0;
delay(1000);
DCTB=1;
delay(3500);
DCTB=0;
delay (1000);
DCFD=1;  
delay (8500);
DCFD=0;
delay (1000);
do{
DCCR=1;}
while(sen1==0);
DCCR=0;

break; 


}
}
}




โค้ด มี ประมานนี้ แต่เคสเยอะมากเพราะต้องทำงานหลายช่อง โพสหมดไม่ได้ เกินกำหนด อักษรครับ

เอาโค้ดไปโพสที่ http://pastebin.com/ ก็ได้ครับแล้วเอาลิงค์มาแปะ
ถ้าการทำงาน มันซ้ำๆ กันไปมา ทำเป็น function อีก function ก็ได้ครับ ไม่จำเป้นต้องมี main loop อย่างเดียว แล้วก็เรียก function นั้นมาทำงาน... อ่ะคับ
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

เมื่อมี Code ที่ทำงานซ้ำๆมากๆ ขอแนะนำให้ดูเรื่อง การเขียน Macro และการสร้า่ง function หรือ subroutine จะช่วยได้

หากเป็นเรื่อง Macro ลองศึกษาได้จากที่นี่ครับ http://www.cprogramming.com/tutorial/cpreprocessor.html
ในหัวข้อเรื่อง Macro โดย Macro ทำตัวเป็นการแทนที่คำสั่งลงไป เวลาใช้ก็ตั้งชื่อให้สื่อกับความหมายในการสร้าง Macro นั้นได้ก็จะทำให้ดูง่ายขึ้นบ้าง (หลีกเลี่ยงการตั้งชื่อแบบ MAC_01 , MAC_02 มันไม่สื่อ) และมักนิยมตั้งชื่อของ Macro ให้เป็นตัวใหญ่กัน
อย่างไรก็ตาม Macro จะยังไม่มีประสิทธิภาพนักกับเรื่องของการทำ Code (แค่เขียน Code สั้นลงบ้าง)
จากกรณี Code ข้างบน อาจเขียน Macro ทำเป็นตัวอย่างสักตัว เพื่อ Guide ให้นะ ที่เหลือลองคิดต่อเอา

Code: [Select]
#include <stdio.h>

#define PULSE_TRIGGER(pbit,ton,toff)  { pbit=1; delay(ton); pbit=0; delay(toff); }
...

เวลาใช้ก็่เขียนเพียง
...
   case 'A' :
PULSE_TRIGGER(DCTG,3500,1000); // PLUSE at DCTG
PULSE_TRIGGER(DCFU,3000,1000);        // PLUSE at DCFU
PULSE_TRIGGER(DCTB,1000,3500);        // PLUSE at DCTB
...

หากลองมาดูเรื่อง function หรือ subroutine ก็ลองอ่านได้จากที่นี่
http://en.wikipedia.org/wiki/Subroutine#C_and_C.2B.2B_examples
http://www.thepmk.ac.th/kum/tc/programming_c_7.pdf

การสร้า่ง subroutine หรือ function จะได้่ประสิทธิภาพกว่าการใ้ช้ Macro แค่วางแผนการรับส่ง ตัวแปรต่างๆให้เหมาะสม
และควรตั้งชื่อให้สื่อกับความหมายใน subroutine นั้นด้วยก็จะดีมาก (หลีกเลี่ยงการตั้งชื่อแบบ sub_01 , sub_02 เช่นกัน) และใน C มักนิยมใช้ Underscore (คือ _ แทน space ในชื่อ )
จริงๆ จาก Code ข้างบน delay ก็เป็น subroutine อย่างหนึ่ง
และจากกรณี Code ข้างบน อาจเขียน function ทำเป็นตัวอย่างสักตัวเพื่อ Guide ให้ ที่เหลือก็ลองคิดต่อเอาเองเช่นกัน

Code: [Select]
...
void pulse_trigger_DCTG(unsigned ton,unsigned toff)
{
    DCTG = 1;
    delay(ton);
    DCTG = 0;
    delay(toff);
}
...
เวลาใช้ก็่เขียนเพียง
...
   case 'A' :
pulse_trigger_DCTG(3500,1000);
...
   case 'B' :
pulse_trigger_DCTG(3500,1000);
...
   case 'C' :
pulse_trigger_DCTG(3500,1000);
...
   case 'D' :
pulse_trigger_DCTG(3500,1000);
...
   case 'E' :
pulse_trigger_DCTG(3500,1000);
...

ค่าที่ส่งมันซ้ำๆ ก็อาจเขียนร่วมกันให้สั้นได้อีก ก็ใช้ Macro และ function ร่วมกันไปเช่น

Code: [Select]
...
#define   FIX_PULSE_TRIGGER_DCTG { pulse_trigger_DCTG(3500,1000); }
...
   case 'A' :
FIX_PULSE_TRIGGER_DCTG;
...
   case 'B' :
FIX_PULSE_TRIGGER_DCTG;
...
   case 'C' :
FIX_PULSE_TRIGGER_DCTG;
...
   case 'D' :
FIX_PULSE_TRIGGER_DCTG;
...
   case 'E' :
FIX_PULSE_TRIGGER_DCTG;

ทั้งนี้ก็สามารถใช้ทั้งสองอย่างร่วมด้วยช่วยกันได้ ก็จะได้ประโยชน์อย่างเต็มที่เลย

แนะนำเพิ่มอีกนิด สามารถ เพิ่ม function หรือ subroutine ได้อีก แม้จะมีการเรียกเพียงครั้งเดียวก็ตาม ทั้งนี้เพื่อเป็นการอธิบาย ให้สื่อความว่าทำอะไร ใน function นั้น (เพราะ function ย่อมจะต้องมีชื่อ) เช่้นการ Initialize เป็นต้น
ดังนั้น ใน main อาจให้ดูง่ายๆก็ทำได้โดยใส่ function เพิ่มเข้่าไป ก็เหมือนเป็นการ อธิบายว่า main นั้นทำอะไรบ้างแล้วเช่น

Code: [Select]
...
void initialize(void )
{
   DCFU = 0;
   DCFD = 0;
  ....
}
void process_motor_program_A(void )

   ....
}
void process_motor_program_a(void )
{
  ....
}
...

void main(void )
{
    char a;

    initialize();
    while(1) {
         a = _getkey();
         switch (a) {
                   case 'A' :
                         process_motor_program_A();
                         break;
                   case 'a' :
                         process_motor_program_a();
                         break;
                   ....
         }
     }
}   


ลองศึกษาและแก้ไขด้วยตนเองนะครับ อยากให้ทำเองมากกว่านะ จะได้ประสบการณ์ที่ดี
แก้ไขด้วยตนเองได้ ตอบอาจารย์ได้ และน่าจะไม่ยากลำบากอะไร ในเรื่องย่อ Code นี้

อย่างตามที่ท่าน wozniak ว่าในเคสนี้ก็ทำ macro อย่างเดียวก็ได้ครับ การทำงานอาจจะเร็วกว่า(ถ้าเขียนโค้ดไม่ผิดน่ะ)

ปล.อยากเห็นโค้ดที่เหลือเลยให้เค้าโพสทั้งหมดดีกว่า อ่ะครับ
เช่น สงสัยว่าโค้ดนี้เอาไว้ทำอะไร...
Code: [Select]
void delay(unsigned int n){
  int x,y;
    for(x=0;x<n;x++){
      for(y=0;y<150;y++){
    }
  }
}
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

*

Offline ROM

  • ***
  • 167
    • View Profile
สงสัยว่าโค้ดนี้เอาไว้ทำอะไร...
Code: [Select]
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 หน่วงเวลาแบบง่ายๆ อาจไม่ค่อยแม่นยำนัก แต่ก็ง่ายในการทำงานในการหน่วงเวลา

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

สงสัยว่าโค้ดนี้เอาไว้ทำอะไร...
Code: [Select]
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/
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P

*

Offline ROM

  • ***
  • 167
    • View Profile
Code: [Select]
แต่ตัว MCU ยังทำงานอยู่น่ะ(ประมาณยังคำนวณตัวเลข) มันไม่ได้แบบ NOP จริงๆ หรือผมเข้าใจอะไรผิดหว่า = ="
http://www.keil.com/forum/2938/

MCU ยังทำงานครับ แต่นับตัวแปรเล่นอยู่ ส่วนจะได้เวลาในการทำงานเท่าใด ก็คงดูที่ asm listing ว่ามี คำสั่งภาษา assembly อะไรบ้่าง ทำไปกี่รอบ แล้วเอาไปคำนวณดู ซึ่งอาจเกิดจากปัจจัยหลายอย่าง ในการเกิดคำสั่งของ asm นี้ โดยอาจเกี่ยวข้องกับ compiler ในแต่ละ version การตั้ง optimizer หรือ อื่นๆ หรือถ้าจะให้ชัดเจนไปคงต้องเขียน assembly ในส่วน delay นี้เอาเองครับ

Code: [Select]
แต่ตัว 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
GNU/Linux User.
Underground computer group.
The GNU people aren't evil. but i'm evil. :P