Version 0.04

This commit is contained in:
NIIBE Yutaka
2014-12-10 16:18:29 +09:00
parent 0276d0825e
commit 23893d9b73
14 changed files with 200 additions and 107 deletions

View File

@@ -1,7 +1,7 @@
/*
* chopstx.c - Threads and only threads.
*
* Copyright (C) 2013 Flying Stone Technology
* Copyright (C) 2013, 2014 Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org>
*
* This file is a part of Chopstx, a thread library for embedded.
@@ -449,7 +449,7 @@ preempt (void)
"mov r4, r10\n\t"
"mov r5, r11\n\t"
"mrs r6, PSP\n\t" /* r13(=SP) in user space. */
"stm r1, {r2, r3, r4, r5, r6}"
"stm r1!, {r2, r3, r4, r5, r6}"
: "=r" (tp)
: "r" (tp)
: "r1", "r2", "r3", "r4", "r5", "r6", "cc", "memory");
@@ -502,7 +502,7 @@ svc (void)
"mov r4, r10\n\t"
"mov r5, r11\n\t"
"mrs r6, PSP\n\t" /* r13(=SP) in user space. */
"stm r1, {r2, r3, r4, r5, r6}\n\t"
"stm r1!, {r2, r3, r4, r5, r6}\n\t"
"ldr r1, [r6]"
: "=r" (tp), "=r" (orig_r0)
: /* no input */
@@ -777,9 +777,11 @@ chx_sched (uint32_t arg)
static void __attribute__((noreturn))
chx_exit (void *retval)
{
register uint32_t r8 asm ("r8") = (uint32_t)retval;
register uint32_t r8 asm ("r8");
struct chx_thread *q;
asm volatile ("mov %0, %1" : "=r" (r8) : "r" (retval));
chx_cpu_sched_lock ();
if (running->flag_join_req)
{ /* wake up a thread which requests to join */
@@ -917,14 +919,16 @@ chopstx_create (uint32_t flags_and_prio,
void
chopstx_usec_wait_var (uint32_t *var)
{
register uint32_t *usec_p asm ("r8") = var;
register uint32_t *r8 asm ("r8");
uint32_t *usec_p = var;
uint32_t usec;
uint32_t usec0 = 0;
asm volatile ("mov %0, %1" : "=r" (r8) : "r" (usec_p));
while (1)
{
chx_cpu_sched_lock ();
if (!usec_p) /* awakened */
if (!r8) /* awakened */
break;
*usec_p -= usec0;
usec = *usec_p;
@@ -937,8 +941,9 @@ chopstx_usec_wait_var (uint32_t *var)
running->state = THREAD_WAIT_TIME;
chx_timer_insert (running, usec0);
chx_spin_unlock (&q_timer.lock);
asm volatile ("mov %0, %1" : "=r" (r8) : "r" (usec_p));
chx_sched (CHX_SLEEP);
asm ("" : "=r" (usec_p) : "r" (usec_p));
asm ("" : "=r" (r8) : "r" (r8));
}
chx_cpu_sched_unlock ();