simplelink: dpl: fix issues in ClockP
This commit fixes ClockP to use correct struct size, to set the correct period and timeout in call to k_timer_start, and to deal with NULL parameters in ClockP_construct. Signed-off-by: Vincent Wan <vincent.wan@linaro.org>
This commit is contained in:
parent
d3b9d78ea3
commit
e45a3f8ed2
|
@ -24,6 +24,12 @@ typedef struct _ClockP_Obj {
|
||||||
bool active;
|
bool active;
|
||||||
} ClockP_Obj;
|
} ClockP_Obj;
|
||||||
|
|
||||||
|
static ClockP_Params ClockP_defaultParams = {
|
||||||
|
.startFlag = false,
|
||||||
|
.period = 0,
|
||||||
|
.arg = 0,
|
||||||
|
};
|
||||||
|
|
||||||
static void expiry_fxn(struct k_timer *timer_id)
|
static void expiry_fxn(struct k_timer *timer_id)
|
||||||
{
|
{
|
||||||
ClockP_Obj *obj = (ClockP_Obj *)k_timer_user_data_get(timer_id);
|
ClockP_Obj *obj = (ClockP_Obj *)k_timer_user_data_get(timer_id);
|
||||||
|
@ -43,6 +49,10 @@ ClockP_Handle ClockP_construct(ClockP_Struct *handle, ClockP_Fxn clockFxn,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params == NULL) {
|
||||||
|
params = &ClockP_defaultParams;
|
||||||
|
}
|
||||||
|
|
||||||
obj->clock_fxn = clockFxn;
|
obj->clock_fxn = clockFxn;
|
||||||
obj->arg = params->arg;
|
obj->arg = params->arg;
|
||||||
obj->period = params->period * ClockP_getSystemTickPeriod() / 1000;
|
obj->period = params->period * ClockP_getSystemTickPeriod() / 1000;
|
||||||
|
@ -99,11 +109,36 @@ void ClockP_setTimeout(ClockP_Handle handle, uint32_t timeout)
|
||||||
void ClockP_start(ClockP_Handle handle)
|
void ClockP_start(ClockP_Handle handle)
|
||||||
{
|
{
|
||||||
ClockP_Obj *obj = (ClockP_Obj *)handle;
|
ClockP_Obj *obj = (ClockP_Obj *)handle;
|
||||||
|
s32_t timeout;
|
||||||
|
s32_t period;
|
||||||
|
|
||||||
__ASSERT_NO_MSG(obj->timeout > (UINT32_MAX / 1000));
|
__ASSERT_NO_MSG(obj->timeout /
|
||||||
|
CONFIG_SYS_CLOCK_TICKS_PER_SEC <= UINT32_MAX / 1000);
|
||||||
|
__ASSERT_NO_MSG(obj->period /
|
||||||
|
CONFIG_SYS_CLOCK_TICKS_PER_SEC <= UINT32_MAX / 1000);
|
||||||
|
|
||||||
k_timer_start(&obj->timer, obj->timeout * 1000 /
|
/* Avoid overflow */
|
||||||
CONFIG_SYS_CLOCK_TICKS_PER_SEC, obj->period);
|
if (obj->timeout > UINT32_MAX / 1000) {
|
||||||
|
timeout = obj->timeout / CONFIG_SYS_CLOCK_TICKS_PER_SEC * 1000;
|
||||||
|
} else if ((obj->timeout != 0) &&
|
||||||
|
(obj->timeout < CONFIG_SYS_CLOCK_TICKS_PER_SEC / 1000)) {
|
||||||
|
/* For small timeouts we use 1 msec */
|
||||||
|
timeout = 1;
|
||||||
|
} else {
|
||||||
|
timeout = obj->timeout * 1000 / CONFIG_SYS_CLOCK_TICKS_PER_SEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj->period > UINT32_MAX / 1000) {
|
||||||
|
period = obj->period / CONFIG_SYS_CLOCK_TICKS_PER_SEC * 1000;
|
||||||
|
} else if ((obj->period != 0) &&
|
||||||
|
(obj->period < CONFIG_SYS_CLOCK_TICKS_PER_SEC / 1000)) {
|
||||||
|
period = 1;
|
||||||
|
} else {
|
||||||
|
period = obj->period * 1000 / CONFIG_SYS_CLOCK_TICKS_PER_SEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
k_timer_start(&obj->timer, timeout, period);
|
||||||
|
|
||||||
obj->active = true;
|
obj->active = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ typedef void (*ClockP_Fxn)(uintptr_t arg);
|
||||||
*/
|
*/
|
||||||
#define ClockP_STRUCT_SIZE (sizeof(struct k_timer) + \
|
#define ClockP_STRUCT_SIZE (sizeof(struct k_timer) + \
|
||||||
sizeof(ClockP_Fxn) + sizeof(uintptr_t) + \
|
sizeof(ClockP_Fxn) + sizeof(uintptr_t) + \
|
||||||
sizeof(uint32_t) * 2)
|
sizeof(uint32_t) * 2) + sizeof(bool)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief ClockP structure.
|
* @brief ClockP structure.
|
||||||
|
|
Loading…
Reference in New Issue