<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=3265&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-25T19:40:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3265&amp;mode</id>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-06-25T19:40:10+01:00</updated>
<published>2015-06-25T19:40:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=132879#p132879</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=132879#p132879"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=132879#p132879"><![CDATA[
Witam!<br />Próbuję uruchomić projekt wielozadaniowy z GB bez żadnych zmian (L19_HD44780_LCD). Rozumiem działanie mechanizmu warstw po lekturze stosownego rozdziału w GB. Kompilacja przebiega prawidłowo, ale na LCD wyświetla się tylko data (12-02-25) w prawym dolnym rogu. Pozostałe warstwy &quot;reprezentowane&quot; są przez białe kwadraty (7 sztuk) przesuwające się równomiernie z prawej strony ekranu na lewą i z powrotem. Co sprawdzić aby uzyskać poprawne wyświetlanie warstw? ATB Rev. 1.03. ATmega32. Bardzo proszę o pomoc.<br />Pozdrawiam<br /><br />P.S. W pliku nagłówkowym LCD jest 4x16, a mój LCD jest 2x16 <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Zmieniłem wyświetlacz na 4x20 i stosownie zaktualizowałem wpis w pliku nagłówkowym LCD. Nadal wyświetla się poprawnie tylko warstwa 1 (godzina i data) w górnym prawym rogu LCD. Na jej tle przesuwają się pełne prostkąty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 25 cze 2015, o 19:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-08T23:35:16+01:00</updated>
<published>2013-06-08T23:35:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38769#p38769</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38769#p38769"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38769#p38769"><![CDATA[
<div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Chcę mieć narzędzia, które będą dla mnie wygodne i których użycie będzie opłacało się bardziej niż RTOS<br /></div><br /><br />Nie żebym miał coś przeciwko RTOS'om ... ale właśnie takie projekty hmmm takie podejście pokazuje dobitnie, że często wiele osób sięgając po RTOS'a dokonuje swoistego przerostu formy nad treścią .... podczas gdy takimi hmm w sumie prostymi metodami można wiele spraw załatwić .... pewnie że tutaj określenie &quot;proste metody&quot; może nie pasuje do kogoś kto dopiero zaczyna przygodę bo jak to czyta to mu jeden diabeł czy to jakiś RTOS czy co to za taski tutaj latają .... ale myślę - że dotarcie ze stopnia początkującego do takiego etapu to na prawdę nie jest trudna droga ... byle by zaskoczyć te podstawy<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Lubię wiedzieć czy to, co robię jest warte zachodu, z tąd te statystyki. Bez tych informacji będzie bardzo ciężko odnieść się krytycznie do tego rozwiązania.<br /></div><br /><br />Na prawdę bardzo ciekawe i godne pochwały podejście na dodatek rzeczywiście przy tak skromnych ale jak skutecznych narzędziach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />jak coś jeszcze będziesz miał po analizach to ja na pewno z chęcią poczytam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 cze 2013, o 23:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-08T23:17:18+01:00</updated>
<published>2013-06-08T23:17:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38768#p38768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38768#p38768"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38768#p38768"><![CDATA[
Z wykresem poszło dosyć łatwo. W najprostszy sposób dodałem sobie licznik, w pętli głównej go inkrenetowałem, a jak wystąpiło przerwanie, to licznik wyrzucałem na terminal, każdą wartość na osobną linijkę, a potem go zerowałem i dalej od początku. Terminal logował do pliku tekstowego. Potem plik tekstowy z ponad 90000 linii ładowałem do excela i przy pomocy funkcji countif(zakres, liczba) policzyłem sobie histogram dla konkretnych wartości w osi x. W dalszej kolejności narysowałem sobie wykresik <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, jak pani na informatyce uczyła w gimnazjum paręnaście wiosen temu. Taka w sumie najprostsza metoda, a już daje pewien obraz. W ten sam sposób postąpię dalej z innymi pomiarami.<br /><br />Co do debugera. Ktoś kiedyś zaimplementował w tym systemie coś a'la printf'a drukującego na terminal. Nie wgłębiałem się w jego budowę, wiem tylko tyle, że jak zrobię debug_print(&quot;%d/n&quot;, licznik); to mi drukuje w terminalu wartość licznika w eleganckim dziesiętnym formacie. No i nie tylko %d, ale też różne inne formaty: hex, binary, string itp. Nie wiem dokładnie co siedzi w tej funkcji. Ale jest na tyle dobre, że nie muszę bawić się jtagiem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, lub pisać własnych.<br /><br />Co do &quot;celu&quot;. Przede wszystkim lubię optymalizować więc poniekąd jest to mi potrzebne w pracy. Ale z drugiej strony robię to też dla tego, że mam przestój w obowiązkach i chcę się czegoś nowego nauczyć. Podwaliny pod RTOS? Nieee <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, to już gruba sprawa, pilnowanie stosu dla każdego z wątków, zabawa z licznikiem programu, rejestry, semafory... Może za 5 lat <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> i pewnie ze wsparciem ludzi z forum. Obecnie mam inny cel. Chcę mieć narzędzia, które będą dla mnie wygodne i których użycie będzie opłacało się bardziej niż RTOS, niezależnie od stopnia skomplikowania projektu. Lubię wiedzieć czy to, co robię jest warte zachodu, z tąd te statystyki. Bez tych informacji będzie bardzo ciężko odnieść się krytycznie do tego rozwiązania.<br /><br />Dla tego też kolejnym etapem na pewno będzie zebranie czasowych zależności, jeszcze większej ilości próbek i próba wyjścia z analizą z dziedziny czasu w dziedzinę częstotliwości. Może tam będzie odpowiedź na niektóre pytania. Zobaczymy. Miłej nocy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 8 cze 2013, o 23:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-08T22:07:59+01:00</updated>
<published>2013-06-08T22:07:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38763#p38763</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38763#p38763"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38763#p38763"><![CDATA[
WOW! ale teraz dowaliłeś &quot;z grubej rury&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tzn w pozytywnym tego słowa znaczeniu ... jak ty to ogarniasz i zbierasz dane do wykresów ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> chyba że twój program/projekt jest na tyle specyficzny, że w jakiś zewnętrzny sposób możesz tak mierzyć te taski albo hmm jakich narzędzi używasz ? aż zapytam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... generalnie bardzo fajna analiza - aż szczęka opada do podłogi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />tzn piszesz że masz dobry debuger - czyli ? <br /><br />generalnie podchodzisz do zagadnienia można by rzec iście naukowo <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> próbując dokonać ocen statystycznych tworzonych mechanizmów w wielu badaniach - tak jakby miały to być wręcz podwaliny pod nowy system RTOS <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ...<br /><br />nie wiedziałem, że aż tak daleko się rozpędzisz - ja już powoli wymiękam w rozważaniach - chociaż przyznam - że to NIESAMOWICIE interesujące ... czuję, że jest to ci potrzebne mocno do projektu, który akurat realizujesz ... nie mniej jednak uważam że fajnie zobaczyć jak się coś takiego robi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... <br /><br />Mnie się już na tym etapie ciężko odnieść w konkretny sposób do pytań bo musiałbym mieć czas i możliwości aby do tego w podobny sposób zasiąść i się pobawić .... Przez ciebie pewnie kiedyś się za to zabiorę (mam kolejny cel) .... bo to na prawdę wręcz arcy-ciekawe zagadnienie (przynajmniej jak dla mnie) ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 cze 2013, o 22:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-08T21:21:43+01:00</updated>
<published>2013-06-08T21:21:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38760#p38760</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38760#p38760"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38760#p38760"><![CDATA[
Cześć!<br />Trochę trwało, ale udało mi się w końcu siąść przy komputerze. Jedziemy dalej. Wkleję parę wykresów, na dobry początek.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/958/50963f1092b5dfdd7a2998a0b33d84f2.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/958/50963f1092b5dfdd7a2998a0b33d84f2.png" alt="Obrazek" /></a><br /><a href="http://forum.atnel.pl/_obrazki/o/958/f84419e365314a7e1d8785afb491d006.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/958/f84419e365314a7e1d8785afb491d006.png" alt="Obrazek" /></a><br /><br />Teraz kilka danych statystycznych:<br /><br /><strong>I grupa.</strong><br /><ul><li>ilość zbadanych okresów pomiędzy przerwaniami: 11797 - ok 1 minuty działania systemu</li><li>średnia/odchylenie standardowe &quot;0 tasks&quot; - 51/14 (obrotów pętli głównej pomiędzy przerwaniami timera, co 5ms)</li><li>średnia/odchylenie standardowe &quot;40 tasks&quot; - 42/12 (obrotów pętli głównej pomiędzy przerwaniami timera, co 5ms)</li></ul><br /><strong>II grupa.</strong><br /><ul><li>ilość zbadanych okresów pomiędzy przerwaniami: 92800 - ok 8 minut działania systemu</li><li>średnia/odchylenie standardowe &quot;0 tasks&quot; - 81/13 (obrotów pętli głównej pomiędzy przerwaniami timera, co 5ms)</li><li>średnia/odchylenie standardowe &quot;40 tasks&quot; - 68/11 (obrotów pętli głównej pomiędzy przerwaniami timera, co 5ms)</li></ul><br />A teraz słówko wyjaśnienia, o co chodzi i mały komentarz do kodu. Postaram się pisać zrozumiale, ale nie wiem, czy mi wyjdzie.<br /><ul><br /><li>&quot;0 tasks&quot; - parametry statystyczne opisujące sytuację, która jest przedstawiona w moim poprzednim poście, w <strong>pierwszym </strong>listingu. W kodzie nie używam żadnego mechanizmu kolejkowania zadań, jest to klasyczny synchroniczny sheduler, znany z zielonki i niebieskiej.</li><li>&quot;40 tasks&quot; - parametry statystyczne opisujące sytuację, która jest przedstawiona w moim poprzednim poście, w <strong>drugim </strong>listingu. W kodzie widać, że co jakiś czas ładuję do kolejki zadania przy pomocy funkcji add_task(taskn);, a w pętli głównej opróżniam tę kolejkę wykonując jedno zadanie na jeden obieg pętli głównej run_task();.</li><li>&quot;taskn()&quot; - Jakieś tam zadanie, które zbudowane jest na podstawie maszyny maszyny stanów. Na każdy moment, kiedy zadaniu przydzielony jest czas procesora, wykonuje się jeden ze stanów, maszyny stanów. Jest to mechanizm bardzo podobny do przełączania wątków po ticku timera systemowego (np. po 10ms) w  RTOS'ach, jednak zdecydowanie szybszy, bo nie bawimy się w zapamiętanie licznika programu i dbanie o zapamiętywanie i przywracanie zawartość stosu oraz rejestrów procesora.</li></ul><br />Wykresy są histogramami. W osi x widzimy ile było obrotów pętli głównej pomiędzy tickiem timera systemowego, co 5ms. W osi Y widzimy, jak często dana ilość obrotów pętli głównej wystąpiła w czasie okresu pomiarowego. Oś y celowo została wyskalowana w % dla lepszej wizualizacji. Interpretacja wykresu jest następująca. Załóżmy, że wykres 1 został zrobiony na podstawie zliczonych obiegów pętli głównej pomiędzy 1000 przerwaniami. Z kapelusza np. liczba 42 w osi x oznacza, że pętla przekręciła się 42 razy w ciągu tych 5ms. Załóżmy, że 42 ma w osi Y 10%. 10% z 1000 = 100, czyli 100 razy w okresie pomiarów (pomiędzy tymi 1000 przerwań) w czysto losowym czasie, pętla główna obracała się 42 razy. Można powiedzieć, że dosyć często. Wniosek jest jeden. Im mniejsza liczba w osi x tym pętla główna jest bardziej obciążona. Im więcej % w osi y tym dana grupa wystąpiła częściej podczas pomiarów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Interpretacja wyników. Widać, że dodając jedno dodatkowe zadanie do pętli głównej, <strong>pętla </strong>zwalnia. Wykres pokazuje to równie dobrze, jak średnia zarówno dla małej jak i dużej grupy badanych odstępów pomiędzy przerwaniami. Można się tego spodziewać, zwłaszcza, że różnice pomiędzy średnimi oscylują w okolicy kilkunastu procent (mała grupa - 19% i duża grupa - 16%), co jest poprawnym wynikiem, bo po opróżnieniu kolejki, pętla mieli dalej 3 zadania, a ilość zadań do zmielenia zarówno dla pierwszego jak i drugiego listingu jest taka sama i zależy tylko od pewnych wielokrotności czasowych. Z różnicy % pomiędzy średnimi dla małej grupy widać, że start systemu bardziej obciąża pętlę główną. Ale to już taka ciekawostka bardziej.<br /><br />Błędnym wnioskiem jest twierdzenie, że zwolnił nam cały system. Zwolniła nam jedynie pętla główna, której co 5ms wpada coś do zrobienia i która na jeden obrót ma czasami o jedno zadanie więcej do zrobienia. Tylko że w przypadku pierwszego listingu, blokujemy procesor na dłuższy czas, bo musimy wykonać wszystkie zadania ze shedulera, co 5ms, w zależności od tego, co tam nam timer akurat naliczył. No i blokujemy zadania 1, 2 i 3. A w przepadku drugiego sposobu w bardzo szybki sposób ustalamy kolejkę zadań przy pomocy shedulera, którą to w obiegu pętli głównej opróżniamy, nie blokując aż tak mocno ważnych zadań o numerach 1, 2 i 3.<br /><br />Nie rozumiem natomiast jednej rzeczy. Czemu odchylenie standardowe się zmniejszyło, po tym, jak wdrożyłem kolekowanie. Czy to oznacza, że dynamika operowania drugiego kodu jest większa? Tzn., czy mogę to interpretować w taki sposób, że histogram jest bardziej zawężony? Czy trzeba by coś więcej policzyć, by to stwierdzić?<br /><br />Może ktoś z was ma pomysł, jakie ciekawe parametry statystyczne jeszcze policzyć? bo fajnie by było coś jeszcze dorzucić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Na tym etapie widzę, że powyższe pomiary i dane są niekompletne. Koniecznie muszę uzupełnić je o to, ile średnio dodatkowych zadań wykonywanych jest pomiędzy przerwaniami. Całe szczęście mam dobry debuger. Chcę też pomierzyć czas obijania się procka (czyli gdy obsługuje tylko te 3 krytyczne czasowo taski). Tutaj muszę uwolnić jeden z timerów, bo wszystkie są zajęte. Sam jestem strasznie ciekawy dalszych wniosków a przy okazji dzielę się nimi na forum.<br /><br />No i na koniec taka moja prywatna refleksja. JA Mirkowi zarzuciłem lanie wody, a teraz role się odwróciły... Już nie dziwię, że chcesz by ludzie Ciebie dobrze rozumieli, powtarzając niektóre kwestie i kwieciście opisując prozą niektóre zagadnienia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. W moim wypadku zanosi się na więcej, bo jak dokonam pozostałych badań to będzie jeszcze ciekawiej. Widać, jak się nie wjedzie czasami w czyjeś buty to się nie doceni pracy osoby, którą się krytykowało. Teraz Mirek to doceniam.<br /><br /><br />Pozdrawiam czytających i mam nadzieję, że nie zanudziłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 8 cze 2013, o 21:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-07T15:36:39+01:00</updated>
<published>2013-06-07T15:36:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38707#p38707</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38707#p38707"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38707#p38707"><![CDATA[
Hej.<br />Kilka kodów, przed prezentacją wyników.<br /><br />Dla pokazania, co mam na mysli, napisałem taki oto pseudo kod:<br />[syntax=c]void do_tasks(void) {<br /><br />do {<br />task1();<br />task2();<br />task3();<br />} while (!system_tick);<br /><br />    // co 5 ms<br />    task4();<br />    task5();<br />    task6();<br />    task7();<br />    task8();<br />    task9();<br />    task10();<br />    task11();<br />    task12();<br />    task13();<br />    task14();<br />    task15();<br />    task16();<br />    task17();<br />    task18();<br />    task19();<br />    task20();<br />   <br />// co 10 ms<br />if (// co 10 ms) {<br />task21();<br />} else {<br />task22();<br />}<br /><br />// co 20 ms<br />switch (// co 20 ms) {<br />task23();<br />task24();<br />task25();<br />task26();<br />task27();<br />case 1:<br />task28();<br />task29();<br />task30();<br />task31();<br />task32();<br />break;<br /><br />case 2:<br />task33();<br />task34();<br />task35();<br />task36();<br />task37();<br />break;<br /><br />case 3:<br />task38();<br />task39();<br />task40();<br />task41();<br />task42();<br />break;<br />}<br /><br />// co 50 ms<br />switch (// co 50 ms) {<br />case 1:<br />task43();<br />task44();<br />break;<br /><br />case 2:<br />task45();<br />task46();<br />break;<br /><br />case 3:<br />task47();<br />task48();<br />break;<br /><br />}<br />}[/syntax]<br /><br />Myślę, że jest to wszystkim dobrze znane. Przykład bazuje na moim prywatnym projekcie w domu i na Mirekowym opisie wielozadaniowego projektu LCD w zielonce.<br /><br />Zamieniam na kolejkowanie:<br /><br />[syntax=c]uint8_t tasks_head = 0;<br />uint8_t tasks_tail = 0;<br />#define max_tasks128<br />#define max_tasks_mask (max_tasks-1)<br /><br />typedef struct {<br />void (*task_function)(void);<br />} task;<br /><br />task tab_tasks&#91;max_tasks&#93;;<br /><br />void add_task(void (*new_task)(void)) {<br />tab_tasks&#91;tasks_head&#93;.task_function = new_task;<br />tasks_head = (tasks_head + 1) &amp; max_tasks_mask;<br />}<br /><br />void run_task(void) {<br />if(!(tasks_tail==tasks_head)){<br />tab_tasks&#91;tasks_tail&#93;.task_function();<br />tab_tasks&#91;tasks_tail&#93;.task_function = NULL;<br />tasks_tail = (tasks_tail + 1)&amp;max_tasks_mask;<br />}<br />}<br /><br />uint16_t licznik =0;<br /><br />void do_tasks(void) {<br /><br />do {<br />task1();<br />task2();<br />task3();<br />run_task(); // TU JEST ZMIANA!!!!<br />} while (!system_tick);<br /><br />    // co 5 ms<br />    add_task(task4);<br />    add_task(task5);<br />    add_task(task6);<br />    add_task(task7);<br />    add_task(task8);<br />    add_task(task9);<br />    add_task(task10);<br />    add_task(task11);<br />    add_task(task12);<br />    add_task(task13);<br />    add_task(task14);<br />    add_task(task15);<br />    add_task(task16);<br />    add_task(task17);<br />    add_task(task18);<br />    add_task(task19);<br />    add_task(task20);<br />   <br />// co 10 ms<br />if (// co 10 ms) {<br />add_task(task21);<br />} else {<br />add_task(task22);<br />}<br /><br />// co 20 ms<br />switch (// co 20 ms) {<br />add_task(task23);<br />add_task(task24);<br />add_task(task25);<br />add_task(task26);<br />add_task(task27);<br />case 1:<br />add_task(task28);<br />add_task(task29);<br />add_task(task30);<br />add_task(task31);<br />add_task(task32);<br />break;<br /><br />case 2:<br />add_task(task33);<br />add_task(task34);<br />add_task(task35);<br />add_task(task36);<br />add_task(task37);<br />break;<br /><br />case 3:<br />add_task(task38);<br />add_task(task39);<br />add_task(task40);<br />add_task(task41);<br />add_task(task42);<br />break;<br />}<br /><br />// co 50 ms<br />switch (// co 50 ms) {<br />case 1:<br />add_task(task43);<br />add_task(task44);<br />break;<br /><br />case 2:<br />add_task(task45);<br />add_task(task46);<br />break;<br /><br />case 3:<br />add_task(task47);<br />add_task(task48);<br />break;<br /><br />}<br />}[/syntax]<br />Wynikami podzielę się wieczorem, są bardzo ciekawe:). do_tasks(); traktujmy jako pętlę główną.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 7 cze 2013, o 15:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-06T19:08:06+01:00</updated>
<published>2013-06-06T19:08:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38651#p38651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38651#p38651"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38651#p38651"><![CDATA[
rolba ---&gt; ale żeś zamieszał <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> oczywiście w pozytywnym tego słowa znaczeniu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... fajnie tzn...<br /><br />na prawdę ciężko coś takiego sprawdzić ot tak ... na churra - ale starałem się przeanalizować - bo, przyznam że masz tu fajny tok myślenia ... i fajny pomysł hyhyhy z tym buforem cyklicznym jak z UART'a haahaha ale idea jest przednia<br /><br />tak wydaje mi się że to ma potencjał i fajnie że opisujesz to na forum bo może to być dobrym przykładem dla innych<br /><br />hmm też bym się zastanawiał jak testować wydajność i obciążenie  ale ...<br /><br />1. i tak tego typu ala &quot;systemik&quot; wdraża się praktycznie indywidualnie pod dany projekt i go tuninguje - chociaż z tego opisu widać że wręcz dałoby się wyprowadzić jakieś ogólne mechanizmy w jakąś nawet taką pseudo bibliotekę i spokojnie używać w różnych swoich projektach<br /><br />2. to co pisałeś - nie ma sensu mówić tu o ilości pamięci RAM - bo wiadomo, że już taki ciut bardziej rozbudowany systemik wielozadaniowy no ciężko byłoby robić na procku mającym 64bajty RAMU <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />3. co do samej wydajności - tak z grubsza porównując do tego co robiłem w warstwach, to może nie wyjdzie to jakoś szczególnie szybciej bo i tu i tam są IF'y które ew nie wykonują procesów, gdy nie mają one nic do roboty - nie mniej jednak jak mówiłem - nie tworzyłem go z taką myślą jaka ci przyświeca i dlatego zdecydowanie uważam - że twoja idea do celu obsługi procesów jest bardzo fajna - przynajmniej tak na luzie teoretycznie to rozpatrując - bo wiadomo że gdyby siedzieć i kodować to pewnie jakieś uwagi by może się nasunęły - ale wszystko jest do rozwiązania<br /><br />ostatecznie - chyba ciężko sprawdzać tu system wydajnościowo - bo coś takiego byłoby możliwe chyba - gdyby to właśnie tworzyć jako uniwersalny system - a jeśli to jest i tak do indywidualnego wdrażania w każdy projekt - to ta wydajność będzie mocno zależała od projektu ... <br /><br />i wydaje mi się, kończąc, że to dodawanie i usuwanie tasków - nie tylko mocno wspomoże wydajność ale jeszcze wydaje się być bardzo przejrzyste i miłe w realizacji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />PS... wdziałem i czytałem, analizowałem wiele kodów na realizację takich systemów wielozadaniowości dla 8-bitowców. Wiadomo jest tego sporo .... ciężko nawet je wszystkie porównywać bo jak mówię - porównywać to można np jakieś już gotowe RT-OSy ... ale dla mnie liczy się przejrzystość implementacji i wydaje mi się, że taki pomysł mieści się w takich fajnych granicach.<br /><br />Jak potestujesz do końca to daj znać sam jestem ciekaw opinii z prania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 cze 2013, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-06T17:49:08+01:00</updated>
<published>2013-06-06T17:49:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38647#p38647</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38647#p38647"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38647#p38647"><![CDATA[
Hej.<br />Mirek, dzięki za dobrą krytykę. Lecimy dalej.<br /><br />Coś już działa. Po krótce, bo za dużo nie mogę powiedzieć (tajemnica służbowa). System jest mocno obciążony komunikacją RS-485 (w pętli głównej, ze względu wymogi czasowe i ilość danych) + obsługa dodatków w sposób synchroniczny (timery programowe): LCD (bardzo zaawansowana obsługa), bardzo duże menu, które jest kompilowane osobnym programem, dołączane do hexa firmware (menu i teksty siedzą w osobnej pamięci), plus klawiatura, buzzer, sterownik pamięci flash. I te rzeczy scheduler wykonuje synchronicznie po kolei. Jest ich bardzo dużo, są odpalane w różnych odstępach czasu (np co 50ms w zerowej, pierwszej, drugiej... dziesiątce), co 10 ms, co 100ms itp. Każdy z tych tasków przypomina wyglądem superdebounce, ale maszyna stanów w środku każdego z nich jest bardziej rozbudowana.<br /><br />Na początek wziąłem pętlę główną (bo najłatwiej i najmniej tasków). Było tak:<br /><br /><br /><br />[syntax=c]/*bla bla bal....*/<br /><br />//petla główna<br />while(1){<br />watchdog_reset();<br />bus_procedure();<br />bus_procedure();<br />}<br /><br />/*bla bla bal....*/[/syntax]<br /><br /><br />Zmieniłem na takie cuś:<br /><br />[syntax=c]/*bla bla bal....*/<br />typedef struct{<br />   void (*taks_function)(void);<br />}task;<br />task tab_tasks&#91;3&#93;;// 3, bo 3 taski<br />/*bla bla bal....*/<br /><br />//pierwsza petla główna<br />tab_tasks&#91;0&#93;.taks_function = watchdog_reset;<br />tab_tasks&#91;1&#93;.taks_function = bus_procedure;<br />tab_tasks&#91;2&#93;.taks_function = bus_procedure;<br /><br />for (int i =0; i&lt;3; i++){<br />    tab_tasks&#91;i&#93;.taks_function();// wykonanie taska<br />    tab_tasks&#91;i&#93;.taks_function = NULL;// wyrzucenie taka z listy<br />}<br /><br />// dalej jest rozdział dodatkowych zadań (LCD, buzzer, menu itp), odpowiednio owarunkowane, odpalane wtedy, kiedy trzeba - nie wnikam w słuszność tego rozwiązania, nie będe go analizować. Przyjm ijmy, że działa dobrze. :)[/syntax]<br /><br />Odpalam urządzenie i działa dobrze, nic się nie dławi, nie zawiesza. Teraz czas na dalsze modyfikacje i nowe funkcje: <br /><br />add_task(task), run_task() oraz implementacja w odpowiednim miejscu tych funkcji. Czyli:<br /><br />[syntax=c]/*bla bla bal....*/<br />uint8_t tasks_head = 0;<br />uint8_t tasks_tail = 0;<br />#define max_tasks32 //na wszelki wypadek dałem więcej:)<br />#define max_tasks_mask (max_tasks-1)    //Dzieki Mirek za ten przykład z buforem z UARTU, wziąłem go żywcem<br /><br />typedef struct {<br />void (*task_function)(void);<br />} task;<br /><br />task tab_tasks&#91;max_tasks&#93;;<br /><br />//Gdyby ktoś to sprawdził, nawet lukając tylko na kod, czy nie ma tu błędu, bo nie czuję do końca, czy jest dobrze<br />void add_task(void (*new_task)(void)) {<br />tab_tasks&#91;tasks_head&#93;.task_function = new_task;<br />tasks_head = (tasks_head + 1) &amp; max_tasks_mask;<br />}<br /><br />//Gdyby ktoś to sprawdził, nawet lukając tylko na kod, czy nie ma tu błędu, bo nie czuję do końca, czy jest dobrze<br />void run_task(void) {<br />if(!(tasks_tail==tasks_head)){<br />tab_tasks&#91;tasks_tail&#93;.task_function();<br />tab_tasks&#91;tasks_tail&#93;.task_function = NULL;<br />tasks_tail = (tasks_tail + 1)&amp;max_tasks_mask;<br />}<br />}<br /><br />/*bla bla bal....*/<br /><br />// W kodzie pętli głównej, co jeden obiek pętli wykonywany jest jeden task:<br />while(1){<br />    run_task();<br />}<br /><br />/*bla bla bal....*/<br /><br />// Za pętlą główną dodawanie tasków w synchrnicznym schedulerze co 5ms. Łącznie 14 niezaleznych tasków.<br />add_task(function1);<br />add_task(function2);<br />...<br />add_task(function14);<br />/*bla bla bal....*/[/syntax]<br /><br /><br />I to też działa, urządzenie ma pełną funkcjonalność, nie zawiesza się. Teraz tylko gdyby ktoś fahowym okiem sprawdził, czy nie ma blędu, czy to może na pierwszy rzut oka tak trybić. A ja jutro sprawdzę, jak to wydajnościowo wypada.<br /><br />Jeszcze tak dodatkowo moje małe reflekcje. Wydaje mi się, że jest w tym mały potencjał do dużych, wielozadaniowych programów na procka. Gdyby dodać do strukturki jeszcze 3 pola:<br />[syntax=c]typedef struct {<br />void (*task_function)(void);<br />    uint8_t task_priority;<br />    uint8_t task_sleep_time;<br />    uint8_t task_life_time;<br />} task;[/syntax]<br /><br />To można by mieć:<br />*elegancką obsługę priorytetów, w osobnej funkcji dodać sortowanie, a taski o tym samym priorytecie traktować jako FIFO<br />*eleganckie _delay_ms(x) dla danego wątku poprzez wysłanie go do odpowiedniej kolejki (do spania). Oczywiście wymaga to oprogramowania tej rzeczy w maszynie stanów danego wątku.<br />*zabezpieczenie przed zagłodzeniem wątków, które mają najniższy priorytet. Chodzi o to, by wymusić taki mechanizm zwiększenia priorytetu, by wątek się w końcu wykonał, jeżeli ma niski priorytet.<br />*myślę, że gdy głowa zrówna się z ogonem, to w pętli głównej ścielimy prockowi łózko i idzie spać. Budzi się wraz z system tick.<br /><br />Jak to widzicie? Na żywym organizmie działa. Sprzęt się nie wiesza <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Ale proszę o weryfikację. Pamięci mam dość - uprzedzając pytania.<br /><br />I jeszcze. Jak sprawdzić system wydajnościowo? Liczyć jakiś czas? Kurka, nie wiem... (???)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 6 cze 2013, o 17:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-06T11:22:32+01:00</updated>
<published>2013-06-06T11:22:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38621#p38621</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38621#p38621"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38621#p38621"><![CDATA[
<div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Nie ma potrzeby pisania wkółko tego samego elaboratu w tej kwestii, jest to dla nas wszystkich jasne.<br /></div><br /><br />to ja może doprecyzuję (ale uprzedzam że wcale się nie gniewam na ciebie) ... <br /><br />1. te osoby, które mnie znają wiedzą że jestem gadułą - i nic na to nie poradzę ani niestety nie posłucham takiej prośby - bo ja tak mam i już - muszę się z tym nauczyć żyć ... a nie wiem czy aż tak to innym przeszkadza. Jeśli tobie tak - no to też przykro mi ... musisz jakoś odfiltrowywać sobie moje &quot;elaboraty&quot; jak to nazwałeś<br /><br />2. piszesz że jest to dla &quot;nas wszystkich&quot; jasne - to ja zapytam dla jakich nas ? Sugerujesz że wypowiadasz się w imieniu rzeczywiście wszystkich osób ? Bardzo uprzejmie przepraszam ale wątpię. Ja może czasem dużo mówię ale za to albo dzięki temu wiele osób mnie zrozumie. Uwierz mi proszę - że są osoby którym to przeszkadza tak jak tobie (w to łatwo pewnie ci uwierzyć) ale też są osoby którym to nie przeszkadza a nawet się cieszą że znajdują wyjaśnienia.<br /><br /><div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Prostując moje zawiłości, twoje rozwiązania inspirują mnie do tworzenia własnych, z tąd moje pytanie.<br /></div><br /><br />No ale ja DOKŁADNIE tak zrozumiałem twój przekaz i postarałem się odpowiedzieć jak umiałem i odpowiedziałem (a że być może nie przy okazji tylko tobie ale i innym którzy tu zajrzą to sorki) ... Dlatego może zakończmy dyskusję (niepotrzebną w ogóle i nie uczmy się nawzajem jak należy się wypowiadać na forum, jakie elaboraty pisać a jakie nie - bo to troszkę nieteges). <br /><br /><div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Ty masz więcej doświadczenia odemnie, widze, że umiesz z marszu ocenić niektóre sprawy.<br /></div><br /><br />Nie przesadzaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ja nie byłbym tego taki pewien na twoim miejscu ... ja po prostu staram się i wciąż się uczę - a że akurat poruszyłeś bardzo ciekawe również dla mnie zagadnienia to dlatego włączyłem się do dyskusji bo wydała mi się interesująca i ciekawie opisane przez ciebie zagadnienia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Oprzeć się na doświadczeniu innych, by budować własne. Tak to Mirek potraktuj.<br /></div><br /><br />Tak traktuję i sam się cieszę że mogę z tyloma fajnymi ludźmi na tym forum kulturalnie wymieniać doświadczenia bo to mi też dużo daje.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Zacząłem kodowanie i przeróbkę Twojego projektu oraz adaptację istniejącego kodu w pracy do mojej koncepcji. Będę informował na bierząco<br /></div><br /><br />I o to chodzi - mogą wyjść z tego bardzo fajne rzeczy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 cze 2013, o 11:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-06T11:09:11+01:00</updated>
<published>2013-06-06T11:09:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38618#p38618</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38618#p38618"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38618#p38618"><![CDATA[
Hej.<br />Mirek, nie zroum mnie źle, ale chciałbym bardzo Ciebie prosić, abyś nie tłumaczył się za każdym razem, gdy dyskusji jest poddawany Twój kod i propozycje zmian do niego. Wiem (!), że nie narzucasz rozwiązań i że są one propozycją rozwiązania pewnych zagadnień. Nie ma potrzeby pisania wkółko tego samego elaboratu w tej kwestii, jest to dla nas wszystkich jasne. Proszę i przepraszam, jeżeli zabrzmiało to inaczej. <br /><br />Prostując moje zawiłości, twoje rozwiązania inspirują mnie do tworzenia własnych, z tąd moje pytanie. Ty masz więcej doświadczenia odemnie, widze, że umiesz z marszu ocenić niektóre sprawy. Więc z doświadczonymi ludźmi chciałbym tę dyskusje prowadzić. Oprzeć się na doświadczeniu innych, by budować własne. Tak to Mirek potraktuj.<br /><br />Zacząłem kodowanie i przeróbkę Twojego projektu oraz adaptację istniejącego kodu w pracy do mojej koncepcji. Będę informował na bierząco. Małymi kroczkami do przodu. <br /><br />Pozdro.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 6 cze 2013, o 11:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2013-06-05T22:18:09+01:00</updated>
<published>2013-06-05T22:18:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38610#p38610</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38610#p38610"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38610#p38610"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">rolba napisał(a):</div><div class="quotecontent">Chciałbym Ciebie prosić o wrzucenie lekkiego luzu<br /></div><br /><br />no ale o co chodzi ? a co się stało ? coś źle napisałem ? .... eeeeh ludzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> no ja piszę najspokojniej w świecie i z życzliwością się odnoszę - a ty mówisz żebym luz wrzucił jakbym coś gdzieś komuś czy tobie przygadał .... .... nie rozumiem, nie rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /></div><br /><br />Musisz się przyzwyczajać. Z tego co widzę ludzie odbierają Twoje słowa jako pewnego rodzaju atak.<br /><br />Nie wiem czym to jest spowodowane, może zbyt długo przebywali na Elektrodzie gdzie to jest normalne? <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 5 cze 2013, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-05T21:42:00+01:00</updated>
<published>2013-06-05T21:42:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38607#p38607</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38607#p38607"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38607#p38607"><![CDATA[
<div class="quotetitle">rolba napisał(a):</div><div class="quotecontent"><br />Chciałbym Ciebie prosić o wrzucenie lekkiego luzu<br /></div><br /><br />no ale o co chodzi ? a co się stało ? coś źle napisałem ? .... eeeeh ludzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> no ja piszę najspokojniej w świecie i z życzliwością się odnoszę - a ty mówisz żebym luz wrzucił jakbym coś gdzieś komuś czy tobie przygadał .... .... nie rozumiem, nie rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 cze 2013, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-05T21:02:17+01:00</updated>
<published>2013-06-05T21:02:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38605#p38605</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38605#p38605"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38605#p38605"><![CDATA[
Hej.<br />Dzięki Mirek za odpowiedź. Chciałbym Ciebie prosić o wrzucenie lekkiego luzu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Zdaję sobie sprawę z tego, że twoje rozwiązania są propozycją załatwienia pewnych problemów. Dla mnie stanowią jednocześnie inspirację do tego, aby wymyślić swój sposób na rozwiązanie jakiegoś problemu z wieloma różnymi zadaniami w systemie. Ale dobra, tak się składa, że w pracy mam pod swoją ręką kod napisany przez kogoś wiele lat temu. Działa na zasadzie zliczania impulsów w interwale 5ms i wywoływania odpowiednich zadań w odpowiednim czasie. Użyty jest sposób z &quot;%&quot; również wspomniany przez Ciebie w tym samym temacie o wielowątkowości LCD. W związku z tym spróbuję &quot;uszeregować&quot; zadania (a jest ich kilkadziesiąt) i zobaczyć, co z tego będzie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> i czy będzie to działać we wspomniany prze zemnie sposób.<br /><br />Jest jeszcze kwestia zagłodzenia wątku o najniższym priorytecie. Tutaj zastanawiam się, czy by nie użyć jakiegoś licznika życia wątku i w przypadku zbyt długiego przesiadywania w kolejce, nie zwiększać sztucznie priorytetu, by go w końcu wykonać. Kolejna sprawa to sortowanie wątków po priorytetach (jaki algorytm???? jest ich masa, każdy inny, jeden lepszy dla takich inny dla siakich przypadków). Czy sortowanie ma się odbywać po zakończeniu wkładania wątków do kolejki, czy za każdym razem, gdy wątek wchodzi do kolejki? No i co w przypadku asynchronicznych wątków? A gdzie tryby oszczędności energii? Wydaje mi się, że jak robota zostanie rozdana, można kazać prockowi iść spać i budzić się np co 10 ms (jako timer systemowy i rozdać robotę). A każde z zadań może mieć osobną maszynę stanów... i wykonywać część roboty... Tyle dylematów... <br /><br />Kończę, bo coś mam niestabilne napięcie w sieci i mi światło przygasa. <br /><br />Pozdro.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 5 cze 2013, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-05T14:52:27+01:00</updated>
<published>2013-06-05T14:52:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38571#p38571</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38571#p38571"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38571#p38571"><![CDATA[
rolba --&gt; a któż miałby krzyczeć i za co ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />jaki zysk i jaka strata ? w odpowiedzi na twoje pytanie - hmm twoją koncepcję - już odpowiadam.<br /><br />PRZEDE WSZYSTKIM i to napisałem dużymi literami, a powtarzam to wszędzie gdzie się da, chciałbym aby było jasne - że ja nigdy nie prezentuję przykładów w swoich książkach, które są jedynie najlepsze i jedynie słuszne w nich podejście - jak to robią niektórzy na niektórych blogach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ....<br /><br />Moim zdaniem i będę to powtarzał z uporem maniaka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> sposobów na rozwiązanie jakiegoś zagadnienia programistycznego może być tyle ilu programistów jest na świecie.....<br /><br />a SZCZEGÓLNIE w takich już bardziej skomplikowanych zagadnieniach. Więc ja nawet nie chciałbym się odnosić, ba! nawet nie mam jak - bo ogólnie jakoś widzę twoją koncepcję ale wiesz - ja mam tak - że jak sam czegoś nie wrzucę do procka i nie sprawdzę to nie jestem w stanie nawet tak teoretycznie ocenić. Zatem przechodząc do sedna - nawet gdyby twoja metoda miałaby użyć ciut więcej zasobów to co z tego ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jeśli z powodzeniem zrealizujesz w oparciu o nią swoje zadania ?<br /><br />Moim celem jest pokazanie innym, nauka poprzez prezentację takich kodów - jak można różnie podchodzić do wielu spraw. Ale tak ostatecznie to powiem ci - że najbardziej to zgadzam się z tym co napisałeś że wszystko tak na prawdę zależy od projektu, bieżących potrzeb, dostępnej pamięci, szybkości wykonywania się itp itp itd<br /><br />zwróć tylko uwagę, że tu 10ms jest nawet zbyt szybkim czasem - spokojnie wystarczyłoby 20 ms jak nie 30 albo i 50ms ... bo chodzi o wyświetlanie tak na prawdę na LCD - a że przy okazji wplotłem w to niejako inne procesy .... to już inna sprawa<br /><br />ja bym coś koło twojego podejścia bardziej widział gdybym np (ja oczywiście) działał nie na LCD w tym przypadku tylko organizował np taką sobie pseudo-wielowątkowość, gdzie nawet zależałoby mi na jakiejś większej rozdzielczości czasowej nawet 5ms albo i szybciej ... ponieważ pomysł z kolejką i dodawaniem tylko istotnych w danym momencie procesów jest bardzo fajny ... a wpłynęłoby to znacząco z kolei tak myślę i gdybam, na jeszcze mniejsze blokowanie czasowe całości<br /><br />nie mówiąc już o priorytetach właśnie ...<br /><br />reasumując - że ja wymyśliłem sobie prosty system warstw dla wyświetlania na LCD i do tego nadaje się to super wg mnie, ale w książce chciałem pokazać że taki mechanizm - jak człowiek chce to jeszcze można zaprzęgnąć do czegoś innego - ba! wręcz do jakiegoś prostego obsługiwania procesów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .....<br /><br />i taka była droga tego projektu - to troszkę tak jak np z dobrą kamerą która nigdy nie będzie dobrym aparatem fotograficznym  pomimo że producent kusi taką opcją i podobnie jak najlepszy aparat nigdy nie będzie dobrą kamerą (choć przy dobrych lustrzankach to już taka granica się zaciera co nieco ) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 cze 2013, o 14:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rolba]]></name></author>
<updated>2013-06-05T14:18:23+01:00</updated>
<published>2013-06-05T14:18:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38570#p38570</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38570#p38570"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38570#p38570"><![CDATA[
Hej.<br />Przy okazji tematu mam pytania. Od razu na początku nadmienię, że niestety mam jakiś problem z proxy w pracy i nie mogę kodu umieścić w syntaxie, nie działa mi edytor tekstu, nic. Forum nie ma żadnej grafiki, nie dział JS, css itp <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br /><br />Ale do rzeczy, pytanie odnośnie linijki:<br /><br />[syntax=c]while( idx&lt;MAX_BULLETS ){} w funkcji BARREL_EVENT.[/syntax]<br /><br />Widać, że każdy z obiektów w tablicy barrel, obsługiwany jest jeden po drugim (while). Czyli co 10ms, w jednym obiegu pętli głównej programu, rozpracowywane są wszystkie obiekty z kolejki barrel. Gdy jakis obiekt zostaje dodany, to obsługiwane jest więcej obiektów. Co tutaj się dzieje, jest dla mnie jasne i w pełni to rozumiem.<br /><br />Jaki zysk, bądź stratę mielibyśmy, gdyby barrel potraktować jako bufor kołowy (oczywiście o odpowiedniej przeliczonej wielkości), wrzucać do niego obiekty i obsługiwać 1 obiekt na 1 obieg pętli głównej programu, ale nie co 10ms, tylko w trybie idle, aż do opróżnienia sie kolejki? Kolejka uzupełniana byłaby poprzez dodanie do niej naszych obiektów nie tylko co 10ms, ale również w trybie asynchronicznym. Gdy kolejka jest pusta - nic się nie wykonuje. Gdy ma 10 obiektów, obsłuży 10 w 10 obiegach pętli głównej, ale w trybie idle. Czy takie podejście jest wogule racjonalne? Czy może lepsze jest podejście mirkowe przedstawione w funkcji BARREL_EVENT? Czy to wszystko zalezy od konkretnego problemu?<br /><br />Zdaję sobie sprawę z tego, że przedstawione przezemnie podejście może zająć więcej zasobów. Ale może zyskiem jest tutaj łatwa obsługa priorytetów i lepsza skalowalnośc takiej obsługi warstw? <br /><br />Niestety wybiórczo czytałem zielonkę, może gdzieś ten problem jest opisany (tylko bardzo proszę nie krzyczeć!)? Bo mi to chodzi po głowie, a nie wiem co mam z tym zrobić, więc postanowiłem się podzielić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> przy okazji tematu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=958">rolba</a> — 5 cze 2013, o 14:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-05T13:57:32+01:00</updated>
<published>2013-06-05T13:57:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38569#p38569</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38569#p38569"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38569#p38569"><![CDATA[
<div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />Bo do tej pory myslałem, że jak wypełnie strukture to ja po prostu mam i tyle, a tutaj, że NULL. Może to jest kluczowe burrel[i] = bf;<br /></div><br /><br />no ale o czym ty teraz mówisz ? a co tu struktury nie masz ? toż używam jej tutaj do trzymania że tak powiem uchwytów (wskaźników) do różnych warstw, które są tworzone dynamicznie - nawet na stosie ... - więc jak kończę z jakąś warstwą to wyrzucam jej wskaźnik ze struktury wpisując NULL ale co wg ciebie struktura znika ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> toż tylko w jej elemencie (tablicy) pojawia się NULL -<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br /><div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />A co do tej drugiej części to w main jest o:<br />TWIN transparent_layer.<br />czyli odwolanie poprzez &quot;.&quot;-kropke. A w funckji mam wskaznik jako adres, więc przekazuje adres tego elementu jako obiekty struktury TWIN.<br /></div><br /><br />no ale coś ty ? przecież akurat tą warstwę zdefiniowałem jako typową zmienną globalną<br /><br />TWIN transparent_layer;<br /><br />no zobacz sobie nad main - i do niej chyba nie dziwne że przez kropkę się odwołuję do pól<br /><br /><div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />Niemalże każdy kod z ksiązki to inne podejście do C.<br /></div><br /><br />no druga książka to już nie jest dla początkujących i jej celem jest pokazanie w praktyce przeróżnych technik podejścia do programowania.... Więc nie są to różne podejścia do C ... tylko różne sposoby wykorzystywania mechanizmów jakie daje ten język ... bardzo wielu osobom właśnie chodziło o takie przykłady - bo to pozwala podejrzeć, że czasem to co robiliśmy przez pół życia jednym sposobem i wydawało się że nie ma innej drogi - to podglądając czyjeś kody - można odkryć - że jednak da radę zrobić coś inaczej a czasem nawet dużo prościej .... ja sam tak lubię się uczyć - dlatego dużo analizuję kodów z netu szukając często takich, których na początku ni w ząb nie rozumiem ... za to jak już zrozumiem to czasem się znowu DUUUUŻO nauczę ... i tak ciągle <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 cze 2013, o 13:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paul Dirac]]></name></author>
<updated>2013-06-05T17:19:05+01:00</updated>
<published>2013-06-05T12:19:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38566#p38566</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38566#p38566"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38566#p38566"><![CDATA[
Co do pierwszej części w sumie jest już jakis przykład zastosowania. <br />Bo do tej pory myslałem, że jak wypełnie strukture to ja po prostu mam i tyle, a tutaj, że NULL. Może to jest kluczowe burrel[i] = bf;. Pewnie chodzi o to, że nadpisze ją wywołując kilka razy a dajac takie przypisanie już będe miał w tablicy struktur all co zostało zapisane w strukturze *bf.<br /><br />A co do tej drugiej części to w main jest o:<br />TWIN transparent_layer.<br />czyli odwolanie poprzez &quot;.&quot;-kropke. A w funckji mam wskaznik jako adres, więc przekazuje adres tego elementu jako obiekty struktury TWIN.<br />Niemalże każdy kod z ksiązki to inne podejście do C. W sumie fajne to jest, bo jak człowiek to uświadomi to wykorzystuje i jest happy, że działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1035">Paul Dirac</a> — 5 cze 2013, o 12:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-05T10:56:13+01:00</updated>
<published>2013-06-05T10:56:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38564#p38564</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38564#p38564"/>
<title type="html"><![CDATA[Re: LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38564#p38564"><![CDATA[
<div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />Mianowicie chodzi o to, że tworzymy funckje, która buduje object, mianowicie: creat_obj(), która zwraca nam indeks w tablicy struktur, gdzie został zapisany ten nowy obiekt. I jak mam to wykorzytsac w programie skoro mam indeks w tablicy struktur, gdzie siedzi dana warstwa. Analizowałem main i tam jest tylko tworzenie obiektów<br /></div><br /><br />No a jakbyś chciał dynamicznie w programie tworzyć obiekty i je później np zwalniać? zobacz sobie tam masz taką funkcję:<br /><br />[syntax=c]void free_obj(uint8_t handle) {<br />barrel&#91;handle&#93;=NULL;<br />}[/syntax]<br /><br />to właśnie dzięki niej - podając jako argument ten index tablicy można zwolnić taki obiekt <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />O! a na pozostałe pytania Anty dobrze podpowiedział <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 cze 2013, o 10:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paul Dirac]]></name></author>
<updated>2013-06-05T10:48:29+01:00</updated>
<published>2013-06-05T10:48:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38561#p38561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38561#p38561"/>
<title type="html"><![CDATA[LCD -&gt;projekt wielozadaniowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3265&amp;p=38561#p38561"><![CDATA[
Witam!<br /><br />Podczas czytania i analizowania całego projektu tego lcd, pojawił mi sie problem filozoficzny. Mianowicie chodzi o to, że tworzymy funckje, która buduje object, mianowicie: creat_obj(), która zwraca nam indeks w tablicy struktur, gdzie został zapisany ten nowy obiekt. I jak mam to wykorzytsac w programie skoro mam indeks w tablicy struktur, gdzie siedzi dana warstwa. Analizowałem main i tam jest tylko tworzenie obiektów, bez sprawdzania co one zwracają.<br /><br />Kolejny probelm jest w funckji:<br />create_obj(&amp;trasnparent_layer,*,*, &quot;coś&quot;);<br /><br />i czemu odowłanie do niej jest przez kropkę:<br />actwive_buf = transparent_layer.buf.<br />Skoro jest to wskaznik na strukturę. zgodnie z funckja create_obj(TWIN *bf, &quot;coś:)l<br /><br />W sumie dzieki za jakies odpowiedzi, to mi rozjasni w sumie jakąs część projektu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1035">Paul Dirac</a> — 5 cze 2013, o 10:48</p><hr />
]]></content>
</entry>
</feed>