forked from weston-embedded/uC-OS3
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request weston-embedded#13 from forg0ne/dyn_tick_bsp
Create bsp_os_dt.c
- Loading branch information
Showing
1 changed file
with
284 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,284 @@ | ||
/* | ||
********************************************************************************************************* | ||
* uC/OS-III | ||
* The Real-Time Kernel | ||
* | ||
* Copyright 2009-2020 Silicon Laboratories Inc. www.silabs.com | ||
* | ||
* SPDX-License-Identifier: APACHE-2.0 | ||
* | ||
* This software is subject to an open source license and is distributed by | ||
* Silicon Laboratories Inc. pursuant to the terms of the Apache License, | ||
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0. | ||
* | ||
********************************************************************************************************* | ||
*/ | ||
|
||
/* | ||
********************************************************************************************************* | ||
* | ||
* uC/OS-III BOARD SUPPORT PACKAGE | ||
* Dynamic Tick BSP | ||
* | ||
* Filename : bsp_os_dt.c | ||
********************************************************************************************************* | ||
*/ | ||
|
||
/* | ||
********************************************************************************************************* | ||
* INCLUDE FILES | ||
********************************************************************************************************* | ||
*/ | ||
|
||
#include <cpu_core.h> | ||
#include <os.h> | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* LOCAL DEFINES | ||
********************************************************************************************************* | ||
*/ | ||
|
||
#if (OS_CFG_DYN_TICK_EN == DEF_ENABLED) | ||
#define TIMER_COUNT_HZ ($$$$) /* Frequency of the Dynamic Tick Timer. */ | ||
#define TIMER_TO_OSTICK(count) (((CPU_INT64U)(count) * OS_CFG_TICK_RATE_HZ) / TIMER_COUNT_HZ) | ||
#define OSTICK_TO_TIMER(ostick) (((CPU_INT64U)(ostick) * TIMER_COUNT_HZ) / OS_CFG_TICK_RATE_HZ) | ||
|
||
/* The max timer count should end on a 1 tick boundary. */ | ||
#define TIMER_COUNT_MAX (DEF_INT_32U_MAX_VAL - (DEF_INT_32U_MAX_VAL % OSTICK_TO_TIMER(1u))) | ||
#endif | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* LOCAL VARIABLES | ||
********************************************************************************************************* | ||
*/ | ||
|
||
#if (OS_CFG_DYN_TICK_EN == DEF_ENABLED) | ||
static OS_TICK TickDelta = 0u; /* Stored in OS Tick units. */ | ||
#endif | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* LOCAL FUNCTION PROTOTYPES | ||
********************************************************************************************************* | ||
*/ | ||
|
||
#if (OS_CFG_DYN_TICK_EN == DEF_ENABLED) | ||
static void BSP_DynTick_ISRHandler(void); | ||
#endif | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
********************************************************************************************************* | ||
* GLOBAL FUNCTIONS | ||
********************************************************************************************************* | ||
********************************************************************************************************* | ||
*/ | ||
|
||
/* | ||
********************************************************************************************************* | ||
* BSP_OS_TickInit() | ||
* | ||
* Description : Initializes the tick interrupt for the OS. | ||
* | ||
* Argument(s) : none. | ||
* | ||
* Return(s) : none. | ||
* | ||
* Note(s) : (1) Must be called prior to OSStart() in main(). | ||
* | ||
* (2) This function ensures that the tick interrupt is disabled until BSP_OS_TickEn() is | ||
* called in the startup task. | ||
********************************************************************************************************* | ||
*/ | ||
|
||
void BSP_OS_TickInit (void) | ||
{ | ||
/* $$$$ */ /* Stop the Dynamic Tick Timer if running. */ | ||
|
||
/* $$$$ */ /* Configure the timer. */ | ||
/* $$$$ */ /* Frequency : TIMER_COUNT_HZ */ | ||
/* $$$$ */ /* Counter Match Value : TIMER_COUNT_MAX */ | ||
/* $$$$ */ /* Counter Value : 0 */ | ||
/* $$$$ */ /* Interrupt : On counter match */ | ||
|
||
/* $$$$ */ /* Install BSP_DynTick_ISRHandler as the int. handler. */ | ||
/* $$$$ */ /* Start the timer. */ | ||
} | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* BSP_OS_TickEnable() | ||
* | ||
* Description : Enable the OS tick interrupt. | ||
* | ||
* Argument(s) : none. | ||
* | ||
* Return(s) : none. | ||
* | ||
* Note(s) : none | ||
********************************************************************************************************* | ||
*/ | ||
|
||
void BSP_OS_TickEnable (void) | ||
{ | ||
/* $$$$ */ /* Enable Timer interrupt. */ | ||
/* $$$$ */ /* Start the Timer count generation. */ | ||
} | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* BSP_OS_TickDisable() | ||
* | ||
* Description : Disable the OS tick interrupt. | ||
* | ||
* Argument(s) : none. | ||
* | ||
* Return(s) : none. | ||
* | ||
* Note(s) : none | ||
********************************************************************************************************* | ||
*/ | ||
|
||
void BSP_OS_TickDisable (void) | ||
{ | ||
/* $$$$ */ /* Stop the Timer count generation. */ | ||
/* $$$$ */ /* Disable Timer interrupt. */ | ||
} | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
********************************************************************************************************* | ||
** uC/OS-III DYNAMIC TICK | ||
********************************************************************************************************* | ||
********************************************************************************************************* | ||
*/ | ||
|
||
#if (OS_CFG_DYN_TICK_EN == DEF_ENABLED) | ||
/* | ||
********************************************************************************************************* | ||
* OS_DynTickGet() | ||
* | ||
* Description : Get the number of ticks which have elapsed since the last delta was set. | ||
* | ||
* Argument(s) : none. | ||
* | ||
* Return(s) : An unsigned integer between 0 and TickDelta, inclusive. | ||
* | ||
* Note(s) : 1) This function is an INTERNAL uC/OS-III function & MUST NOT be called by the | ||
* application. | ||
* | ||
* 2) This function is called with kernel-aware interrupts disabled. | ||
********************************************************************************************************* | ||
*/ | ||
|
||
OS_TICK OS_DynTickGet (void) | ||
{ | ||
CPU_INT32U tmrcnt; | ||
|
||
|
||
tmrcnt = /* $$$$ */; /* Read current timer count. */ | ||
|
||
if (/* $$$$ */) { /* Check timer interrupt flag. */ | ||
return (TickDelta); /* Counter Overflow has occured. */ | ||
} | ||
|
||
tmrcnt = TIMER_TO_OSTICK(tmrcnt); /* Otherwise, the value we read is valid. */ | ||
|
||
return ((OS_TICK)tmrcnt); | ||
} | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* OS_DynTickSet() | ||
* | ||
* Description : Sets the number of ticks that the kernel wants to expire before the next interrupt. | ||
* | ||
* Argument(s) : ticks number of ticks the kernel wants to delay. | ||
* 0 indicates an indefinite delay. | ||
* | ||
* Return(s) : The actual number of ticks which will elapse before the next interrupt. | ||
* (See Note #3). | ||
* | ||
* Note(s) : 1) This function is an INTERNAL uC/OS-III function & MUST NOT be called by the | ||
* application. | ||
* | ||
* 2) This function is called with kernel-aware interrupts disabled. | ||
* | ||
* 3) It is possible for the kernel to specify a delay that is too large for our | ||
* hardware timer, or an indefinite delay. In these cases, we should program the timer | ||
* to count the maximum number of ticks possible. The value we return should then | ||
* be the timer maximum converted into units of OS_TICK. | ||
********************************************************************************************************* | ||
*/ | ||
|
||
OS_TICK OS_DynTickSet (OS_TICK ticks) | ||
{ | ||
CPU_INT32U tmrcnt; | ||
|
||
|
||
tmrcnt = OSTICK_TO_TIMER(ticks); | ||
|
||
if ((tmrcnt >= TIMER_COUNT_MAX) || /* If the delay exceeds our timer's capacity, ... */ | ||
(tmrcnt == 0u)) { /* ... or the kernel wants an indefinite delay. */ | ||
tmrcnt = TIMER_COUNT_MAX; /* Count as many ticks as we are able. */ | ||
} | ||
|
||
TickDelta = TIMER_TO_OSTICK(tmrcnt); /* Convert the timer count into OS_TICK units. */ | ||
|
||
/* $$$$ */ /* Stop the timer. */ | ||
/* $$$$ */ /* Clear the timer interrupt. */ | ||
/* Set new timeout. */ | ||
/* $$$$ */ /* Counter Match Value : tmrcnt */ | ||
/* $$$$ */ /* Counter Value : 0 */ | ||
/* $$$$ */ /* Start the timer. */ | ||
|
||
return (TickDelta); /* Return the number ticks that will elapse before ... */ | ||
/* ... the next interrupt. */ | ||
} | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* BSP_DynTick_ISRHandler() | ||
* | ||
* Description : Dynamic Tick ISR handler. | ||
* | ||
* Argument(s) : none. | ||
* | ||
* Return(s) : none. | ||
* | ||
* Note(s) : none. | ||
********************************************************************************************************* | ||
*/ | ||
|
||
static void BSP_DynTick_ISRHandler (void) | ||
{ | ||
CPU_SR_ALLOC(); | ||
|
||
|
||
CPU_CRITICAL_ENTER(); | ||
OSIntEnter(); | ||
CPU_CRITICAL_EXIT(); | ||
|
||
OSTimeDynTick(TickDelta); /* Next delta will be set by the kernel. */ | ||
|
||
OSIntExit(); | ||
} | ||
#endif /* End of uC/OS-III Dynamic Tick module. */ | ||
|
||
|
||
/* | ||
********************************************************************************************************* | ||
* MODULE END | ||
********************************************************************************************************* | ||
*/ |