# include <stc8h.h>
# include <intrins.h>
# define MAX_TASKS 2
# define MAX_TASK_DEP 32 unsigned char idata task_sp[ MAX_TASKS] ;
unsigned char idata task_stack[ MAX_TASKS] [ MAX_TASK_DEP] ;
unsigned char task_id;
typedef enum { TASK_RUNNING, TASK_SUSPENDED
} TaskStatus; typedef struct { unsigned char id; TaskStatus status; unsigned int delay_count; unsigned int delay_duration;
} Task ; Task idata tasks[ MAX_TASKS] = { { 0 , TASK_RUNNING, 0 , 0 } , { 1 , TASK_RUNNING, 0 , 0 } ,
} ; void Timer0_init ( void ) ;
void sleep ( unsigned int , unsigned int ) ; void sleep ( unsigned int task_id , unsigned int delay_ms) { tasks[ task_id] . status = TASK_SUSPENDED; tasks[ task_id] . delay_count = 0 ; tasks[ task_id] . delay_duration = delay_ms; } void Timer0_init ( ) { AUXR |= 0x80 ; TMOD &= 0xF0 ; EA = 1 ; ET0 = 1 ; TR0 = 1 ; TL0 = 0x40 ; TH0 = 0xA2 ; } void Delay1000ms ( )
{ unsigned char i, j, k; _nop_ ( ) ; _nop_ ( ) ; i = 122 ; j = 193 ; k = 128 ; do { do { while ( -- k) ; } while ( -- j) ; } while ( -- i) ;
}
void task_switch ( ) { task_sp[ task_id] = SP; task_id = task_id + 1 ; if ( task_id == MAX_TASKS) { task_id = 0 ; } SP = task_sp[ task_id] ;
} void task0 ( ) { P5M0 = 0x00 ; P5M1 = 0x00 ; P53 = 1 ; while ( 1 ) { if ( tasks[ 0 ] . status == TASK_SUSPENDED) { task_switch ( ) ; continue ; } sleep ( 0 , 1000 ) ; P53 = ~ P53; task_switch ( ) ; }
} void task1 ( ) { P4M1 = 0x00 ; P4M0 = 0x00 ; P2M1 = 0x00 ; P2M0 = 0x00 ; P27 = 0 ; while ( 1 ) { if ( tasks[ 1 ] . status == TASK_SUSPENDED) { task_switch ( ) ; continue ; } sleep ( 1 , 1000 ) ; P27 = ~ P27; task_switch ( ) ; }
} void Timer0_ISR ( void ) interrupt 1 { unsigned char i; for ( i = 0 ; i< MAX_TASKS; i++ ) { if ( tasks[ i] . status == TASK_SUSPENDED) { tasks[ i] . delay_count++ ; } if ( tasks[ i] . delay_count >= tasks[ i] . delay_duration) { tasks[ i] . status = TASK_RUNNING; tasks[ i] . delay_count = 0 ; } } } void Timer1_Init ( void )
{ AUXR |= 0x40 ; TMOD &= 0x0F ; TL1 = 0xA0 ; TH1 = 0xF6 ; TF1 = 0 ; TR1 = 1 ;
} void Timer1_ISR ( void ) interrupt 3 { task_switch ( ) ;
}
void task_load ( unsigned int fn, unsigned char tid) { task_sp[ tid] = task_stack[ tid] + 1 ; task_stack[ tid] [ 0 ] = fn& 0xff ; task_stack[ tid] [ 1 ] = fn>> 8 ;
} void main ( ) { Timer0_init ( ) ; Timer1_Init ( ) ; task_load ( task0, 0 ) ; task_load ( task1, 1 ) ; task_id = 0 ; SP = task_sp[ 0 ] ;
}