summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/ao_task.c11
-rw-r--r--src/core/ao_task.h1
2 files changed, 10 insertions, 2 deletions
diff --git a/src/core/ao_task.c b/src/core/ao_task.c
index 0411fbdd..9cb074b5 100644
--- a/src/core/ao_task.c
+++ b/src/core/ao_task.c
@@ -305,6 +305,8 @@ ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *nam
);
}
+__data uint8_t ao_task_minimize_latency;
+
/* Task switching function. This must not use any stack variables */
void
ao_yield(void) ao_arch_naked_define
@@ -331,7 +333,12 @@ ao_yield(void) ao_arch_naked_define
}
ao_arch_isr_stack();
- ao_arch_block_interrupts();
+#if !HAS_TASK_QUEUE
+ if (ao_task_minimize_latency)
+ ao_arch_release_interrupts();
+ else
+#endif
+ ao_arch_block_interrupts();
#if AO_CHECK_STACK
in_yield = 1;
@@ -374,7 +381,7 @@ ao_yield(void) ao_arch_naked_define
break;
/* Wait for interrupts when there's nothing ready */
- if (ao_cur_task_index == ao_last_task_index)
+ if (ao_cur_task_index == ao_last_task_index && !ao_task_minimize_latency)
ao_arch_wait_interrupt();
}
}
diff --git a/src/core/ao_task.h b/src/core/ao_task.h
index 049f69a7..50bfb220 100644
--- a/src/core/ao_task.h
+++ b/src/core/ao_task.h
@@ -47,6 +47,7 @@ struct ao_task {
extern __xdata struct ao_task * __xdata ao_tasks[AO_NUM_TASKS];
extern __data uint8_t ao_num_tasks;
extern __xdata struct ao_task *__data ao_cur_task;
+extern __data uint8_t ao_task_minimize_latency; /* Reduce IRQ latency */
/*
ao_task.c