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;