#include <stdio.h>
#include <stdlib.h>
#include<LPC214x.h>

#define ledon IO1SET
#define ledoff IO1CLR


void delay(int x);



#define READY 1

typedef int (*compfn)(const void*, const void*);

struct task {
        int task_id;
        int period;
        int wcet;
    int arrival_time;
    int deadline;
    int state;
    int ceu;

};

int sim_time=10;
struct task array[3]  = { {  1,4,1,0,4,1,0  },
                             {  2,6,2,0,6,1,0 },
                             {  3,12,3,0,12,1,0 } };


void printarray(void);

int  compare(struct task *, struct task *);

void EDF_scheduler(void);

int main(void)
{

     IODIR1  = 0x00FF0000; 
   printf("List before sorting:\n");
   printarray();

   qsort((void *) &array,              // Beginning address of array
   3,                                             // Number of elements in array
   sizeof(struct task),              // Size of each element
   (compfn)compare );           // Pointer to compare function

   printf("\nList after sorting:\n");
   printarray();
   EDF_scheduler();

}

int compare(struct task *elem1, struct task *elem2)
{
   if ( elem1->deadline < elem2->deadline)
      return -1;

   else if (elem1->deadline > elem2->deadline)
      return 1;

   else
      return 0;
}

void printarray(void)
{
   int i;

   for (i = 0; i < 3; i++)
      printf("%d %d %d %d %d %d %d %d\n",
               i+1, array[i].task_id, array[i].period,array[i].wcet,
               array[i].arrival_time,array[i].deadline,array[i].state,array[i].ceu);
}


void EDF_scheduler(void)
{
    while(1)
    {

    int i,time=0;

    int curr_process;

    while(time<sim_time)
    {
        printf("%d\n",time);
        curr_process=0;
        if(curr_process > -1)
        {
            if(array[curr_process].ceu < array[curr_process].wcet )
            {
                array[curr_process].ceu++;
                if(array[curr_process].task_id ==1 )
                     {
                            ledon = (1<<16);  // Turn ON P1.16 – P1.23
                            delay(9000);
                            ledoff= (1<<16);  // Turn OFF P1.16 – P1.23

                       }

                if(array[curr_process].task_id ==2 )
                    {
                        ledon = (1<<17);  // Turn ON P1.16 – P1.23
                      delay(9000);
                      ledoff= (1<<17); 
                    }

                if(array[curr_process].task_id ==3 )
                    {
                        ledon = (1<<18);  // Turn ON P1.16 – P1.23
                      delay(9000);
                      ledoff= (1<<18); 
                    }
            }

            if(array[curr_process].ceu == array[curr_process].wcet )
            {
                if(array[curr_process].task_id ==1 )
                     {
                            ledon |= (1<<19);  // Turn ON P1.16 – P1.23
                            delay(9000);
                            ledoff= (1<<19);    // Turn OFF P1.16 – P1.23

                       }


                if(array[curr_process].task_id ==2 )
                    {
                        ledon= (1<<20);  // Turn ON P1.16 – P1.23
                            delay(9000);
                            ledoff= (1<<20); 
                    }

                if(array[curr_process].task_id ==3 )
                    {
                        ledon = (1<<21);  // Turn ON P1.16 – P1.23
                            delay(9000);
                            ledoff= (1<<21); 
                    }
                array[curr_process].arrival_time +=array[curr_process].period;
                array[curr_process].deadline = array[curr_process].arrival_time+array[curr_process].period;
                array[curr_process].state = READY;
                qsort((void *) &array,              // Beginning address of array
                3,                                 // Number of elements in array
                sizeof(struct task),              // Size of each element
                (compfn)compare );  
                array[curr_process].ceu=0;

            }
        }
        for(i=0;i<3;i++)
        {
            if(array[i].deadline < time)
            {
                printf("\tTASK %d",i+1);
                printf("missed deadline\n");
                array[i].arrival_time += array[i].period;
                array[i].deadline=array[i].arrival_time + array[i].period;
                qsort((void *) &array,              // Beginning address of array
                3,                                              // Number of elements in array
                sizeof(struct task),               // Size of each element
                (compfn)compare );           // Pointer to compare function
            }

        }
        time++;
        qsort((void *) &array,              // Beginning address of array
        3,                                             // Number of elements in array
        sizeof(struct task),              // Size of each element
        (compfn)compare );          // Pointer to compare function


    }


}
}
void  delay(int x)
{



        unsigned  int  k,l;
      for(k = x;k > 0;k--)
      for(l = 0;l < x;l++);
}

Above code is scheduling code..i want to turn on LED based on particular task which is connected to GPIO pin of ARM lpc2148...while simulating it is not showing anything

This article has been dead for over six months. Start a new discussion instead.