summaryrefslogtreecommitdiffstats
path: root/Smol Watch Project/My Project/hal
diff options
context:
space:
mode:
authorJoey Castillo <jose.castillo@gmail.com>2021-05-02 15:45:40 -0400
committerJoey Castillo <jose.castillo@gmail.com>2021-05-02 15:45:40 -0400
commit88a38cc2352c2bd0ad2733093796f3d424ebcc9c (patch)
treeba6d58ae5e46a71094994a5de974672edf5866cb /Smol Watch Project/My Project/hal
parent9b381ef6ae36844e32452047b05b01f15893a2dc (diff)
downloadSensor-Watch-88a38cc2352c2bd0ad2733093796f3d424ebcc9c.tar.gz
Sensor-Watch-88a38cc2352c2bd0ad2733093796f3d424ebcc9c.tar.bz2
Sensor-Watch-88a38cc2352c2bd0ad2733093796f3d424ebcc9c.zip
remove timer; tick based on RTC PER7 interrupt
Diffstat (limited to 'Smol Watch Project/My Project/hal')
-rw-r--r--Smol Watch Project/My Project/hal/documentation/timer.rst52
-rw-r--r--Smol Watch Project/My Project/hal/include/hal_timer.h206
-rw-r--r--Smol Watch Project/My Project/hal/src/hal_timer.c250
3 files changed, 0 insertions, 508 deletions
diff --git a/Smol Watch Project/My Project/hal/documentation/timer.rst b/Smol Watch Project/My Project/hal/documentation/timer.rst
deleted file mode 100644
index c5ca63d1..00000000
--- a/Smol Watch Project/My Project/hal/documentation/timer.rst
+++ /dev/null
@@ -1,52 +0,0 @@
-============================
-The Timer driver (bare-bone)
-============================
-
-The Timer driver provides means for delayed and periodical function invocation.
-
-A timer task is a piece of code (function) executed at a specific time or periodically by the timer after the task has
-been added to the timers task queue. The execution delay or period is set in ticks, where one tick is defined as a
-configurable number of clock cycles in the hardware timer. Changing the number of clock cycles in a tick automatically
-changes execution delays and periods for all tasks in the timers task queue.
-
-A task has two operation modes, single-shot or repeating mode. In single-shot mode the task is removed from the task queue
-and then is executed once, in repeating mode the task reschedules itself automatically after it has executed based on
-the period set in the task configuration.
-In single-shot mode a task is removed from the task queue before its callback is invoked. It allows an application to
-reuse the memory of expired task in the callback.
-
-Each instance of the Timer driver supports infinite amount of timer tasks, only limited by the amount of RAM available.
-
-Features
---------
-* Initialization and de-initialization
-* Starting and stopping
-* Timer tasks - periodical invocation of functions
-* Changing and obtaining of the period of a timer
-
-Applications
-------------
-* Delayed and periodical function execution for middle-ware stacks and applications.
-
-Dependencies
-------------
-* Each instance of the driver requires separate hardware timer capable of generating periodic interrupt.
-
-Concurrency
------------
-The Timer driver is an interrupt driven driver.This means that the interrupt that triggers a task may occur during
-the process of adding or removing a task via the driver's API. In such case the interrupt processing is postponed
-until the task adding or removing is complete.
-
-The task queue is not protected from the access by interrupts not used by the driver. Due to this
-it is not recommended to add or remove a task from such interrupts: in case if a higher priority interrupt supersedes
-the driver's interrupt, adding or removing a task may cause unpredictable behavior of the driver.
-
-Limitations
------------
-* The driver is designed to work outside of an operating system environment, the task queue is therefore processed in interrupt context which may delay execution of other interrupts.
-* If there are a lot of frequently called interrupts with the priority higher than the driver's one, it may cause delay for triggering of a task.
-
-Knows issues and workarounds
-----------------------------
-Not applicable
diff --git a/Smol Watch Project/My Project/hal/include/hal_timer.h b/Smol Watch Project/My Project/hal/include/hal_timer.h
deleted file mode 100644
index 43a1ff47..00000000
--- a/Smol Watch Project/My Project/hal/include/hal_timer.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * \file
- *
- * \brief Timer task functionality declaration.
- *
- * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
- *
- * \asf_license_start
- *
- * \page License
- *
- * Subject to your compliance with these terms, you may use Microchip
- * software and any derivatives exclusively with Microchip products.
- * It is your responsibility to comply with third party license terms applicable
- * to your use of third party software (including open source software) that
- * may accompany Microchip software.
- *
- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
- * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
- * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
- * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
- * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
- * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
- * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
- * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
- * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
- * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
- *
- * \asf_license_stop
- *
- */
-
-#ifndef _HAL_TIMER_H_INCLUDED
-#define _HAL_TIMER_H_INCLUDED
-
-#include <utils_list.h>
-#include <hpl_timer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \addtogroup doc_driver_hal_timer
- *
- * @{
- */
-
-/**
- * \brief Timer mode type
- */
-enum timer_task_mode { TIMER_TASK_ONE_SHOT, TIMER_TASK_REPEAT };
-
-/**
- * \brief Timer task descriptor
- *
- * The timer task descriptor forward declaration.
- */
-struct timer_task;
-
-/**
- * \brief Timer task callback function type
- */
-typedef void (*timer_cb_t)(const struct timer_task *const timer_task);
-
-/**
- * \brief Timer task structure
- */
-struct timer_task {
- struct list_element elem; /*! List element. */
- uint32_t time_label; /*! Absolute timer start time. */
-
- uint32_t interval; /*! Number of timer ticks before calling the task. */
- timer_cb_t cb; /*! Function pointer to the task. */
- enum timer_task_mode mode; /*! Task mode: one shot or repeat. */
-};
-
-/**
- * \brief Timer structure
- */
-struct timer_descriptor {
- struct _timer_device device;
- uint32_t time;
- struct list_descriptor tasks; /*! Timer tasks list. */
- volatile uint8_t flags;
-};
-
-/**
- * \brief Initialize timer
- *
- * This function initializes the given timer.
- * It checks if the given hardware is not initialized and if the given hardware
- * is permitted to be initialized.
- *
- * \param[out] descr A timer descriptor to initialize
- * \param[in] hw The pointer to the hardware instance
- * \param[in] func The pointer to a set of function pointers
- *
- * \return Initialization status.
- */
-int32_t timer_init(struct timer_descriptor *const descr, void *const hw, struct _timer_hpl_interface *const func);
-
-/**
- * \brief Deinitialize timer
- *
- * This function deinitializes the given timer.
- * It checks if the given hardware is initialized and if the given hardware is
- * permitted to be deinitialized.
- *
- * \param[in] descr A timer descriptor to deinitialize
- *
- * \return De-initialization status.
- */
-int32_t timer_deinit(struct timer_descriptor *const descr);
-
-/**
- * \brief Start timer
- *
- * This function starts the given timer.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to start
- *
- * \return Timer starting status.
- */
-int32_t timer_start(struct timer_descriptor *const descr);
-
-/**
- * \brief Stop timer
- *
- * This function stops the given timer.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to stop
- *
- * \return Timer stopping status.
- */
-int32_t timer_stop(struct timer_descriptor *const descr);
-
-/**
- * \brief Set amount of clock cycles per timer tick
- *
- * This function sets the amount of clock cycles per timer tick for the given timer.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to stop
- * \param[in] clock_cycles The amount of clock cycles per tick to set
- *
- * \return Setting clock cycles amount status.
- */
-int32_t timer_set_clock_cycles_per_tick(struct timer_descriptor *const descr, const uint32_t clock_cycles);
-
-/**
- * \brief Retrieve the amount of clock cycles in a tick
- *
- * This function retrieves how many clock cycles there are in a single timer tick.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to convert ticks to
- * clock cycles
- * \param[out] cycles The amount of clock cycles
- *
- * \return The status of clock cycles retrieving.
- */
-int32_t timer_get_clock_cycles_in_tick(const struct timer_descriptor *const descr, uint32_t *const cycles);
-
-/**
- * \brief Add timer task
- *
- * This function adds the given timer task to the given timer.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to add task to
- * \param[in] task A task to add
- *
- * \return Timer's task adding status.
- */
-int32_t timer_add_task(struct timer_descriptor *const descr, struct timer_task *const task);
-
-/**
- * \brief Remove timer task
- *
- * This function removes the given timer task from the given timer.
- * It checks if the given hardware is initialized.
- *
- * \param[in] descr The timer descriptor of a timer to remove task from
- * \param[in] task A task to remove
- *
- * \return Timer's task removing status.
- */
-int32_t timer_remove_task(struct timer_descriptor *const descr, const struct timer_task *const task);
-
-/**
- * \brief Retrieve the current driver version
- *
- * \return Current driver version.
- */
-uint32_t timer_get_version(void);
-/**@}*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _HAL_TIMER_H_INCLUDED */
diff --git a/Smol Watch Project/My Project/hal/src/hal_timer.c b/Smol Watch Project/My Project/hal/src/hal_timer.c
deleted file mode 100644
index 565c6db1..00000000
--- a/Smol Watch Project/My Project/hal/src/hal_timer.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * \file
- *
- * \brief Timer functionality implementation.
- *
- * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
- *
- * \asf_license_start
- *
- * \page License
- *
- * Subject to your compliance with these terms, you may use Microchip
- * software and any derivatives exclusively with Microchip products.
- * It is your responsibility to comply with third party license terms applicable
- * to your use of third party software (including open source software) that
- * may accompany Microchip software.
- *
- * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
- * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
- * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
- * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
- * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
- * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
- * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
- * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
- * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
- * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
- * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
- *
- * \asf_license_stop
- *
- */
-
-#include "hal_timer.h"
-#include <utils_assert.h>
-#include <utils.h>
-#include <hal_atomic.h>
-#include <hpl_irq.h>
-
-/**
- * \brief Driver version
- */
-#define DRIVER_VERSION 0x00000001u
-
-/**
- * \brief Timer flags
- */
-#define TIMER_FLAG_QUEUE_IS_TAKEN 1
-#define TIMER_FLAG_INTERRUPT_TRIGERRED 2
-
-static void timer_add_timer_task(struct list_descriptor *list, struct timer_task *const new_task, const uint32_t time);
-static void timer_process_counted(struct _timer_device *device);
-
-/**
- * \brief Initialize timer
- */
-int32_t timer_init(struct timer_descriptor *const descr, void *const hw, struct _timer_hpl_interface *const func)
-{
- ASSERT(descr && hw);
- _timer_init(&descr->device, hw);
- descr->time = 0;
- descr->device.timer_cb.period_expired = timer_process_counted;
-
- return ERR_NONE;
-}
-
-/**
- * \brief Deinitialize timer
- */
-int32_t timer_deinit(struct timer_descriptor *const descr)
-{
- ASSERT(descr);
- _timer_deinit(&descr->device);
-
- return ERR_NONE;
-}
-
-/**
- * \brief Start timer
- */
-int32_t timer_start(struct timer_descriptor *const descr)
-{
- ASSERT(descr);
- if (_timer_is_started(&descr->device)) {
- return ERR_DENIED;
- }
- _timer_start(&descr->device);
-
- return ERR_NONE;
-}
-
-/**
- * \brief Stop timer
- */
-int32_t timer_stop(struct timer_descriptor *const descr)
-{
- ASSERT(descr);
- if (!_timer_is_started(&descr->device)) {
- return ERR_DENIED;
- }
- _timer_stop(&descr->device);
-
- return ERR_NONE;
-}
-
-/**
- * \brief Set amount of clock cycler per timer tick
- */
-int32_t timer_set_clock_cycles_per_tick(struct timer_descriptor *const descr, const uint32_t clock_cycles)
-{
- ASSERT(descr);
- _timer_set_period(&descr->device, clock_cycles);
-
- return ERR_NONE;
-}
-
-/**
- * \brief Add timer task
- */
-int32_t timer_add_task(struct timer_descriptor *const descr, struct timer_task *const task)
-{
- ASSERT(descr && task);
-
- descr->flags |= TIMER_FLAG_QUEUE_IS_TAKEN;
- if (is_list_element(&descr->tasks, task)) {
- descr->flags &= ~TIMER_FLAG_QUEUE_IS_TAKEN;
- ASSERT(false);
- return ERR_ALREADY_INITIALIZED;
- }
- task->time_label = descr->time;
- timer_add_timer_task(&descr->tasks, task, descr->time);
-
- descr->flags &= ~TIMER_FLAG_QUEUE_IS_TAKEN;
- if (descr->flags & TIMER_FLAG_INTERRUPT_TRIGERRED) {
- CRITICAL_SECTION_ENTER()
- descr->flags &= ~TIMER_FLAG_INTERRUPT_TRIGERRED;
- _timer_set_irq(&descr->device);
- CRITICAL_SECTION_LEAVE()
- }
-
- return ERR_NONE;
-}
-
-/**
- * \brief Remove timer task
- */
-int32_t timer_remove_task(struct timer_descriptor *const descr, const struct timer_task *const task)
-{
- ASSERT(descr && task);
-
- descr->flags |= TIMER_FLAG_QUEUE_IS_TAKEN;
- if (!is_list_element(&descr->tasks, task)) {
- descr->flags &= ~TIMER_FLAG_QUEUE_IS_TAKEN;
- ASSERT(false);
- return ERR_NOT_FOUND;
- }
- list_delete_element(&descr->tasks, task);
-
- descr->flags &= ~TIMER_FLAG_QUEUE_IS_TAKEN;
- if (descr->flags & TIMER_FLAG_INTERRUPT_TRIGERRED) {
- CRITICAL_SECTION_ENTER()
- descr->flags &= ~TIMER_FLAG_INTERRUPT_TRIGERRED;
- _timer_set_irq(&descr->device);
- CRITICAL_SECTION_LEAVE()
- }
-
- return ERR_NONE;
-}
-
-/**
- * \brief Retrieve the amount of clock cycles in a tick
- */
-int32_t timer_get_clock_cycles_in_tick(const struct timer_descriptor *const descr, uint32_t *const cycles)
-{
- ASSERT(descr && cycles);
- *cycles = _timer_get_period(&descr->device);
- return ERR_NONE;
-}
-
-/**
- * \brief Retrieve the current driver version
- */
-uint32_t timer_get_version(void)
-{
- return DRIVER_VERSION;
-}
-
-/**
- * \internal Insert a timer task into sorted timer's list
- *
- * \param[in] head The pointer to the head of timer task list
- * \param[in] task The pointer to task to add
- * \param[in] time Current timer time
- */
-static void timer_add_timer_task(struct list_descriptor *list, struct timer_task *const new_task, const uint32_t time)
-{
- struct timer_task *it, *prev = NULL, *head = (struct timer_task *)list_get_head(list);
-
- if (!head) {
- list_insert_as_head(list, new_task);
- return;
- }
-
- for (it = head; it; it = (struct timer_task *)list_get_next_element(it)) {
- uint32_t time_left;
-
- if (it->time_label <= time) {
- time_left = it->interval - (time - it->time_label);
- } else {
- time_left = it->interval - (0xFFFFFFFF - it->time_label) - time;
- }
- if (time_left >= new_task->interval)
- break;
- prev = it;
- }
-
- if (it == head) {
- list_insert_as_head(list, new_task);
- } else {
- list_insert_after(prev, new_task);
- }
-}
-
-/**
- * \internal Process interrupts
- */
-static void timer_process_counted(struct _timer_device *device)
-{
- struct timer_descriptor *timer = CONTAINER_OF(device, struct timer_descriptor, device);
- struct timer_task * it = (struct timer_task *)list_get_head(&timer->tasks);
- uint32_t time = ++timer->time;
-
- if ((timer->flags & TIMER_FLAG_QUEUE_IS_TAKEN) || (timer->flags & TIMER_FLAG_INTERRUPT_TRIGERRED)) {
- timer->flags |= TIMER_FLAG_INTERRUPT_TRIGERRED;
- return;
- }
-
- while (it && ((time - it->time_label) >= it->interval)) {
- struct timer_task *tmp = it;
-
- list_remove_head(&timer->tasks);
- if (TIMER_TASK_REPEAT == tmp->mode) {
- tmp->time_label = time;
- timer_add_timer_task(&timer->tasks, tmp, time);
- }
- it = (struct timer_task *)list_get_head(&timer->tasks);
-
- tmp->cb(tmp);
- }
-}