scheduler hotovo
This commit is contained in:
@@ -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 {
|
|
||||||
if t.duration_ms <= remaining {
|
|
||||||
(t.func)();
|
|
||||||
remaining -= t.duration_ms;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn scheduler(tasks_main: &[Task], tasks_optional: &[Task]) {
|
fn scheduler(tasks_main: &[Task], tasks_optional: &[Task]) {
|
||||||
let start_time = millis();
|
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 {
|
for t in tasks_main {
|
||||||
(t.func)();
|
(t.func)();
|
||||||
}
|
}
|
||||||
|
for t in tasks_optional {
|
||||||
let elapsed = millis() - start_time;
|
(t.func)();
|
||||||
|
|
||||||
if elapsed < MAJOR_FRAME_MS {
|
|
||||||
run_optionals(tasks_optional, MAJOR_FRAME_MS - elapsed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait out the frame so each cycle lasts exactly 120 s
|
// ak všetky úlohy v rámci stihli bežať raz — koniec cyklu
|
||||||
while millis() - start_time < MAJOR_FRAME_MS {}
|
unsafe {
|
||||||
|
if REMAIN_T1 == 0 && REMAIN_T2 == 0 && REMAIN_T3 == 0 && REMAIN_T4 == 0 &&
|
||||||
|
REMAIN_OPT1 == 0 && REMAIN_OPT2 == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while millis() - frame_start < MAJOR_FRAME_MS {}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[entry]
|
#[entry]
|
||||||
|
|||||||
Reference in New Issue
Block a user