I am calling OSTimer in TIMER1A interrupt service. The problem is if I add another task with some delay, let say OS_Delay(250) again. At this point strange things happen. Either the second task never runs, or the system resets to the beginning (first line of main loop). Regardless of the priorities I set on the two tasks, I never have switching between the two tasks.
Below is my code posted:
code:
salvocfg.h
#define OSUSE_LIBRARY TRUE
#define OSLIBRARY_TYPE OSF
#define OSLIBRARY_CONFIG OSA
#define OSEVENTS 2
#define OSEVENT_FLAGS 0
#define OSMESSAGE_QUEUES 0
#define OSTASKS 2
void TempInit(void){
OSCreateTask(TempTask, TASK_TEMP, PRIO_TEMP);
no_temp_comp = 0;
temp_calc = 0;
}TASK1
void TempTask(void) {
while(1){
sensor_voltage = (double)(temp_sum)/50;
}
//OS_Yield();
OS_Delay(50);
}
}
TASK2void LedInit(void){
OSCreateTask(LedTask, TASK_LED, PRIO_LED);
ucModeCharge = FLASH;
ucModeError = FLASH;
}
////////////////////////////////////////////////////////////////////////////////
void SetChargeLed(unsigned char ucMode){
ucModeCharge = ucMode;
}
////////////////////////////////////////////////////////////////////////////////
void SetErrorLed(unsigned char ucMode){
ucModeError = ucMode;
}
////////////////////////////////////////////////////////////////////////////////void LedTask(void){
while(1){
bTogleLed ^= 1;
switch(ucModeCharge){
case OFF:
CLED_CHARGE(OFF);
break;
case FLASH:
CLED_CHARGE(bTogleLed);
break;
default :
CLED_CHARGE(ON);
break;
}
switch(ucModeError){
case OFF:
ELED(OFF);
break;
case FLASH:
ELED(bTogleLed);
break;
case ON:
ELED(ON);
break;
default:
break;
}
OS_Delay(250);
//OS_Yield();
}
}
INTERRUPTS#pragma vector=TIMER1_A1_VECTOR
__interrupt void OS_tick(void) {
OSTimer();
TA1CTL &= ~TAIFG;
}void OSEnableHook(void){
//TA1CTL = s;
TA1CTL |= TAIE;
}
void OSDisableHook(void){
//istate t = TA1CTL; /* get timer1 interrupt status */
TA1CTL &= ~TAIE; /* disable timer1 interrupt */
//s=t; /* save interrupt status */
}
MAINvoid main(void)
{
__disable_interrupt();
init();
configADC();
OSInit();TempInit();
LedInit();
__enable_interrupt();
while(1){
OSSched();
}
}
[This message has been edited by aek (edited January 23, 2009).]