Mercurial > public > ostc4
comparison Small_CPU/Src/scheduler.c @ 240:625d20070261 div-fixes-5
Improvement SPI stability/recoverability
The core part of this commit comes from careful code reading. The core is the
swap of Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT) and
SPI_Start_single_TxRx_with_Master(). This code is sitting in an if-clause
that is triggered on SPI comms failure. Instead of blindly trying to
communicate again (which will very likely fail again), first try to reset
the comms link, and then try to communicate again. That simply makes
more sense in this case.
This is heavily tested, on 2 simple dives, and 5 very long deco schedules
from the simulator (10+ hour deco's), and a lot of small simulated dives
(upto 2h runtime). Of all these tests, only one long session failed after
9 out of 11h runtime. Analyzing that one failure, suggests that the
RTE is looping in some error handler, which (obviously) results in
a SPI comms failure as a result. I consider this not part of this change.
Additionally, some more cleanup is done in this code.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Mon, 08 Apr 2019 11:49:13 +0200 |
parents | f6961efb3794 |
children | b3685fbada3b |
comparison
equal
deleted
inserted
replaced
239:e4207f0aaa4b | 240:625d20070261 |
---|---|
46 #define INVALID_PREASURE_VALUE (100.0F) | 46 #define INVALID_PREASURE_VALUE (100.0F) |
47 | 47 |
48 /* Private types -------------------------------------------------------------*/ | 48 /* Private types -------------------------------------------------------------*/ |
49 const SGas Air = {79,0,0,0,0}; | 49 const SGas Air = {79,0,0,0,0}; |
50 | 50 |
51 uint8_t testarrayindex = 0; | |
52 uint32_t testarray[256]; | |
53 uint32_t testarrayMain[256]; | |
54 | |
55 /* Exported variables --------------------------------------------------------*/ | 51 /* Exported variables --------------------------------------------------------*/ |
56 SGlobal global; | 52 SGlobal global; |
57 SDevice DeviceDataFlash; | 53 SDevice DeviceDataFlash; |
58 uint8_t deviceDataFlashValid = 0; | 54 uint8_t deviceDataFlashValid = 0; |
59 uint8_t deviceDataSubSeconds = 0; | 55 uint8_t deviceDataSubSeconds = 0; |
119 global.ButtonPICdata[0] = 0xFF; | 115 global.ButtonPICdata[0] = 0xFF; |
120 global.ButtonPICdata[1] = 0xFF; | 116 global.ButtonPICdata[1] = 0xFF; |
121 global.ButtonPICdata[2] = 0xFF; | 117 global.ButtonPICdata[2] = 0xFF; |
122 global.ButtonPICdata[3] = 0xFF; | 118 global.ButtonPICdata[3] = 0xFF; |
123 | 119 |
124 global.I2C_SystemStatus = 0xFF; // 0x00 would be everything working | 120 global.I2C_SystemStatus = HAL_ERROR; // 0x00 would be everything working |
125 | 121 |
126 global.lifeData.pressure_ambient_bar = INVALID_PREASURE_VALUE; | 122 global.lifeData.pressure_ambient_bar = INVALID_PREASURE_VALUE; |
127 global.lifeData.pressure_surface_bar = INVALID_PREASURE_VALUE; | 123 global.lifeData.pressure_surface_bar = INVALID_PREASURE_VALUE; |
128 decom_reset_with_1000mbar(&global.lifeData); | 124 decom_reset_with_1000mbar(&global.lifeData); |
129 | 125 |
413 global.sync_error_count++; | 409 global.sync_error_count++; |
414 | 410 |
415 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the | 411 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the |
416 * function error handler | 412 * function error handler |
417 */ | 413 */ |
414 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT); | |
418 SPI_Start_single_TxRx_with_Master(); | 415 SPI_Start_single_TxRx_with_Master(); |
419 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT); | |
420 } | 416 } |
421 } | 417 } |
422 | 418 |
423 | 419 |
424 /** | 420 /** |
435 uint32_t lasttick = 0; | 431 uint32_t lasttick = 0; |
436 uint8_t counterAscentRate = 0; | 432 uint8_t counterAscentRate = 0; |
437 float lastPressure_bar = 0.0f; | 433 float lastPressure_bar = 0.0f; |
438 global.dataSendToMaster.mode = MODE_DIVE; | 434 global.dataSendToMaster.mode = MODE_DIVE; |
439 global.deviceDataSendToMaster.mode = MODE_DIVE; | 435 global.deviceDataSendToMaster.mode = MODE_DIVE; |
440 //uint16_t counterSecondsShallowDepth = 0; | |
441 uint8_t counter_exit = 0; | 436 uint8_t counter_exit = 0; |
442 | 437 |
443 Scheduler.tickstart = HAL_GetTick() - 1000; | |
444 Scheduler.counterSPIdata100msec = 0; | 438 Scheduler.counterSPIdata100msec = 0; |
445 Scheduler.counterCompass100msec = 0; | 439 Scheduler.counterCompass100msec = 0; |
446 Scheduler.counterPressure100msec = 0; | 440 Scheduler.counterPressure100msec = 0; |
447 Scheduler.counterAmbientLight100msec = 0; | 441 Scheduler.counterAmbientLight100msec = 0; |
448 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; | 442 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
449 | 443 |
450 global.deviceData.diveCycles.value_int32++; | 444 global.deviceData.diveCycles.value_int32++; |
451 scheduleSetDate(&global.deviceData.diveCycles); | 445 scheduleSetDate(&global.deviceData.diveCycles); |
452 global.lifeData.counterSecondsShallowDepth = 0; | 446 global.lifeData.counterSecondsShallowDepth = 0; |
453 | 447 |
448 Scheduler.tickstart = HAL_GetTick(); | |
454 while(global.mode == MODE_DIVE) | 449 while(global.mode == MODE_DIVE) |
455 { | 450 { |
456 schedule_check_resync(); | 451 schedule_check_resync(); |
457 lasttick = HAL_GetTick(); | 452 lasttick = HAL_GetTick(); |
458 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); | 453 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
1333 | 1328 |
1334 | 1329 |
1335 //Supports threadsave copying!!! | 1330 //Supports threadsave copying!!! |
1336 void copyPressureData(void) | 1331 void copyPressureData(void) |
1337 { | 1332 { |
1338 global.dataSendToMaster.sensorErrors = I2C1_Status(); | 1333 global.dataSendToMaster.sensorErrors = global.I2C_SystemStatus; |
1339 //uint8_t dataSendToMaster. | |
1340 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; | 1334 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; |
1341 global.dataSendToMaster.data[boolPressureData].temperature = get_temperature(); | 1335 global.dataSendToMaster.data[boolPressureData].temperature = get_temperature(); |
1342 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); | 1336 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); |
1343 global.dataSendToMaster.data[boolPressureData].surface_mbar = get_surface_mbar(); | 1337 global.dataSendToMaster.data[boolPressureData].surface_mbar = get_surface_mbar(); |
1344 global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min; | 1338 global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min; |