improve resolution

This commit is contained in:
Gabriel Wang 2024-01-22 13:48:48 +00:00
parent fbfad9ac9c
commit e964738dad
5 changed files with 58 additions and 49 deletions

View File

@ -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>

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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;