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>
* 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
* for Cortex-M0/M3
*
* Copyright (C) 2013, 2014, 2015, 2016, 2017
* Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018
* Flying Stone Technology
* 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. */
struct chx_stack_regs {
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
* for GNU/Linux emulation
*
* Copyright (C) 2017 Flying Stone Technology
* Copyright (C) 2017, 2018 Flying Stone Technology
* Author: NIIBE Yutaka <gniibe@fsij.org>
*
* This file is a part of Chopstx, a thread library for embedded.
@@ -32,6 +32,13 @@
#include <signal.h>
#include <sys/time.h>
/* Data Memory Barrier. */
static void
chx_dmb (void)
{
}
static sigset_t ss_cur;
static void

View File

@@ -1,7 +1,7 @@
/*
* chopstx.c - Threads and only threads.
*
* Copyright (C) 2013, 2014, 2015, 2016, 2017
* Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018
* Flying Stone Technology
* 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
* @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;
int r = 0;
chx_dmb ();
chopstx_testcancel ();
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);
}
chx_dmb ();
for (i = 0; i < n; 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;
if (intr->ready)
chx_clr_intr (intr->irq_num);
else
if (intr->ready == 0)
{
chx_spin_lock (&q_intr.lock);
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_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,