summaryrefslogtreecommitdiff
path: root/chopstx.c
diff options
context:
space:
mode:
Diffstat (limited to 'chopstx.c')
-rw-r--r--chopstx.c70
1 files changed, 47 insertions, 23 deletions
diff --git a/chopstx.c b/chopstx.c
index 3f27832..8224ba6 100644
--- a/chopstx.c
+++ b/chopstx.c
@@ -1,7 +1,7 @@
/*
* chopstx.c - Threads and only threads.
*
- * Copyright (C) 2013, 2014 Flying Stone Technology
+ * Copyright (C) 2013, 2014, 2015 Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org>
*
* This file is a part of Chopstx, a thread library for embedded.
@@ -34,8 +34,8 @@
/*
* Thread priority: higer has higher precedence.
*/
-#if !defined(CHX_PRIO_MAIN)
-#define CHX_PRIO_MAIN 1
+#if !defined(CHX_PRIO_MAIN_INIT)
+#define CHX_PRIO_MAIN_INIT 1
#endif
#if !defined(CHX_FLAGS_MAIN)
#define CHX_FLAGS_MAIN 0
@@ -61,22 +61,24 @@
#define CPU_EXCEPTION_PRIORITY_CLEAR 0
-#if 0
-#define CPU_EXCEPTION_PRIORITY_SVC 0x30
+#if defined(__ARM_ARCH_6M__)
+#define CPU_EXCEPTION_PRIORITY_SVC 0x00
#define CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED 0x40
/* ... */
#define CPU_EXCEPTION_PRIORITY_SYSTICK CPU_EXCEPTION_PRIORITY_INTERRUPT
-#define CPU_EXCEPTION_PRIORITY_INTERRUPT 0xb0
+#define CPU_EXCEPTION_PRIORITY_INTERRUPT 0x80
#define CPU_EXCEPTION_PRIORITY_PENDSV 0xc0
-#else
-#define CPU_EXCEPTION_PRIORITY_SVC 0x00
+#elif defined(__ARM_ARCH_7M__)
+#define CPU_EXCEPTION_PRIORITY_SVC 0x30
#define CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED 0x40
/* ... */
#define CPU_EXCEPTION_PRIORITY_SYSTICK CPU_EXCEPTION_PRIORITY_INTERRUPT
-#define CPU_EXCEPTION_PRIORITY_INTERRUPT 0x80
+#define CPU_EXCEPTION_PRIORITY_INTERRUPT 0xb0
#define CPU_EXCEPTION_PRIORITY_PENDSV 0xc0
+#else
+#error "no support for this arch"
#endif
/**
@@ -226,7 +228,7 @@ chx_cpu_sched_lock (void)
{
if (running->prio < CHOPSTX_PRIO_INHIBIT_PREEMPTION)
{
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
asm volatile ("cpsid i" : : : "memory");
#else
register uint32_t tmp = CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED;
@@ -240,7 +242,7 @@ chx_cpu_sched_unlock (void)
{
if (running->prio < CHOPSTX_PRIO_INHIBIT_PREEMPTION)
{
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
asm volatile ("cpsie i" : : : "memory");
#else
register uint32_t tmp = CPU_EXCEPTION_PRIORITY_CLEAR;
@@ -403,7 +405,7 @@ sched (void)
"ldr r1, =running\n\t"
/* Update running. */
"str r0, [r1]\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"cmp r0, #0\n\t"
"beq 1f\n\t"
#else
@@ -412,7 +414,7 @@ sched (void)
/**/
"add r0, #8\n\t"
"ldm r0!, {r4, r5, r6, r7}\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"ldm r0!, {r1, r2, r3}\n\t"
"mov r8, r1\n\t"
"mov r9, r2\n\t"
@@ -434,7 +436,7 @@ sched (void)
/**/
/* Unmask interrupts. */
"mov r0, #0\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"cpsie i\n"
#else
"msr BASEPRI, r0\n"
@@ -450,7 +452,7 @@ sched (void)
"mov r0, #0\n\t"
"mov r1, #0\n\t"
"ldr r2, =idle\n\t" /* PC = idle */
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"mov r3, #0x010\n\t"
"lsl r3, r3, #20\n\t" /* xPSR = T-flag set (Thumb) */
#else
@@ -465,7 +467,7 @@ sched (void)
/**/
/* Unmask interrupts. */
"mov r0, #0\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"cpsie i\n\t"
#else
"msr BASEPRI, r0\n\t"
@@ -483,14 +485,14 @@ preempt (void)
tp = (struct chx_thread *)CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED;
asm (
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"cpsid i\n\t"
#else
"msr BASEPRI, r0\n\t"
#endif
"ldr r1, =running\n\t"
"ldr r0, [r1]\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"cmp r0, #0\n\t"
"bne 0f\n\t"
#else
@@ -501,7 +503,7 @@ preempt (void)
"msr MSP, r1\n\t"
"b sched\n"
"0:\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"add r1, r0, #4\n\t"
"add r1, #4\n\t"
#else
@@ -559,7 +561,7 @@ svc (void)
asm ("ldr r1, =running\n\t"
"ldr r0, [r1]\n\t"
-#if __ARM_ARCH_6M__
+#if defined(__ARM_ARCH_6M__)
"add r1, r0, #4\n\t"
"add r1, #4\n\t"
#else
@@ -810,20 +812,42 @@ chx_init (struct chx_thread *tp)
tp->flag_got_cancel = tp->flag_join_req = 0;
tp->flag_sched_rr = (CHX_FLAGS_MAIN & CHOPSTX_SCHED_RR)? 1 : 0;
tp->flag_detached = (CHX_FLAGS_MAIN & CHOPSTX_DETACHED)? 1 : 0;
- tp->prio_orig = CHX_PRIO_MAIN;
+ tp->prio_orig = CHX_PRIO_MAIN_INIT;
tp->prio = 0;
tp->v = 0;
running = tp;
- if (CHX_PRIO_MAIN >= CHOPSTX_PRIO_INHIBIT_PREEMPTION)
+ if (CHX_PRIO_MAIN_INIT >= CHOPSTX_PRIO_INHIBIT_PREEMPTION)
chx_cpu_sched_lock ();
- tp->prio = CHX_PRIO_MAIN;
+ tp->prio = CHX_PRIO_MAIN_INIT;
chopstx_main = (chopstx_t)tp;
}
+/**
+ * chopstx_main_init - initialize main thread
+ * @prio: priority
+ *
+ * Initialize main thread with @prio.
+ * The thread main is created with priority CHX_PRIO_MAIN_INIT,
+ * and it runs with that priority until this routine will is called.
+ */
+void
+chopstx_main_init (chopstx_prio_t prio)
+{
+ struct chx_thread *tp = (struct chx_thread *)chopstx_main;
+
+ tp->prio_orig = prio;
+
+ if (prio >= CHOPSTX_PRIO_INHIBIT_PREEMPTION)
+ chx_cpu_sched_lock ();
+
+ tp->prio = prio;
+}
+
+
static void
chx_request_preemption (void)
{