Rabbit Microprocessor Basic Tutorial [Bagian 5]

Multitasking

Pada environment multitasking, lebih dari satu task (yang masing-masing mewakili sebuah sequence perintah operasi) dapat terlihat seperti dieksekusi secara paralel. Pada kenyataannya sebuah single processor hanya dapat mengeksekusi satu instruksi pada satu waktu.

Jika pada sebuah aplikasi terdapat beberapa task yang harus dieksekusi, software multitasking biasanya akan mengambil dari delay natural pada setiap task  untuk meningkatkan performa secara keseluruhan dari sistem. Masing-masing task dapat melakukan beberapa pekerjaan ketika  task yang lain sedang dalam keadaan menunggu sebuah event atau sesuatu untuk dikerjakan.

Ada dua jenis multitasking yang ada pada aplikasi Dynamic C : preemptive dan cooperative. Masing-masing tipe multitasking dapat mengontrol kapan harus menunggu dan kapan harus membiarkan task lain dieksekusi. Dynamic C mempunyai language extentions, costatement dan cofunction untuk mendukung multitasking.

Preemptive multitasking didukung oleh slice statement, yang memungkinkan proses komputasi dibagi-bagi masing-masing menjadi irisan-irisan kecil berdasarkan waktu selama beberapa milidetik dan dapat pula dilakukan dengan menggunakan uC/OS-II real-time-kernel (tidak dibahas dalam tutorial lesson ini).

Preemptive Multitasking

Pada preemptive multitasking dijalankan berdasarkan schedule yang berdasarkan prioritas dan atau dengan diberikan rentang waktu tertentu.

Slice Statement

Slice statement dapat digunakan programer untuk menjalankan sebuah block kode program dalam rentang waktu tertentu. Slice statement memerlukan parameter context buffer size yang berisi data integer yang mendefinisikan jumlah byte yang akan digunakan untuk alokasi stack memory. Parameter lainnya yang digunakan adalah time slice sebagai definisi rentang waktu atau jumlah tick yang digunakan pada task  tersebut. Satu tick = 1/1024 detik.

Lab 4.1 Preemptive Multitasking

  • Ketikan listing program berikut ini pada editor window :
/****************************************
     latih3.c
     www.teknikpersinyalan.com
     Preemptive Multitasking
     Basic Training Rabbit Microprocessor
*****************************************/

#class auto 
shared unsigned long x=0,y=0;
unsigned long x_y; 

void main()
{ 
      for (;;)
 {                      // outside loop
      slice (200, 25)
      {     // run this section for 25 ticks 
      for (;;)
            {
                  x++;
            }
      }

      slice (200, 50)
      {     // run this section for 50 ticks
      for (;;)
            {
                  y++;
            }
      }
      printf("x=%ld, y=%ld\n",x,y); // print the results
 }
}
  • Save pekerjaan anda pada folder :\RabbitTraining\ dengan nama file: latih3.c.
  • Lakukan compiling dan debuging pada RAM.
  • Perhatikan output yang keluar pada window Stdio.

Cooperative Multitasking

Tanpa penggunaan kernel preemptive multitasking atau operating system, seorang programer seringkali dihadapkan kepada permasalahan menjalankan task-task yang terpisah pada skala waktu yang berbeda. Solusi yang dapat dilakukan adalah dengan big loop driving state machine. Program terdiri dari sebuah loop besar yang dieksekusi secara terus-menerus. Di dalam loop task-task tersebut dipecah menjadi bagian-bagian kecil program yang dieksekusi secara bergiliran sebagai state machine.

Sebuah state machine dapat sangat sederhana sampai kompleks, melibatkan banyak variabel dan mungkin terkandung banyak state machine lain di dalamnya. Dengan menggunakan state machine busy waiting dapat dihindari yang biasanya membuat loop tersendiri sampai kondisinya terpenuhi. Dengan cara seperti ini satu loop besar dapat melayani banyak state machine yang masing-masing melakukan task-nya, dan tak satu pun busy waiting.

Costatements

Sebuah extensions language cooperative multitasking  ditambahkan pada Dynamic C menggunakan konsep loop besar dan state machine. State pada sebuah task diingat oleh sebuah statement pointer yang menyimpan posisi sebuah eksekusi pada sebuah blok statement ketika statement tersebut di-pause atau menunggu sebuah event.

Fungsi yang dipanggil di dalam costatement menggunakan statement cofunc menggantikan void. Cara memanggilnya dapat digunakan perintah waitfordone atau disingkat wfd.

Main() {
int i;
while(1) {        //Superloop     

      costate {  //Task 1
      ...
      }
      costate {  //Task 2
      ...
      }
  }
}

Lab 4.2 Real Time Problems

  • Ketikan listing program berikut ini pada editor window :
    /*****************************************************
         Latih4.c
         www.teknikpersinyalan.com
         Cooperative Multitasking
         Basic Training Rabbit Microprocessor 
    ******************************************************/ 
    
    #define DS1 0
    #define BINBUFSIZE  255
    #define BOUTBUFSIZE 255 
    
    // Ubah baudrate di sini....! 
    
    #ifndef _232BAUD
    #define _232BAUD 9600L
    #endif 
    
    void warmingup_delay()
    {
          unsigned long i; 
       for (i=0; i<=100000; i=++)
       {
          #asm
          nop
          #endasm
       }
    }
    
    cofunc manual_delay()
    {
          unsigned long i;
       for (i=0; i<=1000000; i++)
       {
          #asm
          nop
          #endasm
       }
    
    }
    
    main()
    {
       unsigned char bacaser='3';
       unsigned int blinkflag=0; 
    
       WrPortI(PDDDR,&PDDDRShadow,0xFF);  //Seluruh port D sebagai output
       serBopen(_232BAUD);                //Membuka port serial B
       bacaser = "\0";                    //Null char
       BitWrPortI(PDDR,&PDDRShadow,1,DS1);
       warmingup_delay();
       serBputc("\0"); 
    
       while(1)   //superloop
       {
       costate
    
       {
          waitfordone bacaser = cof_serBgetc();
          switch(bacaser)
          {
            case '0' :
                         BitWrPortI(PDDR,&PDDRShadow,1,DS1);
                         waitfordone cof_serBputc('A');
                         waitfordone cof_serBputc(' ');
                         blinkflag=0;
                         break;
            case '1' :
                         BitWrPortI(PDDR,&PDDRShadow,0,DS1);
                         waitfordone cof_serBputc('B');
                         waitfordone cof_serBputc(' ');
                         blinkflag=0;
                         break;
            case '2' :
                         BitWrPortI(PDDR,&PDDRShadow,1,DS1);
                         waitfordone cof_serBputc('C');
                         waitfordone cof_serBputc(' ');
                         blinkflag=1;
                         break;
           }
       }
    
       costate
       {
          if (blinkflag)
          {
            BitWrPortI(PDDR,&PDDRShadow,1,DS1);
            waitfor(DelayMs(1000));
          }
    
          if (blinkflag)
          {
            BitWrPortI(PDDR,&PDDRShadow,0,DS1);
            waitfor(DelaySec(1));
          }
       }
    
     
       costate 
       {
          waitfordone cof_serBputc('I');
          waitfordone cof_serBputc('n');
          waitfordone cof_serBputc('d');
          waitfordone cof_serBputc('o');
          waitfordone cof_serBputc('n');
          waitfordone cof_serBputc('e');
          waitfordone cof_serBputc('s');
          waitfordone cof_serBputc('i');
          waitfordone cof_serBputc('a');
          waitfordone cof_serBputc(' ');
    
          waitfordone manual_delay();
    
       }
    
       }
       serBclose(); 
    }
  • Save pekerjaan anda pada folder :\RabbitTraining\ dengan nama file: latih4.c.
  • Pasang jumper SMODE pada konektor JP1.
  • Compile program tersebut di flash.
  • Buka jumper SMODE pada konektor JP1. Abaikan error message pada Dynamic C.
  • Tekan tombol reset.
  • Jalankan program Hercules.exe.
  • Buka port serial yang bersesuaian dengan menekan tombol Open.
  • Kirim karakter ‘0’ dari Hercules, perhatikan yang terjadi pada Interface Board dan window Hercules.
  • Kirim karakter ‘1’ dari Hercules, perhatikan yang terjadi pada Interface Board dan window Hercules.
  • Kirim karakter ‘2’ dari Hercules, perhatikan yang terjadi pada Interface Board dan window Hercules.
  • Ulang-ulang pengiriman data tersebut, perhatikan apa yang terjadi.

Leave a Reply

Your email address will not be published. Required fields are marked *