diff --git a/FreeRTOSConfig.h b/FreeRTOSConfig.h index 97f7401..b923926 100644 --- a/FreeRTOSConfig.h +++ b/FreeRTOSConfig.h @@ -110,7 +110,7 @@ extern uint32_t SystemCoreClock; #define configCHECK_FOR_STACK_OVERFLOW 2 #define configENABLE_BACKWARD_COMPATIBILITY 0 -#define configUSE_TIMERS 1 +#define configUSE_TIMERS 0 #define configTIMER_TASK_PRIORITY TSK_TIMERS_PRIO // above normal #define configTIMER_TASK_STACK_DEPTH TSK_STACK_TIMERS //128 #define configTIMER_QUEUE_LENGTH 4 diff --git a/cortex_handlers.c b/cortex_handlers.c index cefc825..22be285 100644 --- a/cortex_handlers.c +++ b/cortex_handlers.c @@ -13,8 +13,10 @@ void SysTick_Handler(void) { - GEX_MsTick(); + // OS first, avoids jitter osSystickHandler(); + // GEX periodic updates + GEX_MsTick(); } diff --git a/freertos.c b/freertos.c index 7ac46bc..6213905 100644 --- a/freertos.c +++ b/freertos.c @@ -147,7 +147,7 @@ void MX_FREERTOS_Init(void) { stackmon_register("Main", mainTaskStack, sizeof(mainTaskStack)); stackmon_register("Job+Msg", msgJobQueTaskStack, sizeof(msgJobQueTaskStack)); stackmon_register("Idle", xIdleStack, sizeof(xIdleStack)); - stackmon_register("Timers", xTimersStack, sizeof(xTimersStack)); +// stackmon_register("Timers", xTimersStack, sizeof(xTimersStack)); /* USER CODE END Init */ /* Create the mutex(es) */ diff --git a/units/1wire/_ow_init.c b/units/1wire/_ow_init.c index 713a886..91bf86d 100644 --- a/units/1wire/_ow_init.c +++ b/units/1wire/_ow_init.c @@ -14,15 +14,6 @@ error_t OW_preInit(Unit *unit) struct priv *priv = unit->data = calloc_ck(1, sizeof(struct priv)); if (priv == NULL) return E_OUT_OF_MEM; - // the timer is not started until needed - priv->busyWaitTimer = xTimerCreate("1w_tim", // name - 750, // interval (will be changed when starting it) - true, // periodic (we use this only for the polling variant, the one-shot will stop the timer in the CB) - unit, // user data - OW_TimerCb); // callback - - if (priv->busyWaitTimer == NULL) return E_OUT_OF_MEM; - // some defaults priv->pin_number = 0; priv->port_name = 'A'; @@ -63,9 +54,6 @@ void OW_deInit(Unit *unit) // Release all resources rsc_teardown(unit); - // Delete the software timer - assert_param(pdPASS == xTimerDelete(priv->busyWaitTimer, 1000)); - // Free memory free_ck(unit->data); } diff --git a/units/1wire/unit_1wire.c b/units/1wire/unit_1wire.c index 6dead85..9314ec9 100644 --- a/units/1wire/unit_1wire.c +++ b/units/1wire/unit_1wire.c @@ -38,12 +38,13 @@ static void OW_TimerRespCb(Job *job) * * @param xTimer */ -void OW_TimerCb(TimerHandle_t xTimer) +void OW_tickHandler(Unit *unit) { - Unit *unit = pvTimerGetTimerID(xTimer); - assert_param(unit); struct priv *priv = unit->data; - assert_param(priv->busy); + if(!priv->busy) { + dbg("ow tick should be disabled now!"); + return; + } if (priv->parasitic) { // this is the end of the 750ms measurement time @@ -56,7 +57,8 @@ void OW_TimerCb(TimerHandle_t xTimer) uint32_t time = PTIM_GetTime(); if (time - priv->busyStart > 1000) { - xTimerStop(xTimer, 100); + unit->tick_interval = 0; + unit->_tick_cnt = 0; Job j = { .unit = unit, @@ -69,7 +71,8 @@ void OW_TimerCb(TimerHandle_t xTimer) return; halt_ok: - xTimerStop(xTimer, 100); + unit->tick_interval = 0; + unit->_tick_cnt = 0; Job j = { .unit = unit, @@ -79,7 +82,6 @@ halt_ok: scheduleJob(&j); } - enum PinCmd_ { CMD_CHECK_PRESENCE = 0, // simply tests that any devices are attached CMD_SEARCH_ADDR = 1, // perform a scan of the bus, retrieving all found device ROMs @@ -120,13 +122,13 @@ static error_t OW_handleRequest(Unit *unit, TF_ID frame_id, uint8_t command, Pay */ case CMD_POLL_FOR_1: // This can't be exposed via the UU API, due to being async + unit->_tick_cnt = 0; + unit->tick_interval = 750; if (priv->parasitic) { - assert_param(pdPASS == xTimerChangePeriod(priv->busyWaitTimer, 750, 100)); + unit->tick_interval = 750; } else { - // every 10 ticks - assert_param(pdPASS == xTimerChangePeriod(priv->busyWaitTimer, 10, 100)); + unit->tick_interval = 10; } - assert_param(pdPASS == xTimerStart(priv->busyWaitTimer, 100)); priv->busy = true; priv->busyStart = PTIM_GetTime(); priv->busyRequestId = frame_id; @@ -242,4 +244,5 @@ const UnitDriver UNIT_1WIRE = { .deInit = OW_deInit, // Function .handleRequest = OW_handleRequest, + .updateTick = OW_tickHandler, };