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);
…
}