<?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 - Best practices]]></title>
	<link rel="self" href="https://forum.sds.an-d.cz/extern.php?action=feed&amp;tid=1096&amp;type=atom" />
	<updated>2022-10-12T12:44:57Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.sds.an-d.cz/viewtopic.php?id=1096</id>
		<entry>
			<title type="html"><![CDATA[Re: Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7454#p7454" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2022-10-12T12:44:57Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7454#p7454</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7453#p7453" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[absolonj]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=11958</uri>
			</author>
			<updated>2022-10-12T10:35:07Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7453#p7453</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7447#p7447" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2022-10-11T10:04:35Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7447#p7447</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7442#p7442" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[absolonj]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=11958</uri>
			</author>
			<updated>2022-10-10T15:16:49Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7442#p7442</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7441#p7441" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2022-10-10T08:14:43Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7441#p7441</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Best practices]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=7440#p7440" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[absolonj]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=11958</uri>
			</author>
			<updated>2022-10-09T21:04:16Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=7440#p7440</id>
		</entry>
</feed>
