<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[SDS PLC/PAC: Měření Energie & OnlineTechnology.cz - Problém s voláním funkcí dns_resolv, http_get]]></title>
		<link>https://forum.sds.an-d.cz/viewtopic.php?id=855</link>
		<atom:link href="https://forum.sds.an-d.cz/extern.php?action=feed&amp;tid=855&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Nejnovější příspěvky v Problém s voláním funkcí dns_resolv, http_get.]]></description>
		<lastBuildDate>Thu, 08 Jun 2017 16:36:01 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=6076#p6076</link>
			<description><![CDATA[<p>Teprve si to vše přečtu, ale mezitím se můžete podívat sem:</p><p>http://wiki.merenienergie.cz/index.php/FULL-C_details<br />(vysvětlení proč to nemusí fungovat - málo paměti a pročpak to)</p><p>a sem:</p><p>http://wiki.merenienergie.cz/index.php/FULL-C_tips_and_tricks<br />(vysvětlení hodnot)</p><p>Najdete tam vysvětlení na řadu vašich otázek.</p><p>Jak to ale vypadá, váš program je už zkrátka asi moc velký. Zkuste jej upravit - nejde ani tak o zmenšení kódu, jako jeho předělání (aby tam nemuselo být tolik statických polí atd.).</p><p>Dále - stáhněte si nový FULLC.exe, ukazuje mnohem detailněji (po překladu) co se s pamětí v SDS děje a jaké jsou jednotlivé velikosti jednotlivých částí programu.</p><p>---</p><p>píšete:</p><p>HEAP STATS: curalloc=61016, totfree=1436 maxfree=1376</p><p>Váš program využívá téměř celou pamět a zbývá jen 1436 bajtů (a z toho jde alokovat jeden souvislý blok o nejvíce 1376 bajtech). Toto už nestačí pro provedení zmíněných funkcí.</p><p>Pokud nemůžete spotřebu paměti vašeho programu zmenšit (např. jeho přepsáním), musíte přejít na jiné SDS - na variantu 128KB.</p>]]></description>
			<author><![CDATA[null@example.com (adamn)]]></author>
			<pubDate>Thu, 08 Jun 2017 16:36:01 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=6076#p6076</guid>
		</item>
		<item>
			<title><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=6075#p6075</link>
			<description><![CDATA[<p>Zvětšil jsem STACK z 3072 na 4096, ale stále mi to hlásí nedostatek paměti.</p><p>Definice globálních polí:</p><div class="codebox"><pre><code>// Pole pro ukládání naměřených hodnot ze senzorů
char addrArray[264]; // min 264 kvůli zapisování do DataFlash
char typeArray[264];
int tempArray[64]; // max 64 senzorů kvůli nedostatku paměti
int humArray[64];
int moiArray[64];
int resiArrayHI[64]; // do unsigned int pole ve full-c se na jeden index vejde pouze 16 bitů -&gt; je potřeba 32 bitovou hodnotu rozdělit do dvou indexů
int resiArrayLO[64];
int temp2Array[64];
int hum2Array[64];</code></pre></div><p>Pokud odstraním poslední tři pole, tak program běží. Pokud zmenším počet indexů v každém poli na 32, tak se vůbec nerozběhne a hned dává chybovou hlášku out of mem.</p><p>S těmito poli pracuji v této části programu:</p><div class="codebox"><pre><code>// Naplní příslušná pole naměřenými hodnotami ze senzorů.
void readSensors() {
    if(sensorCount == 0) {
        printf(&quot;No sensors connected...\n&quot;);
        break;
    }
    for(int i = 0; i &lt; sensorCount; i++) {
        sensorAddr = addrArray[i];
        if(typeArray[i] == TYPE_HT) {
            printf(&quot;Reading sensor address %d, sensor type %d...\n&quot;, sensorAddr, TYPE_HT);
            if (readValues(3) == 0) { // register count 3
                tempArray[i] = 0;
                humArray[i] = 0;
                moiArray[i] = 0;
                resiArrayHI[i] = 0;
                resiArrayLO[i] = 0;
                temp2Array[i] = 0;
                hum2Array[i] = 0;
            }
            else {
                tempArray[i] = ((res[3] &lt;&lt; 8) | res[4]);
                humArray[i] = ((res[5] &lt;&lt; 8) | res[6]);
                moiArray[i] = 0;
                resiArrayHI[i] = 0;
                resiArrayLO[i] = 0;
                temp2Array[i] = 0;
                hum2Array[i] = 0;
            }
        }
        if(typeArray[i] == TYPE_MHT_22) {
            printf(&quot;Reading sensor address %d, sensor type %d...\n&quot;, sensorAddr, TYPE_MHT_22);
            if (readValues(6) == 0) { // register count 6
                tempArray[i] = 0;
                humArray[i] = 0;
                moiArray[i] = 0;
                resiArrayHI[i] = 0;
                resiArrayLO[i] = 0;
                temp2Array[i] = 0;
                hum2Array[i] = 0;
            }
            else {
                tempArray[i] = ((res[3] &lt;&lt; 8) | res[4]);
                humArray[i] = ((res[5] &lt;&lt; 8) | res[6]);
                moiArray[i] = ((res[9] &lt;&lt; 8) | res[10]);
                resiArrayHI[i] = ((res[11] &lt;&lt; 8) | res[12]);
                resiArrayLO[i] = ((res[13] &lt;&lt; 8) | res[14]);
                temp2Array[i] = 0;
                hum2Array[i] = 0;
            }
        }
        if(typeArray[i] == TYPE_MHT_23) {
            printf(&quot;Reading sensor address %d, sensor type %d...\n&quot;, sensorAddr, TYPE_MHT_23);
            if (readValues(12) == 0) { // register count 12
                tempArray[i] = 0;
                humArray[i] = 0;
                moiArray[i] = 0;
                resiArrayHI[i] = 0;
                resiArrayLO[i] = 0;
                temp2Array[i] = 0;
                hum2Array[i] = 0;
            }
            else {
                tempArray[i] = ((res[3] &lt;&lt; 8) | res[4]);
                humArray[i] = ((res[5] &lt;&lt; 8) | res[6]);
                moiArray[i] = ((res[9] &lt;&lt; 8) | res[10]);
                resiArrayHI[i] = ((res[11] &lt;&lt; 8) | res[12]);
                resiArrayLO[i] = ((res[13] &lt;&lt; 8) | res[14]);
                temp2Array[i] = ((res[23] &lt;&lt; 8) | res[24]);
                hum2Array[i] = ((res[25] &lt;&lt; 8) | res[26]);
            }
        }
    }
}</code></pre></div><p>Vyčítám hodnoty ze senzorů připojených přes RS485 a každou odpověď zapisuji nejprve do pole res[].</p><p>Pro zobrazení hodnot na webové stránce používám tuto část kódu:</p><div class="codebox"><pre><code>// Naplní pole T00 až T07 hodnotami z polí s naměřenými hodnotami.
void sendDataToWebPage() {
    int index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T00[index], 3, &quot;%d,&quot;, addrArray[i]) - 1;
        }
        else {
            index += snprintf(&amp;T00[index], 3, &quot;%d&quot;, addrArray[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T01[index], 3, &quot;%d,&quot;, typeArray[i]) - 1;
        }
        else {
            index += snprintf(&amp;T01[index], 3, &quot;%d&quot;, typeArray[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T02[index], 5, &quot;%d,&quot;, tempArray[i]) - 1;
        }
        else {
            index += snprintf(&amp;T02[index], 5, &quot;%d&quot;, tempArray[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T03[index], 5, &quot;%d,&quot;, humArray[i]) - 1;
        }
        else {
            index += snprintf(&amp;T03[index], 5, &quot;%d&quot;, humArray[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T04[index], 5, &quot;%d,&quot;, moiArray[i]) - 1;
        }
        else {
            index += snprintf(&amp;T04[index], 5, &quot;%d&quot;, moiArray[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T05[index], 10, &quot;%d,&quot;, (resiArrayHI[i] &lt;&lt; 16) | resiArrayLO[i]) - 1;
        }
        else {
            index += snprintf(&amp;T05[index], 10, &quot;%d&quot;, (resiArrayHI[i] &lt;&lt; 16) | resiArrayLO[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T06[index], 5, &quot;%d,&quot;, temp2Array[i]) - 1;
        }
        else {
            index += snprintf(&amp;T06[index], 5, &quot;%d&quot;, temp2Array[i]) - 1;
        }
    }
    index = 0;

    for (int i = 0; i &lt; sensorCount; i++) {
        if (i &lt; sensorCount - 1) {
            index += snprintf(&amp;T07[index], 5, &quot;%d,&quot;, hum2Array[i]) - 1;
        }
        else {
            index += snprintf(&amp;T07[index], 5, &quot;%d&quot;, hum2Array[i]) - 1;
        }
    }
    index = 0;
}</code></pre></div><p>Co máte na mysli hlubokou rekurzí?</p><p>Když program běží bez volání funkcí dns_resolv a http_get, na admin webu FULL-C vidím tyto hodnoty využití:</p><p>FULL-C status: RUNNING</p><p>FC-PROG MEMORY: 64kB<br />HEAP STATS: curalloc=61016, totfree=1436 maxfree=1376, nget=491 nrel=40<br />HEAP STATS: bc_locked=26704, stackTop=1492 (of 3072)<br />SYS: free=360</p><p>Jak se v těchto číslech vyznat?</p><p>Předem díky,<br />Jakub</p>]]></description>
			<author><![CDATA[null@example.com (matoljak)]]></author>
			<pubDate>Thu, 08 Jun 2017 10:07:11 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=6075#p6075</guid>
		</item>
		<item>
			<title><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=6052#p6052</link>
			<description><![CDATA[<p>Prosím napište sem kus kódu vašeho programu, kde jsou ty globální pole definovány. Přesně celý kód kolem těch definic atd.</p><p>Zkuste zvětšit stack. I když, chyba dle popisu chybové hlášky, odpovídá tomu, že došla pamět na HEAPu, při vstupu do funkce. Nepředáváte ty pole do nějaké vaší funkce, nějak &quot;špatně&quot; ? Tj. bez použití ukazatele na pole ? atd.<br />Zkuste sem dát části vašeho kódu, kde se s tím vším pracuje. </p><p>Ono to nemusí být ani chyba způsobená použitím těch sedmin polí, ty jen mohly být &quot;poslední kapka&quot; a paměť došla, a už předtím tam mohl být nějaký jiný, původní problém v programu. Neprovádíte tam např. příliš hlubokou rekurzi ? Nepředáváte proměnné (velké pole) do funkce přímo (správně by to mělo být přes ukazatel)? atd.<br />Jednoznačně se vyčerpá stack / heap. <br />V průběhu běhu programu můžete kontrolovat hodnoty využití (za běhu, na web admin &quot;full-c&quot; ve vašem SDS). Zkuste se podívat, jestli program už není na kraji vyčerpání zdrojů...</p>]]></description>
			<author><![CDATA[null@example.com (adamn)]]></author>
			<pubDate>Mon, 15 May 2017 15:15:36 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=6052#p6052</guid>
		</item>
		<item>
			<title><![CDATA[Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=6051#p6051</link>
			<description><![CDATA[<p>Dobrý den,</p><p>mám problém s funkcemi dns_resolv a http_get.</p><p>Když je zavolám v samostatném programu, který nedělá nic jiného, než že komunikuje se serverem pomocí HTTP GET požadavků, tak vše běží ok. Když ale tyto funkce použiji v programu, který je náročnější, tak mi nezbývá paměť a konzole vypíše:</p><p>*** FULL-C ***: out of mem(29)(72)(H)<br />*** FULL-C ***: out of mem(30)<br />*** FULL-C ***: out of mem(20)</p><p>Celý program zabírá 18 kB (28% paměti), stack zabírá 5% a na heap zbývá 67%.</p><p>Když odstraním z programu 7 globálních int polí, každé o 64 indexech, tak to beží.</p><p>Je možné, že výše zmíněné funkce jsou na paměť tak náročné? Nebo dělám něco špatně?</p><p>Předem díky za odpovědi,<br />Jakub</p>]]></description>
			<author><![CDATA[null@example.com (matoljak)]]></author>
			<pubDate>Mon, 15 May 2017 08:24:15 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=6051#p6051</guid>
		</item>
	</channel>
</rss>
