* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#include "ao.h"
+#include <ao.h>
#define AO_NO_TASK_INDEX 0xff
ao_arch_task_globals
#endif
+#define AO_CHECK_STACK 0
+
+#if AO_CHECK_STACK
+static uint8_t in_yield;
+
+static inline void ao_check_stack(void) {
+ uint8_t q;
+ if (!in_yield && ao_cur_task && &q < &ao_cur_task->stack[0])
+ ao_panic(AO_PANIC_STACK);
+}
+#else
+#define ao_check_stack()
+#endif
+
void
ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant
{
ao_arch_isr_stack();
+#if CHECK_STACK
+ in_yield = 1;
+#endif
/* Find a task to run. If there isn't any runnable task,
* this loop will run forever, which is just fine
*/
}
}
}
+#if CHECK_STACK
+ cli();
+ in_yield = 0;
+#endif
ao_arch_restore_stack();
}
uint8_t
ao_sleep(__xdata void *wchan)
{
- ao_arch_critical(
- ao_cur_task->wchan = wchan;
- );
+ ao_cur_task->wchan = wchan;
ao_yield();
if (ao_cur_task->wchan) {
ao_cur_task->wchan = NULL;
{
uint8_t i;
+ ao_check_stack();
for (i = 0; i < ao_num_tasks; i++)
if (ao_tasks[i]->wchan == wchan)
ao_tasks[i]->wchan = NULL;