Accessing variables from ISRs

nobody wrote on Saturday, February 26, 2005:

Is it safe to access global variables that are used by both ISRs and tasks by simply enclosing the access to the variable(s) with enter/exit critical calls? (see method 1)

Or is the proper way to use the method found in tasks.c to get the TickCount? (like method 2)

(Using a PIC - ask me if i’m lovin it - NOT)

Thanks!
Ron.

------------ Method  1 -------------

interrrupts.c

volatile unsigned char ucPeriodDivider = 1;

#pragma interruptlow vIRQfunction save=PRODH, PRODL, section(".tmpdata")
void vIRQfunction (void)
{

     OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_EDGE_RISE & ucPeriodDivider);
…           
}

monitor.c

extern volatile unsigned char ucPeriodDivider;

void vChangeThePeriod(void)
{
     taskENTER_CRITICAL();   
     ucPeriodDivider = 3;
      taskEXIT_CRITICAL();
}

--------------  Method  2 -------------

interrrupts.c

static volatile unsigned char ucPeriodDivider = 1;

#pragma interruptlow vIRQfunction save=PRODH, PRODL, section(".tmpdata")
void vIRQfunction (void)
{

     OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_EDGE_RISE & ucPeriodDivider);
…           
}

void vChangeThePeriod(volatile unsigned char ucPeriod)
{
     taskENTER_CRITICAL();
     ucPeriodDivider = ucPeriod;
     taskEXIT_CRITICAL();
}

monitor.c

extern volatile unsigned char ucPeriodDivider;

void vMonitor(void)
{

     vChangeThePeriod (3);

}

rtel wrote on Sunday, February 27, 2005:

Method 1 is not dangerous from a mutual exclusion point of view.  As long as you are in the critical region the interrupt function cannot touch the variable.