Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:7d55df32c988, committed 2010-12-04
- Comitter:
- linxinda
- Date:
- Sat Dec 04 07:12:45 2010 +0000
- Commit message:
- HW3B Part1 runAtTrigger
Changed in this revision
--- /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(¤tTime);
+ SetupTimer1(¤tTime);
+ //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,¤tTime);
+ LPC_TIM1->IR=63;
+}*/
+
+void Timer1_IRQHandler(void)
+{
+ if((LPC_TIM1->IR|0xFFFFFFFE)==0xFFFFFFFF){//handle timer overflow
+ //myled1=!myled1;
+ runAtTime (schedFunc,¤tTime);
+ 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(¤tTime);
+ 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