On Tue, Sep 4, 2012 at 11:52 AM, JMGross <msp...@grossibaer.de> wrote:
> ----- Ursprüngliche Nachricht -----
>>True, but that won't matter.  Compilers do not usually track the state
>>of status bits over a longer range than one instruction pattern.
>
> There's more in the status register than just the status bits.
> There are the LPM bits too. Besides CPUOFF, which is of
> course never set when the CPU is running, there is the control
> for XT1 or DCO. And in 3x/5x family, one of them controls the FLL.
> Just overwriting the status register may unintendedly reactivate the
> FLL, that might have been deactivated inside the atomic block,
> with desastrous results. And the others might have impact on
> current consumption.
> Well, one could declare it as a coding bug to deactivate the FLL inside
> an atomic block, but I prefer not creating dependencies where I can avoid it.
> And if the atomic block is a timing calibration function, it might be
> necessary.
>
> How does the latest MCPGCC handle this on funcitons with critical
> attribute?

The "critical" function attribute in mspgcc saves and restores the
entire status register.  Any changes within the function are
discarded.  Use of "biX_status_register_on_exit()" may or may not
work; I haven't tried it, and wouldn't count on it if it did.

As you point out, there are reasons why somebody might want to control
SCG0, and the fact that __set_interrupt_status() might overwrite that
is a concern.  When implementing the intrinsic I asked on E2E how it
behaved on other platforms, and was told it restored all the bits.  I
considered alternatives that would save only GIE, but decided that
doing so wasn't worth the hassle and loss in performance and
compatibility.  Besides, a benefit of explicitly using
__set_interrupt_status() and __get_interrupt_status() is that the
application gets full control of what bits are restored.  Any
intentional changes to the live status register can be replicated in
the saved state before restoring it.  (Though really, if you're going
to play those games, you should probably use __read_status_register()
and __write_status_register() instead; it's unfortunate that IAR and
CCS chose a name that implies only the interrupt status is
manipulated.)

In the MSP430 infrastructure environment I'm developing (both
standalone and for FreeRTOS) I allow the application to control what
bits are cleared on LPM exit, and ensure any infrastructure routines
such as ISRs that manipulate the status register don't clear SCG0 when
they shouldn't.  This was specifically a result of the severity of the
UCS errata in the 5xx family and the importance of controlling FLL
behavior via SCG0 to avoid them.

Peter

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to