mirror of
https://github.com/GorgonMeducer/perf_counter.git
synced 2025-02-07 19:34:18 +08:00
improve resolution
This commit is contained in:
parent
fbfad9ac9c
commit
e964738dad
@ -294,8 +294,8 @@
|
|||||||
<component Cclass="Utilities" Cversion="2.3.0" Cgroup="perf_counter" Csub="Porting" Cvariant="User Defined" isDefaultVariant="true" condition="perf_counter">
|
<component Cclass="Utilities" Cversion="2.3.0" Cgroup="perf_counter" Csub="Porting" Cvariant="User Defined" isDefaultVariant="true" condition="perf_counter">
|
||||||
<description>A user define system timer</description>
|
<description>A user define system timer</description>
|
||||||
<files>
|
<files>
|
||||||
<file category="sourceC" name="template/perfc_port_user.c" attr="config" version="1.0.1"/>
|
<file category="sourceC" name="template/perfc_port_user.c" attr="config" version="1.0.2"/>
|
||||||
<file category="header" name="template/perfc_port_user.h" attr="config" version="1.0.1"/>
|
<file category="header" name="template/perfc_port_user.h" attr="config" version="1.0.2"/>
|
||||||
</files>
|
</files>
|
||||||
|
|
||||||
<Pre_Include_Global_h>
|
<Pre_Include_Global_h>
|
||||||
|
@ -71,8 +71,8 @@ volatile static uint32_t s_wUSUnit = 1;
|
|||||||
volatile static uint32_t s_wMSUnit = 1;
|
volatile static uint32_t s_wMSUnit = 1;
|
||||||
volatile static uint32_t s_wMSResidule = 0;
|
volatile static uint32_t s_wMSResidule = 0;
|
||||||
volatile static uint32_t s_wUSResidule = 0;
|
volatile static uint32_t s_wUSResidule = 0;
|
||||||
volatile static uint32_t s_wSystemMS = 0;
|
volatile static int64_t s_lSystemMS = 0;
|
||||||
volatile static uint32_t s_wSystemUS = 0;
|
volatile static int64_t s_lSystemUS = 0;
|
||||||
|
|
||||||
volatile static int64_t s_lSystemClockCounts = 0;
|
volatile static int64_t s_lSystemClockCounts = 0;
|
||||||
|
|
||||||
@ -82,13 +82,13 @@ volatile static int64_t s_lSystemClockCounts = 0;
|
|||||||
extern
|
extern
|
||||||
uint32_t perfc_port_get_system_freq(void);
|
uint32_t perfc_port_get_system_freq(void);
|
||||||
extern
|
extern
|
||||||
uint32_t perfc_port_get_system_timer_top(void);
|
int64_t perfc_port_get_system_timer_top(void);
|
||||||
extern
|
extern
|
||||||
bool perfc_port_is_system_timer_ovf_pending(void);
|
bool perfc_port_is_system_timer_ovf_pending(void);
|
||||||
extern
|
extern
|
||||||
void perfc_port_init_system_timer(void);
|
void perfc_port_init_system_timer(bool bTimerOccupied);
|
||||||
extern
|
extern
|
||||||
uint32_t perfc_port_get_system_timer_elapsed(void);
|
int64_t perfc_port_get_system_timer_elapsed(void);
|
||||||
extern
|
extern
|
||||||
void perfc_port_clear_system_timer_ovf_pending(void);
|
void perfc_port_clear_system_timer_ovf_pending(void);
|
||||||
extern
|
extern
|
||||||
@ -101,23 +101,28 @@ void perfc_port_clear_system_timer_counter(void);
|
|||||||
|
|
||||||
void user_code_insert_to_systick_handler(void)
|
void user_code_insert_to_systick_handler(void)
|
||||||
{
|
{
|
||||||
uint32_t wLoad = perfc_port_get_system_timer_top() + 1;
|
int64_t lLoad = perfc_port_get_system_timer_top() + 1;
|
||||||
s_lSystemClockCounts += wLoad;
|
s_lSystemClockCounts += lLoad;
|
||||||
|
|
||||||
// update system ms counter
|
// update system ms counter
|
||||||
do {
|
do {
|
||||||
s_wMSResidule += wLoad;
|
int64_t lTemp = s_wMSResidule + lLoad;
|
||||||
uint32_t wMS = s_wMSResidule / s_wMSUnit;
|
|
||||||
s_wMSResidule -= wMS * s_wMSUnit;
|
int64_t lMS = lTemp / s_wMSUnit;
|
||||||
s_wSystemMS += wMS;
|
s_lSystemMS += lMS;
|
||||||
|
s_wMSResidule = (uint32_t)((int64_t)lTemp - (int64_t)lMS * s_wMSUnit);
|
||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
// update system us counter
|
// update system us counter
|
||||||
do {
|
do {
|
||||||
s_wUSResidule += wLoad;
|
int64_t lTemp = s_wUSResidule + lLoad;
|
||||||
uint32_t wUS = s_wUSResidule / s_wUSUnit;
|
|
||||||
s_wUSResidule -= wUS * s_wUSUnit;
|
int64_t lUS = lTemp / s_wUSUnit;
|
||||||
s_wSystemUS += wUS;
|
s_lSystemUS += lUS;
|
||||||
|
|
||||||
|
s_wUSResidule = (uint32_t)((int64_t)lTemp - (int64_t)lUS * s_wUSUnit);
|
||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -143,16 +148,14 @@ void update_perf_counter(void)
|
|||||||
void init_cycle_counter(bool bIsSysTickOccupied)
|
void init_cycle_counter(bool bIsSysTickOccupied)
|
||||||
{
|
{
|
||||||
__IRQ_SAFE {
|
__IRQ_SAFE {
|
||||||
if (!bIsSysTickOccupied) {
|
perfc_port_init_system_timer(bIsSysTickOccupied); // use the longest period
|
||||||
perfc_port_init_system_timer(); // use the longest period
|
|
||||||
}
|
|
||||||
perfc_port_clear_system_timer_ovf_pending();
|
perfc_port_clear_system_timer_ovf_pending();
|
||||||
}
|
}
|
||||||
|
|
||||||
update_perf_counter();
|
update_perf_counter();
|
||||||
s_lSystemClockCounts = 0; // reset system cycle counter
|
s_lSystemClockCounts = 0; // reset system cycle counter
|
||||||
s_wSystemMS = 0; // reset system millisecond counter
|
s_lSystemMS = 0; // reset system millisecond counter
|
||||||
s_wSystemUS = 0; // reset system microsecond counter
|
s_lSystemUS = 0; // reset system microsecond counter
|
||||||
|
|
||||||
__perf_os_patch_init();
|
__perf_os_patch_init();
|
||||||
}
|
}
|
||||||
@ -161,10 +164,10 @@ void init_cycle_counter(bool bIsSysTickOccupied)
|
|||||||
* hence SysTick-LOAD and (SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)
|
* hence SysTick-LOAD and (SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)
|
||||||
* won't change.
|
* won't change.
|
||||||
*/
|
*/
|
||||||
__STATIC_INLINE uint32_t check_systick(void)
|
__STATIC_INLINE int64_t check_systick(void)
|
||||||
{
|
{
|
||||||
uint32_t wLoad = perfc_port_get_system_timer_top() + 1;
|
int64_t lLoad = perfc_port_get_system_timer_top() + 1;
|
||||||
uint32_t wTemp = perfc_port_get_system_timer_elapsed();
|
int64_t lTemp = perfc_port_get_system_timer_elapsed();
|
||||||
|
|
||||||
/* Since we cannot stop counting temporarily, there are several
|
/* Since we cannot stop counting temporarily, there are several
|
||||||
* conditions which we should take into consideration:
|
* conditions which we should take into consideration:
|
||||||
@ -187,12 +190,12 @@ __STATIC_INLINE uint32_t check_systick(void)
|
|||||||
* The following code implements an equivalent logic.
|
* The following code implements an equivalent logic.
|
||||||
*/
|
*/
|
||||||
if (perfc_port_is_system_timer_ovf_pending()){
|
if (perfc_port_is_system_timer_ovf_pending()){
|
||||||
if ((wLoad - wTemp) >= PERF_CNT_COMPENSATION_THRESHOLD) {
|
if ((lLoad - lTemp) >= PERF_CNT_COMPENSATION_THRESHOLD) {
|
||||||
wTemp += wLoad;
|
lTemp += lLoad;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return wTemp;
|
return lTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void before_cycle_counter_reconfiguration(void)
|
void before_cycle_counter_reconfiguration(void)
|
||||||
@ -311,26 +314,26 @@ int64_t clock(void)
|
|||||||
return get_system_ticks();
|
return get_system_ticks();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_system_ms(void)
|
int64_t get_system_ms(void)
|
||||||
{
|
{
|
||||||
uint32_t nTemp = 0;
|
int64_t lTemp = 0;
|
||||||
|
|
||||||
__IRQ_SAFE {
|
__IRQ_SAFE {
|
||||||
nTemp = s_wSystemMS + (check_systick() + s_wMSResidule) / s_wMSUnit;
|
lTemp = s_lSystemMS + ((check_systick() + (int64_t)s_wMSResidule) / s_wMSUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nTemp;
|
return lTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_system_us(void)
|
int64_t get_system_us(void)
|
||||||
{
|
{
|
||||||
uint32_t wTemp = 0;
|
int64_t lTemp = 0;
|
||||||
|
|
||||||
__IRQ_SAFE {
|
__IRQ_SAFE {
|
||||||
wTemp = s_wSystemUS + (check_systick() + s_wUSResidule) / s_wUSUnit;
|
lTemp = s_lSystemUS + ((check_systick() + (int64_t)s_wUSResidule) / s_wUSUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return wTemp;
|
return lTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t perfc_convert_ticks_to_ms(int64_t lTick)
|
int64_t perfc_convert_ticks_to_ms(int64_t lTick)
|
||||||
|
@ -661,17 +661,15 @@ int64_t stop_cycle_counter(void)
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief get the elapsed milliseconds since perf_counter is initialised
|
* \brief get the elapsed milliseconds since perf_counter is initialised
|
||||||
* \return uint32_t the elapsed milliseconds
|
* \return int64_t the elapsed milliseconds
|
||||||
*/
|
*/
|
||||||
extern uint32_t get_system_ms(void);
|
extern int64_t get_system_ms(void);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief get the elapsed microsecond since perf_counter is initialised
|
* \brief get the elapsed microsecond since perf_counter is initialised
|
||||||
* \return uint32_t the elapsed microsecond
|
* \return int64_t the elapsed microsecond
|
||||||
*/
|
*/
|
||||||
extern uint32_t get_system_us(void);
|
extern int64_t get_system_us(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief delay specified time in microsecond
|
* \brief delay specified time in microsecond
|
||||||
|
@ -160,8 +160,12 @@ extern uint32_t SystemCoreClock;
|
|||||||
|
|
||||||
#if !__PERFC_CFG_DISABLE_DEFAULT_SYSTICK_PORTING__
|
#if !__PERFC_CFG_DISABLE_DEFAULT_SYSTICK_PORTING__
|
||||||
__WEAK
|
__WEAK
|
||||||
void perfc_port_init_system_timer(void)
|
void perfc_port_init_system_timer(bool bTimerOccupied)
|
||||||
{
|
{
|
||||||
|
if (bTimerOccupied) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
__IRQ_SAFE {
|
__IRQ_SAFE {
|
||||||
SysTick->CTRL = 0;
|
SysTick->CTRL = 0;
|
||||||
|
|
||||||
@ -188,15 +192,15 @@ bool perfc_port_is_system_timer_ovf_pending(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
__WEAK
|
__WEAK
|
||||||
uint32_t perfc_port_get_system_timer_top(void)
|
int64_t perfc_port_get_system_timer_top(void)
|
||||||
{
|
{
|
||||||
return SysTick->LOAD;
|
return SysTick->LOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK
|
__WEAK
|
||||||
uint32_t perfc_port_get_system_timer_elapsed(void)
|
int64_t perfc_port_get_system_timer_elapsed(void)
|
||||||
{
|
{
|
||||||
return (uint32_t)SysTick->LOAD - (uint32_t)SysTick->VAL;
|
return (int64_t)SysTick->LOAD - (uint32_t)SysTick->VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
__WEAK
|
__WEAK
|
||||||
|
@ -49,8 +49,12 @@
|
|||||||
|
|
||||||
#if __PERFC_USE_USER_CUSTOM_PORTING__
|
#if __PERFC_USE_USER_CUSTOM_PORTING__
|
||||||
|
|
||||||
void perfc_port_init_system_timer(void)
|
void perfc_port_init_system_timer(bool bIsTimeOccupied)
|
||||||
{
|
{
|
||||||
|
if (bIsTimeOccupied) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
__IRQ_SAFE {
|
__IRQ_SAFE {
|
||||||
/* Configure the system timer count with the longest possible period
|
/* Configure the system timer count with the longest possible period
|
||||||
* clear counter
|
* clear counter
|
||||||
@ -73,13 +77,13 @@ bool perfc_port_is_system_timer_ovf_pending(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t perfc_port_get_system_timer_top(void)
|
int64_t perfc_port_get_system_timer_top(void)
|
||||||
{
|
{
|
||||||
/* the top value of the counting */
|
/* the top value of the counting */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t perfc_port_get_system_timer_elapsed(void)
|
int64_t perfc_port_get_system_timer_elapsed(void)
|
||||||
{
|
{
|
||||||
/* the elapsed count number since last overflow */
|
/* the elapsed count number since last overflow */
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user