📄 cpu_core.c
字号:
* --- --- --- --- --- --- --- --- ---------------
* 1 x x x x x x x 0
* 0 1 x x x x x x 1
* 0 0 1 x x x x x 2
* : : : : : : : : :
* : : : : : : : : :
* 0 0 0 1 x x x x 27
* 0 0 0 0 1 x x x 28
* 0 0 0 0 0 1 x x 29
* 0 0 0 0 0 0 1 x 30
* 0 0 0 0 0 0 0 1 31
* 0 0 0 0 0 0 0 0 32
*
*$PAGE*
* (4) For 64-bit values :
*
* b63 b62 b61 ... b04 b03 b02 b01 b00 # Leading Zeros
* --- --- --- --- --- --- --- --- ---------------
* 1 x x x x x x x 0
* 0 1 x x x x x x 1
* 0 0 1 x x x x x 2
* : : : : : : : : :
* : : : : : : : : :
* 0 0 0 1 x x x x 59
* 0 0 0 0 1 x x x 60
* 0 0 0 0 0 1 x x 61
* 0 0 0 0 0 0 1 x 62
* 0 0 0 0 0 0 0 1 63
* 0 0 0 0 0 0 0 0 64
*
*
* See also 'CPU COUNT LEAD ZEROs LOOKUP TABLE Note #1'.
*********************************************************************************************************
*/
#ifndef CPU_CFG_LEAD_ZEROS_ASM_PRESENT
CPU_DATA CPU_CntLeadZeros (CPU_DATA val)
{
CPU_DATA nbr_lead_zeros;
CPU_INT08U ix;
#if (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_08) /* ---------- 8-BIT DATA VAL --------- */
/* Chk bits [07:00] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 0u); /* .. lookup tbl ix = 'val' >> 0 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 0u); /* .. plus nbr msb lead zeros = 0 bits.*/
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16) /* ---------- 16-BIT DATA VAL --------- */
if (val > 0x00FFu) { /* Chk bits [15:08] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 8u); /* .. lookup tbl ix = 'val' >> 8 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 0u); /* .. plus nbr msb lead zeros = 0 bits.*/
} else { /* Chk bits [07:00] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 0u); /* .. lookup tbl ix = 'val' >> 0 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 8u); /* .. plus nbr msb lead zeros = 8 bits.*/
}
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32) /* ---------- 32-BIT DATA VAL --------- */
if (val > 0x0000FFFFu) {
if (val > 0x00FFFFFFu) { /* Chk bits [31:24] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 24u); /* .. lookup tbl ix = 'val' >> 24 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 0u); /* .. plus nbr msb lead zeros = 0 bits.*/
} else { /* Chk bits [23:16] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 16u); /* .. lookup tbl ix = 'val' >> 16 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 8u); /* .. plus nbr msb lead zeros = 8 bits.*/
}
} else {
if (val > 0x000000FFu) { /* Chk bits [15:08] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 8u); /* .. lookup tbl ix = 'val' >> 8 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 16u); /* .. plus nbr msb lead zeros = 16 bits.*/
} else { /* Chk bits [07:00] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 0u); /* .. lookup tbl ix = 'val' >> 0 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 24u); /* .. plus nbr msb lead zeros = 24 bits.*/
}
}
/*$PAGE*/
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_64) /* ---------- 64-BIT DATA VAL --------- */
if (val > 0x00000000FFFFFFFFu) {
if (val > 0x0000FFFFFFFFFFFFu) {
if (val > 0x00FFFFFFFFFFFFFFu) { /* Chk bits [63:56] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 56u); /* .. lookup tbl ix = 'val' >> 56 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 0u); /* .. plus nbr msb lead zeros = 0 bits.*/
} else { /* Chk bits [55:48] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 48u); /* .. lookup tbl ix = 'val' >> 48 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 8u); /* .. plus nbr msb lead zeros = 8 bits.*/
}
} else {
if (val > 0x000000FFFFFFFFFFu) { /* Chk bits [47:40] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 40u); /* .. lookup tbl ix = 'val' >> 40 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 16u); /* .. plus nbr msb lead zeros = 16 bits.*/
} else { /* Chk bits [39:32] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 32u); /* .. lookup tbl ix = 'val' >> 32 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 24u); /* .. plus nbr msb lead zeros = 24 bits.*/
}
}
} else {
if (val > 0x000000000000FFFFu) {
if (val > 0x0000000000FFFFFFu) { /* Chk bits [31:24] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 24u); /* .. lookup tbl ix = 'val' >> 24 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 32u); /* .. plus nbr msb lead zeros = 32 bits.*/
} else { /* Chk bits [23:16] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 16u); /* .. lookup tbl ix = 'val' >> 16 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 40u); /* .. plus nbr msb lead zeros = 40 bits.*/
}
} else {
if (val > 0x00000000000000FFu) { /* Chk bits [15:08] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 8u); /* .. lookup tbl ix = 'val' >> 8 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 48u); /* .. plus nbr msb lead zeros = 48 bits.*/
} else { /* Chk bits [07:00] : */
/* .. Nbr lead zeros = .. */
ix = (CPU_INT08U)(val >> 0u); /* .. lookup tbl ix = 'val' >> 0 bits */
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 56u); /* .. plus nbr msb lead zeros = 56 bits.*/
}
}
}
#else /* See Note #1a. */
(void)&ix;
nbr_lead_zeros = 0u;
#endif
return (nbr_lead_zeros);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
* LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* CPU_NameInit()
*
* Description : Initialize CPU Name.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : CPU_Init().
*
* Note(s) : none.
*********************************************************************************************************
*/
#if (CPU_CFG_NAME_EN == DEF_ENABLED)
static void CPU_NameInit (void)
{
CPU_NameClr();
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* CPU_TS_Init()
*
* Description : (1) Initialize CPU timestamp :
*
* (a) Initialize/start CPU timestamp timer See Note #1
* (b) Initialize CPU timestamp controls
*
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : CPU_Init().
*
* Note(s) : (1) The following initialization MUST be sequenced as follows :
*
* (a) CPU_TS_TmrFreq_Hz MUST be initialized prior to CPU_TS_TmrInit()
* (b) CPU_TS_TmrInit() SHOULD precede calls to all other CPU timestamp functions;
* otherwise, invalid time measurements may be calculated/
* returned.
*
* See also 'CPU_Init() Note #3a'.
*********************************************************************************************************
*/
#if ((CPU_CFG_TS_EN == DEF_ENABLED) || \
(CPU_CFG_TS_TMR_EN == DEF_ENABLED))
static void CPU_TS_Init (void)
{
#if (((CPU_CFG_TS_32_EN == DEF_ENABLED ) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_32)) || \
((CPU_CFG_TS_64_EN == DEF_ENABLED ) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_64)))
CPU_TS_TMR ts_tmr_cnts;
#endif
/* ----------------- INIT CPU TS TMR ------------------ */
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TmrFreq_Hz = 0u; /* Init/clr ts tmr freq (see Note #1a). */
CPU_TS_TmrInit(); /* Init & start ts tmr (see Note #1b). */
#endif
/* ------------------- INIT CPU TS -------------------- */
#if (((CPU_CFG_TS_32_EN == DEF_ENABLED ) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_32)) || \
((CPU_CFG_TS_64_EN == DEF_ENABLED ) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_64)))
ts_tmr_cnts = CPU_TS_TmrRd(); /* Get init ts tmr val (in ts tmr cnts). */
#endif
#if ((CPU_CFG_TS_32_EN == DEF_ENABLED) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_32))
CPU_TS_32_Accum = 0u; /* Init 32-bit accum'd ts. */
CPU_TS_32_TmrPrev = ts_tmr_cnts; /* Init 32-bit ts prev tmr val. */
#endif
#if ((CPU_CFG_TS_64_EN == DEF_ENABLED) && \
(CPU_CFG_TS_TMR_SIZE < CPU_WORD_SIZE_64))
CPU_TS_64_Accum = 0u; /* Init 64-bit accum'd ts. */
CPU_TS_64_TmrPrev = ts_tmr_cnts; /* Init 64-bit ts prev tmr val. */
#endif
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* CPU_IntDisMeasInit()
*
* Description : (1) Initialize interrupts disabled time measurements feature :
*
* (a) Initialize interrupts disabled time measurement controls
* (b) Calculate interrupts disabled time measurement overhead
*
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : CPU_Init().
*
* Note(s) : (2) CPU_IntDisMeasInit() SHOULD precede ALL calls to CPU_CRITICAL_ENTER()/CPU_CRITICAL_EXIT()
* & other CPU interrupts disabled time measurement functions; otherwise,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -