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.
Diff: main.cpp
- Revision:
- 0:7d55df32c988
diff -r 000000000000 -r 7d55df32c988 main.cpp
--- /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;
+}
+