Dokumentasi

API Reference

Pakai ini sebagai referensi runtime yang praktis: apa yang dipanggil, kapan dipanggil, dan mana yang stabil versus opsional.

Kenapa halaman ini penting

Halaman ini menjelaskan bagaimana API Reference masuk ke model eksekusi ZeroKernel yang lebih besar, masalah apa yang sebenarnya diselesaikan, dan trade-off apa yang benar-benar Anda bayar saat fitur ini dipakai di firmware produksi. Tujuannya bukan melihat API Reference sebagai satu API terpisah, tetapi memahami posisinya di dalam bounded scheduling, disiplin queue, visibilitas fault, dan pemilihan profile.

Baca topik ini sebagai kontrak operasional. Mulai dari jalur paling kecil yang benar-benar jalan, pasang dulu di profile lean, lalu baru naik ke routing, diagnostics, atau state transport yang lebih kaya setelah Anda bisa membuktikan hasil timing-nya tetap layak dibanding tambahan flash dan RAM. Pola pikir ini yang menjaga ZeroKernel tetap berguna di board kecil dan tidak berubah jadi abstraksi yang gemuk.

Pola paling aman selalu sama: tentukan batas runtime-nya, jaga hot path tetap pendek, ukur efeknya dengan compare script, lalu baru naikkan kompleksitas. Contoh di bawah bukan pemanis; itu adalah pola minimum yang bisa Anda ambil ke firmware nyata saat Anda butuh integrasi yang rapi, bukan loop manual yang sulit dipertahankan.

Tiga pola yang langsung bisa dipakai

Urutan validasi penuh

Pakai ini saat Anda butuh regression pass yang kredibel sebelum mempublikasikan angka atau mengubah docs.

Shell
    bash scripts/run_desktop_tests.sh
bash scripts/run_desktop_benchmark.sh --enforce-performance
bash scripts/run_resource_matrix.sh --enforce-budget
  
Hardware compare pass

Jalankan compare hardware yang fokus, jangan menebak apakah perubahan membantu atau merugikan.

Shell
    bash scripts/run_esp32_modules_compare.sh /dev/ttyUSB1
bash scripts/run_esp32_real_project_demo.sh /dev/ttyUSB1
  
Guard build lean

Kunci build ke profile yang dimaksud sebelum menganggap benchmark atau compare sebagai angka resmi.

Text
    -DZEROKERNEL_PROFILE_LEAN_NET
-DZEROKERNEL_ENABLE_DIAGNOSTICS=0
-DZEROKERNEL_ENABLE_LEGACY_LABEL_API=0
  

Apa yang perlu Anda cek saat memakainya

  • Validasi timing lebih dulu, baru bentuk API. API yang terlihat rapi bukan kemenangan kalau fast miss justru naik.
  • Pilih profile paling kecil yang masih cocok, lalu aktifkan modul opsional hanya saat payoff terukurnya benar-benar jelas.
  • Jaga callback dan langkah transport tetap bounded supaya watchdog, panic flow, dan batas queue tetap punya arti.

Kesalahan umum yang membuat hasil jadi menyesatkan

  • Jangan menyalin pola demo ke firmware produksi tanpa mengukurnya di board dan profile build yang benar-benar akan dipakai.
  • Jangan membaca angka sukses tanpa membaca queue depth, timing, dan label workload di sampingnya.
  • Jangan menyalakan diagnostics atau kompatibilitas berat di target lean hanya karena default-nya terasa nyaman.

Urutan kerja yang disarankan

Mulai dari jalur paling kecil yang valid

Boot runtime, daftar task minimum yang berguna, lalu buktikan baseline timing bersih sebelum menambah lapisan opsional.

Tambah satu lapisan, lalu ukur

Masukkan routing, diagnostics, atau transport satu lapisan demi satu agar biaya dan payoff-nya tetap jelas.

Publikasikan hanya hasil yang bisa diulang

Update docs, chart, atau klaim publik hanya setelah workload yang sama lolos jalur validasi yang sama lebih dari sekali.

Cara membaca halaman referensi ini

Halaman ini adalah referensi operasional untuk permukaan ZeroKernel yang paling sering dipakai. Ini bukan dump simbol otomatis. Tujuannya adalah membantu Anda memahami call mana yang seharusnya dipakai di setup, mana yang dipakai di loop utama, mana yang membentuk task, dan mana yang dipakai untuk observasi atau eskalasi runtime. Pemisahan ini penting karena firmware embedded jauh lebih mudah dipahami saat batas itu tetap rapi.

Dalam praktik, sebagian besar firmware hanya memakai subset kecil dari seluruh API. Node biasa cukup memakai begin, addTask, tick, routing, lalu membaca timing atau stats. Node yang lebih kompleks mungkin memakai signal, panic, capability, atau modul network. Halaman ini dibuat agar Anda punya peta mental untuk permukaan itu sebelum masuk ke halaman khusus yang menjelaskan satu fitur secara lebih mendalam.

Kalau Anda masih baru, baca halaman ini dari atas ke bawah sekali, lalu pakai sebagai lembar referensi saat menulis kode. Kalau Anda sudah mengintegrasikan ZeroKernel ke project, pakai halaman ini sebagai checklist: lifecycle dulu, task control kedua, routing ketiga, diagnostics terakhir. Urutan itu membantu runtime tetap jelas dan menghindari campur aduk antara setup dan jalur panas runtime.

Lifecycle dan urutan boot

CallKapan dipakaiKenapa ada
ZeroKernel.begin(clockSource)Sekali saat setup atau boot.Mengikat runtime ke clock board dan mereset state scheduler.
ZeroKernel.tick()Terus-menerus dari loop utama.Memajukan scheduler cooperative dan menguras pekerjaan yang bounded.
ZeroKernel.identity()Kapan saja setelah begin().Mengekspos nama, vendor, tagline, dan versi runtime.
ZeroKernel.abiVersion()Saat memeriksa kompatibilitas.Membantu modul dan firmware memakai kontrak ABI yang sama.
ZeroKernel.runtimeVersion()Saat boot banner atau telemetry.Membuat firmware melaporkan versi runtime yang benar-benar berjalan.

Kesalahan lifecycle yang paling umum adalah menganggap begin() sebagai formalitas. Padahal tidak. Kalau runtime dimulai dengan clock yang salah atau implisit, semua klaim tentang cadence, jitter, dan compare hasil menjadi lebih lemah. Runtime hanya akan sebaik kontrak waktu yang Anda berikan.

C++
    static unsigned long boardMillis() {
  return millis();
}

void setup() {
  ZeroKernel.begin(boardMillis);
}

void loop() {
  ZeroKernel.tick();
}
  

Kontrol task dan pembentukan task

CallFungsi utamaAlasan umum
addTask(...)Mendaftarkan task cooperative periodik.Mengubah fragmen loop manual menjadi unit runtime yang terukur.
setTaskPriority(...)Mengubah tie-break order.Membuat kerja kritikal menang saat beberapa task due bersamaan.
setTaskHeartbeatTimeout(...)Mengatur ekspektasi heartbeat.Mendeteksi task yang diam tanpa melapor liveness.
suspendTask(...)Menjeda task tanpa menghapusnya.Mematikan kerja best-effort saat degraded atau maintenance.
resumeTask(...)Mengaktifkan kembali task yang dijeda.Mengembalikan kerja non-kritikal setelah recovery.
heartbeatTask(...)Melapor liveness manual.Menjaga task cooperative yang panjang tetap terlihat oleh watchdog.

Task di ZeroKernel tetaplah kode Anda. Runtime tidak otomatis membuatnya aman. Nilai tambahnya adalah setelah task dideklarasikan, runtime bisa menghitung, mengawasi, membandingkan, dan menampilkannya di diagnostics. Itu sebabnya pendaftaran task bukan cuma ganti gaya callback; ia mengubah alur firmware informal menjadi hal yang benar-benar bisa diamati oleh runtime.

Aturan praktisnya sederhana: jaga body task tetap singkat dan non-blocking, lalu gunakan metadata task untuk memberi tahu runtime bagaimana task itu harus diperlakukan. Priority, heartbeat, dan execution contract adalah bagian yang membuat task terlihat oleh sistem yang lebih besar.

C++
    void sampleTask() {
  readSensor();
}

void setup() {
  ZeroKernel.begin(boardMillis);
  ZeroKernel.addTask("sample", sampleTask, 10);
  ZeroKernel.setTaskPriority("sample", ZeroKernel::kPriorityHigh);
  ZeroKernel.setTaskHeartbeatTimeout("sample", 50);
}
  
C++
    void maintenanceTask() {
  flushLogs();
}

void onStateChange(ZeroKernel::KernelState state) {
  if (state == ZeroKernel::kStateSafeMode) {
    ZeroKernel.suspendTask("maintenance");
  }
}
  

Routing, command, dan signal

CallPemakaian yang disarankanKenapa penting
makeTopicKey(...)Membuat route stabil berbasis key.Memindahkan dispatch berulang dari jalur string.
publishFast(...)Mengirim event langsung.Jalur murah untuk state internal dan sinyal cepat.
publishDeferredFast(...)Mengirim kerja deferred yang bounded.Lebih aman saat callback inline berisiko mengganggu task kritikal.
enqueueCommandFast(...)Mengantre command untuk drain berikutnya.Menyerialkan kerja kontrol di queue cooperative yang bounded.
setSignalHandler(...)Berlangganan output signal runtime.Memusatkan drop, miss, dan event eskalasi.

Untuk firmware baru, jalur normalnya adalah routing berbasis key. String-based routing masih ada, tapi fungsinya sebagai jembatan, bukan arah strategis. Semakin sering sebuah rute dipakai, semakin besar alasan untuk membuang kerja string berulang dari jalur tersebut.

C++
    const auto telemetryKey = ZeroKernel.makeTopicKey("telemetry.sample");

void onTelemetry(long value) {
  latestSample = value;
}

void setup() {
  ZeroKernel.subscribeFast(telemetryKey, onTelemetry);
}

void sampleTask() {
  ZeroKernel.publishDeferredFast(telemetryKey, readSensor());
}
  
C++
    const auto flushKey = ZeroKernel.makeTopicKey("transport.flush");

void triggerFlush() {
  ZeroKernel.enqueueCommandFast(flushKey, 0);
}
  

State, diagnostics, dan bukti yang bisa dipakai

CallApa yang dibacaKapan dipakai
getStats()Counter agregat dan total.Dashboard, status periodik, compare script.
getTimingReport()Ringkasan timing tick dan task.Output benchmark dan gate regression.
state()State kernel saat ini.Log recovery dan telemetry operasional.
onStateChange(...)Transisi state.Alert saat runtime masuk degraded atau panic.
triggerPanic(...)Eskalasi panic eksplisit.Kasus fatal saat menyembunyikan fault lebih berbahaya.
dumpStats(...)Output diagnostics terformat.Bring-up serial dan sesi service lapangan.

Permukaan diagnostics inilah yang mengubah klaim engineering menjadi sesuatu yang bisa dibuktikan. Kalau tim bilang runtime ini deterministik, bukti nyatanya ada di timing report. Kalau tim bilang runtime ini resilient, bukti nyatanya ada di transisi state, recovery, dan eskalasi yang bounded.

C++
    void reportTask() {
  auto stats = ZeroKernel.getStats();
  auto timing = ZeroKernel.getTimingReport();

  Serial.print("runs=");
  Serial.print(stats.taskRuns);
  Serial.print(" fast_miss=");
  Serial.print(timing.fastMissCount);
  Serial.print(" state=");
  Serial.println(ZeroKernel.state());
}
  

Tiga pola referensi yang paling umum

Mayoritas project jatuh ke pola pemakaian yang sama: node minimal, node berbasis routing, atau node yang disupervisi dengan ketat. Saat pola itu terlihat jelas, API jadi lebih mudah dibaca karena tidak lagi tampak seperti daftar function yang panjang, tetapi sebagai beberapa mode operasional yang berulang.

C++
    // Pola 1: loop cooperative minimal
ZeroKernel.begin(boardMillis);
ZeroKernel.addTask("blink", blinkTask, 250);

void loop() {
  ZeroKernel.tick();
}
  
C++
    // Pola 2: node berbasis routing
const auto key = ZeroKernel.makeTopicKey("sensor.sample");
ZeroKernel.subscribeFast(key, onSample);
ZeroKernel.addTask("sample", sampleTask, 20);
  
C++
    // Pola 3: node tersupervisi
ZeroKernel.setTaskHeartbeatTimeout("sample", 50);
ZeroKernel.onStateChange(onKernelStateChanged);
ZeroKernel.setSignalHandler(onKernelSignal);
  

FAQ API reference

Apakah ini referensi simbol yang lengkap?

Tidak. Ini referensi operasional untuk call yang paling sering dipakai. Header publik lebih luas, tetapi halaman ini diurutkan berdasarkan pola pemakaian nyata.

Apakah fast API lebih baik daripada call string lama?

Ya. Routing berbasis key adalah jalur utama kalau Anda peduli size, speed, dan overhead yang predictable.

Apakah semua API boleh dipanggil dari semua task?

Tidak. Pisahkan lifecycle di setup, scheduling di loop utama, routing di task cooperative, dan diagnostics di jalur pelaporan.

Subset paling aman untuk dipelajari dulu apa?

Mulai dari begin, addTask, tick, makeTopicKey, publishDeferredFast, dan getTimingReport. Itu sudah mencakup mayoritas pola runtime.