<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[SDS PLC/PAC: Měření Energie & OnlineTechnology.cz - Problém s voláním funkcí dns_resolv, http_get]]></title>
	<link rel="self" href="https://forum.sds.an-d.cz/extern.php?action=feed&amp;tid=855&amp;type=atom" />
	<updated>2017-06-08T16:36:01Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.sds.an-d.cz/viewtopic.php?id=855</id>
		<entry>
			<title type="html"><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6076#p6076" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2017-06-08T16:36:01Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6076#p6076</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6075#p6075" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[matoljak]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=11732</uri>
			</author>
			<updated>2017-06-08T10:07:11Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6075#p6075</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6052#p6052" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2017-05-15T15:15:36Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6052#p6052</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Problém s voláním funkcí dns_resolv, http_get]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6051#p6051" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[matoljak]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=11732</uri>
			</author>
			<updated>2017-05-15T08:24:15Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6051#p6051</id>
		</entry>
</feed>
