Removed timers use from 1wire, timers disabled, fixed overflow bug

remotes/github/bad-doublebuf
Ondřej Hruška 7 years ago
parent e96ecceec9
commit 887887b675
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 2
      FreeRTOSConfig.h
  2. 4
      cortex_handlers.c
  3. 2
      freertos.c
  4. 12
      units/1wire/_ow_init.c
  5. 25
      units/1wire/unit_1wire.c

@ -110,7 +110,7 @@ extern uint32_t SystemCoreClock;
#define configCHECK_FOR_STACK_OVERFLOW 2 #define configCHECK_FOR_STACK_OVERFLOW 2
#define configENABLE_BACKWARD_COMPATIBILITY 0 #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_PRIORITY TSK_TIMERS_PRIO // above normal
#define configTIMER_TASK_STACK_DEPTH TSK_STACK_TIMERS //128 #define configTIMER_TASK_STACK_DEPTH TSK_STACK_TIMERS //128
#define configTIMER_QUEUE_LENGTH 4 #define configTIMER_QUEUE_LENGTH 4

@ -13,8 +13,10 @@
void SysTick_Handler(void) void SysTick_Handler(void)
{ {
GEX_MsTick(); // OS first, avoids jitter
osSystickHandler(); osSystickHandler();
// GEX periodic updates
GEX_MsTick();
} }

@ -147,7 +147,7 @@ void MX_FREERTOS_Init(void) {
stackmon_register("Main", mainTaskStack, sizeof(mainTaskStack)); stackmon_register("Main", mainTaskStack, sizeof(mainTaskStack));
stackmon_register("Job+Msg", msgJobQueTaskStack, sizeof(msgJobQueTaskStack)); stackmon_register("Job+Msg", msgJobQueTaskStack, sizeof(msgJobQueTaskStack));
stackmon_register("Idle", xIdleStack, sizeof(xIdleStack)); stackmon_register("Idle", xIdleStack, sizeof(xIdleStack));
stackmon_register("Timers", xTimersStack, sizeof(xTimersStack)); // stackmon_register("Timers", xTimersStack, sizeof(xTimersStack));
/* USER CODE END Init */ /* USER CODE END Init */
/* Create the mutex(es) */ /* Create the mutex(es) */

@ -14,15 +14,6 @@ error_t OW_preInit(Unit *unit)
struct priv *priv = unit->data = calloc_ck(1, sizeof(struct priv)); struct priv *priv = unit->data = calloc_ck(1, sizeof(struct priv));
if (priv == NULL) return E_OUT_OF_MEM; 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 // some defaults
priv->pin_number = 0; priv->pin_number = 0;
priv->port_name = 'A'; priv->port_name = 'A';
@ -63,9 +54,6 @@ void OW_deInit(Unit *unit)
// Release all resources // Release all resources
rsc_teardown(unit); rsc_teardown(unit);
// Delete the software timer
assert_param(pdPASS == xTimerDelete(priv->busyWaitTimer, 1000));
// Free memory // Free memory
free_ck(unit->data); free_ck(unit->data);
} }

@ -38,12 +38,13 @@ static void OW_TimerRespCb(Job *job)
* *
* @param xTimer * @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; struct priv *priv = unit->data;
assert_param(priv->busy); if(!priv->busy) {
dbg("ow tick should be disabled now!");
return;
}
if (priv->parasitic) { if (priv->parasitic) {
// this is the end of the 750ms measurement time // this is the end of the 750ms measurement time
@ -56,7 +57,8 @@ void OW_TimerCb(TimerHandle_t xTimer)
uint32_t time = PTIM_GetTime(); uint32_t time = PTIM_GetTime();
if (time - priv->busyStart > 1000) { if (time - priv->busyStart > 1000) {
xTimerStop(xTimer, 100); unit->tick_interval = 0;
unit->_tick_cnt = 0;
Job j = { Job j = {
.unit = unit, .unit = unit,
@ -69,7 +71,8 @@ void OW_TimerCb(TimerHandle_t xTimer)
return; return;
halt_ok: halt_ok:
xTimerStop(xTimer, 100); unit->tick_interval = 0;
unit->_tick_cnt = 0;
Job j = { Job j = {
.unit = unit, .unit = unit,
@ -79,7 +82,6 @@ halt_ok:
scheduleJob(&j); scheduleJob(&j);
} }
enum PinCmd_ { enum PinCmd_ {
CMD_CHECK_PRESENCE = 0, // simply tests that any devices are attached 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 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: case CMD_POLL_FOR_1:
// This can't be exposed via the UU API, due to being async // This can't be exposed via the UU API, due to being async
unit->_tick_cnt = 0;
unit->tick_interval = 750;
if (priv->parasitic) { if (priv->parasitic) {
assert_param(pdPASS == xTimerChangePeriod(priv->busyWaitTimer, 750, 100)); unit->tick_interval = 750;
} else { } else {
// every 10 ticks unit->tick_interval = 10;
assert_param(pdPASS == xTimerChangePeriod(priv->busyWaitTimer, 10, 100));
} }
assert_param(pdPASS == xTimerStart(priv->busyWaitTimer, 100));
priv->busy = true; priv->busy = true;
priv->busyStart = PTIM_GetTime(); priv->busyStart = PTIM_GetTime();
priv->busyRequestId = frame_id; priv->busyRequestId = frame_id;
@ -242,4 +244,5 @@ const UnitDriver UNIT_1WIRE = {
.deInit = OW_deInit, .deInit = OW_deInit,
// Function // Function
.handleRequest = OW_handleRequest, .handleRequest = OW_handleRequest,
.updateTick = OW_tickHandler,
}; };

Loading…
Cancel
Save