ADC12IV is only 1 example of the usage of the interrupt vecor table. For the msp43054xx cases, every single interrupt has a similar interrupt vector register often with numerous subconditions (valid case statements). Adding support for effeiciently producing these interrupt vector tables would be very useful in C would be very useful.

For example on the DMA interrupt, the DMAIV is set based on which channel is triggered:

from slau208e.pdf  (msp4305xx Family Guide)


7.3.10 DMA Interrupt Vector Register (DMAIV)
DMAIV Bits 15-0 DMA interrupt vector value
DMAIV Interrupt Source Interrupt Flag Interrupt Contents Priority
00h No interrupt pending
02h DMA channel 0 DMA0IFG Highest
04h DMA channel 1 DMA1IFG
06h DMA channel 2 DMA2IFG
08h DMA channel 3 DMA3IFG
0Ah DMA channel 4 DMA4IFG
0Ch DMA channel 5 DMA5IFG
0Eh DMA channel 6 DMA6IFG
10h DMA channel 7 DMA7IFG Lowest

The example usage taken from msp430x54x_dma_04.c in the code examples shows an interrupt handler like this:

#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
  switch(__even_in_range(DMAIV,16))
  {
    case 0: break;
    case 2:                                 // DMA0IFG = DMA Channel 0
      P1OUT ^= BIT0;                        // Toggle P1.0
      break;
    case 4: break;                          // DMA1IFG = DMA Channel 1
    case 6: break;                          // DMA2IFG = DMA Channel 2
    case 8: break;                          // DMA3IFG = DMA Channel 3
    case 10: break;                         // DMA4IFG = DMA Channel 4
    case 12: break;                         // DMA5IFG = DMA Channel 5
    case 14: break;                         // DMA6IFG = DMA Channel 6
    case 16: break;                         // DMA7IFG = DMA Channel 7
    default: break;
  }


Obviously if more than 1 DMA channel is used, then more then 1 case statement is required.



Paul F. Sehorne wrote:
Sergey, thanks for your explanation.

I understand the goal of __even_in_range. I saw in the IAR disassembled code what it accomplishes. And I understand the need if the switch statement actually had 34 case statements, but in this code there is only one case statement. So, other than for educational reasons, I don't see the value of spending my time trying to figure out how to write the equivalent routine.

I did write a routine that confirms (at runtime) that the passed in value is in range and is even (lsb is 0); in which case the value is just passed back to the program, and if it does not meet these criterion zero is passed back (again, at runtime). I could further improve this routine by moving the code in the one lone case statement into the assembler routine. And I would like to revisit this function at a later date, for educational reasons and to eventually have an __even_in_range function when needed for multiple case statements. But for the time being I am content to move on to other more pressing issues that are holding up the completion of my port of the eZChronos firmware to mspgcc4.

If I am making a mistake by passing on this for the moment, please point it out to me.

Paul


On 6/14/2010 4:38 AM, Sergey A. Borshch wrote:
On 14.06.2010 5:50, Paul F. Sehorne wrote:
I wrote an assembly routine to emulate the intrinsic function
__even_in_range, and although it might work I doubt that it accomplishes anything significant.
This function ensures the compiler that it's first argument is always even and always in range [0...second argument]. So compiler allowed to generate case as
efficient table jump without additional checking of switch() statement.
And nothing more. You can just replace
switch(__even_in_range(ADC12IV,34))
to
switch(ADC12IV).

------------------------------------------------------------------------

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
lucky parental unit.  See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo
------------------------------------------------------------------------

_______________________________________________
Mspgcc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to