diff options
Diffstat (limited to 'chopstx.c')
-rw-r--r-- | chopstx.c | 70 |
1 files changed, 47 insertions, 23 deletions
@@ -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) { |