Skip to content

Commit

Permalink
Use cpu_late_percent_limit to set limit on % of late tasks in 10th of…
Browse files Browse the repository at this point in the history
… a %
  • Loading branch information
SteveCEvans committed Jan 26, 2024
1 parent 2cd24cf commit 18a50a0
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 3 deletions.
6 changes: 4 additions & 2 deletions src/main/cli/settings.c
Expand Up @@ -1717,8 +1717,10 @@ const clivalue_t valueTable[] = {
{ "expresslrs_model_id", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, UINT8_MAX }, PG_RX_EXPRESSLRS_SPI_CONFIG, offsetof(rxExpressLrsSpiConfig_t, modelId) },
#endif

{ "scheduler_relax_rx", VAR_UINT16 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, 500 }, PG_SCHEDULER_CONFIG, PG_ARRAY_ELEMENT_OFFSET(schedulerConfig_t, 0, rxRelaxDeterminism) },
{ "scheduler_relax_osd", VAR_UINT16 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, 500 }, PG_SCHEDULER_CONFIG, PG_ARRAY_ELEMENT_OFFSET(schedulerConfig_t, 0, osdRelaxDeterminism) },
{ "scheduler_relax_rx", VAR_UINT16 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, 500 }, PG_SCHEDULER_CONFIG, offsetof(schedulerConfig_t, rxRelaxDeterminism) },
{ "scheduler_relax_osd", VAR_UINT16 | HARDWARE_VALUE, .config.minmaxUnsigned = { 0, 500 }, PG_SCHEDULER_CONFIG, offsetof(schedulerConfig_t, osdRelaxDeterminism) },

{ "cpu_late_percent_limit", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 100 }, PG_SCHEDULER_CONFIG, offsetof(schedulerConfig_t, cpuLatePercentageLimit) },

{ "serialmsp_halfduplex", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MSP_CONFIG, offsetof(mspConfig_t, halfDuplex) },

Expand Down
4 changes: 3 additions & 1 deletion src/main/fc/core.c
Expand Up @@ -323,11 +323,13 @@ void updateArmingStatus(void)
unsetArmingDisabled(ARMING_DISABLED_ANGLE);
}

if (getAverageSystemLoadPercent() > LOAD_PERCENTAGE_ONE) {
#if defined(USE_LATE_TASK_STATISTICS)
if ((getCPUPercentageLate() > schedulerConfig()->cpuLatePercentageLimit)) {
setArmingDisabled(ARMING_DISABLED_LOAD);
} else {
unsetArmingDisabled(ARMING_DISABLED_LOAD);
}
#endif // USE_LATE_TASK_STATISTICS

if (isCalibrating()) {
setArmingDisabled(ARMING_DISABLED_CALIBRATING);
Expand Down
1 change: 1 addition & 0 deletions src/main/osd/osd.h
Expand Up @@ -281,6 +281,7 @@ typedef enum {
OSD_WARNING_RSSI_DBM,
OSD_WARNING_OVER_CAP,
OSD_WARNING_RSNR,
OSD_WARNING_LOAD,
OSD_WARNING_COUNT // MUST BE LAST
} osdWarningsFlags_e;

Expand Down
7 changes: 7 additions & 0 deletions src/main/osd/osd_warnings.c
Expand Up @@ -213,6 +213,13 @@ void renderOsdWarning(char *warningText, bool *blinking, uint8_t *displayAttr)
return;
}

if (osdWarnGetState(OSD_WARNING_LOAD) && (getArmingDisableFlags() & ARMING_DISABLED_LOAD)) {
tfp_sprintf(warningText, "CPU OVERLOAD");
*displayAttr = DISPLAYPORT_SEVERITY_CRITICAL;
*blinking = true;
return;
}

#ifdef USE_GPS_RESCUE
if (osdWarnGetState(OSD_WARNING_GPS_RESCUE_UNAVAILABLE) &&
ARMING_FLAG(ARMED) &&
Expand Down
1 change: 1 addition & 0 deletions src/main/pg/scheduler.c
Expand Up @@ -28,4 +28,5 @@ PG_REGISTER_WITH_RESET_TEMPLATE(schedulerConfig_t, schedulerConfig, PG_SCHEDULER
PG_RESET_TEMPLATE(schedulerConfig_t, schedulerConfig,
.rxRelaxDeterminism = SCHEDULER_RELAX_RX,
.osdRelaxDeterminism = SCHEDULER_RELAX_OSD,
.cpuLatePercentageLimit = SCHEDULER_LATE_LIMIT
);
4 changes: 4 additions & 0 deletions src/main/pg/scheduler.h
Expand Up @@ -31,9 +31,13 @@
#define SCHEDULER_RELAX_OSD 25
#endif

// Tenths of a % of tasks late
#define SCHEDULER_LATE_LIMIT 50

typedef struct schedulerConfig_s {
uint16_t rxRelaxDeterminism;
uint16_t osdRelaxDeterminism;
uint16_t cpuLatePercentageLimit;
} schedulerConfig_t;

PG_DECLARE(schedulerConfig_t, schedulerConfig);
Expand Down
8 changes: 8 additions & 0 deletions src/main/scheduler/scheduler.c
Expand Up @@ -107,6 +107,7 @@ static uint8_t skippedOSDAttempts = 0;
static int16_t lateTaskCount = 0;
static uint32_t lateTaskTotal = 0;
static int16_t taskCount = 0;
static uint32_t lateTaskPercentage = 0;
static uint32_t nextTimingCycles;
#endif

Expand Down Expand Up @@ -199,6 +200,12 @@ void taskSystemLoad(timeUs_t currentTimeUs)
#endif
}

uint32_t getCPUPercentageLate(void)
{
return lateTaskPercentage;

}

timeUs_t checkFuncMaxExecutionTimeUs;
timeUs_t checkFuncTotalExecutionTimeUs;
timeUs_t checkFuncMovingSumExecutionTimeUs;
Expand Down Expand Up @@ -535,6 +542,7 @@ FAST_CODE void scheduler(void)
// Total tasks run in last second
DEBUG_SET(DEBUG_TIMING_ACCURACY, 3, taskCount);

lateTaskPercentage = 1000 * (uint32_t)lateTaskCount / taskCount;
lateTaskCount = 0;
lateTaskTotal = 0;
taskCount = 0;
Expand Down
1 change: 1 addition & 0 deletions src/main/scheduler/scheduler.h
Expand Up @@ -243,6 +243,7 @@ void schedulerInit(void);
void scheduler(void);
timeUs_t schedulerExecuteTask(task_t *selectedTask, timeUs_t currentTimeUs);
void taskSystemLoad(timeUs_t currentTimeUs);
uint32_t getCPUPercentageLate(void);
void schedulerEnableGyro(void);
uint16_t getAverageSystemLoadPercent(void);
float schedulerGetCycleTimeMultiplier(void);
1 change: 1 addition & 0 deletions src/test/unit/arming_prevention_unittest.cc
Expand Up @@ -1161,4 +1161,5 @@ extern "C" {
return 0.0f;
}
void getRcDeflectionAbs(void) {}
uint32_t getCPUPercentageLate(void) { return 0; };
}

0 comments on commit 18a50a0

Please sign in to comment.