BWP-SS19-01/Fein Design/EMS

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen

Energy Management System

Das Energy Management System besteht, aus Software-Sicht, aus einem eigenen Header-File (Energy_Management_System.h) und zwei Source-Files (Energy_Management_System.c und Battery_Control.c).

Die Aufgaben des Energy Management Systems sind:

  • Auf Anfrage Energie-Werte liefern
    • Batteriestand
    • Verbrauch durch das System
    • Einnahme durch die Solar Panel
  • Das Simulieren momentaner Energie-Werte je nach Systemzustand
  • Das Bereitstellen des Energiesparmodus

Energy_Management_System.h

Im Header-File befinden sich Konstanten und Funktionsdeklarationen, die für dieses Modul benötigt werden. Speziell die Funktionsdeklarationen der Funktionen, die aus der Battery_Control.c heraus im Energy Management Thread in Energy_Management_System.c benötigt werden.

Außerdem ist hier beschreiben, das die GPIO-Callback-Funktionen bei einer HIGH EDGE ausgelöst werden sollen:

 #define EDGE (GPIO_INT_EDGE | GPIO_INT_ACTIVE_LOW) 

Energy_Management_System.c

Das Energy_Management_System.c File beinhaltet den Thread, der das Energy Management System darstellt.

Zur Kommunikation mit dem Haupt-Thread wird hierbei ein Pointer erzeugt und auf eine globale statische Struct gesetzt.


// Global

	static struct data_item_t edata;

	struct data_item_t * edata_ptr;

// Thread

	edata_ptr = &edata;

Außerdem wird über die selbe Technik der Timer in dem Energy_Management_System.c File manipuliert.

Darüber hinaus ist der Haupt-Thread des Energy_Management_Systems in diesem File definiert.

Dieser initialisiert direkt nach seinem Start die Battery Contol:


void energy_management_system(void* arg1, void* arg2, void* arg3) {

	if (Battery_Control_init()) {
		printk("Battery_Control_init(): ERROR\n");
		return;
	} else {
		printk("Battery-controll initialisation successfully finished\n");
	}


Die Hauptaufgabe des Threads (Diese läuft in einer Endlos-Schleife) ist jedoch die Bearbeitung einer Aufgabe die er von der Main Control erhält.

Dafür wird jeweils immer auf die Aufgabe der Main Control gewartet:

while (edata.sig_id == 0)
	k_sleep(SLEEP_SEC/5);

Danach wird entschieden was sie bedeutet bzw was für eine Aufgabe erledigt werden soll:

edata.sig = choose_workstate (edata.sig_id, edata.sig);

Intern entscheidet die Funktion choose_workstate() welche Aufgabe erfüllt werden soll mit einem switch-case.

Eine weitere erwähnenswerte Funktion in dem Energy_Management_Systems.c File ist der Sleep State:

sys_set_power_state(SYS_POWER_STATE_SLEEP);

k_sched_lock();

k_sleep( (SLEEP_SEC*60) * arg); // <-- Sleeping 

k_sched_unlock();

Hierfür wird das System erst in ein niedrigeres Power-level gesetzt. Anschließend wird der Scheduler auf den aktuellen Thread "festgenagelt". Jetzt kann der aktuelle Thread schlafen gelegt werden, was den Ruhe-Modus repräsentiert. Nach dem Ruhe-Modus wird der Scheduler wieder entsperrt.

Diese Umsetzung wurde bewusst so gewählt, da sonst die device driver der einzelnen Module neu hätten initialisiert werden müssen, was in der aktuellen Datei-Struktur nur schwer umsetzbar ist.

Battery_Control.c

Dieses File beinhaltet alle modul-spezifischen Funktionen, die nicht Teil des Energy Management Threads sind. Außerdem sind hier die GPIO-Ports und ihre Callback-Funktionen implementiert. Auch ist hier der Timer zu finden, über den die Simulation der Energiewerte läuft.