<?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=48&amp;t=8174&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-19T15:00:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=48&amp;t=8174&amp;mode</id>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-19T15:00:09+01:00</updated>
<published>2014-08-19T15:00:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92035#p92035</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92035#p92035"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92035#p92035"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Tak swoją drogą dlaczego zamykanie socketa newsockfd odbywa się w procesie nadrzędnym? Nie lepiej byłoby go zakończyć po zakończeniu wszystkich operacji przez proces potomny, obsługujący dane połączenie?<br /></div><br />Odpowiedz na to jest w linku ktory podalem. <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Po drugie gdzie powinno się zamknąć sockfd? Standardowo, na końcu funkcji main(), za pętlą while(1)? Tej instrukcji tutaj brakuje...<br /></div><br />Ja tam widze zamkniecie sockfd w lini 60. <br /><br />Owszem brakuje w przykladzie zamkniecia kopii sockfd w glownym procesie, ale poniewaz z niego inaczej niz zabijajac proces nie wyjdziesz to w tej chwili poprawnym zamknieciem socketow bedzie musial zajac sie system. <br />Zeby wyjsc poprawnie musialbys dodac obsluge sygnalow. <br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Przede wszystkim czy instrukcje &quot;listen(sockfd,5)&quot; i &quot;clilen = sizeof(cli_addr)&quot; nie powinny się znaleźć wewnątrz pętli while, tak aby były wykonywane po zakończeniu każdego kolejnego połączenia?<br /></div><br />Proponuje debuger albo printfy na console zeby zobaczyc co sie dzieje. <br />Albo dokladnie poczytanie co robi listen a co robi accept.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 19 sie 2014, o 15:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-19T14:27:41+01:00</updated>
<published>2014-08-19T14:27:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92028#p92028</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92028#p92028"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92028#p92028"><![CDATA[
<div class="quotetitle">charsz napisał(a):</div><div class="quotecontent"><br />nie, proces nadrzedny jest jeden, procesow potomnych moze byc dziesiatki. <br />Sprobuj cos takiego uruchomic,<br /></div><br /><br />Przepraszam za poprzednie pytanie, najwyraźniej coś mi się pomieszało. Myślałem, że pid równy 0 odpowiada procesowi nadrzędnemu, a nie potomnemu.<br /><br />Tak swoją drogą dlaczego zamykanie socketa newsockfd odbywa się w procesie nadrzędnym? Nie lepiej byłoby go zakończyć po zakończeniu wszystkich operacji przez proces potomny, obsługujący dane połączenie?<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />O ile dobrze pamietam, to nie ma od tak sobie wspoldzielenia pamieci miedzy procesami. Opcji na polaczenia miedzy procesami jest wiele: <br />IPC, kolejki, komunikacja socketami, i pamiec wspoldzielona - ale wszystko trzeba samemu oprogramowac.<br /></div><br /><br />Ok, poczytam. Czyli w każdym razie jeśli program zawierający jakieś zmienne globalne zostanie sforkowany, to każdy z procesów będzie dysponował własną kopią zmiennych? Czy w związku z tym tablice i struktury przeznaczone dla konkretnego procesu powinienem tworzyć wewnątrz &quot;ifa&quot;, już po wykonaniu fork()?<br /><br />W każdym razie w oparciu o podany wcześniej przykład przygotowałem prosty echo-serwer.<br /><br />[syntax=c]#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;sys/types.h&gt; <br />#include &lt;sys/socket.h&gt;<br />#include &lt;netinet/in.h&gt;<br /><br /><br />#define PORT 1337<br /><br /><br />int main (void) {<br /><br />int sockfd, newsockfd, portno, clilen;<br />char buffer&#91;1000&#93;;<br />struct sockaddr_in serv_addr, cli_addr;<br />int  n;<br />int pid;<br /><br />/* First call to socket() function */<br />sockfd = socket(AF_INET, SOCK_STREAM, 0);<br />if (sockfd &lt; 0) {<br />perror(&quot;ERROR opening socket&quot;);<br />exit(1);<br />}<br /><br />/* Initialize socket structure */<br />bzero((char *) &amp;serv_addr, sizeof(serv_addr));<br />portno = 5001;<br />serv_addr.sin_family = AF_INET;<br />serv_addr.sin_addr.s_addr = INADDR_ANY;<br />serv_addr.sin_port = htons(PORT);<br /><br />/* Now bind the host address using bind() call.*/<br />if (bind(sockfd, (struct sockaddr *) &amp;serv_addr, sizeof(serv_addr)) &lt; 0) {<br />perror(&quot;ERROR on binding&quot;);<br />exit(1);<br />    }<br /><br />/* Now start listening for the clients, here <br />* process will go in sleep mode and will wait <br />* for the incoming connection<br />*/<br />listen(sockfd,5);<br />clilen = sizeof(cli_addr);<br />while (1) {<br />newsockfd = accept(sockfd, (struct sockaddr *) &amp;cli_addr, &amp;clilen);<br />if (newsockfd &lt; 0) {<br />perror(&quot;ERROR on accept&quot;);<br />exit(1);<br />}<br />/* Create child process */<br />pid = fork();<br />if (pid &lt; 0) {<br />perror(&quot;ERROR on fork&quot;);<br />exit(1);<br />        }<br />if (pid == 0) {<br />/* This is the client process */<br />close(sockfd);<br /><br />memset(buffer, 0x00, sizeof(buffer));<br /><br />n = read(newsockfd, buffer, sizeof(buffer));<br /><br />if (n &lt; 0) {<br />error(&quot;ERROR reading from socket&quot;);<br />exit(1);<br />}<br /><br />n = write(newsockfd, buffer, sizeof(buffer));<br /><br />if (n &lt; 0) {<br />perror(&quot;ERROR writing to socket&quot;);<br />exit(1);<br />}<br /><br />exit(0);<br />        }<br />else {<br />close(newsockfd);<br />}<br />} /* end of while */<br /><br />}[/syntax]<br /><br />Działa, jednak mam kilka pytań. Przede wszystkim czy instrukcje &quot;listen(sockfd,5)&quot; i &quot;clilen = sizeof(cli_addr)&quot; nie powinny się znaleźć wewnątrz pętli while, tak aby były wykonywane po zakończeniu każdego kolejnego połączenia?<br />Po drugie gdzie powinno się zamknąć sockfd? Standardowo, na końcu funkcji main(), za pętlą while(1)? Tej instrukcji tutaj brakuje...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 19 sie 2014, o 14:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-19T13:11:06+01:00</updated>
<published>2014-08-19T13:11:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92017#p92017</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92017#p92017"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=92017#p92017"><![CDATA[
Proces nadrzedny jest procesem nasluchujaco kontrolnym a proces podrzedny jest procesem wykonawczym. <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />1) Przede wszystkim czy nie lepiej (bardziej intuicyjnie) byłoby zamienić te funkcje miejscami, żeby utrzymywanie komunikacji odbywało się w procesie potomnym?<br /></div><br />nie, proces nadrzedny jest jeden, procesow potomnych moze byc dziesiatki. <br />Sprobuj cos takiego uruchomic, <br />zrob 'ps -aux'<br />pozniej zrob polaczenie na port nasluchujacy <br />i znow zrob 'ps -aux'<br />bedziesz mial jeden proces wiecej, <br />jesli przetwarzanie (doprocessing()) bedzie odpowiednio dlugie to mozesz otworzyc kolejna sesje i zobaczysz ze pojawi sie kolejny proces na liscie procesow. <br />Chodzi o to, ze gdyby twoje czujniki byly klientami TCP to nie musialbys sie martwic ze dwa naraz zaczna pisac. Program nadrzedny z forkuje sie tyle razy ile potrzeba.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />2) Co ze współdzieleniem danych? Jeśli proces potomny zapisuje dane do jakiegoś bufora, albo zwraca wynik do zmiennej, to czy główny proces będzie miał dostęp do tych informacji.<br /></div><br /><br />O ile dobrze pamietam, to nie ma od tak sobie wspoldzielenia pamieci miedzy procesami. Opcji na polaczenia miedzy procesami jest wiele: <br />IPC, kolejki, komunikacja socketami, i pamiec wspoldzielona - ale wszystko trzeba samemu oprogramowac.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />3) Nic nie stoi na przeszkodzie, żeby &quot;rozwidlić&quot; proces na samym początku pętli main i w każdym z wariantów ustawić dwa osobne zadania z dwiema osobnymi nieskończonymi pętlami? W jednej na przykład można by zainicjować i obsługiwać serwer (jak wyżej) a w drugiej realizować inne zadania, np. cykliczne odczytywanie czujników i wysyłanie raportów.<br /></div><br />Pytanie czy potrzebujesz takiego rozwidlenia. Pamietaj o punkcie nr 2 - wspoldzielenie danych. Wiekszosc mechanizmow wspoldzielenia nie wymaga zeby procesy mialy tego samego ojca. <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />4) Czy operacja opisana powyżej w jakiś wymusi jakiś inny sposób forkowania następnych procesów? Na przekład trzeba będzie spodziewać się innych wartości zmiennej pid? To samo pytanie mam też odnośnie operacji &quot;daemonizacji&quot; programu.<br /></div><br /><br />Jesli bedziesz uzywal fork to nie, jesli zdecydujesz sie uzyc rfork bedziesz mogl spodziewac sie czegos innego:<br />wiecej tu: <!-- m --><a class="postlink" href="http://plan9.bell-labs.com/magic/man2html/2/fork" >http://plan9.bell-labs.com/magic/man2html/2/fork</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 19 sie 2014, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-19T11:30:30+01:00</updated>
<published>2014-08-19T11:30:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91994#p91994</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91994#p91994"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91994#p91994"><![CDATA[
<div class="quotetitle">charsz napisał(a):</div><div class="quotecontent"><br />To w koncu piszesz serwer TCP?<br /></div><br /><br />Czytam przykłady w sieci. Chciałbym zapytać, czy dobrze to wszystko rozumiem.<br /><br />Weźmy fragment takiego kodu:<br /><br />[syntax=c]// Inicjacja pracy serwera<br /><br />    listen(sockfd,5);<br />    clilen = sizeof(cli_addr);<br />    while (1) <br />    {<br />        newsockfd = accept(sockfd, <br />                (struct sockaddr *) &amp;cli_addr, &amp;clilen);<br />        if (newsockfd &lt; 0)<br />        {<br />            perror(&quot;ERROR on accept&quot;);<br />            exit(1);<br />        }<br />        /* Create child process */<br />        pid = fork();<br />        if (pid &lt; 0)<br />        {<br />            perror(&quot;ERROR on fork&quot;);<br />    exit(1);<br />        }<br />        if (pid == 0)  <br />        {<br />            /* This is the client process */<br />            close(sockfd);<br />            doprocessing(newsockfd);<br />            exit(0);<br />        }<br />        else<br />        {<br />            close(newsockfd);<br />        }<br />    } /* end of while */[/syntax]<br /><br />Jak rozumiem po wywołaniu funkcji fork program rozwidla się - zostaje niejako zduplikowany i normalnie obydwa procesy wykonywałyby dokładnie to samo zadanie. Dalej jednak mogę sprawdzić w którym z procesów się znajduję, za pomocą instrukcji warunkowej, sprawdzając wartość zwróconą wcześniej przez fork(). Jeśli jest ona równa 0, znajduję się w procesie &quot;rodzicu&quot;. Jeśli nie - w potomnym. Tutaj mogę zadecydować jakie instrukcje będą wykonywane przez każdy proces. Jeden z nich po prostu zamyka własną kopię socketa sieciowego, drugi zajmuje się udzieleniem odpowiedzi na zapytanie z sieci. Po wykonaniu tej operacji zostaje zamknięty funkcją exit(0);<br /><br />Mam jednak kilka pytań:<br />1) Przede wszystkim czy nie lepiej (bardziej intuicyjnie) byłoby zamienić te funkcje miejscami, żeby utrzymywanie komunikacji odbywało się w procesie potomnym?<br />2) Co ze współdzieleniem danych? Jeśli proces potomny zapisuje dane do jakiegoś bufora, albo zwraca wynik do zmiennej, to czy główny proces będzie miał dostęp do tych informacji.<br />3) Nic nie stoi na przeszkodzie, żeby &quot;rozwidlić&quot; proces na samym początku pętli main i w każdym z wariantów ustawić dwa osobne zadania z dwiema osobnymi nieskończonymi pętlami? W jednej na przykład można by zainicjować i obsługiwać serwer (jak wyżej) a w drugiej realizować inne zadania, np. cykliczne odczytywanie czujników i wysyłanie raportów.<br />4) Czy operacja opisana powyżej w jakiś wymusi jakiś inny sposób forkowania następnych procesów? Na przekład trzeba będzie spodziewać się innych wartości zmiennej pid? To samo pytanie mam też odnośnie operacji &quot;daemonizacji&quot; programu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 19 sie 2014, o 11:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-19T08:16:33+01:00</updated>
<published>2014-08-19T08:16:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91961#p91961</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91961#p91961"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91961#p91961"><![CDATA[
To w koncu piszesz serwer TCP? <br /><br />Najprostszy sposob na wyslanie maila to odpalenie klienta poczty przez exec/system. <br />Albo wykonanie polaczenia na port 25  i nadawanie protokolem SMTP.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 19 sie 2014, o 08:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T19:08:23+01:00</updated>
<published>2014-08-18T19:08:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91936#p91936</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91936#p91936"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91936#p91936"><![CDATA[
<div class="quotetitle">charsz napisał(a):</div><div class="quotecontent"><br />No to od czego zaczynamy? Klienta UDP juz masz jak widze, zapisywanie do pliku ?<br /></div><br /><br />Z tym sobie jakoś poradzę. Ta część chyba nie różni się aż tak znacznie od sposobu obsługi systemu plików na AVR-ach z kartą pamięci.<br /><br />Nie do końca w tej chwili radzę sobie jeszcze ze zrozumieniem forkowania procesów w związku z obsługą serwera TCP (niby już coś takiego robiłem pisząc daemona, ale wówczas opierałem się na gotowym przykładzie) i wykonywaniem określonych funkcji w zadanych odstępach czasu. Będę musiał trochę doczytać...<br /><br />BTW jaki jest najprostszy/najlepszy sposób na wysłanie maila z poziomu programu napisanego w C pod Linuskem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-18T15:35:50+01:00</updated>
<published>2014-08-18T15:35:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91914#p91914</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91914#p91914"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91914#p91914"><![CDATA[
No to od czego zaczynamy? Klienta UDP juz masz jak widze, zapisywanie do pliku ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 18 sie 2014, o 15:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T14:49:20+01:00</updated>
<published>2014-08-18T14:49:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91909#p91909</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91909#p91909"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91909#p91909"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Nie zgadzam się co do Twojego wyboru UDP zamiast TCP ale to Ty wiesz więcej o swoim projekcie a ja bazuję jedynie na tym co napisałeś. Informuję że są inne stosy TCP/UDP (np. contiki). Tu nie będę polemizował.<br /></div><br /><br />Wydaje mi się, że źle się zrozumieliśmy. Ja nie odrzucam komunikacji po TCP jako takiej. Uważam jedynie, że nie ma sensu przerabiać gotowego projektu licznika Geigera (z paroma innymi czujnikami na pokładzie), ponieważ wymagałoby to zastosowania innego stosu. W tym przypadku UDP sprawdza się znakomicie, a wady tego rozwiązania nie stwarzają wielkiego problemu - co najwyżej jeden request na pół roku nie dojdzie do skutku z uwagi na zagubiony pakiet.<br /><br />W przyszłych projektach mogę już jednak zastosować zupełnie inne podejście. Tak naprawę mam zamiar przyjrzeć się któremuś z lepszych stosów (uC, może nawet lwIP po lepszym zapoznaniu się z STM-ami). Obecnie także zainteresowałem się układami W5100/W5500, które mają wbudowany stos. Projektuje właśnie płytkę z jednym z nich, gdy będzie gotowa raczej nie będę &quot;marnował&quot; możliwości tego sprzętu na UDP. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Tyle tylko, że to już będzie osobne urządzenie, ze swoją własną strukturą i osobną funkcją odczytu stanu. Równie dobrze będę mógł w niej zastosować klienta TCP, niezależnie od dotychczasowej funkcji, posługującej się UDP.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 14:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T13:27:47+01:00</updated>
<published>2014-08-18T13:27:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91897#p91897</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91897#p91897"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91897#p91897"><![CDATA[
<div class="quotetitle">charsz napisał(a):</div><div class="quotecontent"><br />Autor watku niech lepiej malymi kroczkami zacznie sobie opanowywac technologie.<br /></div><br /><br />Dokładnie właśnie to mam na myśli. Opis całego systemu to tylko ogólna wizja tego, co kiedyś chciałbym osiągnąć. Na razie jestem na etapie tworzenia poszczególnych &quot;cegiełek&quot; w ramach samokształcenia. Mam już parę czujników, takich jak <a href="http://forum.atnel.pl/topic6899.html"  class="postlink">TUTAJ</a>. Teraz jestem na etapie pisania daemona na RasPi, który będzie pośredniczył w komunikacji i odpowiadał za parę podstawowych funkcji z zakresu automatyki. Potem napiszę jakiś <strong>Prosty</strong> skrypt, który da mi dostęp do aktualnych odczytów przez WWW. W międzyczasie może skonstruuję jeszcze jakiś sterownik, który podłączę do tego systemu.<br /><br />Plany co do bardziej skomplikowanego WebUI albo aplikacji na Androida, to znacznie odleglejsza przyszłość. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />- serwer w C do odbioru danych (zeby przetrenowac forki i czytanie z socketow)<br />- AVR jako klient<br />- UDP bym wywalil i przeszedl na TCP<br /></div><br /><br />Ja to widzę trochę inaczej. Po pierwsze nie mam zamiaru rezygnować z UDP. Nie widzę powodu, dla którego miałbym męczyć niewielki uC sesją TCP. Po drugie najprostszy stos na AVR-y (Tuxgraphics) ma na tyle ograniczone możliwości w zakresie komunikacji TCP, że przewaga nad UDP jest znikoma.<br />Inaczej też widzę kierunek komunikacji w tym przypadku. Wolę, żeby to AVR był serwerem i wysyłał odpowiedź po otrzymaniu odpowiedniego requesta. Daemon na RasPi w tym wypadku pełnił będzie funkcję klienta UDP, cyklicznie odpytując o nowe dane. Takie podejście ma kilka zalet:<br />1) W razie awarii RasPi ciągle mam możliwość ręcznego odczytania każdego czujnika, chociażby za pomocą netcata albo PacketSendera.<br />2) Mogę łatwo ustalić częstotliwość odświeżania danych.<br /><br />Tak więc daemon będzie klientem UDP dla czujników na AVR-ach, a także serwerem TCP dla wyższej warstwy.<br /><br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Opanowanie fork, obsluga TCP dla kogos kto ogarnia C to pare dni/pare godzin zalezy ile ma czasu dziennie na nauke.<br /></div><br /><br />Na chwilę obecną nie mam większych problemów z obsługą klienta UDP i TCP w C. Podpierając się przykładami z Sieci napisałem już funkcję odczytującą dane z czujnika. Wygląda ona następująco:<br /><br />[syntax=c]void read_egeiger (egeiger_t *device) {<br /><br />int sockfd, n, i;<br />struct sockaddr_in servaddr, cliaddr;<br />char recvline&#91;200&#93;;<br /><br />sockfd=socket(AF_INET,SOCK_DGRAM,0);<br /><br />memset(&amp;servaddr, 0x00, sizeof(servaddr));<br />servaddr.sin_family = AF_INET;<br />servaddr.sin_addr.s_addr=inet_addr(device-&gt;address);<br />servaddr.sin_port=htons(device-&gt;port);<br /><br />for (i=0; i&lt;CMD_QTY; i++) {<br /><br />sendto(sockfd, commands&#91;i&#93;, strlen(commands&#91;i&#93;), 0, (struct sockaddr *)&amp;servaddr, sizeof(servaddr));<br /><br />n=recvfrom(sockfd,recvline,200,0,NULL,NULL);<br />recvline&#91;n&#93;=0;<br /><br />parse_answer(recvline, device);<br />}<br /><br />device-&gt;lastupdate = time(NULL);<br /><br />close(sockfd);<br />}[/syntax]<br /><br />Z klientem TCP miałem do czynienia podczas innego ćwiczenia - napisałem prosty program, który komunikuje się z serwerem MPD, parsuje dane o aktualnie odtwarzanej muzyce i wyświetla takie informacje jak tytuł czy wykonawca na wyświetlaczu 2x16 (podpiętym do RasPi).<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Takie cwiczenie daje fajna baze wiedzy o systemie, troche o protokolach sieciowych ale przyszlosciowo niestety nie jest najlepszym rozwiazaniem, bo za chwile moze sie okazac ze bedzie potrzebna baza danych, cos do rysowania wykresow, jakiegos gui do zarzadzania.<br /></div><br /><br />Jedno nie wyklucza drugiego. Bazę danych będzie można w przyszłości podpiąć do tego daemona, a GUI czy rysowaniem wykresów niech się już zajmie skomunikowana z nim wyższa warstwa (webaplikacja, aplikacja na androida itp.).<br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Co do alarmow to nic nie stoi na przeszkodzie zrobienie jak na AVR:<br /><br />- jeden alarm liczacy (mili)sekundy<br />- w petli glownej sprawdzasz wartosc licznika i uruchamiasz funkcje wtedy kiedy potrzebujesz<br /></div><br /><br />Tak robiłem to do tej pory. Czyli to jest prawidłowe podejście?<br />Nie ma pod Linuksem jakiegoś rozwiązania, które pozwalałoby to zrobić o wiele prościej, np. rejestrując wiele funkcji,. które mają się wykonywać w różnych odstępach czasu?<br /><br /><br /><div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />A, i jeśli możesz, zrezygnuj z UDP. UDP jest protokołem bez potwierdzeń i zawodnym i będziesz zdziwiony że jak coś włączysz... to się nie włączyło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />W moim przypadku nie jest to żadnym problemem. Po pierwsze do tej pory jeszcze ani razu mi się nie zdarzyło, żeby jakiś pakiet nie dotarł.<br />Po drugie po stronie AVR soft napisany jest w taki sposób, by po wykonaniu operacji zawsze była odsyłana odpowiedź z informacją o stanie po wykonaniu tej operacji. Jeśli nie dostanie się informacji zwrotnej wiadomo, że operację trzeba powtórzyć.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Proponuję zacząć pisać bo jak pytałeś o timery, to jeszcze kawałek drogi przed tobą <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />Na razie nic nie stoi na przeszkodzie, żeby robić to na timerach, tak jak w AVR?<br />To też jest dobre podejście?<br /><br />[syntax=c]int main () {<br /><br />init();<br /><br />while (1) {<br /><br />if (timer &gt; (last_timer_capture1 + DELAY1)) {<br />//operacja 1<br />last_timer_capture1 = timer;<br />}<br /><br />if (timer &gt; (last_timer_capture2 + DELAY2)) {<br />//operacja 2<br />last_timer_capture2 = timer;<br />}<br /><br />if (timer &gt; (last_timer_capture3 + DELAY3)) {<br />//operacja 3<br />last_timer_capture3 = timer;<br />}<br /><br />usleep(50000);<br /><br />}[/syntax]<br /><br />Tylko czy takie podejście nie będzie przeszkodą w obsłudze serwera TCP?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 13:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-18T13:00:17+01:00</updated>
<published>2014-08-18T13:00:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91895#p91895</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91895#p91895"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91895#p91895"><![CDATA[
Nie rozpedzajcie sie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Autor watku niech lepiej malymi kroczkami zacznie sobie opanowywac technologie. <br />Sugerowalbym:<br /><br />- serwer w C do odbioru danych (zeby przetrenowac forki i czytanie z socketow)<br />- AVR jako klient<br />- UDP bym wywalil i przeszedl na TCP<br />- serwer mialby wejscia: odbior danych z AVR (socket TCP), zarzadzanie przez socket TCP albo unix socket (druga faza)<br /><br />Opanowanie fork, obsluga TCP dla kogos kto ogarnia C to pare dni/pare godzin zalezy ile ma czasu dziennie na nauke. <br /><br />Takie cwiczenie daje fajna baze wiedzy o systemie, troche o protokolach sieciowych ale przyszlosciowo niestety nie jest najlepszym rozwiazaniem, bo za chwile moze sie okazac ze bedzie potrzebna baza danych, cos do rysowania wykresow, jakiegos gui do zarzadzania. <br />Mimo tych wad POLECAM pojsc droga zbudowania w pelni dzialajacego obslugujacego wiele polaczen naraz serwera TCP.<br />Google twoim przyjacielem, jest na pewno tez pare ksiazek o pisaniu na linuxa. A i na forum paru specow jak widac jest <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Co do alarmow to nic nie stoi na przeszkodzie zrobienie jak na AVR:<br /><br />- jeden alarm liczacy (mili)sekundy<br />- w petli glownej sprawdzasz wartosc licznika i uruchamiasz funkcje wtedy kiedy potrzebujesz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 18 sie 2014, o 13:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T12:49:32+01:00</updated>
<published>2014-08-18T12:49:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91894#p91894</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91894#p91894"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91894#p91894"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Tu jednak zastanów się czy nie warto na maszynie z procesem zbierającym dane który to wystawi je w pamięci współdzielonej/gnieździe lokalnym, uruchomić PHP które szybciej i łatwiej obsłuży protokoły HTML/JSON/XML i inne ,,grube&quot;. To pozwoli szybko zbudować aplikację bez ładowania się w budowanie serwera HTTP w języku C <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> A PHP czy inna technologia webowa, obsłuży Ci i wysyłanie danych do czujników i zbieranie z nich... Osobiście PHP nie stosuję i wolę Python'a i Django <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />Nie mam zamiaru budować serwera HTTP, bo ten już mam (lighttpd) na tym samym urządzeniu i to właśnie on wykonuje skrypty PHP.<br />Serwerek o którym mówię ma wykonywać prostsze funkcje:<br />1. Gromadzić w jednym miejscu dane z kilku rozproszonych czujników i sterowników.<br />2. Konwertować dane z formatów wygodnych dla AVR-ów na te czytelne dla człowieka (np. int na float).<br />3. Przygotowywać proste raporty, co znów wiąże się z powyższą konwersją. Na przykład zamiast &quot;+TEMP: 255&quot; będzie udostępniał treść &quot;Temperatura: 25,5 st. C&quot;.<br />4. Dzięki serwerkowi z zewnątrz cały system będzie widoczny jako jedno urządzenie. Na razie mam tylko dwa czujniki, ale prawdopodobnie za jakiś czas dodam jeszcze kilka innych urządzeń (np. sterowanie światłem). Wtedy np. nie będę musiał zastanawiać się do którego kontrolera powinienem wysłać komendę. To będzie ustalone w konfiguracji programu i on już sam przekieruje odpowiednie polecenie tam, gdzie trzeba.<br /><br />Czyli innymi słowy całość ma pracować na kilku warstwach:<br />1) Najniższa - zbieranie danych i wykonywanie poleceń. Ta część jest wykonywana bezpośrednio przez sterowniki zbudowane na uC. Nie wymagają one do pracy warstw wyższych i w razie konieczności można się z każdym z nich z osobna niezależnie skontaktować przez telnet albo pakiet UDP.<br />2) Warstwa pośrednia - pośrednicząca w komunikacji między warstwą najniższa i najwyższą. Tę funkcję spełnia omawiany daemon, odpalony na RasPi (na razie, w przyszłości pewnie na czymś lepszym). Jej funkcją jest gromadzenie danych ze wszystkich czujników i przekazywanie ich wyżej, tudzież rozsyłanie niżej poleceń przychodzących od użytkownika. Na tej warstwie odpalona jest także automatyka. Np. sprawdzamy, czy określona wartość na dwóch lub więcej czujnikach wzrosła ponad ustalony stan - jeśli tak, wysyłamy maila.<br />3) Warstwa najwyższa - strona WWW z PHP albo aplikacja na Androida. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />BTW rzuć okiem na moją wcześniejszą wypowiedź - edytowałem ją. Mam kilka pytań odnośnie alarmów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 12:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T12:08:44+01:00</updated>
<published>2014-08-18T12:08:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91891#p91891</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91891#p91891"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91891#p91891"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Tu zaproponuję najprostsze ze znanych mi podejść (KISS <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> ...<br />Jeśli chcesz <strong>odpytywać</strong> urządzenia z granulacją sekund, zastosuj wywołanie (tu będę podawał manuale): man 2 alarm, które pozwoli Ci ustalić interwał w sekundach na odpytanie oraz: man 2 signal, które pozwoli Ci zarejestrować funkcję obsługi tegoż sygnału. Nawet ostatnio podawałem przykład signal w innym wątku... <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic8102.html" >topic8102.html</a><!-- l -->. W tamtym wątku było to dla innych sygnałów ale zasada ta sama.<br /><br />Jeśli chcesz <strong>odpytywać</strong> urządzenia z granulacją mniejszą niż sekundy, użyj: man 2 setitimer oraz signal do rejestracji obsługi sygnału alarm.<br /></div><br /><br />Hmm... A można w ten sposób ustawić kilka alarmów, przypisanych do różnych funkcji, które będą wywoływane z różną częstotliwością, niezależnie od siebie? W końcu tak właśnie działają liczniki w AVR-ach...<br />Można przypisać kilka funkcji do jednego alarmu?<br /><br /><br /><div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Wystarczy że program udostępni plik w którym zapisze dane z czujników w formacie łatwym do sparsowania od strony PHP lub innych technologii. Pamiętaj jednak o założeniu blokady na plik poprzez: man 2 flock (zerknij na flagi, pewnie będzie najlepsza LOCK_SH) w trakcie pisania do niego i sprawdzaniu blokady ze strony PHP przed odczytem.<br /></div><br /><br />To najprostsze rozwiązanie - myślałem o nim początkowo, ale teraz skłaniam się raczej ku rozwiązaniu z serwerem. Powód jest prosty - do pliku dostanę się tylko z tej samej maszyny. Mając serwer mogę w przyszłości pomyśleć np. o dopisaniu jakiejś aplikacji na androida, która posłuży do zdalnej obsługi zbudowanych urządzeń. Poza tym plik w wygodny sposób pozwoli mi tylko wyciągać dane z czujników. Dzięki serwerowi będę mógł też przesyłać jakieś polecenia do wykonania sterownikom (np. załączanie światła).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T10:50:11+01:00</updated>
<published>2014-08-18T10:50:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91886#p91886</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91886#p91886"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91886#p91886"><![CDATA[
<div class="quotetitle">PROTON napisał(a):</div><div class="quotecontent"><br />W Linuxie możesz wstrzymywać pracę programu na określony czas, funkcja: sleep() i nanosleep(), nanosleep wymaga struktury timespec.<br /></div><br /><br />To wiem, zwykle wykorzystuję usleep().<br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jak chcesz programować w Linuxie to proponuję C++.<br /></div><br /><br />Na razie nie czuję takiej potrzeby, żeby uczyć się kolejnego języka. Moim głównym zainteresowaniem jest elektronika, a w związku z tym potrzebuję C do programowania MCU. Linux jest niejako &quot;na boku&quot;, gdy chcę dodać do moich projektów jakiś &quot;wyższy poziom' - np. interfejs deamon czytający informacje z czujników i przekazujący je do skryptu PHP udostępnionego na serwerze WWW.<br /><br /><div class="quotetitle">charsz napisał(a):</div><div class="quotecontent"><br />Pamietaj tez ze AVR jest systemem czasu rzeczywistego, tzn mozesz przewidziec ile czasu co zajmie, a linux juz nie.<br /></div><br /><br />Zdaję sobie z tego sprawę, ale szczególnie mi to nie przeszkadza. AVR-y i Linuksa wykorzystują po prostu do innych celów.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Tutaj musisz radzic sobie innymi metodami, forkowanie, oczekiwania na procesy podrzedne. <br />Np serwery TCP/UDP pisze sie tak, ze glowny proces nasluchuje czy jest nowe polaczenie, a jak cos sie znajdzie to tworzy swoja kopie (fork) ktora zajmuje sie tylko i wylacznie obsluga tego polaczenia, tak aby zwis transmisji nie zablokowal mozliwosci przyjecia kolejnego polaczenia.<br /></div><br /><br />Hmm... Czy opanowanie takiej metody pisania programów jest czymś szczególnie trudnym w porównaniu z obsługą wielu zadań za pomocą timerów na uC? Od czego powinienem zacząć? Z jakimi zagadnieniami się zapoznać?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 18 minutach ]</span></strong><br /><br /><div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Napisz najdokładniej co chcesz zrobić. Możliwości w GNU/Linux jest takie zatrzęsienie że nie wiadomo co proponować.<br />Chodzi Ci o serwer sieciowy czy komunikację wewnętrzną czy ew. wykonywanie periodyczne działania w aplikacji czy reakcję na zdarzenie...<br /></div><br /><br />Hmm... Właściwie wszystko (a właściwie większość z powyższych po trochu). W tej chwili próbuję napisać program (deamona), który będzie pracował w tle, regularnie odczytując status paru urządzeń na MCU. Napisałem już funkcje odpowiedzialne za komunikację z tymi urządzeniami. Wykorzystuję do tego celu pakiety UDP, a odczytywane informacje są przechowywane w strukturze. Ta sama struktura trzyma &quot;namiary&quot; na urządzenie. W ten sposób struktura tworzy rodzaj wirtualnej reprezentacji urządzenia:<br /><br />[syntax=c]device_t device;<br />strncpy(device.ipaddress, &quot;192.168.1.100&quot;, sizeof(device.ipaddress));<br />device.port = 1337;<br /><br />int main () {<br /><br />device_read(&amp;device)<br /><br />printf(&quot;Odczyt 1: %i&quot;\nOdczyt2: %i\n&quot;, device.odczyt1, device.odczyt2);<br /><br />return (0);<br /><br />}[/syntax]<br /><br />Dzięki zastosowaniu takiego podejścia mogę utworzyć całą tablicę &quot;urządzeń&quot; i odświeżać ich dane jedno po drugim.<br /><br /><strong>W tym wypadku chodzi więc tylko o to, żeby w regularnych odstępach czasu wykonywać operację odświeżania danych zawartych w strukturach</strong> (funkcja read_device(&amp;device)). Oczywiście funkcja nie tylko odczytuje te dane, ale także zajmuje się ich wstępną obróbką, np. przetwarza int na float.<br /><br /><br />Teraz jednak idziemy dalej. <strong>Program musi też działać jako serwer, udostępniający te dane użytkownikowi i/lub innym programom</strong> (np. skryptowi PHP) w postaci &quot;raportów&quot;. Innymi słowy zestawiamy z serwerem połączenie TCP, wysyłamy komendę, a on odsyła odpowiedni raport o bieżących wynikach pomiarów.<br /><br />To najważniejsze funkcje, ale nie jedyne. Program powinien też cyklicznie sprawdzać jedną z kluczowych wartości i w przypadku wykrycia przekroczenia ustalonego limitu wysyłać wiadomość e-mail do użytkownika. Co jakiś czas &quot;raport&quot; powinien też trafiać do pliku. Tym jednak zajmę się później. W planach &quot;na kiedyś&quot; jest też ładowanie wyników pomiarów do jakiejś bazy danych.<br /><br />Generalnie program staram się napisać tak, żeby w przyszłości można było za jego pomocą odczytywać i kontrolować także inne zbudowane przeze mnie urządzenia na uC, pracujące w sieci - kwestia dodania kolejnej struktury odpowiadającej ich charakterystyce i zarejestrowania kolejnej funkcji cyklicznie czytającej dane.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 10:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-08-18T09:09:57+01:00</updated>
<published>2014-08-18T09:09:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91881#p91881</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91881#p91881"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91881#p91881"><![CDATA[
Programujac na uC nie masz systemu, tutaj masz system i wiele rzeczy robi za Ciebie. <br />Pamietaj tez ze AVR jest systemem czasu rzeczywistego, tzn mozesz przewidziec ile czasu co zajmie, a linux juz nie. <br />Tutaj musisz radzic sobie innymi metodami, forkowanie, oczekiwania na procesy podrzedne. <br />Np serwery TCP/UDP pisze sie tak, ze glowny proces nasluchuje czy jest nowe polaczenie, a jak cos sie znajdzie to tworzy swoja kopie (fork) ktora zajmuje sie tylko i wylacznie obsluga tego polaczenia, tak aby zwis transmisji nie zablokowal mozliwosci przyjecia kolejnego polaczenia. <br />No ale jesli mimo wszystko bedziesz potrzebowal timerow to w linuxie odpowiednikiem przerwan z licznikow beda sygnaly (signal()) oraz interesowac bedzie cie ich ustawianie (setitimer());<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 18 sie 2014, o 09:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROTON]]></name></author>
<updated>2014-08-18T08:54:17+01:00</updated>
<published>2014-08-18T08:54:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91878#p91878</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91878#p91878"/>
<title type="html"><![CDATA[Re: Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91878#p91878"><![CDATA[
W Linuxie możesz wstrzymywać pracę programu na określony czas, funkcja: sleep() i nanosleep(), nanosleep wymaga struktury timespec.<br />Jak chcesz programować w Linuxie to proponuję C++.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1315">PROTON</a> — 18 sie 2014, o 08:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2014-08-18T08:21:18+01:00</updated>
<published>2014-08-18T08:21:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91872#p91872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91872#p91872"/>
<title type="html"><![CDATA[Cykliczne wykonywanie zadań w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8174&amp;p=91872#p91872"><![CDATA[
Programowania w C na dobrą sprawę uczyłem się na mikrokontrolerach. Dopiero jakiś czas temu postanowiłem wykorzystać posiadane Raspberry Pi do czegoś więcej, niż tylko odpalanie cudzych aplikacji. Napisałem obecnie kilka niewielkich programików. Podczas ich tworzenia posługiwałem się wiedzą i przyzwyczajeniami wyniesionymi z MCU. I tak na przykład chcąc wykonywać jakieś zadanie cyklicznie w pętli głównej stosuję licznik programowy. Jeśli w programie stosuję bibliotekę wiringPi (dostęp do GPIO na zasadach podobnych do Arduino), korzystam z zawartej w niej instrukcji milis().<br /><br />Tak się jednak zastanawiam.... Może pod Linuksem istnieje jakaś prostsza/lepsza metoda? Może da się po prostu zarejestrować wskaźnik do jakiejś funkcji tak, żeby program automatycznie wywoływał ją w określonych przedziałach czasu? Chodzi mi tutaj m.in. o obsługę serwera. Mog to zrobić w bardziej elegancki sposób, czy pozostają mi liczniki, dokładnie tak jak na AVR-ach?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 sie 2014, o 08:21</p><hr />
]]></content>
</entry>
</feed>