Just to try whether is it posible to call rtostimer::start()/stop() from an ISR. The answer seems to be NO.

Dependencies:   mbed-rtos mbed

Fork of boton_ISR by Carlos López Molina

Committer:
CarlosKitu
Date:
Tue Jan 03 13:49:43 2017 +0000
Revision:
0:005ae170e5f9
Child:
1:fc92ede355c4
pruebas de boton isr y activar rtostimer.start(), que no funciona dentro de ISR

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CarlosKitu 0:005ae170e5f9 1 #include "mbed.h"
CarlosKitu 0:005ae170e5f9 2 #include "rtos.h"
CarlosKitu 0:005ae170e5f9 3
CarlosKitu 0:005ae170e5f9 4 DigitalOut myled(LED1);
CarlosKitu 0:005ae170e5f9 5 Serial pc(SERIAL_TX, SERIAL_RX);
CarlosKitu 0:005ae170e5f9 6
CarlosKitu 0:005ae170e5f9 7 volatile int contador_timer = 0;
CarlosKitu 0:005ae170e5f9 8 volatile int estado_timer = 0;
CarlosKitu 0:005ae170e5f9 9 RtosTimer * timer;
CarlosKitu 0:005ae170e5f9 10
CarlosKitu 0:005ae170e5f9 11 class Counter {
CarlosKitu 0:005ae170e5f9 12 public:
CarlosKitu 0:005ae170e5f9 13 Counter(PinName pin) : _interrupt(pin) { // create the InterruptIn on the pin specified to Counter
CarlosKitu 0:005ae170e5f9 14 _interrupt.rise(this, &Counter::increment); // attach increment function of this counter instance
CarlosKitu 0:005ae170e5f9 15 _interrupt.mode(PullUp);
CarlosKitu 0:005ae170e5f9 16 }
CarlosKitu 0:005ae170e5f9 17
CarlosKitu 0:005ae170e5f9 18 void increment() {
CarlosKitu 0:005ae170e5f9 19 _count++;
CarlosKitu 0:005ae170e5f9 20
CarlosKitu 0:005ae170e5f9 21 if(estado_timer==0)
CarlosKitu 0:005ae170e5f9 22 {
CarlosKitu 0:005ae170e5f9 23 myled = 1 - myled;
CarlosKitu 0:005ae170e5f9 24 ;
CarlosKitu 0:005ae170e5f9 25 timer->start(1000);
CarlosKitu 0:005ae170e5f9 26 }
CarlosKitu 0:005ae170e5f9 27 else{
CarlosKitu 0:005ae170e5f9 28 timer->stop();
CarlosKitu 0:005ae170e5f9 29 myled = 1 - myled;
CarlosKitu 0:005ae170e5f9 30 }
CarlosKitu 0:005ae170e5f9 31 estado_timer = 1 - estado_timer;
CarlosKitu 0:005ae170e5f9 32 }
CarlosKitu 0:005ae170e5f9 33
CarlosKitu 0:005ae170e5f9 34 int read() {
CarlosKitu 0:005ae170e5f9 35 return _count;
CarlosKitu 0:005ae170e5f9 36 }
CarlosKitu 0:005ae170e5f9 37
CarlosKitu 0:005ae170e5f9 38 private:
CarlosKitu 0:005ae170e5f9 39 InterruptIn _interrupt;
CarlosKitu 0:005ae170e5f9 40 volatile int _count;
CarlosKitu 0:005ae170e5f9 41 };
CarlosKitu 0:005ae170e5f9 42
CarlosKitu 0:005ae170e5f9 43 void tick(void const * arg){
CarlosKitu 0:005ae170e5f9 44 contador_timer += 1;
CarlosKitu 0:005ae170e5f9 45 //myled = 1 - myled;
CarlosKitu 0:005ae170e5f9 46 }
CarlosKitu 0:005ae170e5f9 47
CarlosKitu 0:005ae170e5f9 48
CarlosKitu 0:005ae170e5f9 49 Counter counter(PC_9); // Boton azul
CarlosKitu 0:005ae170e5f9 50
CarlosKitu 0:005ae170e5f9 51
CarlosKitu 0:005ae170e5f9 52 int main() {
CarlosKitu 0:005ae170e5f9 53
CarlosKitu 0:005ae170e5f9 54 myled = 1;
CarlosKitu 0:005ae170e5f9 55 timer = new RtosTimer(tick, osTimerPeriodic, (void *) 0);
CarlosKitu 0:005ae170e5f9 56 //timer->start(1000);
CarlosKitu 0:005ae170e5f9 57
CarlosKitu 0:005ae170e5f9 58 while(1){
CarlosKitu 0:005ae170e5f9 59 //wait(1);
CarlosKitu 0:005ae170e5f9 60 Thread::wait(2100);
CarlosKitu 0:005ae170e5f9 61 //if (counter.read()==2) timer->start(1000);
CarlosKitu 0:005ae170e5f9 62 //if (counter.read()==10) timer->stop();
CarlosKitu 0:005ae170e5f9 63 //pc.printf("bucle princ %i\r\n", counter.read());
CarlosKitu 0:005ae170e5f9 64 pc.printf("bucle princ. contador_timer: %i contador_boton %i\r\n", contador_timer, counter.read());
CarlosKitu 0:005ae170e5f9 65 //myled = 1 - myled;
CarlosKitu 0:005ae170e5f9 66 }
CarlosKitu 0:005ae170e5f9 67 }
CarlosKitu 0:005ae170e5f9 68
CarlosKitu 0:005ae170e5f9 69
CarlosKitu 0:005ae170e5f9 70