Compare commits
3 Commits
release/1.
...
release/1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fffb8aa3b3 | ||
|
|
0ed2e95ea2 | ||
|
|
02aa678d4c |
20
ChangeLog
20
ChangeLog
@@ -1,3 +1,23 @@
|
|||||||
|
2018-10-02 NIIBE Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* VERSION: 1.11.
|
||||||
|
* doc/chopstx.texi (VERSION): 1.11.
|
||||||
|
|
||||||
|
2018-10-01 NIIBE Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* contrib/ackbtn-stm32f103.c (PINCFG_EDGE): New.
|
||||||
|
(ackbtn_init): Use PINCFG_EDGE bit.
|
||||||
|
(ackbtn_enable): Configure the edge detector here.
|
||||||
|
(ackbtn_disable): Disable the edge detector.
|
||||||
|
|
||||||
|
* chopstx.c (chopstx_poll): Don't clear ->ready here.
|
||||||
|
(chx_cond_hook): Set ->ready = 0 when condition does
|
||||||
|
not meet.
|
||||||
|
(chopstx_claim_irq): Make sure clearing the interrupt.
|
||||||
|
(chx_intr_hook): Add the case when ->ready == 1.
|
||||||
|
(chopstx_intr_done): Set ->ready = 0.
|
||||||
|
(chx_join_hook): Set ->ready = 0 when it is still alive.
|
||||||
|
|
||||||
2018-09-29 NIIBE Yutaka <gniibe@fsij.org>
|
2018-09-29 NIIBE Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
* VERSION: 1.10.
|
* VERSION: 1.10.
|
||||||
|
|||||||
31
NEWS
31
NEWS
@@ -1,11 +1,30 @@
|
|||||||
NEWS - Noteworthy changes
|
NEWS - Noteworthy changes
|
||||||
|
|
||||||
|
|
||||||
|
* Major changes in Chopstx 1.11
|
||||||
|
|
||||||
|
Released 2018-10-02
|
||||||
|
|
||||||
|
** Support calling chopstx_poll with intr->ready==1
|
||||||
|
In version <= 1.10, it assumed that all events should be handled after
|
||||||
|
chopstx_poll, before calling chopstx_poll again. With having
|
||||||
|
chopstx_intr_done, it's OK now that chopstx_poll can be called again
|
||||||
|
not examining/handling all poll descriptors, but only parts of them.
|
||||||
|
|
||||||
|
** Acknowledge button change
|
||||||
|
In 1.10, the action was able to be "memorized" by the edge detector.
|
||||||
|
Now, the edge detector is disabled by ackbtn_disable, and it is
|
||||||
|
enabled by ackbtn_enable. So, the status is cleared correctly.
|
||||||
|
|
||||||
|
** New board support: FST-01SZ
|
||||||
|
It's still under development. Programming-wise, it will keep same.
|
||||||
|
|
||||||
|
|
||||||
* Major changes in Chopstx 1.10
|
* Major changes in Chopstx 1.10
|
||||||
|
|
||||||
Released 2018-09-29
|
Released 2018-09-29
|
||||||
|
|
||||||
** Function chopstx_intr_wait is not deprecated, now.
|
** Function chopstx_intr_wait is not deprecated, now
|
||||||
Once, it was said that it's deprecated, but it's active again
|
Once, it was said that it's deprecated, but it's active again
|
||||||
to match the new function of chopstx_intr_done.
|
to match the new function of chopstx_intr_done.
|
||||||
|
|
||||||
@@ -59,7 +78,7 @@ Timer expiration had a bug. When it is waken up, the wake up doesn't
|
|||||||
handle as a timer expiration when there are multiple threads on same
|
handle as a timer expiration when there are multiple threads on same
|
||||||
timing of expire. It confuses as if it were forced wakeup.
|
timing of expire. It confuses as if it were forced wakeup.
|
||||||
|
|
||||||
** New driver: USART for STM32.
|
** New driver: USART for STM32
|
||||||
USART driver for STM32 is added.
|
USART driver for STM32 is added.
|
||||||
|
|
||||||
|
|
||||||
@@ -394,11 +413,11 @@ Vectored Interrupt Controller (NVIC), in the ARM v7-M Architecture
|
|||||||
Reference Manual. The subsection, B3.4.1, Theory of operation,
|
Reference Manual. The subsection, B3.4.1, Theory of operation,
|
||||||
explains how it works.
|
explains how it works.
|
||||||
|
|
||||||
|
|
||||||
** gpio_init change
|
** gpio_init change
|
||||||
Now, gpi_init support AFIO mapping and another GPIO (GPIO_OTHER)
|
Now, gpi_init support AFIO mapping and another GPIO (GPIO_OTHER)
|
||||||
settings.
|
settings.
|
||||||
|
|
||||||
Local Variables:
|
|
||||||
mode: outline
|
# Local Variables:
|
||||||
End:
|
# mode: outline
|
||||||
|
# End:
|
||||||
|
|||||||
4
README
4
README
@@ -1,6 +1,6 @@
|
|||||||
Chopstx - Threads and only Threads
|
Chopstx - Threads and only Threads
|
||||||
Version 1.10
|
Version 1.11
|
||||||
2018-09-29
|
2018-10-02
|
||||||
Niibe Yutaka
|
Niibe Yutaka
|
||||||
Flying Stone Technology
|
Flying Stone Technology
|
||||||
|
|
||||||
|
|||||||
26
chopstx.c
26
chopstx.c
@@ -969,6 +969,7 @@ chx_cond_hook (struct chx_px *px, struct chx_poll_head *pd)
|
|||||||
{ /* Condition doesn't met.
|
{ /* Condition doesn't met.
|
||||||
* Register the proxy to wait for the condition.
|
* Register the proxy to wait for the condition.
|
||||||
*/
|
*/
|
||||||
|
pc->ready = 0;
|
||||||
chx_cpu_sched_lock ();
|
chx_cpu_sched_lock ();
|
||||||
chx_spin_lock (&pc->cond->lock);
|
chx_spin_lock (&pc->cond->lock);
|
||||||
ll_prio_enqueue ((struct chx_pq *)px, &pc->cond->q);
|
ll_prio_enqueue ((struct chx_pq *)px, &pc->cond->q);
|
||||||
@@ -998,6 +999,7 @@ chopstx_claim_irq (chopstx_intr_t *intr, uint8_t irq_num)
|
|||||||
chx_cpu_sched_lock ();
|
chx_cpu_sched_lock ();
|
||||||
chx_spin_lock (&q_intr.lock);
|
chx_spin_lock (&q_intr.lock);
|
||||||
chx_disable_intr (irq_num);
|
chx_disable_intr (irq_num);
|
||||||
|
chx_clr_intr (irq_num);
|
||||||
chx_set_intr_prio (irq_num);
|
chx_set_intr_prio (irq_num);
|
||||||
chx_spin_unlock (&q_intr.lock);
|
chx_spin_unlock (&q_intr.lock);
|
||||||
chx_cpu_sched_unlock ();
|
chx_cpu_sched_unlock ();
|
||||||
@@ -1012,10 +1014,19 @@ chx_intr_hook (struct chx_px *px, struct chx_poll_head *pd)
|
|||||||
chopstx_testcancel ();
|
chopstx_testcancel ();
|
||||||
chx_cpu_sched_lock ();
|
chx_cpu_sched_lock ();
|
||||||
px->v = intr->irq_num;
|
px->v = intr->irq_num;
|
||||||
chx_spin_lock (&q_intr.lock);
|
if (intr->ready)
|
||||||
ll_prio_enqueue ((struct chx_pq *)px, &q_intr.q);
|
{
|
||||||
chx_enable_intr (intr->irq_num);
|
chx_spin_lock (&px->lock);
|
||||||
chx_spin_unlock (&q_intr.lock);
|
(*px->counter_p)++;
|
||||||
|
chx_spin_unlock (&px->lock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chx_spin_lock (&q_intr.lock);
|
||||||
|
ll_prio_enqueue ((struct chx_pq *)px, &q_intr.q);
|
||||||
|
chx_enable_intr (intr->irq_num);
|
||||||
|
chx_spin_unlock (&q_intr.lock);
|
||||||
|
}
|
||||||
chx_cpu_sched_unlock ();
|
chx_cpu_sched_unlock ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1047,7 +1058,10 @@ chopstx_intr_done (chopstx_intr_t *intr)
|
|||||||
chx_dmb ();
|
chx_dmb ();
|
||||||
|
|
||||||
if (intr->ready)
|
if (intr->ready)
|
||||||
chx_clr_intr (intr->irq_num);
|
{
|
||||||
|
chx_clr_intr (intr->irq_num);
|
||||||
|
intr->ready = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1215,6 +1229,7 @@ chx_join_hook (struct chx_px *px, struct chx_poll_head *pd)
|
|||||||
{ /* Not yet exited.
|
{ /* Not yet exited.
|
||||||
* Register the proxy to wait for TP's exit.
|
* Register the proxy to wait for TP's exit.
|
||||||
*/
|
*/
|
||||||
|
pj->ready = 0;
|
||||||
px->v = (uintptr_t)tp;
|
px->v = (uintptr_t)tp;
|
||||||
chx_spin_lock (&q_join.lock);
|
chx_spin_lock (&q_join.lock);
|
||||||
ll_prio_enqueue ((struct chx_pq *)px, &q_join.q);
|
ll_prio_enqueue ((struct chx_pq *)px, &q_join.q);
|
||||||
@@ -1358,7 +1373,6 @@ chopstx_poll (uint32_t *usec_p, int n, struct chx_poll_head *const pd_array[])
|
|||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
pd = pd_array[i];
|
pd = pd_array[i];
|
||||||
pd->ready = 0;
|
|
||||||
px[i].ready_p = &pd->ready;
|
px[i].ready_p = &pd->ready;
|
||||||
if (pd->type == CHOPSTX_POLL_COND)
|
if (pd->type == CHOPSTX_POLL_COND)
|
||||||
chx_cond_hook (&px[i], pd);
|
chx_cond_hook (&px[i], pd);
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
|
|
||||||
static uint32_t pin_config;
|
static uint32_t pin_config;
|
||||||
|
#define PINCFG_EDGE 0x80000000
|
||||||
|
#define PINCFG_EDGE_RISING PINCFG_EDGE
|
||||||
|
|
||||||
void
|
void
|
||||||
ackbtn_init (chopstx_intr_t *intr)
|
ackbtn_init (chopstx_intr_t *intr)
|
||||||
@@ -42,7 +44,6 @@ ackbtn_init (chopstx_intr_t *intr)
|
|||||||
uint8_t irq_num;
|
uint8_t irq_num;
|
||||||
uint32_t afio_exticr_index;
|
uint32_t afio_exticr_index;
|
||||||
uint32_t afio_exticr_extiX_pY;
|
uint32_t afio_exticr_extiX_pY;
|
||||||
int rising_edge;
|
|
||||||
|
|
||||||
switch (SYS_BOARD_ID)
|
switch (SYS_BOARD_ID)
|
||||||
{
|
{
|
||||||
@@ -53,36 +54,43 @@ ackbtn_init (chopstx_intr_t *intr)
|
|||||||
afio_exticr_extiX_pY = AFIO_EXTICR1_EXTI3_PA;
|
afio_exticr_extiX_pY = AFIO_EXTICR1_EXTI3_PA;
|
||||||
irq_num = EXTI3_IRQ;
|
irq_num = EXTI3_IRQ;
|
||||||
pin_config = 0x0008; /* EXTI_PR_PR3 == EXTI_IMR_MR3 == EXTI_RTSR_TR3 */
|
pin_config = 0x0008; /* EXTI_PR_PR3 == EXTI_IMR_MR3 == EXTI_RTSR_TR3 */
|
||||||
rising_edge = 1;
|
pin_config |= PINCFG_EDGE_RISING;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
chopstx_claim_irq (intr, irq_num);
|
|
||||||
|
|
||||||
/* Configure EXTI line */
|
/* Configure EXTI line */
|
||||||
if (afio_exticr_extiX_pY)
|
if (afio_exticr_extiX_pY)
|
||||||
AFIO->EXTICR[afio_exticr_index] |= afio_exticr_extiX_pY;
|
AFIO->EXTICR[afio_exticr_index] |= afio_exticr_extiX_pY;
|
||||||
|
|
||||||
/* Interrupt is masked, now */
|
/* Interrupt is masked, now */
|
||||||
EXTI->IMR &= ~pin_config;
|
EXTI->IMR &= ~(pin_config & ~PINCFG_EDGE);
|
||||||
|
|
||||||
/* Configure which edge is detected */
|
chopstx_claim_irq (intr, irq_num);
|
||||||
if (rising_edge)
|
|
||||||
EXTI->RTSR |= pin_config;
|
|
||||||
else
|
|
||||||
EXTI->FTSR |= pin_config;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ackbtn_enable (void)
|
ackbtn_enable (void)
|
||||||
{
|
{
|
||||||
EXTI->PR |= pin_config; /* Clear pending interrupt */
|
/* Clear pending interrupt */
|
||||||
EXTI->IMR |= pin_config; /* Enable interrupt clearing the mask */
|
EXTI->PR |= (pin_config & ~PINCFG_EDGE);
|
||||||
|
/* Enable interrupt, clearing the mask */
|
||||||
|
EXTI->IMR |= (pin_config & ~PINCFG_EDGE);
|
||||||
|
|
||||||
|
/* Configure which edge is detected */
|
||||||
|
if ((pin_config & PINCFG_EDGE))
|
||||||
|
EXTI->RTSR |= (pin_config & ~PINCFG_EDGE);
|
||||||
|
else
|
||||||
|
EXTI->FTSR |= (pin_config & ~PINCFG_EDGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ackbtn_disable (void)
|
ackbtn_disable (void)
|
||||||
{
|
{
|
||||||
EXTI->IMR &= ~pin_config; /* Disable interrupt having the mask */
|
/* Disable interrupt having the mask */
|
||||||
EXTI->PR |= pin_config; /* Clear pending interrupt */
|
EXTI->IMR &= ~(pin_config & ~PINCFG_EDGE);
|
||||||
|
/* Clear pending interrupt */
|
||||||
|
|
||||||
|
/* Disable edge detection */
|
||||||
|
EXTI->RTSR &= ~(pin_config & ~PINCFG_EDGE);
|
||||||
|
EXTI->FTSR &= ~(pin_config & ~PINCFG_EDGE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
\input texinfo @c -*-texinfo-*-
|
\input texinfo @c -*-texinfo-*-
|
||||||
@c %**start of header
|
@c %**start of header
|
||||||
@setfilename chopstx.info
|
@setfilename chopstx.info
|
||||||
@set VERSION 1.10
|
@set VERSION 1.11
|
||||||
@settitle Chopstx Reference Manual
|
@settitle Chopstx Reference Manual
|
||||||
@c Unify some of the indices.
|
@c Unify some of the indices.
|
||||||
@syncodeindex tp fn
|
@syncodeindex tp fn
|
||||||
|
|||||||
Reference in New Issue
Block a user