scheduler hotovo

This commit is contained in:
Priec
2025-12-18 12:24:59 +01:00
parent a78a53bebd
commit 93d13c1507

View File

@@ -23,12 +23,24 @@ fn busy_delay(ms: u32) {
while millis() - start < ms {} while millis() - start < ms {}
} }
fn task1() { busy_delay(10_000); } const TASK_CHUNK_MS: u32 = 1_000;
fn task2() { busy_delay(10_000); } const MAIN_TASK_TOTAL: u32 = 20_000;
fn task3() { busy_delay(10_000); } const OPT_TASK_TOTAL: u32 = 10_000;
fn task4() { busy_delay(10_000); }
fn opt1() { busy_delay(3_000); } // aby úlohy vedeli, koľko im ešte zostáva
fn opt2() { busy_delay(4_000); } static mut REMAIN_T1: u32 = MAIN_TASK_TOTAL;
static mut REMAIN_T2: u32 = MAIN_TASK_TOTAL;
static mut REMAIN_T3: u32 = MAIN_TASK_TOTAL;
static mut REMAIN_T4: u32 = MAIN_TASK_TOTAL;
static mut REMAIN_OPT1: u32 = OPT_TASK_TOTAL;
static mut REMAIN_OPT2: u32 = OPT_TASK_TOTAL;
fn task1() { unsafe { if REMAIN_T1 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_T1 -= TASK_CHUNK_MS; } } }
fn task2() { unsafe { if REMAIN_T2 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_T2 -= TASK_CHUNK_MS; } } }
fn task3() { unsafe { if REMAIN_T3 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_T3 -= TASK_CHUNK_MS; } } }
fn task4() { unsafe { if REMAIN_T4 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_T4 -= TASK_CHUNK_MS; } } }
fn opt1() { unsafe { if REMAIN_OPT1 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_OPT1 -= TASK_CHUNK_MS; } } }
fn opt2() { unsafe { if REMAIN_OPT2 >= TASK_CHUNK_MS { busy_delay(TASK_CHUNK_MS); REMAIN_OPT2 -= TASK_CHUNK_MS; } } }
struct Task { struct Task {
name: &'static str, name: &'static str,
@@ -38,45 +50,52 @@ struct Task {
} }
static TASKS_MAIN: [Task; 4] = [ static TASKS_MAIN: [Task; 4] = [
Task { name: "T1", duration_ms: 10_000, active: true, func: task1 }, Task { name: "T1", duration_ms: MAIN_TASK_TOTAL, active: true, func: task1 },
Task { name: "T2", duration_ms: 10_000, active: true, func: task2 }, Task { name: "T2", duration_ms: MAIN_TASK_TOTAL, active: true, func: task2 },
Task { name: "T3", duration_ms: 10_000, active: true, func: task3 }, Task { name: "T3", duration_ms: MAIN_TASK_TOTAL, active: true, func: task3 },
Task { name: "T4", duration_ms: 10_000, active: true, func: task4 }, Task { name: "T4", duration_ms: MAIN_TASK_TOTAL, active: true, func: task4 },
]; ];
static TASKS_OPT: [Task; 2] = [ static TASKS_OPT: [Task; 2] = [
Task { name: "Opt1", duration_ms: 3_000, active: true, func: opt1 }, Task { name: "Opt1", duration_ms: OPT_TASK_TOTAL, active: true, func: opt1 },
Task { name: "Opt2", duration_ms: 4_000, active: true, func: opt2 }, Task { name: "Opt2", duration_ms: OPT_TASK_TOTAL, active: true, func: opt2 },
]; ];
const MAJOR_FRAME_MS: u32 = 120_000; const MAJOR_FRAME_MS: u32 = 120_000;
fn run_optionals(tasks: &[Task], mut remaining: u32) {
for t in tasks { fn scheduler(tasks_main: &[Task], tasks_optional: &[Task]) {
if t.duration_ms <= remaining { let frame_start = millis();
// reset zostávajúce časy na začiatku rámca
unsafe {
REMAIN_T1 = MAIN_TASK_TOTAL;
REMAIN_T2 = MAIN_TASK_TOTAL;
REMAIN_T3 = MAIN_TASK_TOTAL;
REMAIN_T4 = MAIN_TASK_TOTAL;
REMAIN_OPT1 = OPT_TASK_TOTAL;
REMAIN_OPT2 = OPT_TASK_TOTAL;
}
while millis() - frame_start < MAJOR_FRAME_MS {
// iterovať cez všetky hlavné aj voliteľné úlohy po malých krokoch
for t in tasks_main {
(t.func)(); (t.func)();
remaining -= t.duration_ms; }
} else { for t in tasks_optional {
(t.func)();
}
// ak všetky úlohy v rámci stihli bežať raz — koniec cyklu
unsafe {
if REMAIN_T1 == 0 && REMAIN_T2 == 0 && REMAIN_T3 == 0 && REMAIN_T4 == 0 &&
REMAIN_OPT1 == 0 && REMAIN_OPT2 == 0 {
break; break;
} }
} }
} }
fn scheduler(tasks_main: &[Task], tasks_optional: &[Task]) { while millis() - frame_start < MAJOR_FRAME_MS {}
let start_time = millis();
for t in tasks_main {
(t.func)();
}
let elapsed = millis() - start_time;
if elapsed < MAJOR_FRAME_MS {
run_optionals(tasks_optional, MAJOR_FRAME_MS - elapsed);
}
// Wait out the frame so each cycle lasts exactly 120 s
while millis() - start_time < MAJOR_FRAME_MS {}
} }
#[entry] #[entry]