<?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 - Best practices]]></title>
		<link>https://forum.sds.an-d.cz/viewtopic.php?id=1096</link>
		<atom:link href="https://forum.sds.an-d.cz/extern.php?action=feed&amp;tid=1096&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Nejnovější příspěvky v Best practices.]]></description>
		<lastBuildDate>Wed, 12 Oct 2022 12:44:57 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7454#p7454</link>
			<description><![CDATA[<p>V případě definice na zásobníku, je potřeba pohlídat že zásobník má dostatečnou velikost (nastavenou při překladu programu).</p><p>Pokud se dá vyhnout alokaci (heap), tak je to dobře, protože to snižuje eventuální fragmentaci.</p>]]></description>
			<author><![CDATA[null@example.com (adamn)]]></author>
			<pubDate>Wed, 12 Oct 2022 12:44:57 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7454#p7454</guid>
		</item>
		<item>
			<title><![CDATA[Re: Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7453#p7453</link>
			<description><![CDATA[<p>Děkuji, to mi zcela stačí.</p><p>Ještě k těch alokacím. Je tedy jedno, jakým způsobem alokuji velký globální buffer, tedy:</p><div class="codebox"><pre><code>    char *buffer = (char *)malloc(5000);
    char buffer[5000];</code></pre></div><p>V prvním případě alokuji na haldě, kde mám místa dost, ve druhém případě se místo přidělí staticky při kompilaci (uploadu/startu) a ubere to na velikosti haldy, v obou případech mi to ukousne stejnou část paměti. Asi je to úplně jedno, co použiji, ten druhý zápis vypadá možná lépe.</p>]]></description>
			<author><![CDATA[null@example.com (absolonj)]]></author>
			<pubDate>Wed, 12 Oct 2022 10:35:07 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7453#p7453</guid>
		</item>
		<item>
			<title><![CDATA[Re: Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7447#p7447</link>
			<description><![CDATA[<p>Rozdíl tam bude zcela minimální, určitě zanedbatelný. <br />Hlubší optimalizace se neprovádí (prakticky odpovídá O0), takže bych to celkově bral spíše jako otázku Code Style a obecného způsobu zápisu programu, tedy především čitelnost.</p><p>Takže pro první příklad bych volil druhou možnost (dát to do své funkce),<br />pro druhý příklad (to bude časově nastejno), bych z důvodu čitelnosti kódu, určitě použil vyskočení podle podmínky (return).</p>]]></description>
			<author><![CDATA[null@example.com (adamn)]]></author>
			<pubDate>Tue, 11 Oct 2022 10:04:35 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7447#p7447</guid>
		</item>
		<item>
			<title><![CDATA[Re: Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7442#p7442</link>
			<description><![CDATA[<p>Děkuji za vyčerpávající odpověď.</p><p>Nicméně ještě k bodu e): Jedná se mi o to, jakým způsobem se přeskakují bloky instrukcí pro neplněnou podmínku a zda je tedy lepší než:</p><div class="codebox"><pre><code>   if (obcas_se_stane)
   {
      ...
      hodně řádků...
      ...
   }</code></pre></div><p>není lepší psát:</p><div class="codebox"><pre><code>    if (obcas_se_stane)
      proved_hodne_radku();

    void proved_hodne_radku()
    {
      ...
      hodně řádků...
      ...
    }</code></pre></div><p>Podmínka nastane jednou za čas a přeskakování velkého množství řádků ve druhém případě odpadne.<br />Podobně např. ve funkci se dá místo:</p><div class="codebox"><pre><code>   void fce()
   {
       if (podminka)
       {
         ...
         hodně řádků...
         ...
       }
   }</code></pre></div><p>napsat:</p><div class="codebox"><pre><code>   void fce()
   {
      if (!podminka)
         return;
      ...
      hodně řádků...
      ...
   }</code></pre></div><p>Samozřejmě si mohu udělat benchmark.</p>]]></description>
			<author><![CDATA[null@example.com (absolonj)]]></author>
			<pubDate>Mon, 10 Oct 2022 15:16:49 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7442#p7442</guid>
		</item>
		<item>
			<title><![CDATA[Re: Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7441#p7441</link>
			<description><![CDATA[<p>Odpovědi doplním na https://wiki.merenienergie.cz/subdom/wiki/index.php?title=FULL-C:_tips_and_tricks . </p><p>a) <br />Veškerá pamět je fyzicky společná (RAM procesoru), pro účely FC je pak logicky rozdělena - rozdělení je pěkně vidět po prvním překladu ve FULLC.exe, je tam interaktivní proužek s barvami, které ukazují, kde co jak bude (a jak to bude velké).<br />Globální proměnné jsou tedy na pevném místě v RAM. Lokální jsou na zásobníku. <br />Parametry volání funkce také na zásobníku. Pozor ale nejsou tam uloženy &quot;jen tak&quot; tedy jen surové hodnoty za sebou apod., u FC jsou všechny proměnné na stacku obaleny dalšími informacemi (např. o rozsahu atd., protože SDS si interně hlídá např. chyby typu buffer overflow).</p><p>b)<br />U sdílených proměnných je potřeba znát (a tedy zadat) pevnou délku, využívá to kód který to integruje vůči webovému rozhraní. <br />Už z&nbsp; hlediska přehlednosti programu je vhodné je definovat na jeho začátku, jako globální proměnné.</p><p>c)<br />Tohle je funkcionalita, která teprve bude implementována. Ano, bude to užitečné.<br />Při znovuspuštění programu, bude text poslední chyby schován a zobrazen, tak aby se neztratil.</p><p>d)<br />Způsob kódování hodnoty je rozdílný dle typu SDS. Dokumentace bude aktualizována.<br />Řada 64 a 128 to už má interně posunuté, řada 512 ne (protože je tam více platných bitů s významy).</p><p>e)<br />Volání funkce má nepatrně větší overhead než postupné vykonávání kódu.<br />Prakticky by ani u jednoho z řešení neměl být významně měřitelný rozdíl.<br />Zkuste si napsat benchmark.</p>]]></description>
			<author><![CDATA[null@example.com (adamn)]]></author>
			<pubDate>Mon, 10 Oct 2022 08:14:43 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7441#p7441</guid>
		</item>
		<item>
			<title><![CDATA[Best practices]]></title>
			<link>https://forum.sds.an-d.cz/viewtopic.php?pid=7440#p7440</link>
			<description><![CDATA[<p>Mám několik dotazů k obecným zásadám psaní programu:</p><p>a) Jak přesně dochází k alokaci promněnných (oddíl variables, zásobník, halda)? Kde jsou umístěné globální proměnné, definované mimo tělo funkce (včetně main) a kde dočasné proměnné, definované uvnitř funkcí? Předpokládám z dřívějších diskuzí, že parametry volání funkcí jsou na zásobníku.</p><p>b) Mohu být textové sdílené proměnné alokovány na haldě? Předpokládám, že ne, protože z principu u nich musí být známá pevná délka. Takže např. T00[20] je jediná správná definice.</p><p>c) Dá se nějak při novém startu programu po jeho ukončení chybou ve zdrojovém kódu zjistit, ve kterém řádku k chybě došlo? Taková chyba se může objevit náhodou po průchodu téměř nepoužívanou větví, reset watchdogu sice program znovu spustí, ale přijdu o informaci o chybě z ladicího výpisu na konzolu.</p><p>d) Ve FULL-C je informace o důvodu resetu systému umístěna v systémové proměnné 40 (SoCresetReason). Ta mi vrací např. 0x1460000, ale podle příkladu na Wiki, by to měly být spodní bity. Mám si to posunout&nbsp; &gt;&gt; 16?</p><p>e) Je načítání programu nějak optimalizováno (přeskakování řádků, kde není splněna podmínka) nebo je lepší dlouhé úseky ve smyčce nahradit raději voláním funkcí - zrychlí se tím zpracování smyčky?</p>]]></description>
			<author><![CDATA[null@example.com (absolonj)]]></author>
			<pubDate>Sun, 09 Oct 2022 21:04:16 +0000</pubDate>
			<guid>https://forum.sds.an-d.cz/viewtopic.php?pid=7440#p7440</guid>
		</item>
	</channel>
</rss>
