diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2009-03-08 23:33:41 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2009-03-08 23:33:41 +0000 |
commit | 51835242fc57907004ec44d499b5278ac6cc822b (patch) | |
tree | 13c1a8443302b1e6527a50c27f5e1ba8ae1049ca /nuttx/arch/arm | |
parent | 173b6c45055ea605169f1b54458cbfbe40db467d (diff) | |
download | px4-nuttx-51835242fc57907004ec44d499b5278ac6cc822b.tar.gz px4-nuttx-51835242fc57907004ec44d499b5278ac6cc822b.tar.bz2 px4-nuttx-51835242fc57907004ec44d499b5278ac6cc822b.zip |
Add support for priority inheritance
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1581 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm')
-rw-r--r-- | nuttx/arch/arm/src/common/up_reprioritizertr.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/nuttx/arch/arm/src/common/up_reprioritizertr.c b/nuttx/arch/arm/src/common/up_reprioritizertr.c index b802f2e84..edc2f9e1f 100644 --- a/nuttx/arch/arm/src/common/up_reprioritizertr.c +++ b/nuttx/arch/arm/src/common/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * arch/arm/src/common/up_reprioritizertr.c * - * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <spudmonkey@racsa.co.cr> * * Redistribution and use in source and binary forms, with or without @@ -85,14 +85,27 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { _TCB *rtcb = (_TCB*)g_readytorun.head; boolean switch_needed; @@ -109,6 +122,9 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was |