summaryrefslogtreecommitdiff
path: root/nuttx/arch/z80/src/common/up_unblocktask.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/z80/src/common/up_unblocktask.c')
-rw-r--r--nuttx/arch/z80/src/common/up_unblocktask.c105
1 files changed, 50 insertions, 55 deletions
diff --git a/nuttx/arch/z80/src/common/up_unblocktask.c b/nuttx/arch/z80/src/common/up_unblocktask.c
index 9f9714bb9..e6141d4fc 100644
--- a/nuttx/arch/z80/src/common/up_unblocktask.c
+++ b/nuttx/arch/z80/src/common/up_unblocktask.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/z80/src/common/up_unblocktask.c
*
- * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -84,85 +84,80 @@
void up_unblock_task(FAR struct tcb_s *tcb)
{
+ FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
+
/* Verify that the context switch can be performed */
- if ((tcb->task_state < FIRST_BLOCKED_STATE) ||
- (tcb->task_state > LAST_BLOCKED_STATE))
- {
- PANIC(OSERR_BADUNBLOCKSTATE);
- }
- else
- {
- FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
+ ASSERT((tcb->task_state >= FIRST_BLOCKED_STATE) &&
+ (tcb->task_state <= LAST_BLOCKED_STATE));
- /* dbg("Unblocking TCB=%p\n", tcb); */
+ /* dbg("Unblocking TCB=%p\n", tcb); */
- /* Remove the task from the blocked task list */
+ /* Remove the task from the blocked task list */
- sched_removeblocked(tcb);
+ sched_removeblocked(tcb);
- /* Reset its timeslice. This is only meaningful for round
- * robin tasks but it doesn't here to do it for everything
- */
+ /* Reset its timeslice. This is only meaningful for round
+ * robin tasks but it doesn't here to do it for everything
+ */
#if CONFIG_RR_INTERVAL > 0
- tcb->timeslice = CONFIG_RR_INTERVAL / MSEC_PER_TICK;
+ tcb->timeslice = CONFIG_RR_INTERVAL / MSEC_PER_TICK;
#endif
- /* Add the task in the correct location in the prioritized
- * g_readytorun task list
+ /* Add the task in the correct location in the prioritized
+ * g_readytorun task list
+ */
+
+ if (sched_addreadytorun(tcb))
+ {
+ /* The currently active task has changed! We need to do
+ * a context switch to the new task.
+ *
+ * Are we in an interrupt handler?
*/
- if (sched_addreadytorun(tcb))
+ if (IN_INTERRUPT())
{
- /* The currently active task has changed! We need to do
- * a context switch to the new task.
- *
- * Are we in an interrupt handler?
+ /* Yes, then we have to do things differently.
+ * Just copy the current context into the OLD rtcb.
*/
- if (IN_INTERRUPT())
- {
- /* Yes, then we have to do things differently.
- * Just copy the current context into the OLD rtcb.
- */
+ SAVE_IRQCONTEXT(rtcb);
- SAVE_IRQCONTEXT(rtcb);
+ /* Restore the exception context of the rtcb at the (new) head
+ * of the g_readytorun task list.
+ */
- /* Restore the exception context of the rtcb at the (new) head
- * of the g_readytorun task list.
- */
+ rtcb = (FAR struct tcb_s*)g_readytorun.head;
+ /* dbg("New Active Task TCB=%p\n", rtcb); */
- rtcb = (FAR struct tcb_s*)g_readytorun.head;
- /* dbg("New Active Task TCB=%p\n", rtcb); */
+ /* Then setup so that the context will be performed on exit
+ * from the interrupt.
+ */
- /* Then setup so that the context will be performed on exit
- * from the interrupt.
- */
+ SET_IRQCONTEXT(rtcb);
+ }
- SET_IRQCONTEXT(rtcb);
- }
+ /* We are not in an interrupt handler. Copy the user C context
+ * into the TCB of the task that was previously active. if
+ * SAVE_USERCONTEXT returns a non-zero value, then this is really the
+ * previously running task restarting!
+ */
- /* We are not in an interrupt handler. Copy the user C context
- * into the TCB of the task that was previously active. if
- * SAVE_USERCONTEXT returns a non-zero value, then this is really the
- * previously running task restarting!
+ else if (!SAVE_USERCONTEXT(rtcb))
+ {
+ /* Restore the exception context of the new task that is ready to
+ * run (probably tcb). This is the new rtcb at the head of the
+ * g_readytorun task list.
*/
- else if (!SAVE_USERCONTEXT(rtcb))
- {
- /* Restore the exception context of the new task that is ready to
- * run (probably tcb). This is the new rtcb at the head of the
- * g_readytorun task list.
- */
-
- rtcb = (FAR struct tcb_s*)g_readytorun.head;
- /* dbg("New Active Task TCB=%p\n", rtcb); */
+ rtcb = (FAR struct tcb_s*)g_readytorun.head;
+ /* dbg("New Active Task TCB=%p\n", rtcb); */
- /* Then switch contexts */
+ /* Then switch contexts */
- RESTORE_USERCONTEXT(rtcb);
- }
+ RESTORE_USERCONTEXT(rtcb);
}
}
}