summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-10-16 12:59:53 +0900
committerKeith Packard <keithp@keithp.com>2009-10-16 12:59:53 +0900
commitb657aa209b9ea3b3efd33a940283b3ba60a169af (patch)
treeb1803da45a1413a3758965fedaa554aac636a9dd /src
parentd709a0688eff84e25e24d755850ef045d6b0c3de (diff)
Add ao_wake_task and ao_exit
ao_wake_task signals a specific task to wake up. ao_exit terminates the current task. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
-rw-r--r--src/ao.h8
-rw-r--r--src/ao_task.c22
2 files changed, 29 insertions, 1 deletions
diff --git a/src/ao.h b/src/ao.h
index b6862a87..13271109 100644
--- a/src/ao.h
+++ b/src/ao.h
@@ -63,6 +63,10 @@ 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);
+
/* Yield the processor to another task */
void
ao_yield(void) _naked;
@@ -71,6 +75,10 @@ ao_yield(void) _naked;
void
ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
+/* Terminate the current task */
+void
+ao_exit(void);
+
/* Dump task info to console */
void
ao_task_info(void);
diff --git a/src/ao_task.c b/src/ao_task.c
index 12b73943..136444b0 100644
--- a/src/ao_task.c
+++ b/src/ao_task.c
@@ -93,7 +93,9 @@ ao_yield(void) _naked
push _bp
_endasm;
- if (ao_cur_task_index != AO_NO_TASK_INDEX)
+ 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;
@@ -199,6 +201,24 @@ ao_wakeup(__xdata void *wchan)
}
void
+ao_wake_task(__xdata struct ao_task *task)
+{
+ task->wchan = NULL;
+}
+
+void
+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();
+ /* we'll never get back here */
+}
+
+void
ao_task_info(void)
{
uint8_t i;