EZS Handwerkszeug. Interaktion mit dem System Beobachtung. Interaktion mit dem System Beeinflussung. Hardware. Hardware. Simulator.

Ähnliche Dokumente
EZS Handwerkszeug. Implementierung der Übungsaufgaben. Programmieren in C/C++

EZS Handwerkszeug. Übung zur Vorlesung EZS. Florian Franzmann Martin Hoffmann Tobias Klaus Peter Wägemann

Ausführungszeiten. Worst-Case Execution-Time. Übung zur Vorlesung EZS. Zeitgeber Oszilloskop Diskussion

Messung von Ausführungszeiten & Antwortzeiten

Echtzeitsysteme. Übungen zur Vorlesung. Messung von Ausführungszeiten & Antwortzeiten. Tobias Klaus, Florian Schmaus, Peter Wägemann

Echtzeitsysteme. Übungen zur Vorlesung. Entwicklungsumgebung (Teil 2) Tobias Klaus, Florian Schmaus, Peter Wägemann

Übersicht. Echtzeitsysteme. Wiederholungen? Informationen zum Übungsbetrieb. cipan Sprechstunde der CIP-Admins

Echtzeitsysteme. Übungen zur Vorlesung. Entwicklungsumgebung (Teil 2) Tobias Klaus, Florian Schmaus, Peter Wägemann

Echtzeitsysteme. Übungen zur Vorlesung. Entwicklungsumgebung (Teil 2)

Echtzeitsysteme. Übungen zur Vorlesung. Entwicklungsumgebung (Teil 2)

Echtzeitsysteme. Übersicht. Wiederholungen notwendig? Informationen zum Übungsbetrieb. Übungen zur Vorlesung. Entwicklungsumgebung (Teil 2)

Simple Scope. ecos-vertiefung. Florian Franzmann Tobias Klaus Peter Wägemann

Ü B U N G E N Z U E C H T Z E I T S Y S T E M E

Extended Scope. Events und Mailboxen. Florian Franzmann Tobias Klaus Florian Korschin Florian Schmaus Peter Wägemann

ecos Embedded Configurable Operating System

Tobias Klaus Florian Schmaus Peter Wägemann

Nicht-periodische Aufgaben: Extended Scope (Teil 1)

EZStubs Entwicklungsumgebung. Intention

Nicht-periodische Aufgaben: Extended Scope (Teil 1)

WCET Analyse. Florian Franzmann Tobias Klaus Peter Wägemann

Anwendungsentwicklung mit Ecos

Hallo Welt! Erster Teil. Florian Franzmann Tobias Klaus Peter Wägemann

T 1 Abtastung Signal T 2 Abtastung Signal T 3 Analyse 20 3 T 4 Darstellung 100 6

Betriebssysteme Übung 2. Tutorium System Calls & Multiprogramming

Wiederholung: Übernahmeprüfung bei terminbasierter Einplanung

Assembler - Einleitung

Just-In-Time-Compiler (2)

Aufgabe 2: Aperiodic Task Support

µversion 2 Einführung

EZStubs Entwicklungsumgebung

Teil I Debuggen mit gdb

Überblick. Verlässliche Echtzeitsysteme. Anmeldung an Gerrit I. Gerrit. Übungen zur Vorlesung. Isabella Stilkerich, Florian Franzmann, Martin Hoffmann

Betriebsmittelprotokolle

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Implementierung von Interruptbehandlungen. Interrupts

Echtzeitsysteme. Übungen zur Vorlesung. Florian Franzmann, Martin Hoffmann, Tobias Klaus

Just-In-Time-Compiler (2)

Ü B U N G E N Z U E C H T Z E I T S Y S T E M E

Code Composer Studio 4.x

Aufgabe 3. Aufgabe 4.

Events und Mailboxen. Zum Start im neuen Jahr... Ein Ausflug in die Welt der Wissenschaft was erwartet euch in eurer Bachelor-/Masterarbeit?

Übungen zu Grundlagen der systemnahen Programmierung in C (GSPiC) im Sommersemester 2018

Hardware Logik-Analysatoren

Die AVR Mikrocontrollerfamilie

Vorlesung 5: Interrupts

Verlässliche Echtzeitsysteme

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Martin Gräfe. С und Linux. Die Möglichkeiten des Betriebssystems mit eigenen Programmen nutzen HANSER

Technische Informatik für Ingenieure WS 2010/2011 Übungsblatt Nr. 3

Übung zu Betriebssystembau (Ü BS)

Ein-Ausgabefunktionen in C (letzter Abschnitt Vorlesungsstoff ab C.110)

Design and Implementation of a Soft-error Resilient OSEK Real-time Operating System

U5-2 Register beim AVR-µC

Visual Basic Editor CATIA V5

Compiler für f r Eingebettete Systeme (CfES)

Arduino Kurs Timer und Interrupts. Stephan Laage-Witt FES Lörrach

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion

Zustellerkonzepte: Extended Scope (Teil 2)

Timer. Funktionsprinzip

Betriebssystembau. 3. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Echtzeitsysteme. Übungen zur Vorlesung. Fabian Scheler, Peter Ulbrich, Niko Böhm

Mikrocomputertechnik

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Javakurs für Fortgeschrittene

Überblick. Verlässliche Echtzeitsysteme. Annahmen. Table of Contents. Übungen zur Vorlesung. Florian Franzmann Martin Hoffmann Tobias Klaus

Technische Informatik für Ingenieure WS 2010/2011 Musterlösung Übungsblatt Nr. 3

Remote Debugging via Firewire

Ausgewählte Kapitel eingebetteter Systeme

Grundlagen Rechnerarchitektur und Betriebssysteme

Was ist ein Profiler?

Nebenläufige Programmierung in Java: Threads

Technische Informatik 1 Übung 5: Eingabe/Ausgabe (Computerübung) Georgia Giannopoulou, ETZ G & 18.

Eclipse Tutorial.doc

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

Verteilte Systeme - Java Networking (Sockets) 2 -

Konzepte von Betriebssystem- Komponenten Ausnahme- / Unterbrechungsbehandlung

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

Da der Mikrocontroller mit den internen Timern sehr genau Zeiten messen kann, entschieden wir uns für die Zeitmessung.

Fakultät für Informatik der Technischen Universität München. Kapitel 3. Nebenläufigkeit

Einführung in die Programmiersprache C

Rechnernetze und Organisation

ADT: Verkettete Listen

Echtzeit-Multitasking

Echtzeit-Multitasking

i386 Interrupt-Deskriptortabelle (IDT)

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Microcontroller Selbststudium Semesterwoche 9

Rainbow-OS Architekturseminar Thema: Interrupt-Controller

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Modellierung von Echtzeitsystemen

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH

Technische Informatik für Ingenieure Winter 2005/2006 Übungsblatt Nr. 3

Pthreads. David Klaftenegger. Seminar: Multicore Programmierung Sommersemester

TA Hacke Dein bewaffnen Sie!

Transkript:

1 Überblick EZS Handwerkszeug Übung zur Vorlesung EZS Martin Hoffmann, Florian Franzmann, Tobias Klaus 1 Handwerkszeug Zeitmessungen libezs ecos Unterbrechungsbehandlung Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 Verteilte Systeme und Betriebssysteme) http://www4.cs.fau.de 2 Fehlersuche DDD - GDB - CGDB 4. November 2013 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 1 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 2 / 28 1 Überblick Interaktion mit dem System Beobachtung 1 Überblick Interaktion mit dem System Beeinflussung Hardware Simulator Hardware Simulator Virtueller Signalgenerator Sinus Sampling eines Signals in der Anwendung libezs bietet einheitliche Schnittstelle Liest den Wert des Funktionsgenerators ADC) Liefert den Inhalt des Hardware-ADC Registers zurück Wert lesen: ezs_adc_read) Analyse der Schrittfunktion der Anwendung libezs bietet einheitliche Schnittstelle Schreibt den Wert auf einen DAC Wert schreiben: ezs_dac_write) Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 3 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 4 / 28

2 Handwerkszeug Zeitmessung Die Stoppuhr 2 Handwerkszeug 2.1 Zeitmessungen 1 Handwerkszeug Zeitmessungen libezs ecos Unterbrechungsbehandlung Priorität ISR Thread t 1 t 2 105 150 100 Ereignis Latenz Antwortzeit Ergebnis Zeit 2 Fehlersuche DDD - GDB - CGDB Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 5 / 28 Stoppuhr Punkte auf der Zeitachse t 1 und t 2 Ereignis und Ergebnis Antwortzeit ist t = t 2 t 1 Beispiel: 150 100 = 50 Zählerticks) Umsetzung Zähler durch libezs vorgegeben), start und stop Funktion Startzeitpunkt t 1 ist Zustand der Messung Globale Variable pro Messpaar Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 6 / 28 Zeitmessung Rechenzeitverbrauch 2 Handwerkszeug 2.1 Zeitmessungen Zähler in Mikrocontrollern 2 Handwerkszeug 2.1 Zeitmessungen Priorität ISR Thread A Thread B 20 20 40 20 20 0 Laufzeitzähler 100 120 150160170 190 Rechenzeitsimulation Verbrauchte Laufzeit eines Threads Vorgegebene Zeit aktiv warten Laufzeit verbrauchen Umsetzung Funktion die aktiv t wcet wartet Schleife auf Zählerwert HW-Zähler läuft bei Unterbrechungen weiter! lokaler Zähler Dekrement bei jeder Änderung! Beispiel: Sprung von 120 170 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 7 / 28 Zeit Zähler Counter) zählen hardwarebasiert Ereignisse z.b. von: Externem Drehgeber Radumdrehung) Externem Quarz Real-Time Clock) Internem Prozessortakt hohe Auflösung) Äquidistante Ereignisse ermöglichen einen Zeitgeber Timer) für Periodische Aktivierung Messen von Zeitabständen kontrolliertes Verbrennen von Prozessorzeit) Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 8 / 28

Zähler Betriebsmodi 2 Handwerkszeug 2.1 Zeitmessungen libezs Überblick 2 Handwerkszeug 2.2 libezs Zähler bzw. Zeitgeber bieten zwei Betriebsmodi: Abfragebetrieb Polling) Aktives Auslesen des Zählers, bis zum Erreichen eines vorgegebenen Wertes. Unterbrecherbetrieb Interrupt) Der Zähler unterbricht das laufende System beim Erreichen eines vorkonfigurierten Zählerstandes. Hinweis Für die Laufzeit WCET 1 ) Simulation nutzen wir den Abfragebetrieb. Plattformunabhängige Hilfsfunktionen Zeitmessung WCET Simulation ADC-Zugriff Signalgenerator) DAC-Ausgabe... aufgabe2 -- CMakeLists.txt -- app.c -- ecos -- drivers -- include -- counter.h - i386 -- ezs_adc.c -- ezs_counter.c -- ezs_dac.c -- libezs -- include -- ezs_adc.h -- ezs_dac.h -- stopwatch.h -- src -- stopwatch.c 1 Worst Case Execution Time = Größtmögliche Laufzeit eines Threads, Funktion, ) Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 9 / 28 Die libezs wird ständig auch von euch) erweitert. Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 10 / 28 2 Handwerkszeug 2.2 libezs libezs Zeitmessung stopwatch.c/.h Für die Zeitmessung soll die libezs zwei Funktionen bereitstellen: void ezs_watch_startcyg_uint32 * state); cyg_uint32 ezs_watch_stopcyg_uint32 * state); Parameter: Zeiger auf globale) Variable Unabhängige Messzeitpunkte ezs_watch_stopcyg_uint32 * state) gibt die Zeitdifferenz in Ticks zurück Hinweis Für die Implementierung wird ein i386 Zähler mit einer bestimmten Auflösung bereitgestellt. ezs_counter_resolution_us), ezs_counter_get) in drivers/include/ezs_counter.h Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 11 / 28 2 Handwerkszeug 2.2 libezs libezs WCET-Simulator stopwatch.c/.h Zur WCET-Simulation soll folgende Funktion implementiert werden: void ezs_watch_wcetcyg_uint32 wcet); Parameter: gewünschte WCET in 10 µs Ticks Die Implementierung muss einen internen Zähler nutzen, der bei jeder Änderung des Systemzählers angepasst wird. Hierbei muss der Abfragebetrieb genutzt werden. Es wird keine globale Zustandsvariable benötigt. Jeder Thread besitzt einen eigenen Stack! Hinweis Für die Implementierung wird ein i386 Zähler mit einer bestimmten Auflösung bereitgestellt. ezs_counter_resolution_us), ezs_counter_get) in drivers/include/ezs_counter.h Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 12 / 28

1 Handwerkszeug Zeitmessungen libezs ecos Unterbrechungsbehandlung 2 Fehlersuche DDD - GDB - CGDB # i n c l u d e <cyg / k e r n e l / kapi. h> Interruptvektornummer siehe Hardwarehandbuch Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 13 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28 # i n c l u d e <cyg / k e r n el / kapi. h> Interruptpriorität für unterbrechbare Unterbrechungen hardwareabhängig) # i n c l u d e <cyg / k e r n e l / kapi. h> Beliebiger Übergabeparameter für ISR/DSR Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28

# i n c l u d e <cyg / k e r n el / kapi. h> Funktionspointer ISR Implementierung # i n c l u d e <cyg / k e r n e l / kapi. h> Funktionspointer DSR Implementierung Signatur: cyg_uint32 *)cyg_vector_t, cyg_addrword_t) Signatur: cyg_uint32 *)cyg_vector_t, cyg_ucount32 count, cyg_addrword_t) Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28 ISR Implementierungskelett # i n c l u d e <cyg / k e r n el / kapi. h> Handle und Speicher für Interruptobjekt Beispiel für eine minimale Interrupt Service Routine cyg_uint32 i s r cyg_addrword_t data ) { cyg_ bool_t dsr_ required = 0; cyg_acknowledge_isr vector r e t u r n dsr_required? CYG_ISR_CALL_DSR CYG_ISR_HANDLED) : CYG_ISR_HANDLED; 1 Beliebiger ISR Code 2 Bestätigung der Interruptbehandlung 3 Anforderung einer DSR oder 4 Rückkehr ohne DSR Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 14 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 15 / 28

ISR Implementierungskelett ISR Implementierungskelett Beispiel für eine minimale Interrupt Service Routine cyg_uint32 i s r cyg_addrword_t data ) { cyg_ bool_t dsr_ required = 0; cyg_acknowledge_isr vector r e t u r n dsr_required? CYG_ISR_CALL_DSR CYG_ISR_HANDLED) : CYG_ISR_HANDLED; 1 Beliebiger ISR Code 2 Bestätigung der Interruptbehandlung 3 Anforderung einer DSR oder 4 Rückkehr ohne DSR Beispiel für eine minimale Interrupt Service Routine cyg_uint32 i s r cyg_addrword_t data ) { cyg_ bool_t dsr_ required = 0; cyg_acknowledge_isr vector r e t u r n dsr_required? CYG_ISR_CALL_DSR CYG_ISR_HANDLED) : CYG_ISR_HANDLED; 1 Beliebiger ISR Code 2 Bestätigung der Interruptbehandlung 3 Anforderung einer DSR oder 4 Rückkehr ohne DSR Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 15 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 15 / 28 ISR Implementierungskelett DSR Implementierungskelett Beispiel für eine minimale Interrupt Service Routine cyg_uint32 i s r cyg_addrword_t data ) { cyg_ bool_t dsr_ required = 0; cyg_acknowledge_isr vector r e t u r n dsr_required? CYG_ISR_CALL_DSR CYG_ISR_HANDLED) : CYG_ISR_HANDLED; 1 Beliebiger ISR Code 2 Bestätigung der Interruptbehandlung 3 Anforderung einer DSR oder 4 Rückkehr ohne DSR Beispiel für eine minimale Deferrable Service Routine void d s r _ f u n c t i o n cyg_ucount32 count, cyg_addrword_t data ) { 1 Anzahl der ISRs die diese DSR anforderten normalerweise 1) 2 Ausführung synchron zum Scheduler Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 15 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 16 / 28

DSR Implementierungskelett 3 Fehlersuche Beispiel für eine minimale Deferrable Service Routine void d s r _ f u n c t i o n cyg_ucount32 count, cyg_addrword_t data ) { 1 Anzahl der ISRs die diese DSR anforderten normalerweise 1) 2 Ausführung synchron zum Scheduler 1 Handwerkszeug Zeitmessungen libezs ecos Unterbrechungsbehandlung 2 Fehlersuche DDD - GDB - CGDB Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 16 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 17 / 28 Die Anwendung im Debugger DDD) ausführen Breakpoints setzen durch einen Doppelklick ins Quelltextfenster Debugger starten und die Anwendung laden: make ddd die Ausführung starten: Continue ddd: Cont-Button) auf der GDB-Konsole folgendes eingeben: Achtung gdb) cont Der Run-Button bzw. gdb) run wird nicht funktionieren! auf der GDB-Konsole für eine bestimmte Funktion gdb) break <function_name> gdb) break <file_name>:<line> Achtung Auf eingebettete Funktionen kann man keinen Breakpoint setzen! Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 18 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 19 / 28

Bedingungen für Breakpoints Bevor das Programm an einem Breakpoint tatsächlich angehalten wird, kann man a) den Breakpoint n-mal ignorieren b) auf die Erfüllung einer Bedingung warten. aus dem Quelltextfenster heraus Bedingungen für Breakpoints Forts.) Achtung bedingte Breakpoints können Ein-/Ausgabe-Operationen zur Folge haben, die das Laufzeitverhalten des Programms beeinflussen können. auf der GDB-Konsole gdb) ignore <breakpoint_nr> <n> gdb) condition <breakpoint_nr> runs == 7 # a) # b) Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 20 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 21 / 28 Weitere Kontrollmöglichkeiten Werte von Variablen beobachten globale Variablen und Objekte Break Anhalten des Programms von außen. normalerweise per Ctrl-C in der GDB-Konsole gdb) # Achtung: vollqual. Name! gdb) graph display Test_Thread::runs Watchpoints gdb) watch xyz Programm anhalten wenn Variable xyz ihren Wert ändert Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 22 / 28 lokale Variablen und Argumente Menü Data Display Local Variables Display Arguments Beobachtung problematisch: Speicherstellen/Register werden vom GCC wiederverwendet passende Debug-Information wird noch) nicht erzeugt Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 23 / 28

Speicherstellen beobachten Neustart ohne DDD zu beenden Menü Data Memory Parameter a) Wie viele Bytes, Half Words, Words, b) Hexadezimal, Oktal, c) Bytes, Half Words 2 Bytes), Words 4 bytes), d) Startadresse Hilfreich zum Kontrollieren von I/O-Registern zunächst muss man die Verbindung zum GDB-Stub trennen gdb) detach erneut eine Verbindung aufbauen <PORT> steht in der Ausgabe von make) gdb) target remote localhost:<port> die Anwendung laden load das hat einige Vorteile: Breakpoints und Watches bleiben erhalten Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 24 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 25 / 28 Debugger neu starten Debugger neu starten Manchmal kann es vorkommen, dass der GDB-Stub bzw. der qemu sich komisch verhält. Man hat dann drei Möglichkeiten: 1 DDD beenden und die Anwendung erneut laden Breakpoints und Watches gehen verloren 2 nur den GDB beenden den gdb beenden killall gdb DDD wird das bemerken und folgender Dialog erscheint 3 den kompletten DDD neu starten aus dem Menü File die Option Restart auswählen auf den Restart GDB -Button klicken Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 26 / 28 Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 27 / 28

4 Fragen Fragen? Hoffmann, Franzmann, Klaus Inf 4) EZS Handwerkszeug WS 2013/14 28 / 28