From 678cb5a5857d86b4552554e579ab65317c969aa2 Mon Sep 17 00:00:00 2001 From: robert-hh Date: Mon, 18 Jul 2022 16:59:24 +0200 Subject: [PATCH] renesas-ra/softtimer: Switch to use softtimer code from shared/runtime. --- ports/renesas-ra/Makefile | 2 +- ports/renesas-ra/gccollect.c | 2 +- ports/renesas-ra/machine_timer.c | 2 +- ports/renesas-ra/main.c | 2 +- ports/renesas-ra/softtimer.c | 148 ------------------------------- ports/renesas-ra/softtimer.h | 66 -------------- ports/renesas-ra/systick.c | 2 +- 7 files changed, 5 insertions(+), 219 deletions(-) delete mode 100644 ports/renesas-ra/softtimer.c delete mode 100644 ports/renesas-ra/softtimer.h diff --git a/ports/renesas-ra/Makefile b/ports/renesas-ra/Makefile index 832b7db9fa..d326c81e78 100644 --- a/ports/renesas-ra/Makefile +++ b/ports/renesas-ra/Makefile @@ -179,6 +179,7 @@ SHARED_SRC_C += $(addprefix shared/,\ runtime/interrupt_char.c \ runtime/mpirq.c \ runtime/pyexec.c \ + runtime/softtimer.c \ runtime/stdout_helpers.c \ runtime/sys_stdio_mphal.c \ timeutils/timeutils.c \ @@ -297,7 +298,6 @@ SRC_C += \ irq.c \ pendsv.c \ systick.c \ - softtimer.c \ powerctrl.c \ powerctrlboot.c \ pybthread.c \ diff --git a/ports/renesas-ra/gccollect.c b/ports/renesas-ra/gccollect.c index bd697a2af3..667bbc4327 100644 --- a/ports/renesas-ra/gccollect.c +++ b/ports/renesas-ra/gccollect.c @@ -31,8 +31,8 @@ #include "py/gc.h" #include "py/mpthread.h" #include "shared/runtime/gchelper.h" +#include "shared/runtime/softtimer.h" #include "gccollect.h" -#include "softtimer.h" #include "systick.h" void gc_collect(void) { diff --git a/ports/renesas-ra/machine_timer.c b/ports/renesas-ra/machine_timer.c index c945322187..c387d35117 100644 --- a/ports/renesas-ra/machine_timer.c +++ b/ports/renesas-ra/machine_timer.c @@ -26,7 +26,7 @@ #include "py/runtime.h" #include "py/mphal.h" -#include "softtimer.h" +#include "shared/runtime/softtimer.h" typedef soft_timer_entry_t machine_timer_obj_t; diff --git a/ports/renesas-ra/main.c b/ports/renesas-ra/main.c index 78af1a9639..a87ddbd868 100644 --- a/ports/renesas-ra/main.c +++ b/ports/renesas-ra/main.c @@ -35,6 +35,7 @@ #include "py/mphal.h" #include "shared/readline/readline.h" #include "shared/runtime/pyexec.h" +#include "shared/runtime/softtimer.h" #include "lib/oofatfs/ff.h" #include "lib/littlefs/lfs1.h" #include "lib/littlefs/lfs1_util.h" @@ -52,7 +53,6 @@ #include "gccollect.h" #include "factoryreset.h" #include "modmachine.h" -#include "softtimer.h" #include "spi.h" #include "uart.h" #include "timer.h" diff --git a/ports/renesas-ra/softtimer.c b/ports/renesas-ra/softtimer.c deleted file mode 100644 index c9c59cab0e..0000000000 --- a/ports/renesas-ra/softtimer.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include "py/gc.h" -#include "py/mphal.h" -#include "py/runtime.h" -#include "irq.h" -#include "softtimer.h" - -#define TICKS_PERIOD 0x80000000 -#define TICKS_DIFF(t1, t0) ((int32_t)(((t1 - t0 + TICKS_PERIOD / 2) & (TICKS_PERIOD - 1)) - TICKS_PERIOD / 2)) - -extern __IO uint32_t uwTick; - -volatile uint32_t soft_timer_next; - -// Pointer to the pairheap of soft timer objects. -// This may contain bss/data pointers as well as GC-heap pointers, -// and is explicitly GC traced by soft_timer_gc_mark_all(). -STATIC soft_timer_entry_t *soft_timer_heap; - -STATIC int soft_timer_lt(mp_pairheap_t *n1, mp_pairheap_t *n2) { - soft_timer_entry_t *e1 = (soft_timer_entry_t *)n1; - soft_timer_entry_t *e2 = (soft_timer_entry_t *)n2; - return TICKS_DIFF(e1->expiry_ms, e2->expiry_ms) < 0; -} - -STATIC void soft_timer_schedule_systick(uint32_t ticks_ms) { - uint32_t irq_state = disable_irq(); - uint32_t uw_tick = uwTick; - if (TICKS_DIFF(ticks_ms, uw_tick) <= 0) { - soft_timer_next = uw_tick + 1; - } else { - soft_timer_next = ticks_ms; - } - enable_irq(irq_state); -} - -void soft_timer_deinit(void) { - // Pop off all the nodes which are allocated on the GC-heap. - uint32_t irq_state = raise_irq_pri(IRQ_PRI_PENDSV); - soft_timer_entry_t *heap_from = soft_timer_heap; - soft_timer_entry_t *heap_to = (soft_timer_entry_t *)mp_pairheap_new(soft_timer_lt); - while (heap_from != NULL) { - soft_timer_entry_t *entry = (soft_timer_entry_t *)mp_pairheap_peek(soft_timer_lt, &heap_from->pairheap); - heap_from = (soft_timer_entry_t *)mp_pairheap_pop(soft_timer_lt, &heap_from->pairheap); - if (!(entry->flags & SOFT_TIMER_FLAG_GC_ALLOCATED)) { - heap_to = (soft_timer_entry_t *)mp_pairheap_push(soft_timer_lt, &heap_to->pairheap, &entry->pairheap); - } - } - soft_timer_heap = heap_to; - restore_irq_pri(irq_state); -} - -// Must be executed at IRQ_PRI_PENDSV -void soft_timer_handler(void) { - uint32_t ticks_ms = uwTick; - soft_timer_entry_t *heap = soft_timer_heap; - while (heap != NULL && TICKS_DIFF(heap->expiry_ms, ticks_ms) <= 0) { - soft_timer_entry_t *entry = heap; - heap = (soft_timer_entry_t *)mp_pairheap_pop(soft_timer_lt, &heap->pairheap); - if (entry->flags & SOFT_TIMER_FLAG_PY_CALLBACK) { - mp_sched_schedule(entry->py_callback, MP_OBJ_FROM_PTR(entry)); - } else { - entry->c_callback(entry); - } - if (entry->mode == SOFT_TIMER_MODE_PERIODIC) { - entry->expiry_ms += entry->delta_ms; - heap = (soft_timer_entry_t *)mp_pairheap_push(soft_timer_lt, &heap->pairheap, &entry->pairheap); - } - } - soft_timer_heap = heap; - if (heap == NULL) { - // No more timers left, set largest delay possible - soft_timer_next = uwTick; - } else { - // Set soft_timer_next so SysTick calls us back at the correct time - soft_timer_schedule_systick(heap->expiry_ms); - } -} - -void soft_timer_gc_mark_all(void) { - // Mark all soft timer nodes that are allocated on the GC-heap. - // To avoid deep C recursion, pop and recreate the pairheap as nodes are marked. - uint32_t irq_state = raise_irq_pri(IRQ_PRI_PENDSV); - soft_timer_entry_t *heap_from = soft_timer_heap; - soft_timer_entry_t *heap_to = (soft_timer_entry_t *)mp_pairheap_new(soft_timer_lt); - while (heap_from != NULL) { - soft_timer_entry_t *entry = (soft_timer_entry_t *)mp_pairheap_peek(soft_timer_lt, &heap_from->pairheap); - heap_from = (soft_timer_entry_t *)mp_pairheap_pop(soft_timer_lt, &heap_from->pairheap); - if (entry->flags & SOFT_TIMER_FLAG_GC_ALLOCATED) { - gc_collect_root((void **)&entry, 1); - } - heap_to = (soft_timer_entry_t *)mp_pairheap_push(soft_timer_lt, &heap_to->pairheap, &entry->pairheap); - } - soft_timer_heap = heap_to; - restore_irq_pri(irq_state); -} - -void soft_timer_static_init(soft_timer_entry_t *entry, uint16_t mode, uint32_t delta_ms, void (*cb)(soft_timer_entry_t *)) { - mp_pairheap_init_node(soft_timer_lt, &entry->pairheap); - entry->flags = 0; - entry->mode = mode; - entry->delta_ms = delta_ms; - entry->c_callback = cb; -} - -void soft_timer_insert(soft_timer_entry_t *entry, uint32_t initial_delta_ms) { - mp_pairheap_init_node(soft_timer_lt, &entry->pairheap); - entry->expiry_ms = mp_hal_ticks_ms() + initial_delta_ms; - uint32_t irq_state = raise_irq_pri(IRQ_PRI_PENDSV); - soft_timer_heap = (soft_timer_entry_t *)mp_pairheap_push(soft_timer_lt, &soft_timer_heap->pairheap, &entry->pairheap); - if (entry == soft_timer_heap) { - // This new timer became the earliest one so set soft_timer_next - soft_timer_schedule_systick(entry->expiry_ms); - } - restore_irq_pri(irq_state); -} - -void soft_timer_remove(soft_timer_entry_t *entry) { - uint32_t irq_state = raise_irq_pri(IRQ_PRI_PENDSV); - soft_timer_heap = (soft_timer_entry_t *)mp_pairheap_delete(soft_timer_lt, &soft_timer_heap->pairheap, &entry->pairheap); - restore_irq_pri(irq_state); -} diff --git a/ports/renesas-ra/softtimer.h b/ports/renesas-ra/softtimer.h deleted file mode 100644 index aec885c547..0000000000 --- a/ports/renesas-ra/softtimer.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_RENESAS_RA_SOFTTIMER_H -#define MICROPY_INCLUDED_RENESAS_RA_SOFTTIMER_H - -#include "py/pairheap.h" - -#define SOFT_TIMER_FLAG_PY_CALLBACK (1) -#define SOFT_TIMER_FLAG_GC_ALLOCATED (2) - -#define SOFT_TIMER_MODE_ONE_SHOT (1) -#define SOFT_TIMER_MODE_PERIODIC (2) - -typedef struct _soft_timer_entry_t { - mp_pairheap_t pairheap; - uint16_t flags; - uint16_t mode; - uint32_t expiry_ms; - uint32_t delta_ms; // for periodic mode - union { - void (*c_callback)(struct _soft_timer_entry_t *); - mp_obj_t py_callback; - }; -} soft_timer_entry_t; - -extern volatile uint32_t soft_timer_next; - -void soft_timer_deinit(void); -void soft_timer_handler(void); -void soft_timer_gc_mark_all(void); - -void soft_timer_static_init(soft_timer_entry_t *entry, uint16_t mode, uint32_t delta_ms, void (*cb)(soft_timer_entry_t *)); -void soft_timer_insert(soft_timer_entry_t *entry, uint32_t initial_delta_ms); -void soft_timer_remove(soft_timer_entry_t *entry); - -// The timer will be reinserted into the heap so that it is called after initial_delta_ms milliseconds. -// After that, if it's periodic, it will continue to be called every entry->delta_ms milliseconds. -static inline void soft_timer_reinsert(soft_timer_entry_t *entry, uint32_t initial_delta_ms) { - soft_timer_remove(entry); - soft_timer_insert(entry, initial_delta_ms); -} - -#endif // MICROPY_INCLUDED_RENESAS_RA_SOFTTIMER_H diff --git a/ports/renesas-ra/systick.c b/ports/renesas-ra/systick.c index e88166b110..95ca808301 100644 --- a/ports/renesas-ra/systick.c +++ b/ports/renesas-ra/systick.c @@ -27,10 +27,10 @@ #include "py/runtime.h" #include "py/mphal.h" +#include "shared/runtime/softtimer.h" #include "irq.h" #include "pendsv.h" #include "systick.h" -#include "softtimer.h" #include "pybthread.h" #include "hal_data.h"