New API: chopstx_intr_done.
This commit is contained in:
10
ChangeLog
10
ChangeLog
@@ -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...
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
25
chopstx.c
25
chopstx.c
@@ -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]);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user