summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/thread.h1
-rw-r--r--firmware/thread.c47
2 files changed, 35 insertions, 13 deletions
diff --git a/firmware/export/thread.h b/firmware/export/thread.h
index c6b3c8e4e3..77209726f7 100644
--- a/firmware/export/thread.h
+++ b/firmware/export/thread.h
@@ -25,6 +25,7 @@
25#define DEFAULT_STACK_SIZE 0x400 /* Bytes */ 25#define DEFAULT_STACK_SIZE 0x400 /* Bytes */
26 26
27int create_thread(void* function, void* stack, int stack_size, char *name); 27int create_thread(void* function, void* stack, int stack_size, char *name);
28void remove_thread(int threadnum);
28void switch_thread(void); 29void switch_thread(void);
29void sleep_thread(void); 30void sleep_thread(void);
30void wake_up_thread(void); 31void wake_up_thread(void);
diff --git a/firmware/thread.c b/firmware/thread.c
index aedd665d2e..25141d6f80 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -137,7 +137,7 @@ void wake_up_thread(void)
137 137
138/*--------------------------------------------------------------------------- 138/*---------------------------------------------------------------------------
139 * Create thread. 139 * Create thread.
140 * Return 0 if context area could be allocated, else -1. 140 * Return ID if context area could be allocated, else -1.
141 *--------------------------------------------------------------------------- 141 *---------------------------------------------------------------------------
142 */ 142 */
143int create_thread(void* function, void* stack, int stack_size, char *name) 143int create_thread(void* function, void* stack, int stack_size, char *name)
@@ -149,9 +149,8 @@ int create_thread(void* function, void* stack, int stack_size, char *name)
149 149
150 if (num_threads >= MAXTHREADS) 150 if (num_threads >= MAXTHREADS)
151 return -1; 151 return -1;
152 else 152
153 { 153 /* Munge the stack to make it easy to spot stack overflows */
154 /* Munge the stack to make it easy to spot stack overflows */
155 stacklen = stack_size / 4; 154 stacklen = stack_size / 4;
156 stackptr = stack; 155 stackptr = stack;
157 for(i = 0;i < stacklen;i++) 156 for(i = 0;i < stacklen;i++)
@@ -163,16 +162,38 @@ int create_thread(void* function, void* stack, int stack_size, char *name)
163 thread_name[num_threads] = name; 162 thread_name[num_threads] = name;
164 thread_stack[num_threads] = stack; 163 thread_stack[num_threads] = stack;
165 thread_stack_size[num_threads] = stack_size; 164 thread_stack_size[num_threads] = stack_size;
166 regs = &thread_contexts[num_threads++]; 165 regs = &thread_contexts[num_threads];
167 store_context(regs); 166 store_context(regs);
168 /* Subtract 4 to leave room for the PR push in load_context() 167 /* Subtract 4 to leave room for the PR push in load_context()
169 Align it on an even 32 bit boundary */ 168 Align it on an even 32 bit boundary */
170 regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3); 169 regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3);
171 regs->sr = 0; 170 regs->sr = 0;
172 regs->pr = function; 171 regs->pr = function;
173 } 172
174 wake_up_thread(); 173 wake_up_thread();
175 return 0; 174 return num_threads++; /* return the current ID, e.g for remove_tread() */
175}
176
177/*---------------------------------------------------------------------------
178 * Remove a thread from the scheduler.
179 * Parameter is the ID as returned from create_thread().
180 *---------------------------------------------------------------------------
181 */
182void remove_thread(int threadnum)
183{
184 int i;
185
186 if(threadnum >= num_threads)
187 return;
188
189 num_threads--;
190 for (i=threadnum; i<num_threads-1; i++)
191 { /* move all entries which are behind */
192 thread_name[i] = thread_name[i+1];
193 thread_stack[i] = thread_stack[i+1];
194 thread_stack_size[i] = thread_stack_size[i+1];
195 thread_contexts[i] = thread_contexts[i+1];
196 }
176} 197}
177 198
178void init_threads(void) 199void init_threads(void)