projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ser_resync(): New function.
[bertos.git]
/
kern
/
proc.c
diff --git
a/kern/proc.c
b/kern/proc.c
index 3971df00bb54907424748e89878b691151851de0..e0c2ba27858af55069edcde9211e6c90268815ee 100755
(executable)
--- a/
kern/proc.c
+++ b/
kern/proc.c
@@
-17,6
+17,12
@@
/*
* $Log$
/*
* $Log$
+ * Revision 1.8 2004/08/14 19:37:57 rasky
+ * Merge da SC: macros.h, pool.h, BIT_CHANGE, nome dei processi, etc.
+ *
+ * Revision 1.7 2004/08/02 20:20:29 aleph
+ * Merge from project_ks
+ *
* Revision 1.6 2004/07/30 14:24:16 rasky
* Task switching con salvataggio perfetto stato di interrupt (SR)
* Kernel monitor per dump informazioni su stack dei processi
* Revision 1.6 2004/07/30 14:24:16 rasky
* Task switching con salvataggio perfetto stato di interrupt (SR)
* Kernel monitor per dump informazioni su stack dei processi
@@
-47,7
+53,7
@@
#include <string.h> /* memset() */
#include <string.h> /* memset() */
-/*! CPU dependent context switching routines
+/*! CPU dependent context switching routines
* \note This function *MUST* preserve also the status of the interrupts.
*/
extern void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
* \note This function *MUST* preserve also the status of the interrupts.
*/
extern void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
@@
-90,8
+96,9
@@
static void monitor_init(void)
INITLIST(&MonitorProcs);
}
INITLIST(&MonitorProcs);
}
-static void monitor_add(Process* proc, cpustack_t* stack_base, size_t stack_size)
+static void monitor_add(Process* proc, c
onst char* name, c
pustack_t* stack_base, size_t stack_size)
{
{
+ proc->monitor.name = name;
proc->monitor.stack_base = stack_base;
proc->monitor.stack_size = stack_size;
proc->monitor.stack_base = stack_base;
proc->monitor.stack_size = stack_size;
@@
-142,13
+149,25
@@
size_t monitor_check_stack(cpustack_t* stack_base, size_t stack_size)
void monitor_debug_stacks(void)
{
struct Process* p;
void monitor_debug_stacks(void)
{
struct Process* p;
+ int i;
+
+ if (ISLISTEMPTY(&MonitorProcs))
+ {
+ kprintf("No stacks registered in the monitor\n");
+ return;
+ }
+
+ kprintf("%-24s %-6s%-8s%-8s%-8s\n", "Process name", "TCB", "SPbase", "SPsize", "SPfree");
+ for (i=0;i<56;i++)
+ kprintf("-");
+ kprintf("\n");
for (p = MONITOR_NODE_TO_PROCESS(MonitorProcs.head);
p->monitor.link.succ;
p = MONITOR_NODE_TO_PROCESS(p->monitor.link.succ))
{
size_t free = monitor_check_stack(p->monitor.stack_base, p->monitor.stack_size);
for (p = MONITOR_NODE_TO_PROCESS(MonitorProcs.head);
p->monitor.link.succ;
p = MONITOR_NODE_TO_PROCESS(p->monitor.link.succ))
{
size_t free = monitor_check_stack(p->monitor.stack_base, p->monitor.stack_size);
- kprintf("
TCB: %x sp_base: %x sp_size: %x sp_free: %x\n"
, (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
+ kprintf("
%-24s %04x %04x %4x %4x\n", p->monitor.name
, (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
}
}
}
}
@@
-157,6
+176,9
@@
void monitor_debug_stacks(void)
static void proc_init_struct(Process* proc)
{
static void proc_init_struct(Process* proc)
{
+ /* Avoid warning for unused argument */
+ (void)proc;
+
#if CONFIG_KERN_SIGNALS
proc->sig_recv = 0;
#endif
#if CONFIG_KERN_SIGNALS
proc->sig_recv = 0;
#endif
@@
-166,6
+188,7
@@
static void proc_init_struct(Process* proc)
#endif
}
#endif
}
+
void proc_init(void)
{
INITLIST(&ProcReadyList);
void proc_init(void)
{
INITLIST(&ProcReadyList);
@@
-192,7
+215,7
@@
void proc_init(void)
* \return Process structure of new created process
* if successful, NULL otherwise.
*/
* \return Process structure of new created process
* if successful, NULL otherwise.
*/
-
Process *proc_new(void (*entry)(void)
, size_t stacksize, cpustack_t *stack_base)
+
struct Process *proc_new_with_name(UNUSED(const char*, name), void (*entry)(void), IPTR data
, size_t stacksize, cpustack_t *stack_base)
{
Process *proc;
cpuflags_t flags;
{
Process *proc;
cpuflags_t flags;
@@
-251,6
+274,7
@@
Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
}
proc_init_struct(proc);
}
proc_init_struct(proc);
+ proc->user_data = data;
#if CONFIG_KERN_HEAP
proc->stack_base = stack_base;
#if CONFIG_KERN_HEAP
proc->stack_base = stack_base;
@@
-273,7
+297,7
@@
Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
ENABLE_IRQRESTORE(flags);
#if CONFIG_KERN_MONITOR
ENABLE_IRQRESTORE(flags);
#if CONFIG_KERN_MONITOR
- monitor_add(proc, stack_base, stacksize);
+ monitor_add(proc,
name,
stack_base, stacksize);
#endif
return proc;
#endif
return proc;
@@
-409,6
+433,13
@@
struct Process *proc_current(void)
return CurrentProcess;
}
return CurrentProcess;
}
+/*!
+ * Get the pointer to the user data of the current process
+ */
+IPTR proc_current_user_data(void)
+{
+ return CurrentProcess->user_data;
+}
#if 0 /* Simple testcase for the scheduler */
#if 0 /* Simple testcase for the scheduler */
@@
-446,8
+477,8
@@
static cpustack_t proc_test_stack2[CONFIG_KERN_DEFSTACKSIZE/sizeof(cpustack_t)];
*/
void NORETURN proc_test(void)
{
*/
void NORETURN proc_test(void)
{
- proc_new(proc_test_thread1, sizeof(proc_test_stack1), proc_test_stack1);
- proc_new(proc_test_thread2, sizeof(proc_test_stack2), proc_test_stack2);
+ proc_new(proc_test_thread1,
NULL,
sizeof(proc_test_stack1), proc_test_stack1);
+ proc_new(proc_test_thread2,
NULL,
sizeof(proc_test_stack2), proc_test_stack2);
kputs("Created tasks\n");
kputs("stack1:\n");
kputs("Created tasks\n");
kputs("stack1:\n");