{
    "id": 361,
    "date": "2018-03-24T19:54:32",
    "date_gmt": "2018-03-24T19:54:32",
    "guid": {
        "rendered": "http:\/\/hayperek.pl\/?p=361"
    },
    "modified": "2018-03-24T19:54:32",
    "modified_gmt": "2018-03-24T19:54:32",
    "slug": "miedzy-niebem-a-ziemia-czyli-sterowniki-peryferiow",
    "status": "publish",
    "type": "post",
    "link": "https:\/\/hayperek.pl\/pl_pl\/2018\/03\/24\/miedzy-niebem-a-ziemia-czyli-sterowniki-peryferiow\/",
    "title": {
        "rendered": "Mi\u0119dzy niebem a ziemi\u0105, czyli sterowniki peryferi\u00f3w."
    },
    "content": {
        "rendered": "<p>W <a href=\"http:\/\/hayperek.pl\/pl_pl\/2018\/03\/19\/hackathon\/\">drugim artykule<\/a> na tym blogu, napisa\u0142em, i\u017c natur\u0105 system\u00f3w wbudowanych jest wzajemne przenikanie si\u0119 sprz\u0119tu i oprogramowania. Wynika z tego, \u017ce ka\u017cda funkcjonalno\u015b\u0107 w naszym urz\u0105dzeniu b\u0119dzie odwo\u0142ywa\u0107 si\u0119 w mniejszym lub wi\u0119kszym stopniu do uk\u0142ad\u00f3w peryferyjnych mikrokontrolera. Na pocz\u0105tek troch\u0119 teorii&#8230;<\/p>\n<h5>Teoria<\/h5>\n<p>Istnieje kilka sposob\u00f3w na powi\u0105zanie \u015bwiata software&#8217;u ze sprz\u0119tem. Pierwszym, cz\u0119sto spotykanym w projektach pocz\u0105tkuj\u0105cych adept\u00f3w, jest odwo\u0142ywanie si\u0119 do sprz\u0119tu bezpo\u015brednio z poziomu aplikacji. Przywo\u0142uj\u0105c przyk\u0142ad terminala z <a href=\"http:\/\/hayperek.pl\/pl_pl\/2018\/03\/23\/software-czyli-jak-tchnac-zycie-w-sprzet\/\">poprzedniego artyku\u0142u<\/a>, widzimy, \u017ce mo\u017cna &#8222;dobra\u0107 si\u0119&#8221; bezpo\u015brednio do rejestr\u00f3w portu szeregowego (UART) w celu odczytania odebranego bajtu, jak r\u00f3wnie\u017c mo\u017cna pisa\u0107 bezpo\u015brednio na wy\u015bwietlacz, u\u017cywaj\u0105c np. GPIO. Podej\u015bcie takie ma liczne wady &#8211; powtarzaj\u0105ce si\u0119 fragmenty kodu, s\u0142aba czytelno\u015b\u0107 i brak przeno\u015bno\u015bci mi\u0119dzy platformami.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-362 size-medium\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_1-300x71.jpg\" alt=\"\" width=\"300\" height=\"71\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_1-300x71.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_1-600x143.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_1.jpg 757w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>W drugim podej\u015bciu wprowadzamy po\u015bredni\u0105 warstw\u0119 abstrakcji sprz\u0119tu. Innymi s\u0142owy, zamiast pobiera\u0107 dane bezpo\u015brednio z peryferi\u00f3w, odwo\u0142ujemy si\u0119 do nich przez funkcj\u0119 interfejsu, jaki udost\u0119pnia warstwa abstrakcji. Ponownie sp\u00f3jrzmy na przyk\u0142adu terminala. Mo\u017cna wyobrazi\u0107 sobie og\u00f3ln\u0105 funkcj\u0119 <em>PobierzBajt()<\/em>, kt\u00f3ra odwo\u0142a si\u0119 do portu szeregowego w naszym imieniu i zwr\u00f3ci ostatnio odebrany znak. Zalet\u0105 takiego podej\u015bcia jest odseparowanie kodu aplikacji od kodu platformowego, kt\u00f3ry si\u0119ga do sprz\u0119tu. Zapewnia to lepsz\u0105 czytelno\u015b\u0107 kodu oraz jego przeno\u015bno\u015b\u0107. Dobrze zaprojektowany kod aplikacji wymaga\u0107 w\u00f3wczas b\u0119dzie jedynie przeniesienia na inn\u0105 platform\u0119. Wci\u0105\u017c jednak jeste\u015bmy w po\u015bredni spos\u00f3b powi\u0105zani ze sprz\u0119tem, co utrudnia m.in. wsp\u00f3\u0142dzielenie zasob\u00f3w mi\u0119dzy wieloma aplikacjami.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-363 size-medium\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_2-300x117.jpg\" alt=\"\" width=\"300\" height=\"117\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_2-300x117.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_2-600x234.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_2.jpg 757w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Trzecie podej\u015bcie ca\u0142kowicie odcina warstw\u0119 aplikacji od sprz\u0119tu. Wszelkie zapytania i \u017c\u0105dania trafiaj\u0105 do demon\u00f3w\/serwis\u00f3w, kt\u00f3re to dopiero przekazuj\u0105 je ni\u017cej, do warstwy abstrakcji. Rozwi\u0105zany zostaje w ten spos\u00f3b problem wsp\u00f3\u0142dzielenia zasob\u00f3w. Nie mo\u017cna tak\u017ce zapomina\u0107 o kwestiach bezpiecze\u0144stwa. W dw\u00f3ch pierwszych podej\u015bciach aplikacja jest w stanie wykona\u0107 dowoln\u0105 operacj\u0119, na kt\u00f3r\u0105 pozwala udost\u0119pniony interfejs sprz\u0119tu. W przypadku b\u0142\u0119du nic jej nie powstrzymuje przed podj\u0119ciem akcji, kt\u00f3ra potencjalnie mo\u017ce doprowadzi\u0107 do b\u0142\u0119dnego dzia\u0142ania czy nawet awarii ca\u0142ego systemu. Do warstwy us\u0142ug mo\u017cna tak\u017ce oddelegowa\u0107 cz\u0119\u015b\u0107 funkcjonalno\u015bci, kt\u00f3r\u0105 wcze\u015bniej zawiera\u0142a aplikacja. Dobry przyk\u0142ad stanowi\u0105 tu wszelkie protoko\u0142y komunikacyjne. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-364 size-medium\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_3-300x162.jpg\" alt=\"\" width=\"300\" height=\"162\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_3-300x162.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_3-600x324.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/hal_3.jpg 763w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h5>Praktyka<\/h5>\n<p>Zdecydowali\u015bmy si\u0119 wykorzysta\u0107 w projekcie procesor SMT32F407. Podobnie jak inni producenci mikrokontroler\u00f3w, tak firma STMicroelectronics dostarcza dla uk\u0142ad\u00f3w z rodziny STM32 wygodn\u0105 bibliotek\u0119 HAL <em>(ang. Hardware Abstraction Layer),<\/em> kt\u00f3rej u\u017cyjemy. <\/p>\n<blockquote><p>Jak to? Jaki profesjonalista u\u017cywa HAL&#8217;a? Tylko pisanie po rejestrach!<\/p><\/blockquote>\n<p>No w\u0142a\u015bnie&#8230; W \u015brodowisku entuzjast\u00f3w mikrokontroler\u00f3w biblioteka HAL budzi do\u015b\u0107 skrajne emocje. Wiele os\u00f3b, zw\u0142aszcza z du\u017cym do\u015bwiadczeniem w programowaniu, krytykuje j\u0105 za nadmiern\u0105 zasobo\u017cerno\u015b\u0107, przesadne skomplikowanie, ograniczone mo\u017cliwo\u015bci i spor\u0105 ilo\u015b\u0107 b\u0142\u0119d\u00f3w. Z drugiej strony osoby rozpoczynaj\u0105ce dopiero przygod\u0119 z STM&#8217;ami chwal\u0105 prostot\u0119 konfiguracji i \u0142atwo\u015b\u0107 u\u017cycia jak\u0105 zapewnia <em>(zazwyczaj do momentu, w kt\u00f3rym nie natrafi\u0105 na jeden z bug\u00f3w \ud83d\ude42 )<\/em>. <\/p>\n<blockquote><p>Dlaczego wi\u0119c u\u017cyjemy HAL&#8217;a?<\/p><\/blockquote>\n<p>Mimo wszystkich swoich s\u0142abo\u015bci i problem\u00f3w jakie niesie, ma on jedn\u0105, ogromn\u0105 zalet\u0119 &#8211; pozwala na prawd\u0119 \u0142atwo i szybko uruchomi\u0107 potrzebne uk\u0142ady peryferyjne. Na etapie prototypu, kiedy tak na prawd\u0119 dopiero poszukujemy najlepszych rozwi\u0105za\u0144, nie musimy traci\u0107 cennego czasu na zag\u0142\u0119bianie si\u0119 w niuanse konfiguracji danego urz\u0105dzenia. Ot wo\u0142amy odpowiedni\u0105 funkcj\u0119 Init i gotowe. Nawet je\u015bli za jaki\u015b czas oka\u017ce si\u0119, i\u017c nie b\u0119dzie nam ju\u017c ono potrzebne lub przeniesiemy funkcjonalno\u015b\u0107 w inne miejsce, nie stracili\u015bmy wiele.<br \/>\nDopiero w momencie kiedy ca\u0142o\u015b\u0107 systemu nabierze ostatecznych kszta\u0142t\u00f3w, mo\u017cna b\u0119dzie przyst\u0105pi\u0107 do optymalizacji, czyli w gruncie rzeczy zast\u0105pienia HAL&#8217;a w krytycznych miejscach czym\u015b bardziej adekwatnym, np. odwo\u0142aniami bezpo\u015brednio do rejestr\u00f3w.<br \/>\nW przysz\u0142o\u015bci postaram si\u0119 po\u015bwi\u0119ci\u0107 problemom optymalizacji nieco wi\u0119cej miejsca. A by\u0107 mo\u017ce nawet ca\u0142y dzie\u0144 \ud83d\ude42<\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>W drugim artykule na tym blogu, napisa\u0142em, i\u017c natur\u0105 system\u00f3w wbudowanych jest wzajemne przenikanie si\u0119 sprz\u0119tu i oprogramowania. Wynika z tego, \u017ce ka\u017cda funkcjonalno\u015b\u0107 w naszym urz\u0105dzeniu b\u0119dzie odwo\u0142ywa\u0107 si\u0119 w mniejszym lub wi\u0119kszym stopniu do uk\u0142ad\u00f3w peryferyjnych mikrokontrolera. Na pocz\u0105tek troch\u0119 teorii&#8230; Teoria Istnieje kilka sposob\u00f3w na powi\u0105zanie \u015bwiata software&#8217;u ze sprz\u0119tem. Pierwszym, cz\u0119sto [&hellip;]<\/p>",
        "protected": false
    },
    "author": 1,
    "featured_media": 391,
    "comment_status": "closed",
    "ping_status": "open",
    "sticky": false,
    "template": "",
    "format": "standard",
    "meta": {
        "footnotes": ""
    },
    "categories": [
        3
    ],
    "tags": [],
    "class_list": {
        "0": "post-361",
        "1": "post",
        "2": "type-post",
        "3": "status-publish",
        "4": "format-standard",
        "5": "has-post-thumbnail",
        "6": "hentry",
        "7": "category-stodni",
        "9": "post-with-thumbnail",
        "10": "post-with-thumbnail-large"
    },
    "_links": {
        "self": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/361",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/comments?post=361"
            }
        ],
        "version-history": [
            {
                "count": 15,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/361\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 379,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/361\/revisions\/379"
            }
        ],
        "wp:featuredmedia": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media\/391"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media?parent=361"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/categories?post=361"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/tags?post=361"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}