summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2013-06-11 16:43:28 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2013-06-11 16:43:28 +0900
commit4dde668afbd44ffae98e71778bc50e68cd2fe660 (patch)
tree1d81850c236a0848b8e9a4ee240c8adb3372fc0e
parentbbd9404fa54dc7ec5c783e65feea2f95bee54bf2 (diff)
Add CHOPSTX_PRIO_INHIBIT_PREEMPTION
-rw-r--r--ChangeLog6
-rw-r--r--chopstx.c65
-rw-r--r--chopstx.h1
3 files changed, 45 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index f951ec6..dfa3e0a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-06-11 Niibe Yutaka <gniibe@fsij.org>
+
+ * chopstx.c (chx_timer_expired): Use uint16_t here.
+ (chx_cpu_sched_lock, chx_cpu_sched_unlock): Change only when
+ its priority is lower than CHOPSTX_PRIO_INHIBIT_PREEMPTION.
+
2013-06-06 Niibe Yutaka <gniibe@fsij.org>
* entry.c: Include sys.h for clock_init and gpio_init.
diff --git a/chopstx.c b/chopstx.c
index 9318a38..4d9bf24 100644
--- a/chopstx.c
+++ b/chopstx.c
@@ -46,7 +46,7 @@
#define PREEMPTION_USEC 1000 /* 1ms */
#endif
-#define MAX_PRIO 255
+#define MAX_PRIO (255+1)
/*
* Exception priority: lower has higher precedence.
@@ -68,20 +68,6 @@
#define CPU_EXCEPTION_PRIORITY_INTERRUPT 0x60
#define CPU_EXCEPTION_PRIORITY_PENDSV 0x70
-static void
-chx_cpu_sched_lock (void)
-{
- register uint32_t tmp = CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED;
- asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory");
-}
-
-static void
-chx_cpu_sched_unlock (void)
-{
- register uint32_t tmp = CPU_EXCEPTION_PRIORITY_CLEAR;
- asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory");
-}
-
void __attribute__((weak, noreturn))
chx_fatal (uint32_t err_code)
{
@@ -215,6 +201,27 @@ struct chx_thread {
};
+static void
+chx_cpu_sched_lock (void)
+{
+ if (running->prio < CHOPSTX_PRIO_INHIBIT_PREEMPTION)
+ {
+ register uint32_t tmp = CPU_EXCEPTION_PRIORITY_INHIBIT_SCHED;
+ asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory");
+ }
+}
+
+static void
+chx_cpu_sched_unlock (void)
+{
+ if (running->prio < CHOPSTX_PRIO_INHIBIT_PREEMPTION)
+ {
+ register uint32_t tmp = CPU_EXCEPTION_PRIORITY_CLEAR;
+ asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory");
+ }
+}
+
+
/*
* Double linked list handling.
*/
@@ -372,16 +379,20 @@ sched (void)
/**/
"add r0, #8\n\t"
"ldm r0!, {r4, r5, r6, r7}\n\t"
- "ldr r8, [r0], 4\n\t"
- "ldr r9, [r0], 4\n\t"
- "ldr r10, [r0], 4\n\t"
- "ldr r11, [r0], 4\n\t"
- "ldr r1, [r0]\n\t"
+ "ldr r8, [r0], #4\n\t"
+ "ldr r9, [r0], #4\n\t"
+ "ldr r10, [r0], #4\n\t"
+ "ldr r11, [r0], #4\n\t"
+ "ldr r1, [r0], #4\n\t"
"msr PSP, r1\n\t"
+ "ldrb r1, [r0, #3]\n\t" /* ->PRIO field. */
+ "cmp r1, #247\n\t"
+ "bhi 0f\n\t" /* Leave interrupt disabled if >= 248 */
/**/
"mov r0, #0\n\t"
- "msr BASEPRI, r0\n\t" /* Unmask interrupts. */
+ "msr BASEPRI, r0\n" /* Unmask interrupts. */
/**/
+ "0:\n\t"
"sub r0, #3\n\t" /* EXC_RETURN to a thread with PSP */
"bx r0\n"
"1:\n\t"
@@ -575,7 +586,7 @@ void
chx_timer_expired (void)
{
struct chx_thread *tp;
- chopstx_prio_t prio = 0;
+ uint16_t prio = 0; /* Use uint16_t here. */
chx_spin_lock (&q_timer.lock);
if ((tp = ll_pop (&q_timer)))
@@ -586,8 +597,8 @@ chx_timer_expired (void)
if (tp == running) /* tp->flag_sched_rr == 1 */
prio = MAX_PRIO;
else
- if (tp->prio > prio)
- prio = tp->prio;
+ if ((uint16_t)tp->prio > prio)
+ prio = (uint16_t)tp->prio;
if (!ll_empty (&q_timer))
{
@@ -604,8 +615,8 @@ chx_timer_expired (void)
if (tp == running)
prio = MAX_PRIO;
else
- if (tp->prio > prio)
- prio = tp->prio;
+ if ((uint16_t)tp->prio > prio)
+ prio = (uint16_t)tp->prio;
}
if (!ll_empty (&q_timer))
@@ -613,7 +624,7 @@ chx_timer_expired (void)
}
}
- if (running == NULL || running->prio < prio)
+ if (running == NULL || (uint16_t)running->prio < prio)
chx_request_preemption ();
chx_spin_unlock (&q_timer.lock);
}
diff --git a/chopstx.h b/chopstx.h
index ed632b3..e1f695a 100644
--- a/chopstx.h
+++ b/chopstx.h
@@ -38,6 +38,7 @@ chopstx_create (uint32_t flags_and_prio,
#define CHOPSTX_DETACHED 0x10000
#define CHOPSTX_SCHED_RR 0x20000
+#define CHOPSTX_PRIO_INHIBIT_PREEMPTION 248
void chopstx_usec_wait_internal (uint32_t *arg);