⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 realtime.c

📁 DM642 ti c6000 多任务/ 中断使用示例
💻 C
字号:
/******************************************************************************

* FILENAME: REALTIME.C

*

* Real-time tutorial code 

*

* This file should be used in conjunction with the realtime.pjt project 

*

* It consists of a loop which performs an FIR filter and three interrupt

* service routines (ISRs). Of the three ISRs, one is not time-critical

* (ISR3) and can be held off indefinitely. Another, ISR1, is extremely

* time-critical and must be serviced, even while in another ISR. ISR2

* is time-critical, but will not preempt ISR1.

*

*     Code              Priority        Background/foreground  Interruptible?

*     ---------         --------------  ---------------------  --------------

*     main loop         lowest          background             Yes

*     ISR3              second lowest   background             Yes

*     ISR2              second highest  foreground             Yes

*     ISR1              highest         foreground             No

* 

******************************************************************************/

/*------------------------------------------------------------------------------*/

/* CSL/RTS includes                                                             */

/*------------------------------------------------------------------------------*/



#include <csl.h>

#include <csl_irq.h>

#include <csl_timer.h> 

#include "realtime.h"

#include "c6x.h"



unsigned int timer0value=0;

unsigned int timer1value=0;

unsigned int timer2value=0;



void SetupInterrupts(void);

void ConfigureAllTimers(void);



/*----------------------------------------------------------------------------

* Global variables which monitor interrupt service routine (ISR) activity.

*----------------------------------------------------------------------------*/

typedef enum { NoIsrActive, Isr1Active, Isr2Active, Isr3Active} ISR_LIST;

static volatile ISR_LIST WhatIsrActive = NoIsrActive;



static volatile uint32 Isr0 = 0;

static volatile uint32 Isr1 = 0;

static volatile uint32 Isr2 = 0;



/*-----------------------------------------------------------------------------

* Global variables used by main loop

*----------------------------------------------------------------------------*/

#define FIR_TAPS            16

const int16 AvgFirCoeff[FIR_TAPS] =

{

    2048,   2048,   2048,   2048,

    2048,   2048,   2048,   2048,

    2048,   2048,   2048,   2048,

    2048,   2048,   2048,   2048,    

};



void intConfig(void);

                     

/*--------------------------------------------------------------------------*/

/* Initialize CSL and open the next available DMA channel for data transfer */

/*--------------------------------------------------------------------------*/ 

int main(void)

{

    volatile int KeepRunning = 1;

    static int16 x[FIR_TAPS];

    int i;            

    

    CSL_init(); 

    ConfigureAllTimers();

    

    for (i = 0; i < FIR_TAPS; i++)

        x[i] = 0;

        

    /*---- Setting up interrupts is processor-specific ------------------*/

    SetupInterrupts();

    

    

    /*---- When we're not taking interrupts, perform an FIR -----------------*/

    while ( KeepRunning )       /* Run until the user sets KeepRunning to 0  */

    {

        int16 Result;

        

        x[0] = InputData();

        Result = Fir32(x, AvgFirCoeff) >> 15;

        

        OutputData(Result);

    }

    return 0;

}



/*-----------------------------------------------------------------------------

* int16 InputData(void)

*

* Pretend to input data from some external source like an A/D, but actually

* just generate it randomly. Note that this function is not re-enterant.

*----------------------------------------------------------------------------*/

int16 InputData(void)

{

    static int16 Seed = 21845;

    

    return ( PseudoRand16(&Seed) );

}



/*-----------------------------------------------------------------------------

* void OutputData(int16 Data)

*

* Pretend to output data to some external source like a D/A, but actually

* just write it to an on-chip memory location.

*----------------------------------------------------------------------------*/

static int16 OutputDataMem;

volatile int16 * OutputDataPtr = &OutputDataMem;

void OutputData(int16 Data)

{

    *OutputDataPtr = Data;

}



/*-----------------------------------------------------------------------------

* int32 Fir32(int16 x[], int16 coeff[])

*

* Calculate the Finite Impulse Response (FIR)

* The GUARD_BITS should be integer(ln(TAPS)/ln(2))

*----------------------------------------------------------------------------*/

const int GUARD_BITS = 4;

int32 Fir32(int16 x[], const int16 coeff[])

{

    int32 sum;

    int i;



    i = FIR_TAPS - 1;

    sum = ( (int32)x[i] * (int32)coeff[i] ) >> GUARD_BITS;

    for (i-- ; i >= 0; i--)

    {

        sum += ( (int32)x[i] * (int32)coeff[i] ) >> GUARD_BITS;

        x[i+1] = x[i];

    }

    return ( sum );

}



/*-----------------------------------------------------------------------------

* int16 PseudoRand(void)

*

* Use a linear congruential psuedo random generator, which is very fast.

* The basic calculation is:

* Rndnum(n) = (  (Rndnum(n-1) * MULT) + INC  ) modulo M

*  MULT is determined by number theory that I don't pretend to understand,

*  but supposedly the last 3 digits (in decimal) 821, 621, 421, or 221.

*  INC is a prime number.

*  A good initial seed value (i.e. Rndnum(0) is 21845, which is just 65535

*  divided by 3.

*----------------------------------------------------------------------------*/

const int16 Mult = 31821;

const int16 Inc = 13849;

int16 PseudoRand16(int16 * Seed)

{

    *Seed = (  (int32)*Seed * Mult + Inc ) & 0xFFFF;

    return (*Seed);

}





/*-----------------------------------------------------------------------------

* void PerformIsr1(void)

*

* Indicate that Isr1 is being performed, and increment the number of times

* it has been performed. Every so often, take a longer time than normal

* to introduce some variability into the system timing.

*----------------------------------------------------------------------------*/



interrupt void

PerformIsr1(void)

{

    WhatIsrActive = Isr1Active;

    Isr0++;

    if ((Isr0 % 8) == 0)

        TakeALongTime();

    WhatIsrActive = NoIsrActive;

    timer0value++;

}



/*-----------------------------------------------------------------------------

* void PerformIsr2(void)

*

* Indicate that Isr2 is being performed, and increment the number of times

* it has been performed. Every so often, take a longer time than normal

* to introduce some variability into the system timing.

*----------------------------------------------------------------------------*/



interrupt void

PerformIsr2(void)

{

    WhatIsrActive = Isr2Active;

    Isr1++;

    if ((Isr1 % 8) == 0)

        TakeALongTime();

    WhatIsrActive = NoIsrActive;

    timer1value++;

}



/*-----------------------------------------------------------------------------

* void PerformIsr3(void)

*

* Indicate that Isr3 is being performed, and increment the number of times

* it has been performed. Every so often, take a longer time than normal

* to introduce some variability into the system timing.

*----------------------------------------------------------------------------*/



interrupt void

PerformIsr3(void)

{

    WhatIsrActive = Isr3Active;

    Isr2++;

    if ((Isr2 % 8) == 0)

        TakeALongTime();

    WhatIsrActive = NoIsrActive;

    timer2value++;

}



/*-----------------------------------------------------------------------------

* void TakeALongTime(void)

*

* This function does nothing useful - it just wastes time.

*----------------------------------------------------------------------------*/

void TakeALongTime(void)

{

    volatile uint16 Output;

    uint16 i;

    

    for (i = 0; i < 0x1; i++)

        Output = i;

}



/* ----------------------------------------------------------------------*/

/*           Copyright (C) 2001 Texas Instruments Incorporated.          */

/*                           All Rights Reserved                         */

/*-----------------------------------------------------------------------*/



void SetupInterrupts(void)

{

    IRQ_resetAll();                       /* Reset all maskable interrupts  */

  	IRQ_enable(IRQ_EVT_TINT0);            /* Enable timer0 -> CPU interrupt */

    IRQ_enable(IRQ_EVT_TINT1);            /* Enable timer1 -> CPU interrupt */

    IRQ_map(IRQ_EVT_TINT2,13);            /* Enable timer2 -> CPU interrupt */

    IRQ_enable(IRQ_EVT_TINT2);            /* Enable timer1 -> CPU interrupt */

    IRQ_nmiEnable();                      /* Enable non-maskable interrupt  */

    IRQ_globalEnable();                   /* Globally enable all interrupts */

} /* end SetupInterrupts() */



void ConfigureAllTimers(void)

{

    TIMER_Handle timer0;

    TIMER_Handle timer1;

    TIMER_Handle timer2;

    

    timer0 = TIMER_open(TIMER_DEV0,0);

    TIMER_configArgs( timer0, 0x000002c0, 0x01000, 0x00000000);

    

    timer1 = TIMER_open(TIMER_DEV1,0);

    TIMER_configArgs( timer1, 0x000002c0, 0x00100, 0x00000000);

    

    timer2 = TIMER_open(TIMER_DEV2,0);

    TIMER_configArgs( timer2, 0x000002c0, 0x10000, 0x00000000);  

} /* end ConfigureAllTimers() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -