diff options
| author | Keith Packard <keithp@keithp.com> | 2011-08-25 22:55:33 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-08-25 22:57:24 -0700 | 
| commit | 8125acc030574afed6f23aa8aa302d9c768bb04e (patch) | |
| tree | 906aaf22c3674080df89c6e756a0195d2aab2bf9 /src/core/ao_task.c | |
| parent | e9fab7dc99a0e7c22b511c5919adf7df85213252 (diff) | |
altos: get avr-demo to build. Pull in AVR drivers and LCD driver
This completes the basic task of making an AVR version of altos by
getting the Teensy 'avr-demo' program to build.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/core/ao_task.c')
| -rw-r--r-- | src/core/ao_task.c | 99 | 
1 files changed, 24 insertions, 75 deletions
diff --git a/src/core/ao_task.c b/src/core/ao_task.c index 41520476..32826114 100644 --- a/src/core/ao_task.c +++ b/src/core/ao_task.c @@ -24,6 +24,10 @@ __data uint8_t ao_num_tasks;  __data uint8_t ao_cur_task_index;  __xdata struct ao_task *__data ao_cur_task; +#ifdef ao_arch_task_globals +ao_arch_task_globals +#endif +  void  ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant  { @@ -53,27 +57,16 @@ ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *nam  void  ao_yield(void) ao_arch_naked_define  { -	ao_arch_save_context(); +	ao_arch_save_regs();  	if (ao_cur_task_index == AO_NO_TASK_INDEX)  		ao_cur_task_index = ao_num_tasks-1;  	else  	{ -		uint8_t stack_len; -		__data uint8_t *stack_ptr; -		__xdata uint8_t *save_ptr; -		/* Save the current stack */ -		stack_len = SP - (AO_STACK_START - 1); -		ao_cur_task->stack_count = stack_len; -		stack_ptr = (uint8_t __data *) AO_STACK_START; -		save_ptr = (uint8_t __xdata *) ao_cur_task->stack; -		do -			*save_ptr++ = *stack_ptr++; -		while (--stack_len); +		ao_arch_save_stack();  	} -	/* Empty the stack; might as well let interrupts have the whole thing */ -	SP = AO_STACK_START - 1; +	ao_arch_isr_stack();  	/* Find a task to run. If there isn't any runnable task,  	 * this loop will run forever, which is just fine @@ -99,63 +92,20 @@ ao_yield(void) ao_arch_naked_define  			}  			/* Enter lower power mode when there isn't anything to do */ -			if (ao_next_task_index == ao_cur_task_index) -				PCON = PCON_IDLE; +			if (ao_next_task_index == ao_cur_task_index) { +				ao_arch_cpu_idle(); +			}  		}  	} - -	{ -		uint8_t stack_len; -		__data uint8_t *stack_ptr; -		__xdata uint8_t *save_ptr; - -		/* Restore the old stack */ -		stack_len = ao_cur_task->stack_count; -		SP = AO_STACK_START - 1 + stack_len; - -		stack_ptr = (uint8_t __data *) AO_STACK_START; -		save_ptr = (uint8_t __xdata *) ao_cur_task->stack; -		do -			*stack_ptr++ = *save_ptr++; -		while (--stack_len); -	} - -	_asm -		pop		_bp -		pop		PSW -		pop		ar1 -		pop		ar0 -		pop		ar7 -		pop		ar6 -		pop		ar5 -		pop		ar4 -		pop		ar3 -		pop		ar2 -		pop		b -		pop		DPH -		pop		DPL -		/* The next byte of the stack is the IE register.  Only the global -		enable bit forms part of the task context.  Pop off the IE then set -		the global enable bit to match that of the stored IE register. */ -		pop		ACC -		JB		ACC.7,0098$ -		CLR		_EA -		LJMP	0099$ -	0098$: -		SETB		_EA -	0099$: -		/* Finally pop off the ACC, which was the first register saved. */ -		pop		ACC -		ret -	_endasm; +	ao_arch_restore_stack();  }  uint8_t  ao_sleep(__xdata void *wchan)  { -	__critical { +	ao_arch_critical(  		ao_cur_task->wchan = wchan; -	} +		);  	ao_yield();  	ao_cur_task->alarm = 0;  	if (ao_cur_task->wchan) { @@ -186,14 +136,16 @@ ao_alarm(uint16_t delay)  }  void -ao_exit(void) __critical +ao_exit(void)  { -	uint8_t	i; -	ao_num_tasks--; -	for (i = ao_cur_task_index; i < ao_num_tasks; i++) -		ao_tasks[i] = ao_tasks[i+1]; -	ao_cur_task_index = AO_NO_TASK_INDEX; -	ao_yield(); +	ao_arch_critical( +		uint8_t	i; +		ao_num_tasks--; +		for (i = ao_cur_task_index; i < ao_num_tasks; i++) +			ao_tasks[i] = ao_tasks[i+1]; +		ao_cur_task_index = AO_NO_TASK_INDEX; +		ao_yield(); +		);  	/* we'll never get back here */  } @@ -201,16 +153,13 @@ void  ao_task_info(void)  {  	uint8_t	i; -	uint8_t pc_loc;  	__xdata struct ao_task *task;  	for (i = 0; i < ao_num_tasks; i++) {  		task = ao_tasks[i]; -		pc_loc = task->stack_count - 17; -		printf("%12s: wchan %04x pc %04x\n", +		printf("%12s: wchan %04x\n",  		       task->name, -		       (int16_t) task->wchan, -		       (task->stack[pc_loc]) | (task->stack[pc_loc+1] << 8)); +		       (int16_t) task->wchan);  	}  }  | 
