Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

10. Semestrální úloha - vestavný systém s architekturou ARM

Možné úlohy

  • Distribuované řízení osvětlení: 2 studenti.
  • Výpočet a zobrazení Julia set: 1 student.

Deadline

  • Odevzdání úlohy proběhne v zápočtovém týdnu.
  • Za každý další týden -5 bodů.

Odevzdání

  • Zdrojové kódy v archivu (zip) nahrajte na https://cw.felk.cvut.cz/brute/ (úkol SEMCODE)
  • Dokumentaci (uživatelský manuál a technickou zprávu) v archivu do SEMDOC

Pro odevzdání je potřeba založit tým a bude to platit i pro jednotlivce. Vytváření týmu je nastavené pro umožnění práce ve dvojicích na první alternativě zadání.

Distribuované řízení osvětlení

Úloha je určená pro dvojice studentů bez rozdílu pro studijní program OI i KyR

Úlohu je možné řešit i samostatně, jednotlivci.

Navrhněte systém pro nastavování intenzity a barvy osvětlení v jednotlivých místnostech domácnosti. V každé místnosti je umístěna řídicí jednotka, která řídí intenzitu a barvu stropního osvětlení a osvětlení/barvu stěn. Takové řešení může sloužit k dosažení maximálního komfortu a podporu denního režimu obyvatel. V mnoha situacích je ale potřeba nastavit osvětlení manuálně. K tomu je každá jednotka vybavena trojicí otočných voličů a grafickým displejem. Jednotky jsou propojené komunikační sítí (fyzické médium ETHERNET 1Gbps, protokol TCP/IP) a z každé jednotky by mělo být možné nastavit intenzitu na libovolné jiné. Stejně tak je požadovaná možnost sledovat přítomnost a stav ostatních jednotek.

Pro komunikaci se používá protokol UDP (nespojovaná služba). Veškeré příkazy i stav se posílají mezi porty 55555. Jednotky jednou za sekundu vysílají do celé lokální sítě svůj stav (broadcast). Každá jednotka sleduje tyto informace a vytváří si seznam dostupných jednotek a jejich stavu. Uživatel pak může voličem vybrat jednotku, sledovat její stav a měnit ho zasláním příkazu vloženého do UDP datagramu a poslaného na jedinečnou cílovou adresu vybrané jednotky. Jednotky jsou jednoznačně určené svojí síťovou (IPv4) adresou. Kromě adresy jsou pro zvýšení komfortu obsluhy jsou do jednotek zapsaná jména (maximálně 16 znaků) a grafický symbol/ikona o rozměrech 16×16 bodů v barevné hloubce RGB 565 (celková délka 512 byte). Pro veškeré přenosy po síti se používá síťové pořadí jednotlivých byte začínající nejvíce významným bytem (network order = big-endian).

Podrobnější how-to k práci s vlákny naleznete na stránkách bývalého předmětu X35POS ve cvičení 3.

Formát jednotlivých zpráv protokolu Apo Light Control v 1.0

Byte offset Datový typ Význam
0 … 3 uint32_t Kontrolní číslo 'ALC1'
4 … 7 uint32_t Verze protokolu 1.0 0x00010000
8 … 11 uint32_t Typ zprávy (0 status, 1 inkrement, 2 nastavení na hodnotu )
12 … Vlastní data zprávy

Obsah stavové zprávy

Byte offset Datový typ Význam
0 … 3 uint32_t Kontrolní číslo 'ALC1'
4 … 7 uint32_t Verze protokolu 1.0 0x00010000
8 … 11 uint32_t Typ zprávy 0 - status
12 … 15 uint32_t Strop RGB 888, nejvyšších 8 bitů nevyužito
16 … 19 uint32_t Stěny RGB 888, nejvyšších 8 bitů nevyužito
20 … 35 16x char textový popis jednotky, nevyužité znaky na konci nastavit na nulu
36 … 547 256x uint16_t grafický symbol reprezentující místnost

Obsah zprávy pro korekci intenzity, typ 1

Byte offset Datový typ Význam
0 … 3 uint32_t Kontrolní číslo 'ALC1'
4 … 7 uint32_t Verze protokolu 1.0 0x00010000
8 … 11 uint32_t Typ zprávy 1 - inkrement/úprava
12 … 13 int16_t Úprava složky R pro strop
14 … 15 int16_t Úprava složky G pro strop
16 … 17 int16_t Úprava složky B pro strop
18 … 19 int16_t Úprava složky R pro stěny
20 … 21 int16_t Úprava složky G pro stěny
22 … 23 int16_t Úprava složky B pro stěny

Zpráva pro nastavení (typ 2) používá stejný formát, jako zpráva pro úpravu. Jednotlivé složky však nejsou inkrementy, ale hodnoty, na které se mají složky nastavit. Záporná hodnota pak značí, že se daná složka nastavovat nemá.

Hodnocení a postup řešení

  • [2b] vypsání seznamu jmen jednotek na display (výpis textu viz cvičení 7)
  • [1b] výběr jednotky otočným voličem
  • [1b] zobrazení menu vybrané jednotky na display
  • [1b] inkrementální nastavování vybraného světla jednotky a odeslání zprávy s nastavením (typ 1)
    • v případě, že nebyla realizována komunikace přes UDP, vypsat hodnoty na terminál
  • [2b] příjem zprávy (typ 1/typ 2) a nastavení hodnoty osvětlení
  • [1b] periodické odesílání stavové zprávy (typ 0) včetně ikony
  • [2b] dynamické vytváření seznamu aktivních jednotek
  • [1b] zobrazení aktuálního nastavení jednotek v seznamu aktivních jednotek (případně v menu jednotky) na display
  • další funkce v podmenu jednotky
    • [1b] vypnutí světel
    • [2b] plné zapnutí (výběr z 16 barev)
  • [1b] zobrazení ikony v seznamu aktivních jednotek
  • [1b] netriviální ikona jednotky
  • povinná dokumentace (body pouze v případě finálního funkčního řešení)
    • [2b] za uživatelskou příručku
    • [2b] za technickou zprávu

Alternativní zadání: Výpočet a zobrazení Julia set

Úlohu je nutné řešit individuálně a je určená především pro studenty KyR

Ale I studenti studijního programu OI si ji mohou volit bez omezení, nevyužijí však práci/čas investovaný do řešení podobné úlohy v rámci předmětu B3B36PRG.

Úloha studentům KyR přináší především výhodu, že mohou vlastní kód výpočtu i zobrazení sdílet se semestrálním projektem z předmětu B3B36PRG a zároveň získat zkušenosti, jak kód implementovat tak, aby byl snadno přenositelný mezi různými systémy. Sdílení kódu s druhým předmětem je zvolené i z důvodu snížení časových nároků předmětu B35APO pro studenty KyR podle kreditové dotace.

Implementujte na přípravku MZ_APO zobrazení Julia set. (Názorný příklad od Karl Sims zde: Understanding Julia and Mandelbrot Sets.) Výstup by měl využívat maximum z podporované barevné škály (RGB565) LCD displeje (480×320 bodů). Poloha zobrazení počátku souřadného systému na displeji bude volená dvěma otočnými voliči. Třetí volič bude použitý pro nastavení parametru c a to buď spojitě nebo ze seznamu hodnot s opticky zajímavým výstupem.

Obnova zobrazení by měla probíhat ve vlákně nezávislém na výpočetním vlákně.

Parametry by mělo být možné nastavovat i vzdáleně zasláním UDP zprávy v textovém formátu “<x> <y> <c>” na port 44444.

Hodnocení a postup řešení

  • [16b] za program (podrobnější členění může být ještě upraveno)
    • [2b] grafický výstup na display
    • [1b] výpočet a vykreslení množiny - algoritmus z B3B36PRG pokud má být kód s předmětem sdílen, v předmětu B35APO je možné zvolit i jiný zajímavý vzorec pro vykreslení fraktálů
    • [2b] změna parametrů vykreslení a vzorce podle otočných voličů
    • [2b] výstup na display v samostatném vlákně
    • [3b] výpis nastavených hodnot parametrů na display ve formě textu (viz cvičení 7)
    • [2b] zobrazení menu nebo jiné řešení pro úpravu jasu, barevné palety atd
    • [2b] vzdálené nastavování parametrů z PC, například zprávou přes UDP
    • [2b] režim pro výkladní skříň, parametry se periodicky mění tak, aby se display trvale měnil a střídaly se zajímavé obrázky/efekty
  • povinná dokumentace (body pouze v případě finálního funkčního řešení)
    • [2b] za uživatelskou příručku
    • [2b] za technickou zprávu]

Počáteční šablona pro tvorbu aplikace

Šablonu aplikacenajdete v adresáři

/opt/apo/mzapo_template

Součástí šablony jsou následující soubory

  • Makefile - pravidla pro sestavení a vzdálené spouštění aplikace
  • change_me.c - zdrojový kód s hlavní funkcí main - šablona určená k přejmenování
  • font_prop14x16.c - proporcionální font s maximální šířkou 14 a výškou 16 bodu
  • font_rom8x16.c - font s fixní šířkou
  • font_types.h - definice typu použitého pro popis fontu
  • mzapo_parlcd.h - deklarace funkcí pro nízkoúrovňový přístup k LCD display
  • mzapo_parlcd.c - implementace funkcí pro nízkoúrovňový přístup k LCD display
  • mzapo_phys.h - deklarace funkce pro mapování fyzického rozsahu adres do aplikačního procesu
  • mzapo_phys.c - implementace funkce pro mapování fyzického rozsahu adres do aplikačního procesu
  • mzapo_regs.h - definice bázových adres a registrů výukového návrhu MZ_APO

Podrobnější popis registrů návrhu lze nalézt v dokumentaci desky MZ_APO.

Pravidla Makefile pro sestavovací program je potřeba upravit pro vlastní aplikaci. Aplikace se bude skládat z jednoho nebo více zdrojových souborů v jazyce C (soubory s příponou *.c) a nebo v jazyce C++ (soubory s příponou *.cpp). Příkladem s hlavní funkci main je vzorový soubor change_me.c, který by měl být nahrazen, přejmenován za soubor specifický pro danou aplikaci.

Do proměnné SOURCES je nastaven seznam zdrojových souborů, viz následující část souboru Makefile

SOURCES = change_me.c mzapo_phys.c mzapo_parlcd.c
#SOURCES += font_prop14x16.c font_rom8x16.c

V první řádce je potřeba upravit jméno hlavního souboru aplikace. Pokud jsou využité fonty, je potřeba druhou řádku odkomentovat. Do seznamu je možné na těchto dvou řádkách nebo opakováním řádku s plus-rovná-se přidat i další potřebné soubory. Hlavičkové soubory (*.h) se do seznamu neuvádí.

Jméno žádaného binárního spustitelného souboru je nastavené v do proměnné TARGET_EXE.

Překlad je proveden prostým zavoláním sestavovacího programu

make

kdy je vyvoláno první nalezené pravidlo all.

Pro smazání generovaných souborů (objektové soubory, binární kód aplikace a automaticky generované závislosti) slouží cíl clean. Cíle lze i kombinovat

make clean all

Případná kompilace při změně a spuštění aplikace na vzdálené jednotce je provedeno při vyvolání cíle run

make TARGET_IP=192.168.202.xx run

Automatické přihlášení, přenos dat a spuštění aplikace na cílovém zařízení s danou IP adresou vyžaduje již zavedený privátní klíč v SSH agentovi pro dané sezení

ssh-add /opt/apo/zynq/ssh-connect/mzapo-root-key

Aplikace je nejdříve překopírovaná do podadresáře /tmp vytvořeného podle přihlašovacího jména uživatele a poté je aplikace spuštěné s tím, že standardní vstup i výstup je k dispozici na straně vývojářského počítače přes SSH spojení.

Soubory jsou dostupné i v GitLab FEL přes ssh (nutný nahraný public key):
git@gitlab.fel.cvut.cz:b35apo/mzapo_template.git

Případně přes https:

https://gitlab.fel.cvut.cz/b35apo/mzapo_template.git

Klíč pro přístup k vývojovému kitu je možné v prostředí Xfce aktivovat automaticky po přihlášení v nastavení automaticky spouštěných aplikací Setting manager > Session and startup > Application Autostart (Nastavení > Správce nastavení > Relace a spouštění > Automatický start aplikace). Přidejte položku, název vyplňte například na ssh-mz_apo, přidejte popis a příkaz
ssh-add /opt/zynq/ssh-connect/mzapo-root-key

Nespojovaná/datagramová komunikace v síti s protokolem IP (Internet Protokol)

V současné době je protokol IP (Internet Protokol) nejrozšířenějším standardem pro komunikaci mezi počítači a zařízeními. Protokol je protokolem vyšší vrstvy na úrovni paketů, datagramů a spojení. Pro realizaci vlastního přenosu rámců po lokálních sítích se používá řada technologií, asi nejrozšířenější je technologie ETHERNET, která ve své základní podobě rámců ale neřeší přenos rámců mezi více sítěmi.

Obě technologie se tedy velmi dobře doplňují. Protokol IP existuje ve dvou verzích IPv4, který používá pro identifikaci rozhraní každého počítače ve světové síti 32-bitovou adresu. Postupně se pak přechází na novou verzi protokolu IPv6, který používá 128-bitové adresy s lépe propracovanými pravidly pro přiřazování a komunikaci.

Pro práci na semestrální úloze se předpokládá použití jednodušší verze IPv4. Nad základní síťovou vrstvou je definované množství dalších protokolů specializovaných pro rozdílné potřeby komunikace různých aplikací a druhů přenosu. Asi nejznámější je protokol TCP, který slouží pro zajištění zabezpečeného spojení s kompletním mechanizmem potvrzování přijetí dat. Proud dat je v případě ztráty paketu pozastavený a je zajištěné opětovné poslání nedoručených dat. protokol se používá například pro nejrozšířenější transportní aplikační protokoly a služby HTTP, HTTPS a SSH. Protokol TCP však není vhodný pro paralelní doručování zpráv se všeobecnou cílovou adresou všem účastníkům v rámci lokální sítě (Broadcast).

Aby bylo možné jednoduše vytvářet seznam všech připojených jednotek, bude se v rámci semstrální aplikace používat nezabezpečený, nespojovaný, datagramový protokol UDP. Tato volba umožňuje vysílat informaci o stavu jednotky do lokální sítě bez definování adresy určení. Takovéto zprávy pak mohou přijímat všechny jednotky na lokální síti.

Příklad jednoduchého programu v roli serveru a druhého v klienta lze nalézt například v návodu Beej's Guide to Network Programming.

Podrobnější how-to pro práci se sockety naleznete na stránkách bývalého předmětu X35POS v cvičení 4.

Hlavičkové soubory pro programy v jazyce C, které zpřístupňují soketové služby na systémech splňujících normu POSIX

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

Program, který přistupuje k těmto službám, musí nejdříve založit síťový socket

   int sockfd;

   if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

Volba AF_INET specifikuje adresní rodinu IPv4, SOCK_DGRAM pak volí nespojovanou službu UDP. Více o volání socket v Beej's Guide nebo v dokumentaci GNU C knihovny použité na systému GNU/Linux.

Volba lokálního portu, na kterém poté aplikace naslouchá a který je použitý spolu s IP adresou odchozího rozhraní počítače/jednotky se volí voláním bind (GNU).

Příklad jednoduchého zavázání IPv4 socketu na všechna lokální rozhraní. Port MY_PORT je 16-ti bitové číslo v rozsahu 0 až 65535. Síťové adresy jsou ukládané v paměťových strukturách již v síťovém pořadí bajtů, proto je potřeba převést interní (h = host) pořadí na síťové (n = network) pořadí bajtů. Porty v rozsahu 1 až 1000 jsou pak rezervované pro privilegované služby, mohou je používat jen programy s právy administrátora nebo přímého přístupu k síti.

  struct sockaddr_in bindaddr;

  memset(&bindaddr, 0, sizeof(bindaddr));
  bindaddr.sin_family = AF_INET;
  bindaddr.sin_port = htons(MY_PORT);
  bindaddr.sin_addr.s_addr = INADDR_ANY;

  if (bind(sockfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1) {
    perror("bind");
    exit(1);
  }

Systém však po ukončení služby na určitém portu ještě po určitou dobu znovuvyužití portu rezervuje/blokuje, aby zpožděné, nezpracované příchozí pakety nekolidovaly s nově spuštěnou službou/programem. Proto je vhodné před voláním bind() odmítnout tuto blokaci pro službu, která musí běžet na pevném čísle portu.

  int yes=1;

  if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
                sizeof(yes)) == -1) {
    perror("setsockopt (SO_REUSEADDR)");
    exit(1);
  }

Protože by mohlo dojít k rozesílání datagramům všem jednotkám na lokální síti omylem, musí být tato volba povolena

    int broadcast = 1;

    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
        sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

Dále je již možné k zasílání zpráv využít volání sendto a recvfrom.

IPv4 adresu pro hromadné rozeslání zprávy na všechny uzly v lokální síti je možné nastavit

  struct sockaddr_in braddr;

  memset(&braddr, 0, sizeof(braddr));
  braddr.sin_family = AF_INET;
  braddr.sin_port = htons(HELLO_SERVICE_PORT);
  braddr.sin_addr.s_addr = INADDR_BROADCAST;

Jednoduchý test UDP z řádky

Spuštění serveru / posluchače příchozích UDP paketů na všech síťových rozhraních s IP adresou

nc -u -l -p 44444

Spuštění programu pro vysílání zpráv

nc -u 127.0.0.1 44444

Testování protokolu pro distribuované řízení osvětlení

Pro otestování úlohy distribuovaného řízení osvětlení naleznete na počítačích v místnosti KN:E-2 v adresáři

opt/apo/alc1

program pro monitorování provozu na portu 55555 alc_monitor pro PC a alc_monitor-arm spustitelný na kitech. Program se při spuštění bez parametrů chová jako virtuální jednotka osvětlení, rozesílá jednou za 4 sekundy svojí stavovou informaci a zapamatované hodnoty barevných komponent mohou být upravovány zasíláním zpráv pro relativní i absolutní úpravu intenzity.

Program je možné použít i pro vysílání příkazů sám na sebe nebo na jinou jednotku. Bez uvedení parametrů je nastavena cílová adresa příkazů na 127.0.0.1, to je příkazy vysílá program sám sobě přes lokální adresu/IP rozhraní loopback (lo).

Příkazy se zadávají v terminálu ve formátu

[r|g|b|R|G|B][=+-]<number>

Zápis g=200 po odeslání řádku vyšle příkaz nastavení zelené složky prvního světla na hodnotu 200. Zápis B+10 vyšle požadavek na zvýšení intenzity modré složky druhého světelného zdroje. Pro řízení nastavení stavu na jiné jednotce je potřeba při spuštění uvést alespoň dva parametry

./alc_monitor <name_of_emulated_unit> <target_ip_address> [nobind|single]

První parametr umožňuje zvolit textový identifikátor emulované jednotky. Druhý IP adresu (např. 192.168.202.160) pro volbu cíle příkazů. Příznakem nobind je nastaven režim posílání pouze příkazů bez emulace jednotky, v tomto režimu lze program spustit i na stejném PC, kitu jako již běží aplikace. Režim single slouží k omezení vypisovaných zpráv pouze na jednu jednotku, která je zároveň cílem příkazů. Tento režim je vhodný pro případ, kdy již provoz generovaný více jednotkami přestává být přehledný.

Upozornění: program, byl zatím testovaný pouze sám se sebou, pouze jedna implementace. Není tedy ověřené, že návrh standardu beze zbytku splňuje tak jak byl návrh zamýšlený. Viz. koncepce RFC. Návrh se nemůže stát standardem pro síť Internet, pokud neexistují alespoň dvě implementace vytvořené nezávisle na sobě různými týmy podle dřívějšího návrhu a tyto implementace po propojení vykazují plnou vzájemnou kompatibilitu.

Požadavky na odevzdání semestrální práce

Nejzazší termín pro odevzdání semestrální práce bez bodové ztráty je stanovený na půlnoc 4. června 2017.

Při odevzdání po tomto termínu bude aplikovaná po dobu jednoho týdne srážka 5 bodů, v dalším již 10. Za termín odevzdání se počítá datum a čas, kdy byla nahraná finální verze do systému. Práci je ale nutné předvést i některému z cvičících, který jí ohodnotí a udělí v případě splnění všech povinností zápočet. Ten je nutný k přihlášení na zkoušku. Archiv odevzdaný do systému by neměl obsahovat objektové a zálohové soubory. Finální spustitelný soubor obsahovat může, ale použitý bude jen ve výjimečných případech. Program musí být možné přeložit. Instrukce by mely být specifikované v technické části dokumentace. Preferované je použití sestavovacího programu “make”. Kontrolovat bude program cvičící za účasti studenta (v případě práce ve dvojici obou studentů) kód odevzdaný do systému. Především při kontrole po termínu odevzdání bude testování zaměřené na verzi nahranou do systému. Nutné úpravy na místě budou znamenat snížení hodnocení podle pravidel odevzdání v čase odpovídajícím testování. Kromě kontroly funkce můžete očekávat dotazy na implementaci a koncepci odevzdaného kódu. V případě odevzdání v týmu budou otázky směrované libovolně na členy týmu a nedostatky znalosti funkce kódu mohou snížit hodnocení projektu pro oba členy.

Před odevzdáním si zkontrolujte, že program lze kompletně sestavit z připraveného archivu.

change_me

Odevzdání projektu, který generuje spustitelný soubor se jménem change_me bude u zákazníka/cvičícího vyvolávat zásadní nedůvěru v kvalitu projektu. I hlavní soubor aplikace by měl být přejmenovaný.

Zároveň by v záhlaví vámi vytvářených souborů měla být vyplněna jména skutečných autorů a licence díla. Soubor change_me.c berte jako vzor a hlavičku přepište.

courses/b35apo/tutorials/10/start.txt · Last modified: 2018/02/11 17:30 (external edit)