First attempt at iPod threading.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7852 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e3095ee3b8
commit
52e91de5d3
2 changed files with 29 additions and 17 deletions
|
@ -67,10 +67,6 @@ void sleep(int ticks)
|
||||||
|
|
||||||
void yield(void)
|
void yield(void)
|
||||||
{
|
{
|
||||||
#if CONFIG_CPU == PP5020
|
|
||||||
/* TODO: Threading not yet implemented */
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
switch_thread();
|
switch_thread();
|
||||||
wake_up_thread();
|
wake_up_thread();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,12 +42,12 @@ struct regs
|
||||||
void *start; /* Thread start address, or NULL when started */
|
void *start; /* Thread start address, or NULL when started */
|
||||||
};
|
};
|
||||||
#elif CONFIG_CPU == PP5020
|
#elif CONFIG_CPU == PP5020
|
||||||
/* TODO: define struct regs */
|
|
||||||
struct regs
|
struct regs
|
||||||
{
|
{
|
||||||
void *sp; /* Stack pointer (a15) */
|
unsigned int r[9]; /* Registers r4-r12 */
|
||||||
void *start; /* Thread start address */
|
void *sp; /* Stack pointer (r13) */
|
||||||
int started; /* 0 when not started */
|
unsigned int lr; /* r14 (lr) */
|
||||||
|
void *start; /* Thread start address, or NULL when started */
|
||||||
};
|
};
|
||||||
#elif CONFIG_CPU == TCC730
|
#elif CONFIG_CPU == TCC730
|
||||||
struct regs
|
struct regs
|
||||||
|
@ -79,17 +79,35 @@ static inline void store_context(void* addr) __attribute__ ((always_inline));
|
||||||
static inline void load_context(const void* addr) __attribute__ ((always_inline));
|
static inline void load_context(const void* addr) __attribute__ ((always_inline));
|
||||||
|
|
||||||
#if CONFIG_CPU == PP5020
|
#if CONFIG_CPU == PP5020
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
/* TODO: Implement store_context and load_context */
|
* Store non-volatile context.
|
||||||
|
*---------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
static inline void store_context(void* addr)
|
static inline void store_context(void* addr)
|
||||||
{
|
{
|
||||||
(void)addr;
|
asm volatile(
|
||||||
|
"stmia %0, { r4-r14 }\n"
|
||||||
|
: : "r" (addr)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* Load non-volatile context.
|
||||||
|
*---------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
static inline void load_context(const void* addr)
|
static inline void load_context(const void* addr)
|
||||||
{
|
{
|
||||||
(void)addr;
|
asm volatile(
|
||||||
|
"ldmia %0, { r4-r14 } \n" /* load regs r4 to r14 from context */
|
||||||
|
"ldr r0, [%0, #44] \n" /* load start pointer */
|
||||||
|
"mov r1, #0 \n"
|
||||||
|
"cmp r0, r1 \n" /* check for NULL */
|
||||||
|
"beq .running \n" /* if it's NULL, we're already running */
|
||||||
|
"str r1, [%0, #44] \n"
|
||||||
|
"mov pc, r0 \n" /* not already running, so jump to start */
|
||||||
|
".running: \n"
|
||||||
|
: : "r" (addr) : "r0", "r1"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -312,7 +330,7 @@ int create_thread(void (*function)(void), void* stack, int stack_size,
|
||||||
thread_stack[num_threads] = stack;
|
thread_stack[num_threads] = stack;
|
||||||
thread_stack_size[num_threads] = stack_size;
|
thread_stack_size[num_threads] = stack_size;
|
||||||
regs = &thread_contexts[num_threads];
|
regs = &thread_contexts[num_threads];
|
||||||
#if defined(CPU_COLDFIRE) || (CONFIG_CPU == SH7034)
|
#if defined(CPU_COLDFIRE) || (CONFIG_CPU == SH7034) || (CONFIG_CPU == PP5020)
|
||||||
/* Align stack to an even 32 bit boundary */
|
/* Align stack to an even 32 bit boundary */
|
||||||
regs->sp = (void*)(((unsigned int)stack + stack_size) & ~3);
|
regs->sp = (void*)(((unsigned int)stack + stack_size) & ~3);
|
||||||
#elif CONFIG_CPU == TCC730
|
#elif CONFIG_CPU == TCC730
|
||||||
|
@ -360,12 +378,10 @@ void init_threads(void)
|
||||||
thread_name[0] = main_thread_name;
|
thread_name[0] = main_thread_name;
|
||||||
thread_stack[0] = stackbegin;
|
thread_stack[0] = stackbegin;
|
||||||
thread_stack_size[0] = (int)stackend - (int)stackbegin;
|
thread_stack_size[0] = (int)stackend - (int)stackbegin;
|
||||||
#if defined(CPU_COLDFIRE) || (CONFIG_CPU == SH7034)
|
#if defined(CPU_COLDFIRE) || (CONFIG_CPU == SH7034) || (CONFIG_CPU == PP5020)
|
||||||
thread_contexts[0].start = 0; /* thread 0 already running */
|
thread_contexts[0].start = 0; /* thread 0 already running */
|
||||||
#elif CONFIG_CPU == TCC730
|
#elif CONFIG_CPU == TCC730
|
||||||
thread_contexts[0].started = 1;
|
thread_contexts[0].started = 1;
|
||||||
#elif CONFIG_CPU == PP5020
|
|
||||||
thread_contexts[0].start = 0; /* thread 0 already running */
|
|
||||||
#endif
|
#endif
|
||||||
num_sleepers = 0;
|
num_sleepers = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue