Damn I got schooled, hahaha…

Thanks for pointing this out, otherwise I might have used it and lost hours 
debugging…

---------------------------------------
Sergio Campamá
sergiocamp...@gmail.com




On Dec 5, 2011, at 9:22 PM, Eric Decker wrote:

> 
> 
> On Mon, Dec 5, 2011 at 4:05 PM, Sergio Campamá <scamp...@ing.puc.cl> wrote:
> Hello Wayne,
> 
> The only difference between LPM3 and LPM4 is that the ACLK is stopped in 
> LPM4, so moving onto LPM3 won't solve your problem. What is the P1.1 
> connected to? If you wanted to wake the system up from LPM4 when there is an 
> interrupt on P1.1, you could do this: (I believe that you want to sleep only 
> if the pin is down)
> 
> void function(){
>        P1IES &= BIT1;
>        P1IFG &= BIT1;
>        P1IE |= BIT1;
> 
> 
>        while(1){
>                sleep_if_down()
>                //do work
>        }
> }
> 
> __attribute__((critical)) void sleep_if_down(){
>        if(! P1IN && BIT1){
>                LPM4();
>        }
> }
> 
> interrupt(PORT1_VECTOR) PORT1_ISR(){
>        //wake up from LPM4
>        P1IFG &= BIT1;
>        _BIC_SR_IRQ(LPM4_bits);
> }
> 
> What this does is that it checks if the P1.1 is down, if it is, it enters 
> LPM4. Now, the __attribute__((critical)) part tells the compiler (I learned 
> this in this mailing-list) to disable interrupts while in the function. So 
> you won't handle the interrupt until after the comparison is made.
> 
> Have you looked explicitly at the code generated for the above?
> 
> If I understand critical correctly, it basically disables interrupts  during 
> the routine.   Which means that when you go asleep (LPM4) interrupts will be 
> disabled and the cpu goes away forever because it can't take the Port1 
> interrupt.
> 
> I believe you have to have interrupts enabled when you do the LPM4.   Which 
> gets back to Wayne's critical region/race condition issue.
> 
> 
> eric
> 
> 
> 
> You don't have to setup the IE and IES all the time, just the first time, 
> that's why I took it out of the while, and the IFG gets cleared in the 
> interrupt vector, no need to do it again.
> 
> I hope this helps. Best regards,
> ---------------------------------------
> Sergio Campamá
> sergiocamp...@gmail.com
> 
> 
> 
> 
> On Dec 5, 2011, at 8:40 PM, Wayne Uroda wrote:
> 
> > I have a question which isn't technically related to MSPGCC (more of a 
> > msp430 question) but I thought one of you smart people might know.
> >
> > Imagine the following scenario:
> >
> > /* 1*/        while (1)
> > /* 2*/        {
> > /* 3*/                if (!port1.in.pin1)
> > /* 4*/                {
> > /* 5*/                        // Enable interrupt (rising edge) for pin 1.1
> > /* 6*/                        port1.ies.pin1 = 0;
> > /* 7*/                        port1.ifg.pin1 = 0;
> > /* 8*/                        port1.ie.pin1 = 1;
> > /* 9*/
> > /*10*/                        // Enter sleep mode, but only if the pin is 
> > still not high
> > /*11*/                        if (!port1.in.pin1)
> > /*12*/                        {
> > /*13*/                                LPM4();
> > /*14*/                        }
> > /*15*/                }
> > /*16*/
> > /*17*/                // Awake
> > /*18*/                // Do real work here
> > /*19*/        }
> >
> > The ISR for port1 interrupt just wakes up the processor from LPM4 and 
> > clears the IFG for pin 1.1.
> >
> > The problem I see is that there is a small window (between the execution of 
> > line 11 and line 13) where pin1.1 can go high, have the ISR handled and the 
> > IFG cleared, and then the system can incorrectly go into LPM4 even though 
> > pin1.1 is high.
> >
> > My thoughts are that the only way around this is to avoid using LPM4 and 
> > poll the state of pin 1.1, which is what I have done in previous designs. 
> > As far as I know there is no way to atomically enter LPM4 and enable 
> > interrupts so that the pending pin1.1 IFG can be handled AFTER entering 
> > LPM4, thus bringing the system out of LPM4.
> >
> > Has anybody come up against this? Is using LPM3 the best/only workaround?
> >
> > I am using 1 family chips, MSP430F148 in particular.
> >
> > Thanks,
> >
> > - Wayne
> >
> > ------------------------------------------------------------------------------
> > All the data continuously generated in your IT infrastructure
> > contains a definitive record of customers, application performance,
> > security threats, fraudulent activity, and more. Splunk takes this
> > data and makes sense of it. IT sense. And common sense.
> > http://p.sf.net/sfu/splunk-novd2d
> > _______________________________________________
> > Mspgcc-users mailing list
> > Mspgcc-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/mspgcc-users
> 
> 
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure
> contains a definitive record of customers, application performance,
> security threats, fraudulent activity, and more. Splunk takes this
> data and makes sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-novd2d
> _______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
> 
> 
> 
> -- 
> Eric B. Decker
> Senior (over 50 :-) Researcher
> 
> 

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure 
contains a definitive record of customers, application performance, 
security threats, fraudulent activity, and more. Splunk takes this 
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to