diff options
| author | Keith Packard <keithp@keithp.com> | 2010-11-26 17:39:40 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2010-12-22 20:39:40 -0800 | 
| commit | 484b44e81b655f1ecb48256095382a56d2839bae (patch) | |
| tree | 14446271e5d92b9ea9bee040c7787ba48c616229 /src | |
| parent | 07213dc34fa20470a4b36a327a83d75b0f010ebb (diff) | |
altos: eliminate ao_wake_task
Waking up a task waiting on some random object is a bad idea. Fix
the waiters to look for suitable signalling.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/ao.h | 4 | ||||
| -rw-r--r-- | src/ao_packet.c | 2 | ||||
| -rw-r--r-- | src/ao_packet_master.c | 16 | ||||
| -rw-r--r-- | src/ao_packet_slave.c | 7 | ||||
| -rw-r--r-- | src/ao_radio.c | 7 | ||||
| -rw-r--r-- | src/ao_task.c | 9 | 
6 files changed, 19 insertions, 26 deletions
@@ -69,10 +69,6 @@ ao_sleep(__xdata void *wchan);  void  ao_wakeup(__xdata void *wchan); -/* Wake up a specific task */ -void -ao_wake_task(__xdata struct ao_task *task); -  /* set an alarm to go off in 'delay' ticks */  void  ao_alarm(uint16_t delay); diff --git a/src/ao_packet.c b/src/ao_packet.c index 9896149c..f627e02b 100644 --- a/src/ao_packet.c +++ b/src/ao_packet.c @@ -117,7 +117,7 @@ ao_packet_flush(void)  	 * then poke the master to send all queued data  	 */  	if (ao_packet_tx_used && ao_packet_master_sleeping) -		ao_wake_task(&ao_packet_task); +		ao_wakeup(&ao_packet_master_sleeping);  }  #endif /* PACKET_HAS_MASTER */ diff --git a/src/ao_packet_master.c b/src/ao_packet_master.c index 3b23ad92..0808bc80 100644 --- a/src/ao_packet_master.c +++ b/src/ao_packet_master.c @@ -21,16 +21,13 @@ static char  ao_packet_getchar(void) __critical  {  	char c; -	while ((c = ao_packet_pollchar()) == AO_READ_AGAIN) -	{ +	while ((c = ao_packet_pollchar()) == AO_READ_AGAIN) {  		if (!ao_packet_enable)  			break;  		if (ao_packet_master_sleeping) -			ao_wake_task(&ao_packet_task); +			ao_wakeup(&ao_packet_master_sleeping);  		ao_usb_flush();  		ao_sleep(&ao_stdin_ready); -		if (!ao_packet_enable) -			break;  	}  	return c;  } @@ -41,7 +38,7 @@ ao_packet_echo(void) __reentrant  	uint8_t	c;  	while (ao_packet_enable) {  		c = ao_packet_getchar(); -		if (ao_packet_enable) +		if (c != AO_READ_AGAIN)  			ao_usb_putchar(c);  	}  	ao_exit(); @@ -97,7 +94,8 @@ ao_packet_master(void)  			if (ao_rx_packet.packet.len)  				ao_packet_master_busy();  			ao_packet_master_sleeping = 1; -			ao_delay(ao_packet_master_delay); +			ao_alarm(ao_packet_master_delay); +			ao_sleep(&ao_packet_master_sleeping);  			ao_packet_master_sleeping = 0;  		}  	} @@ -126,8 +124,8 @@ ao_packet_forward(void) __reentrant  		ao_delay(AO_MS_TO_TICKS(100));  	ao_packet_enable = 0;  	while (ao_packet_echo_task.wchan || ao_packet_task.wchan) { -		if (ao_packet_echo_task.wchan) -			ao_wake_task(&ao_packet_echo_task); +		ao_radio_recv_abort(); +		ao_wakeup(&ao_stdin_ready);  		ao_delay(AO_MS_TO_TICKS(10));  	}  } diff --git a/src/ao_packet_slave.c b/src/ao_packet_slave.c index 3040d781..39d04bbb 100644 --- a/src/ao_packet_slave.c +++ b/src/ao_packet_slave.c @@ -44,12 +44,13 @@ ao_packet_slave_stop(void)  {  	if (ao_packet_enable) {  		ao_packet_enable = 0; -		ao_radio_recv_abort();  		while (ao_packet_task.wchan) { -			ao_wake_task(&ao_packet_task); -			ao_yield(); +			ao_radio_recv_abort(); +			ao_delay(AO_MS_TO_TICKS(10));  		} +		ao_radio_get();  		ao_radio_set_telemetry(); +		ao_radio_put();  	}  } diff --git a/src/ao_radio.c b/src/ao_radio.c index 362b73aa..7b7c5161 100644 --- a/src/ao_radio.c +++ b/src/ao_radio.c @@ -377,8 +377,13 @@ ao_radio_recv(__xdata void *packet, uint8_t size) __reentrant  			    DMA_CFG1_PRIORITY_HIGH);  	ao_dma_start(ao_radio_dma);  	RFST = RFST_SRX; + +	/* Wait for DMA to be done, for the radio receive process to +	 * get aborted or for a receive timeout to fire +	 */  	__critical while (!ao_radio_dma_done && !ao_radio_abort) -			   ao_sleep(&ao_radio_dma_done); +			   if (ao_sleep(&ao_radio_dma_done)) +				   break;  	/* If recv was aborted, clean up by stopping the DMA engine  	 * and idling the radio diff --git a/src/ao_task.c b/src/ao_task.c index 72c9d7d6..35f34b49 100644 --- a/src/ao_task.c +++ b/src/ao_task.c @@ -204,12 +204,11 @@ ao_sleep(__xdata void *wchan)  		ao_cur_task->wchan = wchan;  	}  	ao_yield(); +	ao_cur_task->alarm = 0;  	if (ao_cur_task->wchan) {  		ao_cur_task->wchan = NULL; -		ao_cur_task->alarm = 0;  		return 1;  	} -	ao_cur_task->alarm = 0;  	return 0;  } @@ -234,12 +233,6 @@ ao_alarm(uint16_t delay)  }  void -ao_wake_task(__xdata struct ao_task *task) -{ -	task->wchan = NULL; -} - -void  ao_exit(void) __critical  {  	uint8_t	i;  | 
