{"id":438,"date":"2018-03-25T18:12:11","date_gmt":"2018-03-25T18:12:11","guid":{"rendered":"http:\/\/hayperek.pl\/?p=438"},"modified":"2018-03-25T18:12:29","modified_gmt":"2018-03-25T18:12:29","slug":"czas-to-podstawa","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/03\/25\/czas-to-podstawa\/","title":{"rendered":"Czas to podstawa"},"content":{"rendered":"<p>W ka\u017cdym niemal\u017ce systemie wbudowanym, bez wzgl\u0119du na zastosowanie, potrzebna jest jaka\u015b forma podstawy czasu. Nie chodzi tu bynajmniej o bie\u017c\u0105c\u0105 godzin\u0119 i dat\u0119, a o mo\u017cliwo\u015b\u0107 periodycznego wywo\u0142ywania okre\u015blonych zada\u0144 oraz pomiar czasu mi\u0119dzy zdarzeniami. Najprostszym rozwi\u0105zaniem jest zaprz\u0119gni\u0119cie do pracy jednego z wielu dost\u0119pnych licznik\u00f3w\/timer\u00f3w mikrokontrolera. Niekt\u00f3re uk\u0142ady posiadaj\u0105 specjalizowane timery s\u0142u\u017c\u0105ce w\u0142a\u015bnie generowaniu periodycznych przerwa\u0144 zapewniaj\u0105cych podstaw\u0119 czasu. W przypadku STM32F407 jest to 24-bitowy licznik SysTick (Cortex System Timer). Charakteryzuje si\u0119 du\u017co prostsz\u0105 budow\u0105, ni\u017c inne dost\u0119pne liczniki. Posiada tak\u017ce w\u0142asne, dedykowane przerwanie. Od strony sprz\u0119towej, jest to idealny kandydat.<\/p>\n<p>Idealn\u0105 form\u0105 programowej realizacji daemona\/us\u0142ugi zapewniaj\u0105cej czas dla r\u00f3\u017cnych aplikacji, by\u0142aby us\u0142uga\/demon, do kt\u00f3rego poszczeg\u00f3lne aplikacje rejestrowa\u0142yby swoje callbacki z zadanym okresem wywo\u0142ania. Mo\u017cna wyobrazi\u0107 sobie prosty interfejs takiej us\u0142ugi, w stylu <em>WykonajCo(zadany_czas, moja_funkcja)<\/em>. Innymi s\u0142owy je\u015bli dana aplikacja chcia\u0142aby aby <em>operacjaA<\/em> by\u0142a wykonywana co 150ms, musia\u0142a by zawo\u0142a\u0107 <em>WykonujCo(150ms, operacjaA)<\/em>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-385 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_11.jpg\" alt=\"\" width=\"450\" height=\"236\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_11.jpg 450w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_11-300x157.jpg 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><br \/>\nW czasie dzia\u0142ania systemu, us\u0142uga co np. 10ms przechodzi\u0142aby po li\u015bcie zarejestrowanych funkcji i sprawdza\u0142a czy nie min\u0105\u0142 ju\u017c zadany okres czasu dla ka\u017cdej z nich.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-386 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_22.jpg\" alt=\"\" width=\"450\" height=\"175\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_22.jpg 450w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_22-300x117.jpg 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><br \/>\nTakie podej\u015bcie zapewnia ogromn\u0105 elastyczno\u015b\u0107 oraz mo\u017cliwo\u015b\u0107 dynamicznego rejestrowania\/usuwania wpis\u00f3w z listy. Nale\u017cy jednak zada\u0107 sobie kluczowe pytanie: czy rzeczywi\u015bcie w naszym systemie wymagane jest a\u017c tak zaawansowane rozwi\u0105zanie? Je\u015bli za\u0142o\u017cy\u0107, \u017ce wszystkie callbacki aplikacji s\u0105 statycznie przypisywane i nie jest konieczna ich rekonfiguracja w czasie pracy urz\u0105dzenia, mo\u017cna nieco upro\u015bci\u0107 architektur\u0119 us\u0142ugi.<\/p>\n<p>W tym podej\u015bciu istnieje grupa z g\u00f3ry zdefiniowanych &#8222;slot\u00f3w&#8221; na callbacki, wywo\u0142ywanych z okre\u015blon\u0105 cz\u0119stotliwo\u015bci\u0105, np. co 10ms, co 100ms, co minut\u0119. Poniewa\u017c przypisanie callback&#8217;a do danego jest statycznie, mo\u017cna dokona\u0107 go na etapie kompilacji. Ostateczna architektura naszej podstawy czasu wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-387 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_33.jpg\" alt=\"\" width=\"450\" height=\"193\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_33.jpg 450w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/timer_33-300x129.jpg 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><br \/>\nSysTick dostarcza podstaw\u0119 czasu o rozdzielczo\u015bci 1ms. Jest ona nast\u0119pnie dzielona i dystrybuowana na poszczeg\u00f3lne sloty: 10ms (SysTick\/10), 100ms (SysTick\/100), 500ms (SysTick\/500), 1sek (SysTick\/1000) oraz 1min (SysTick\/60000). Ka\u017cdy slot sk\u0142ada si\u0119 ze statycznej listy funkcji, kt\u00f3re maj\u0105 zosta\u0107 wykonane po up\u0142yni\u0119ciu zadanego okresu czasu. W ten spos\u00f3b uzyskujemy rozwi\u0105zanie prostsze, o nieco mniejszej elastyczno\u015bci, jednak wci\u0105\u017c spe\u0142niaj\u0105ce nasze wymagania.<\/p>\n<p>Jutro spr\u00f3bujemy wykorzysta\u0107 podstaw\u0119 czasu do odczytu stanu przycisk\u00f3w. Zapraszam!<\/p>","protected":false},"excerpt":{"rendered":"<p>W ka\u017cdym niemal\u017ce systemie wbudowanym, bez wzgl\u0119du na zastosowanie, potrzebna jest jaka\u015b forma podstawy czasu. Nie chodzi tu bynajmniej o bie\u017c\u0105c\u0105 godzin\u0119 i dat\u0119, a o mo\u017cliwo\u015b\u0107 periodycznego wywo\u0142ywania okre\u015blonych zada\u0144 oraz pomiar czasu mi\u0119dzy zdarzeniami. Najprostszym rozwi\u0105zaniem jest zaprz\u0119gni\u0119cie do pracy jednego z wielu dost\u0119pnych licznik\u00f3w\/timer\u00f3w mikrokontrolera. Niekt\u00f3re uk\u0142ady posiadaj\u0105 specjalizowane timery s\u0142u\u017c\u0105ce w\u0142a\u015bnie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":437,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-438","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\/en\/wp-json\/wp\/v2\/posts\/438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/comments?post=438"}],"version-history":[{"count":1,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/438\/revisions"}],"predecessor-version":[{"id":439,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/438\/revisions\/439"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/437"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}