projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix SPI1 activation bug. Now SPI1 on at91sam7x is fully functional.
[bertos.git]
/
bertos
/
kern
/
coop.c
diff --git
a/bertos/kern/coop.c
b/bertos/kern/coop.c
index b62a02e43ddb0bedc48336e0675bbc1f81180617..9b736166111eb97ce29276c996e1f0f46dfda4b2 100644
(file)
--- a/
bertos/kern/coop.c
+++ b/
bertos/kern/coop.c
@@
-27,13
+27,12
@@
* the GNU General Public License.
*
* Copyright 2001, 2004, 2008 Develer S.r.l. (http://www.develer.com/)
* the GNU General Public License.
*
* Copyright 2001, 2004, 2008 Develer S.r.l. (http://www.develer.com/)
- * Copyright 1999, 2000, 2001 Bernie Innocenti <bernie@codewiz.org>
+ * Copyright 1999, 2000, 2001
, 2008
Bernie Innocenti <bernie@codewiz.org>
* -->
*
* -->
*
- * \brief Simple realtime multitasking scheduler.
- * Context switching is only done cooperatively.
+ * \brief Simple cooperative multitasking scheduler.
*
*
- * \version $Id
: proc.c 1616 2008-08-10 19:41:26Z bernie
$
+ * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
* \author Stefano Fedrigo <aleph@develer.com>
*/
* \author Bernie Innocenti <bernie@codewiz.org>
* \author Stefano Fedrigo <aleph@develer.com>
*/
@@
-57,24
+56,20
@@
* Saving and restoring the context on the stack is done by a CPU-dependent
* support routine which usually needs to be written in assembly.
*/
* Saving and restoring the context on the stack is done by a CPU-dependent
* support routine which usually needs to be written in assembly.
*/
-EXTERN_C void asm_switch_context(cpu
stack_t **new_sp, cpu
stack_t **save_sp);
+EXTERN_C void asm_switch_context(cpu
_stack_t **new_sp, cpu_
stack_t **save_sp);
/**
* System scheduler: pass CPU control to the next process in
* the ready queue.
*/
/**
* System scheduler: pass CPU control to the next process in
* the ready queue.
*/
-void proc_schedule(void)
+
static
void proc_schedule(void)
{
{
- struct Process *old_process;
- cpuflags_t flags;
+ cpu_flags_t flags;
ATOMIC(LIST_ASSERT_VALID(&ProcReadyList));
ASSERT_USER_CONTEXT();
ATOMIC(LIST_ASSERT_VALID(&ProcReadyList));
ASSERT_USER_CONTEXT();
- ASSERT_IRQ_ENABLED();
-
- /* Remember old process to save its context later */
- old_process = CurrentProcess;
+ IRQ_ASSERT_ENABLED();
/* Poll on the ready queue for the first ready process */
IRQ_SAVE_DISABLE(flags);
/* Poll on the ready queue for the first ready process */
IRQ_SAVE_DISABLE(flags);
@@
-101,6
+96,14
@@
void proc_schedule(void)
IRQ_DISABLE;
}
IRQ_RESTORE(flags);
IRQ_DISABLE;
}
IRQ_RESTORE(flags);
+}
+
+void proc_switch(void)
+{
+ /* Remember old process to save its context later */
+ Process * const old_process = CurrentProcess;
+
+ proc_schedule();
/*
* Optimization: don't switch contexts when the active
/*
* Optimization: don't switch contexts when the active
@@
-108,12
+111,12
@@
void proc_schedule(void)
*/
if (CurrentProcess != old_process)
{
*/
if (CurrentProcess != old_process)
{
- cpustack_t *dummy;
+ cpu
_
stack_t *dummy;
#if CONFIG_KERN_MONITOR
LOG_INFO("Switch from %p(%s) to %p(%s)\n",
#if CONFIG_KERN_MONITOR
LOG_INFO("Switch from %p(%s) to %p(%s)\n",
- old_process,
old_process ? old_process->monitor.name : "NONE"
,
- CurrentProcess,
CurrentProcess->monitor.name
);
+ old_process,
proc_name(old_process)
,
+ CurrentProcess,
proc_currentName()
);
#endif
/* Save context of old process and switch to new process. If there is no
#endif
/* Save context of old process and switch to new process. If there is no
@@
-133,9
+136,8
@@
void proc_schedule(void)
/**
* Co-operative context switch
*/
/**
* Co-operative context switch
*/
-void proc_
switch
(void)
+void proc_
yield
(void)
{
ATOMIC(SCHED_ENQUEUE(CurrentProcess));
{
ATOMIC(SCHED_ENQUEUE(CurrentProcess));
-
- proc_schedule();
+ proc_switch();
}
}