{"id":1541,"date":"2014-03-20T13:01:15","date_gmt":"2014-03-20T11:01:15","guid":{"rendered":"https:\/\/zz-indigo.mavipet.sk\/?p=1541"},"modified":"2019-10-29T18:04:51","modified_gmt":"2019-10-29T18:04:51","slug":"ako-som-si-zaoptimalozoval","status":"publish","type":"post","link":"https:\/\/zz-indigo.mavipet.sk\/?p=1541","title":{"rendered":"Ako som si zaoptimalozoval."},"content":{"rendered":"<p>Na jednom projekte som sa dostal na obmedzenia ve\u013ekosti flash v ATtiny2313. Tak som sa vrhol na optimaliz\u00e1ciu (K\u00f3d sa kompiloval z prep\u00edna\u010dom -Os). V k\u00f3de som na\u0161iel len jednu mo\u017enos\u0165 ako optimalizova\u0165 ve\u013ekos\u0165. Zbavi\u0165 sa n\u00e1sobenia a delenia. Vo v\u00fdsledku sa mi celkov\u00fd k\u00f3d scvrkol o 98 bytov oproti p\u00f4vodnej ve\u013ekosti.<\/p>\n<p><!--more--><\/p>\n<p>Na za\u010diatok p\u00f4vodn\u00fd k\u00f3d ktor\u00fd je z d\u00f4vodu preh\u013eadnosti silne neoptimalizovan\u00fd:<\/p>\n<pre>\/* read uint32_t 8 chars - 0xFFFFFFFF = error *\/\nuint32_t readul(void) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint8_t x=0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned char c;\n   \u00a0\u00a0\u00a0\u00a0 uint32_t nasobok = 10000000;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t vysledok = 0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c = uart_get();\n   \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vysledok = vysledok + (c - '0') * nasobok;\n   \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nasobok = nasobok \/ 10;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while ((x &lt; 8) &amp; (c &gt;= '0') &amp; (c &lt;= '9'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x == 8)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(vysledok);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(0xFFFFFFFF);\n}<\/pre>\n<p>Ako vidno optimaliz\u00e1cia je mo\u017en\u00e1 len zmenou algoritmu ktor\u00fd nebude vyu\u017e\u00edva\u0165 n\u00e1ro\u010dn\u00e9 oper\u00e1cie. A t\u00fdmi s\u00fa n\u00e1sobenie a delenie. Delenia sa d\u00e1 vcelku \u013eahko zbavi\u0165:<\/p>\n<pre>\/* read uint32_t 8 chars - 0xFFFFFFFF = error *\/\nuint32_t readul(void) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint8_t x=0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned char c;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t vysledok = 0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c = uart_get();\n   \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vysledok = vysledok * 10;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vysledok = vysledok + (c - '0');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while ((x &lt; 8) &amp; (c &gt;= '0') &amp; (c &lt;= '9'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x == 8)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(vysledok);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(0xFFFFFFFF);\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>K\u00f3d je tro\u0161ku zlo\u017eitej\u0161\u00ed na pochopenie ale zatia\u013e \u017eiadna hr\u00f4za. K\u00f3d po skompilovan\u00ed je men\u0161\u00ed o 56 bytov. Nevyzer\u00e1 to moc ale je to dostato\u010dn\u00e9 na moje potreby. Navy\u0161e k\u00f3d vy\u017eaduje menej RAM ke\u010f\u017ee\u00a0 n\u00e1m vypadla jedna premenn\u00e1. A je podstatne r\u00fdchlej\u0161\u00ed. Predsa len delenie 32bit \u010d\u00edsiel nieje pre 8bit CPU trivi\u00e1lna \u00faloha.<\/p>\n<p>Teraz ostal ot\u00e1zne u\u017e len jedno n\u00e1sobenie, je mo\u017en\u00e9 ho optimalizova\u0165? Sk\u00fasme to. Ke\u010f\u017ee sa jedn\u00e1 o n\u00e1sobenie kon\u0161tantou je mo\u017en\u00e9 ho nahradi\u0165 bitov\u00fdm posuvom a s\u00fa\u010dinom.<\/p>\n<pre>\/* read uint32_t 8 chars - 0xFFFFFFFF = error *\/\nuint32_t readul(void) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint8_t x=0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned char c;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t vysledok = 0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c = uart_get();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vysledok = (vysledok &lt;&lt; 1) + (vysledok &lt;&lt; 3);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vysledok = vysledok + (c - '0'); \/\/23\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while ((x &lt; 8) &amp; (c &gt;= '0') &amp; (c &lt;= '9'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x == 8)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(vysledok);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(0xFFFFFFFF);\n}<\/pre>\n<p>V\u00fdsledok je oproti p;vodn\u00e9mu k\u00f3du men\u0161\u00ed o 98 bytov ale jeho pochopenie je o dos\u0165 \u0165a\u017e\u0161ie.<\/p>\n<p>\u010eal\u0161\u00edm adeptom na optimaliz\u00e1ciu je k\u00f3d na v\u00fdpis unsigned long v decim\u00e1lnom form\u00e1te.\u00a0Ale zatia\u013e neviem ako.<\/p>\n<pre>\/* tlac freq *\/\nvoid print_freq(uint32_t freq) {\n        uint8_t y=0;\n        uint32_t tosc;\n        char c[8];\n        tosc = freq;\n        for(y=8;y&gt;0;y--) {\n                c[y-1] = (tosc % 10) + '0';\n                tosc = tosc \/ 10;\n        }\n        for(y=0;y&lt;8;y++)\n                uart_putc(c[y]);\n        uart_putS('nr');\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na jednom projekte som sa dostal na obmedzenia ve\u013ekosti flash v ATtiny2313. Tak som sa vrhol na optimaliz\u00e1ciu (K\u00f3d sa kompiloval z prep\u00edna\u010dom -Os). V k\u00f3de som na\u0161iel len jednu mo\u017enos\u0165 ako optimalizova\u0165 ve\u013ekos\u0165. Zbavi\u0165 sa n\u00e1sobenia a delenia. Vo &hellip; <a href=\"https:\/\/zz-indigo.mavipet.sk\/?p=1541\">Pokra\u010dova\u0165 v \u010d\u00edtan\u00ed <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-1541","post","type-post","status-publish","format-standard","hentry","category-avr"],"_links":{"self":[{"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/posts\/1541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1541"}],"version-history":[{"count":1,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/posts\/1541\/revisions"}],"predecessor-version":[{"id":2654,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=\/wp\/v2\/posts\/1541\/revisions\/2654"}],"wp:attachment":[{"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zz-indigo.mavipet.sk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}