ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
44106
Valdis (15.11.2005 14:33, просмотров: 2498)
Неконтролируемый доступ к переменной Помогите решить проблему. В теле обработчика прерывания происходит накопление переменной angle на величину delta=10. Переменная angle обьявлена как внешняя. Но явный доступ к ней осуществляется только в теле вышеупомянутого обрабочика. Переменная инкрементируется как и ожидается, но в какой-то момент изменяет свое значение случайным образом. Возможно где-то параллельный процесс, модифицирующий ее.
#include 
#include 
#define f0 2
#define fclk 30000
#define angle_max 8160

unsigned int delta=0;
unsigned int quarter=0;
unsigned int volatile angle;

main()
{

  FLL_CTL0=DCOPLUS+XCAP18PF;        //?????????
  SCFI0=FLLD_4+FN_3;            //?????
  SCFQCTL=SCFQ_4M;           //????????????

  FLL_CTL1=SELM_XT2;

  void delay ();
  void init_timerB();
  int f;
  f=20;
  delta=f/f0;


  init_timerB();
  delay();
}

void init_timerB(void)
{
  WDTCTL = WDTPW + WDTHOLD;             //Stop watchdog timer

  TBCCR0=0x3FF;
  //TBCCTL0=CCIE;
  TBCTL =  TBSSEL_2 + MC_3 + TBCLR+ID_1+TBIE;
  TBCCTL1=OUTMOD_6;//+CCIE;


  P1SEL=0x12;   //output SMCLK and MCLK
  P1DIR=0x12;   //  for oscilloscope

  P2SEL=0x0C;
  P2DIR=0x0C;
     _EINT();
}

 void delay ()
        {
           for (;;);
        }

#pragma vector=TIMERB1_VECTOR          //?????? ??????????-??????????? ???-??????
__interrupt void TIMERB1_ISR(void)
{
extern unsigned int delta;
extern unsigned int volatile angle;
extern unsigned int quarter;
unsigned int loc;
extern const unsigned int Sine_table[];
extern const unsigned int * Sine_ptr;

 if (TBIV==0x0E)
 {
      switch (quarter)
      {
        case 0:

            if(angle>angle_max)
            {
              quarter=1;
              angle-=delta;
            }
            else
              //angle+=delta;   //?????????? ???????? ??? ??????? ???????
              asm("ADD &delta,&angle");
        break;

        case 1:
            if(angle==0)
            {
              quarter=0;
              angle+=delta;
            }

            else
              angle-=delta;   //?????????? ???????? ??? ??????? ???????
        break;

        default:break;

      }

        loc = angle;
        loc=loc>>8;                  //???????? ??????? ???? ? ?????????? ??? ????????
        Sine_ptr=&Sine_table[0]+loc;  //? ???????? ?????????
        //TBCCR1=*Sine_ptr;

  }

}