New API: chopstx_intr_done.

This commit is contained in:
NIIBE Yutaka
2018-09-26 10:18:23 +09:00
parent 7ad7527e81
commit d4f4f80ad9
5 changed files with 49 additions and 7 deletions

View File

@@ -1,3 +1,13 @@
2018-09-26 NIIBE Yutaka <gniibe@fsij.org>
* chopstx.h (chopstx_intr_done): New function.
* chopstx.c (chopstx_intr_done): New function.
(chopstx_poll): Don't call chx_clr_intr.
Ensure data memory barrier for interrupt handling.
* chopstx-cortex-m.c (chx_dmb): New static function.
* chopstx-gnu-linux.c (chx_dmb): Ditto.
2018-09-21 NIIBE Yutaka <gniibe@fsij.org> 2018-09-21 NIIBE Yutaka <gniibe@fsij.org>
* mcu/stm32.h (struct GPIO, struct FLASH): Moved from... * mcu/stm32.h (struct GPIO, struct FLASH): Moved from...

View File

@@ -2,7 +2,7 @@
* chopstx-cortex-m.c - Threads and only threads: Arch specific code * chopstx-cortex-m.c - Threads and only threads: Arch specific code
* for Cortex-M0/M3 * for Cortex-M0/M3
* *
* Copyright (C) 2013, 2014, 2015, 2016, 2017 * Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018
* Flying Stone Technology * Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org> * Author: NIIBE Yutaka <gniibe@fsij.org>
* *
@@ -28,6 +28,13 @@
* *
*/ */
/* Data Memory Barrier. */
static void
chx_dmb (void)
{
asm volatile ("dmb" : : : "memory");
}
/* Saved registers on the stack. */ /* Saved registers on the stack. */
struct chx_stack_regs { struct chx_stack_regs {
uint32_t reg[8]; /* r0, r1, r2, r3, r12, lr, pc, xpsr */ uint32_t reg[8]; /* r0, r1, r2, r3, r12, lr, pc, xpsr */

View File

@@ -2,7 +2,7 @@
* chopstx-gnu-linux.c - Threads and only threads: Arch specific code * chopstx-gnu-linux.c - Threads and only threads: Arch specific code
* for GNU/Linux emulation * for GNU/Linux emulation
* *
* Copyright (C) 2017 Flying Stone Technology * Copyright (C) 2017, 2018 Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org> * Author: NIIBE Yutaka <gniibe@fsij.org>
* *
* This file is a part of Chopstx, a thread library for embedded. * This file is a part of Chopstx, a thread library for embedded.
@@ -32,6 +32,13 @@
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
/* Data Memory Barrier. */
static void
chx_dmb (void)
{
}
static sigset_t ss_cur; static sigset_t ss_cur;
static void static void

View File

@@ -1,7 +1,7 @@
/* /*
* chopstx.c - Threads and only threads. * chopstx.c - Threads and only threads.
* *
* Copyright (C) 2013, 2014, 2015, 2016, 2017 * Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018
* Flying Stone Technology * Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org> * Author: NIIBE Yutaka <gniibe@fsij.org>
* *
@@ -1034,6 +1034,23 @@ chopstx_intr_wait (chopstx_intr_t *intr)
} }
/**
* chopstx_intr_done - Finish an IRQ handling
* @intr: Pointer to INTR structure
*
* Finish for the interrupt @intr occured.
*
*/
void
chopstx_intr_done (chopstx_intr_t *intr)
{
chx_dmb ();
if (intr->ready)
chx_clr_intr (intr->irq_num);
}
/** /**
* chopstx_cleanup_push - Register a clean-up * chopstx_cleanup_push - Register a clean-up
* @clp: Pointer to clean-up structure * @clp: Pointer to clean-up structure
@@ -1332,6 +1349,7 @@ chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *const pd_array[])
struct chx_poll_head *pd; struct chx_poll_head *pd;
int r = 0; int r = 0;
chx_dmb ();
chopstx_testcancel (); chopstx_testcancel ();
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
@@ -1384,6 +1402,7 @@ chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *const pd_array[])
while (r == 0); while (r == 0);
} }
chx_dmb ();
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
pd = pd_array[i]; pd = pd_array[i];
@@ -1404,9 +1423,7 @@ chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *const pd_array[])
{ {
struct chx_intr *intr = (struct chx_intr *)pd; struct chx_intr *intr = (struct chx_intr *)pd;
if (intr->ready) if (intr->ready == 0)
chx_clr_intr (intr->irq_num);
else
{ {
chx_spin_lock (&q_intr.lock); chx_spin_lock (&q_intr.lock);
ll_dequeue ((struct chx_pq *)&px[i]); ll_dequeue ((struct chx_pq *)&px[i]);

View File

@@ -155,7 +155,8 @@ typedef struct chx_intr chopstx_intr_t;
void chopstx_claim_irq (chopstx_intr_t *intr, uint8_t irq_num); void chopstx_claim_irq (chopstx_intr_t *intr, uint8_t irq_num);
void chopstx_intr_wait (chopstx_intr_t *intr); /* DEPRECATED */ void chopstx_intr_wait (chopstx_intr_t *intr);
void chopstx_intr_done (chopstx_intr_t *intr);
int chopstx_poll (uint32_t *usec_p, int n, int chopstx_poll (uint32_t *usec_p, int n,