Xinda Lin / Mbed 2 deprecated runAtTime

Files at this revision

API Documentation at this revision

Comitter:
linxinda
Date:
Sat Dec 04 07:12:45 2010 +0000
Commit message:
HW3B Part1 runAtTrigger

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
queue.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Dec 04 07:12:45 2010 +0000
@@ -0,0 +1,106 @@
+#include "mbed.h"
+#include "queue.h"
+
+DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+struct timeval
+{
+  unsigned long long int tv_sec;     /* Seconds. */
+  unsigned long long int tv_usec;    /* Microseconds. */
+};
+void runAtTime (void (*schedFunc)(), struct timeval *tv);
+void schedFunc(void);
+void SetupTimer1(struct timeval *tv);
+void Timer1_IRQHandler(void);
+void setTimeval(struct timeval *tv);
+ timeval currentTime;
+
+PriorityQueue myQueue;
+_task runTime;
+unsigned long long int triggerTime;
+
+
+int main() {
+    _task t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
+    t1.usec=1000;
+    triggerTime=t1.usec;
+    t2.usec=2000;
+    t3.usec=8000;
+    t4.usec=4000;
+    t5.usec=5000;
+    t6.usec=3000;
+    t7.usec=9000;
+    t8.usec=5000;
+    t9.usec=10000;
+    //myQueue.Insert(&t1);
+    myQueue.Insert(&t2);
+    myQueue.Insert(&t3);
+    myQueue.Insert(&t4);
+    myQueue.Insert(&t5);
+    myQueue.Insert(&t6);
+    myQueue.Insert(&t7);
+    myQueue.Insert(&t8);
+    myQueue.Insert(&t9);
+    setTimeval(&currentTime);
+    SetupTimer1(&currentTime);
+    //SetupTimer1();
+    while(1){
+       pc.printf("%llu\r\n",LPC_TIM1->TC);
+       pc.printf("%llu\r\n",LPC_TIM1->IR);
+      }
+}
+
+void SetupTimer1(struct timeval *tv){
+   LPC_SC->PCONP |= 1 << 2;     // Power on Timer`
+   LPC_SC->PCLKSEL0 |= 1 << 4;
+   LPC_TIM1->TCR = 0x2;         // Reset and set to timer mode
+   LPC_TIM1->CTCR = 0x0;
+   LPC_TIM1->PR = 0;            // No prescale
+     //unsigned long long int Tc=(unsigned long long int )tv->tv_sec*96000000;
+     LPC_TIM1->MR0=tv->tv_usec*96000;
+     //LPC_TIM1->MR0=0x20000000;
+     LPC_TIM1->MR1=0xFFFFFFFF;
+     LPC_TIM1->MCR = 0x00000001;           // Interrupt and Reset on Match
+     LPC_TIM1->TCR = 1;           // Enable Timer
+     //enable interrupt
+     NVIC_SetVector (TIMER1_IRQn, (uint32_t)&Timer1_IRQHandler);
+     NVIC_EnableIRQ (TIMER1_IRQn);
+}
+
+/*void TriggerHandler(void){
+    runAtTime (schedFunc,&currentTime);
+    LPC_TIM1->IR=63;
+}*/
+
+void Timer1_IRQHandler(void)
+{
+    if((LPC_TIM1->IR|0xFFFFFFFE)==0xFFFFFFFF){//handle timer overflow
+    //myled1=!myled1;
+    runAtTime (schedFunc,&currentTime);        
+    LPC_TIM1->IR = 1<<0;
+    }
+    
+    if((LPC_TIM1->IR|0xFFFFFFFD)==0xFFFFFFFF){//trigger function at specific time
+    myled2=!myled2;
+    
+    LPC_TIM1->IR = 1<<1;
+    }
+
+}
+
+void schedFunc(void){
+    
+     runTime=*myQueue.Delete();
+     triggerTime=runTime.usec;
+     setTimeval(&currentTime);
+     myled1=!myled1;
+}
+void runAtTime(void (*scheFunc)(),struct timeval *tv){
+    (*scheFunc)();
+    LPC_TIM1->MR0=tv->tv_usec*96000;
+}
+void setTimeval(struct timeval *tv){
+    
+    tv->tv_usec=triggerTime;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Dec 04 07:12:45 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/queue.h	Sat Dec 04 07:12:45 2010 +0000
@@ -0,0 +1,112 @@
+#include "mbed.h"
+Serial pc(USBTX, USBRX);
+
+struct _task{
+    unsigned long long int usec;
+    void (*schedFunc)();
+};
+
+
+class PriorityQueue 
+{
+private:
+    struct Node   
+    {
+        struct Node *Previous;
+        _task Data;
+        struct Node *Next;
+    }Current;
+    struct Node *head;  // Pointer to Head
+    struct Node *ptr;   
+        // Pointer for travelling through Queue
+    int NumOfNodes;
+        // Keeps track of Number of nodes
+public:
+    PriorityQueue(void);
+    void Insert(_task * myTask);
+    _task* Delete();
+    void Display(void);
+    ~PriorityQueue(void);
+};
+
+PriorityQueue::PriorityQueue(void)
+{
+    Current.Previous=NULL;
+    Current.Next=NULL;
+    head=&Current;
+    ptr=head;
+}
+
+void PriorityQueue::Insert(_task * myTask)
+{
+    struct Node *newnode;
+    struct Node *traceback;
+    struct Node *backnode; //the node behind traceback
+
+    traceback=ptr;
+    newnode=new Node;
+    newnode->Data.usec=myTask->usec;
+    newnode->Data.schedFunc=myTask->schedFunc;
+    if (ptr->Previous==NULL){
+        head=newnode;
+    }
+    while ((newnode->Data.usec<traceback->Data.usec)&&(traceback->Previous!=NULL)){
+        traceback=traceback->Previous;
+    }
+    if (traceback->Previous==NULL){
+        head=newnode;
+        newnode->Next=traceback;
+    }
+    
+    if (traceback->Next!=NULL){
+        backnode=traceback->Next;
+        newnode->Next=backnode;
+        newnode->Previous=traceback;
+        traceback->Next=newnode;
+        backnode->Previous=newnode;
+    }
+    
+    if(traceback->Next==NULL)
+        {
+            newnode->Next=traceback->Next;
+            traceback->Next=newnode;
+            newnode->Previous=traceback;
+        }
+
+    while(ptr->Next!=NULL){                    
+        ptr=ptr->Next;
+    }    
+    NumOfNodes++;
+}
+
+_task * PriorityQueue::Delete()
+{
+    struct Node *mynode;
+    ptr=head;    
+    mynode=head;
+    head=head->Next;
+    return &mynode->Data;
+}
+
+void PriorityQueue::Display(void)
+{
+    ptr=head;
+    //pc.printf("Priority Queue is as Follows: ");
+    while(ptr!=NULL)
+    {
+        pc.printf ("%lld\r\n",ptr->Data.usec);
+        ptr=ptr->Next;
+    }
+}
+
+PriorityQueue::~PriorityQueue(void)
+{
+    struct Node *temp;                      /* Temporary variable */
+    while(head->Next!=NULL)
+    {
+        temp=head->Next;
+        head=temp;
+    }
+    if(head->Next==NULL)
+        delete head;
+}
\ No newline at end of file