{"id":53751,"date":"2019-12-09T00:00:00","date_gmt":"2019-12-08T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash"},"modified":"2020-02-18T14:01:41","modified_gmt":"2020-02-18T11:01:41","slug":"moya-realizatsiya-koltsevogo-bufera-v-nor-flash","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","title":{"rendered":"Implementimi im i bufrit ring p\u00ebr flash NOR","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"predystoriya\">Historia e m\u00ebparshme<\/h1>\n<p><\/p>\n<p>Ka jan\u00eb automat\u00eb t\u00eb zhvilluar vet\u00eb. Brenda kan\u00eb Raspberry Pi dhe pak rrethana n\u00eb nj\u00eb pllak\u00eb t\u00eb ve\u00e7ant\u00eb. Jan\u00eb t\u00eb lidhur me pranues monedhash, pranues bankar, terminal bankar\u2026 Nj\u00eb program i shkruar vet\u00eb menaxhon gjith\u00e7ka. E gjith\u00eb historia e pun\u00ebs shkruhet n\u00eb nj\u00eb gazet\u00eb n\u00eb flash (MicroSD), e cila m\u00eb pas transferohet p\u00ebrmes internetit (me nj\u00eb modem USB) n\u00eb server, ku ruhet n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash. Informacioni mbi shitjet ngarkohet n\u00eb 1C, gjithashtu ka nj\u00eb nd\u00ebrfaqe t\u00eb thjesht\u00eb web p\u00ebr monitorim etj. <\/p>\n<p><\/p>\n<p>Pra, gazeta \u00ebsht\u00eb jetike \u2014 p\u00ebr regjistrimin (aty jan\u00eb t\u00eb ardhurat, shitjet etj.), monitorimin (\u00e7do lloj defekti dhe rrethana t\u00eb tjera shitore); kjo, mund t\u00eb thuhet, \u00ebsht\u00eb e gjith\u00eb informacioni q\u00eb kemi p\u00ebr k\u00ebt\u00eb automat. <\/p>\n<p><\/p>\n<h1 id=\"problema\">Problemi<\/h1>\n<p><\/p>\n<p>Flash-at tregojn\u00eb se jan\u00eb pajisje shum\u00eb t\u00eb pasigurta. Ato d\u00ebshtojn\u00eb me nj\u00eb rregullshm\u00ebri t\u00eb admirueshme. Kjo \u00e7on n\u00eb ndalesa t\u00eb automat\u00ebve, si dhe (n\u00ebse p\u00ebr ndonj\u00eb arsye gazeta nuk mund t\u00eb transferohet online) n\u00eb humbje t\u00eb dh\u00ebnash.<\/p>\n<p><\/p>\n<p><em>Ky nuk \u00ebsht\u00eb p\u00ebrvoja e par\u00eb me flash-at, m\u00eb par\u00eb kishte nj\u00eb projekt tjet\u00ebr me m\u00eb shum\u00eb se nj\u00ebqind pajisje, ku gazeta ruhej n\u00eb flash USB, aty gjithashtu kishte probleme me besueshm\u00ebrin\u00eb, ndonj\u00ebher\u00eb numri i pajisjeve t\u00eb prishura n\u00eb muaj arrinte dhjet\u00ebra. Provuan flash t\u00eb ndryshme, duke p\u00ebrfshir\u00eb ato mark\u00eb me memorie SLC, po disa modele jan\u00eb m\u00eb t\u00eb besueshme se t\u00eb tjerat, por z\u00ebvend\u00ebsimi i flash-ave nuk zgjidhi problemin n\u00eb m\u00ebnyr\u00eb radikale.<\/em><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<p><strong>Kujdes!<\/strong> Longread! N\u00ebse nuk ju intereson \"pse\", por vet\u00ebm \"si\", mund t\u00eb shkoni menj\u00ebher\u00eb <noindex><a rel=\"nofollow\" href=\"#format\">n\u00eb fund<\/a><\/noindex> artikuj.<\/p>\n<p><\/p>\n<h1 id=\"reshenie\">Zgjidhja<\/h1>\n<p><\/p>\n<p>E para q\u00eb m\u00eb vjen n\u00eb mend: t\u00eb heqim dor\u00eb nga MicroSD, t\u00eb p\u00ebrdorim, p\u00ebr shembull, SSD, dhe t\u00eb ngarkohemi prej tij. Teoretikisht \u00ebsht\u00eb e mundur, ndoshta, por relativisht e shtrenjt\u00eb, dhe nuk \u00ebsht\u00eb ashtu shum\u00eb e besueshme (shtohet nj\u00eb adaptues USB-SATA; statistikat e d\u00ebshtimeve p\u00ebr SSD-t\u00eb buxhetore nuk jan\u00eb inkurajuese gjithashtu).<\/p>\n<p><\/p>\n<p>USB HDD gjithashtu nuk duken zgjidhje shum\u00eb t\u00ebrheq\u00ebse.<\/p>\n<p><\/p>\n<p>Prandaj kemi arritur n\u00eb k\u00ebt\u00eb variant: t\u00eb mbajm\u00eb ngarkimin nga MicroSD, por t'i p\u00ebrdorim ato n\u00eb m\u00ebnyr\u00eb read-only, dhe t\u00eb ruajm\u00eb gazet\u00ebn e pun\u00ebs (dhe informacionin tjet\u00ebr unik p\u00ebr pajisjen \u2014 numrin e seris\u00eb, kalibrimet e sensor\u00ebve, etj.) diku tjet\u00ebr. <\/p>\n<p><\/p>\n<p>Tema e FS read-only p\u00ebr Raspberry Pi \u00ebsht\u00eb studiuar n\u00eb thell\u00ebsi, nuk do t\u00eb ndalem n\u00eb detajet e realizimit n\u00eb k\u00ebt\u00eb artikull <em>(por n\u00ebse do t\u00eb ket\u00eb interes \u2014 ndoshta do t\u00eb shkruaj nj\u00eb mini-artikull mbi k\u00ebt\u00eb tem\u00eb)<\/em>. Nj\u00eb pik\u00eb e vetme q\u00eb do t\u00eb doja t\u00eb theksoja: sipas eksperienc\u00ebs personale dhe p\u00ebrmes komenteve t\u00eb atyre q\u00eb e kan\u00eb implementuar, ka p\u00ebrmir\u00ebsim n\u00eb besueshm\u00ebri. Po, \u00ebsht\u00eb e pamundur t\u00eb eliminosh plot\u00ebsisht defektet, megjithat\u00eb, \u00ebsht\u00eb mjaft e mundshme t\u00eb zvog\u00eblohet ndjesh\u00ebm frekuenca e tyre. P\u00ebr m\u00eb tep\u00ebr, kartat b\u00ebhen uniformeshe, e cila duksh\u00ebm e leht\u00ebson z\u00ebvend\u00ebsimin p\u00ebr personelin e sh\u00ebrbimit.<\/p>\n<p><\/p>\n<h2 id=\"apparatnaya-chast\">Pjesa harduerike<\/h2>\n<p><\/p>\n<p>Nuk kishte dyshime t\u00eb ve\u00e7anta p\u00ebr zgjedhjen e tipit t\u00eb memories \u2014 NOR Flash.<br \/>\nArgumentet: <\/p>\n<p><\/p>\n<ul>\n<li>lidhi t\u00eb thjeshta (zakonisht autobusi SPI, p\u00ebrvoj\u00eb p\u00ebrdorimi e s\u00eb cil\u00ebs tashm\u00eb ekziston, k\u00ebshtu q\u00eb nuk parashikohen probleme \"harduerike\");<\/li>\n<li>\u00e7mim qesharak;<\/li>\n<li>protokoll standard i funksionimit (implementimi \u00ebsht\u00eb tashm\u00eb n\u00eb b\u00ebrtham\u00ebn Linux, n\u00ebse d\u00ebshirohet, mund t\u00eb marr\u00ebsh nj\u00eb t\u00eb tret\u00eb, q\u00eb gjithashtu ekziston, ose madje t\u00eb shkruash tuajin, p\u00ebr t\u00eb cilin gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb);<\/li>\n<li>besueshm\u00ebri dhe q\u00ebndrueshm\u00ebri:<br \/>\nnga nj\u00eb datasheet tipik: t\u00eb dh\u00ebnat ruhen p\u00ebr 20 vjet, 100000 cikle erase p\u00ebr secilin bllok;<br \/>\nnga burime t\u00eb jashtme: BER jasht\u00ebzakonisht i ul\u00ebt, postulohet se nuk \u00ebsht\u00eb e nevojshme t\u00eb p\u00ebrdoren kodet p\u00ebr korrigjimin e gabimeve <em>(n\u00eb disa punime shqyrtohet ECC p\u00ebr NOR, por zakonisht atje kan\u00eb parasysh MLC NOR, ka dhe t\u00eb tilla)<\/em>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Le t\u00eb vler\u00ebsojm\u00eb k\u00ebrkesat p\u00ebr v\u00ebllimin dhe q\u00ebndrueshm\u00ebrin\u00eb.<\/p>\n<p><\/p>\n<p>Kemi d\u00ebshir\u00eb q\u00eb t\u00eb dh\u00ebnat t\u00eb ruhen me garanci p\u00ebr disa dit\u00eb. Kjo \u00ebsht\u00eb e nevojshme p\u00ebr t\u00eb siguruar q\u00eb n\u00eb rast ndonj\u00eb problemi me komunikimin historia e shitjeve t\u00eb mos humbas\u00eb. Do t\u00eb orientoheni n\u00eb 5 dit\u00eb, gjat\u00eb k\u00ebsaj periudhe <em>(edhe duke marr\u00eb parasysh fundjavat dhe festat)<\/em> mund t\u00eb zgjidhet problemi.<\/p>\n<p><\/p>\n<p>Tani p\u00ebr tani, p\u00ebr nj\u00eb dit\u00eb grumbullohen rreth 100kB t\u00eb journal-it (3-4 mij\u00eb regjistrime), megjithat\u00eb gradualisht kjo shif\u00ebr po rritet \u2014 po rritet detajimi, po shtohen ngjarje t\u00eb reja. Gjithashtu ndonj\u00ebher\u00eb ka shp\u00ebrthime (ndonj\u00eb sensor fillon t\u00eb d\u00ebrgoj\u00eb njoftime false, p\u00ebr shembull). Do t\u00eb llogarisim mbi 10 mij\u00eb regjistrime me 100 byte \u2014 nj\u00eb megabajt n\u00eb dit\u00eb.<\/p>\n<p><\/p>\n<p>Pra, gjithsej del 5MB t\u00eb dh\u00ebnash t\u00eb pastra (t\u00eb kompresueshme) p\u00ebrve\u00e7 <em>(vler\u00ebsim i shkrough)<\/em> 1MB t\u00eb dh\u00ebnash sh\u00ebrbimi.<\/p>\n<p><\/p>\n<p>Pra, na nevojitet nj\u00eb \u00e7ip 8MB n\u00ebse nuk p\u00ebrdorim kompresim, ose 4MB n\u00ebse e p\u00ebrdorim. Shifra mjaft reale p\u00ebr k\u00ebt\u00eb lloj memorie.<\/p>\n<p><\/p>\n<p>Sa i p\u00ebrket q\u00ebndrueshm\u00ebris\u00eb: n\u00ebse planifikojm\u00eb q\u00eb memoria t\u00eb riprogramohet jo m\u00eb shpesh se nj\u00eb her\u00eb n\u00eb 5 dit\u00eb, at\u00ebher\u00eb gjat\u00eb 10 vjet\u00ebve t\u00eb sh\u00ebrbimit ne do t\u00eb kemi m\u00eb pak se nj\u00eb mij\u00eb cikle riresh.<br \/>\nKujtoj, prodhuesi premton nj\u00ebqind mij\u00eb.<\/p>\n<p>\n<b class=\"spoiler_title\">Pak p\u00ebr NOR vs NAND<\/b><\/p>\n<p>Sot \u00ebsht\u00eb e sigurt se sot memorie NAND \u00ebsht\u00eb shum\u00eb m\u00eb popullore, megjithat\u00eb p\u00ebr k\u00ebt\u00eb projekt nuk do ta p\u00ebrdora: NAND, n\u00eb krahasim me NOR, domosdoshm\u00ebrisht k\u00ebrkon p\u00ebrdorimin e kodave t\u00eb korrigjimit t\u00eb gabimeve, tabel\u00ebs s\u00eb bllokimeve t\u00eb d\u00ebshtuar, etj., dhe k\u00ebmb\u00ebt e \u00e7ipave NAND zakonisht jan\u00eb shum\u00eb m\u00eb t\u00eb shumta.<\/p>\n<p><\/p>\n<p>Si disavantazhe t\u00eb NOR mund t\u00eb p\u00ebrmenden:<\/p>\n<p><\/p>\n<ul>\n<li>v\u00ebllimi i vog\u00ebl (dhe, p\u00ebr pasoj\u00eb, \u00e7mimi i lart\u00eb p\u00ebr megabajt);<\/li>\n<li>shpejt\u00ebsi e ul\u00ebt e shk\u00ebmbimit (n\u00eb mas\u00eb t\u00eb madhe p\u00ebr shkak se p\u00ebrdoret nj\u00eb nd\u00ebrfaqe sekondare, zakonisht SPI ose I2C);<\/li>\n<li>fshirja e ngadalshme (n\u00eb var\u00ebsi t\u00eb madh\u00ebsis\u00eb s\u00eb bllokut, zgjat nga disa pjes\u00eb t\u00eb sekond\u00ebs deri n\u00eb disa sekonda).<\/li>\n<\/ul>\n<p><\/p>\n<p>Duket se nuk ka asgj\u00eb kritike p\u00ebr ne, k\u00ebshtu q\u00eb vazhdojm\u00eb.<\/p>\n<p><\/p>\n<p>N\u00ebse jan\u00eb t\u00eb interesuara p\u00ebr detajet, \u00ebsht\u00eb zgjedhur \u00e7ipi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.adestotech.com\/wp-content\/uploads\/doc3686.pdf\">at25df321a<\/a><\/noindex> <em>(megithat\u00eb, kjo \u00ebsht\u00eb e par\u00ebnd\u00ebsishme, n\u00eb treg ka shum\u00eb analoge, t\u00eb p\u00ebrshtatshme sipas pinout dhe sistemit t\u00eb komandave; madje edhe n\u00ebse d\u00ebshirojm\u00eb t\u00eb vendosim nj\u00eb \u00e7ip t\u00eb prodhuesit tjet\u00ebr dhe\/ose me nj\u00eb v\u00ebllim t\u00eb ndrysh\u00ebm, gjith\u00e7ka do t\u00eb funksionoj\u00eb pa ndryshuar kodin)<\/em>.<\/p>\n<p><\/p>\n<p>Un\u00eb p\u00ebrdor driver-in e nd\u00ebrtuar n\u00eb b\u00ebrtham\u00ebn Linux, n\u00eb Raspberry fal\u00eb mb\u00ebshtetjes s\u00eb overlay-it t\u00eb pem\u00ebs s\u00eb pajisjeve \u00ebsht\u00eb shum\u00eb e thjesht\u00eb \u2014 thjesht duhet t\u00eb vendos\u00ebsh overlay-n\u00eb e kompiluar n\u00eb \/boot\/overlays dhe t\u00eb modifikosh pak \/boot\/config.txt.<\/p>\n<p>\n<b class=\"spoiler_title\">Shembulli i skedarit dts<\/b><\/p>\n<p>Sinqerisht, nuk jam i sigurt se \u00ebsht\u00eb shkruar pa gabime, por funksionon.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/*\n * Device tree overlay for at25 at spi0.1\n *\/\n\n\/dts-v1\/;\n\/plugin\/;\n\n\/ {\n    compatible = \"brcm,bcm2835\", \"brcm,bcm2836\", \"brcm,bcm2708\", \"brcm,bcm2709\"; \n\n    \/* disable spi-dev for spi0.1 *\/\n    fragment@0 {\n        target = &lt;&amp;spi0&gt;;\n        __overlay__ {\n            status = \"okay\";\n            spidev@1{\n                status = \"disabled\";\n            };\n        };\n    };\n\n    \/* the spi config of the at25 *\/\n    fragment@1 {\n        target = &lt;&amp;spi0&gt;;\n        __overlay__ {\n            #address-cells = &lt;1&gt;;\n            #size-cells = &lt;0&gt;;\n            flash: m25p80@1 {\n                    compatible = \"atmel,at25df321a\";\n                    reg = &lt;1&gt;;\n                    spi-max-frequency = &lt;50000000&gt;;\n\n                    \/* default to false:\n                    m25p,fast-read ;\n                    *\/\n            };\n        };\n    };\n\n    __overrides__ {\n        spimaxfrequency = &lt;&amp;flash&gt;,\"spi-max-frequency:0\";\n        fastread = &lt;&amp;flash&gt;,\"m25p,fast-read?\";\n    };\n};<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Dhe nj\u00eb rresht tjet\u00ebr n\u00eb config.txt<\/b><\/p>\n<pre><code class=\"plaintext\">dtoverlay=at25:spimaxfrequency=50000000<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebrshkrimi i lidhjes s\u00eb \u00e7ipit me Raspberry Pi, e l\u00eb p\u00ebr anash. Nga nj\u00ebra an\u00eb, nuk jam specialist n\u00eb elektronik\u00eb, ndonj\u00ebher\u00eb \u2014 kjo \u00ebsht\u00eb shum\u00eb e thjesht\u00eb edhe p\u00ebr mua: \u00e7ipi ka vet\u00ebm 8 ngjyr\u00eb, nga t\u00eb cilat na nevojitet toka, energjia, SPI (CS, SI, SO, SCK); nivelet p\u00ebrputhen me ato t\u00eb Raspberry Pi, nuk k\u00ebrkohet ndonj\u00eb p\u00ebrb\u00ebrje shtes\u00eb \u2014 thjesht lidhni k\u00ebto 6 kontakte t\u00eb sh\u00ebnuara.<\/p>\n<p><\/p>\n<h2 id=\"postanovka-zadachi\">Formulimi i detyr\u00ebs<\/h2>\n<p><\/p>\n<p>Si zakonisht, formulimi i detyr\u00ebs kalon n\u00eb disa iteracione, mendoj se ka ardhur koha p\u00ebr nj\u00eb tjet\u00ebr. K\u00ebshtu q\u00eb t\u00eb ndalojm\u00eb, t\u00eb mbledhim s\u00eb bashku at\u00eb q\u00eb \u00ebsht\u00eb shkruar tashm\u00eb dhe t\u00eb sqarojm\u00eb detajet q\u00eb mbeten n\u00eb hije.<\/p>\n<p><\/p>\n<p>Pra, ne kemi vendosur q\u00eb revista do t\u00eb ruhet n\u00eb SPI NOR Flash.<\/p>\n<p>\n<b class=\"spoiler_title\">\u00c7far\u00eb \u00ebsht\u00eb NOR Flash p\u00ebr ata q\u00eb nuk e din\u00eb<\/b><\/p>\n<p>Kjo \u00ebsht\u00eb memorie q\u00eb nuk humb energjin\u00eb, me t\u00eb cil\u00ebn mund t\u00eb b\u00ebjm\u00eb tre operacione:<\/p>\n<p><\/p>\n<ol>\n<li>Leximi:<br \/>\nLeximi m\u00eb i zakonsh\u00ebm: d\u00ebrgojm\u00eb adres\u00ebn dhe lexojm\u00eb aq byte sa na nevojitet;<\/li>\n<li>Shkrimi:<br \/>\nN\u00eb NOR flash, shkrimi duket si zakonisht, por ka nj\u00eb karakteristik\u00eb: mund t\u00eb ndryshoni vet\u00ebm 1 n\u00eb 0, por jo e kund\u00ebrta. P\u00ebr shembull, n\u00ebse n\u00eb qeliz\u00ebn e memories ishte 0x55, pasi t\u00eb shkruajm\u00eb 0x0f atje do t\u00eb ruhet 0x05. <em>(shih tabel\u00ebn pak m\u00eb posht\u00eb)<\/em>;<\/li>\n<li>Fshi:<br \/>\nNatyrisht, na nevojitet t\u00eb b\u00ebjm\u00eb edhe operacionin e kund\u00ebrt \u2014 t\u00eb ndryshojm\u00eb 0 n\u00eb 1, p\u00ebr k\u00ebt\u00eb arsye ekziston operacioni fshi. I ndrysh\u00ebm nga dy t\u00eb par\u00ebt, ai punon me blloqe (blloku minimal i fshirjes n\u00eb \u00e7ipin p\u00ebrkat\u00ebs \u00ebsht\u00eb 4kb). Fshirja shkat\u00ebrron t\u00eb gjith\u00eb bllokun si nj\u00eb nj\u00ebsi dhe kjo \u00ebsht\u00eb m\u00ebnyra e vetme p\u00ebr t\u00eb ndryshuar 0 n\u00eb 1. Prandaj, kur punoni me flash memory shpesh duhet t\u00eb rregulloni strukturat e t\u00eb dh\u00ebnave n\u00eb kufirin e bllokut t\u00eb fshirjes.<br \/>\nShkrimi n\u00eb NOR Flash:<\/li>\n<\/ol>\n<p><\/p>\n<p>T\u00eb dh\u00ebna binar\u00eb<\/p>\n<p><strong>Ishte<\/strong><br \/>\n<code>01010101<\/code><\/p>\n<p><strong>E shkruam<\/strong><br \/>\n<code>00001111<\/code><\/p>\n<p><strong>U b\u00eb<\/strong><br \/>\n<code>00000101<\/code><\/p>\n<p><\/p>\n<p>Dhe libri i regjistrimeve \u00ebsht\u00eb nj\u00eb varg shkrimesh me gjat\u00ebsi t\u00eb ndryshueshme. Gjat\u00ebsia tipike e nj\u00eb shkrimi \u00ebsht\u00eb rreth 30 byte (nd\u00ebrsa ndonj\u00ebher\u00eb ndodhin edhe shkrime me gjat\u00ebsi disa kilobajt). <em>N\u00eb k\u00ebt\u00eb rast, ne punojm\u00eb me to thjesht si nj\u00eb grup byte-esh, por, n\u00ebse jeni t\u00eb interesuar, brenda shkrimeve p\u00ebrdoret CBOR.<\/em><\/p>\n<p><\/p>\n<p>P\u00ebrve\u00e7 revist\u00ebs, na duhet t\u00eb ruajm\u00eb disa informacione \"konfigurimi\", si ato q\u00eb p\u00ebrdit\u00ebsohen, ashtu edhe jo: nj\u00eb ID aparati t\u00eb caktuar, kalibrimet e sensor\u00ebve, nj\u00eb flamur \"aparati \u00ebsht\u00eb p\u00ebrkoh\u00ebsisht i fikur\", etj.<br \/>\nK\u00ebto informacione p\u00ebrb\u00ebjn\u00eb nj\u00eb grup shkrimesh key-value, gjithashtu ruhet n\u00eb CBOR. K\u00ebto informacione nuk jan\u00eb shum\u00eb (maksimalisht disa kilobajt), dhe ato p\u00ebrdit\u00ebsohen jo shpesh.<br \/>\nM\u00eb von\u00eb do t'i referohemi si konteksti.<\/p>\n<p><\/p>\n<p>N\u00ebse kujtojm\u00eb nga e filluam k\u00ebt\u00eb artikull, \u00ebsht\u00eb shum\u00eb e r\u00ebnd\u00ebsishme t\u00eb sigurohet besueshm\u00ebria e ruajtjes s\u00eb t\u00eb dh\u00ebnave dhe, sa m\u00eb shum\u00eb t\u00eb jet\u00eb e mundur, puna e nd\u00ebrprer\u00eb edhe n\u00eb rast t\u00eb pap\u00ebrfundimeve\/humbjeve t\u00eb t\u00eb dh\u00ebnave.<\/p>\n<p><\/p>\n<p>Cilat burime problemesh mund t\u00eb shqyrtojm\u00eb?<\/p>\n<p><\/p>\n<ul>\n<li>Nd\u00ebrprerja e energjis\u00eb n\u00eb momentin e operacioneve write\/erase. Kjo \u00ebsht\u00eb nga ajo lloj \"kund\u00ebr shpive nuk ka pranimi\".<br \/>\nInformacioni nga <noindex><a rel=\"nofollow\" href=\"https:\/\/electronics.stackexchange.com\/questions\/225956\/what-would-happen-in-case-of-power-outage-during-nor-flash-erase-or-programming\">diskutim<\/a><\/noindex> n\u00eb stackexchange: kur nd\u00ebrpritet energjia gjat\u00eb pun\u00ebs me flash \u00e7far\u00eb erase (vendosja n\u00eb 1), \u00e7far\u00eb write (vendosja n\u00eb 0) \u00e7on n\u00eb sjellje t\u00eb paqart\u00eb: t\u00eb dh\u00ebnat mund t\u00eb shkruhen, t\u00eb shkruhen pjes\u00ebrisht (p.sh., ne kaluam 10 byte\/80 bit, por arrit\u00ebm t\u00eb shkruajm\u00eb vet\u00ebm 45 bit), nuk p\u00ebrjashtohet as q\u00eb disa bit t\u00eb mbesin n\u00eb nj\u00eb \"gjendje nd\u00ebrmjet\u00ebse\" (leximi mund t\u00eb jap\u00eb si 0 ashtu edhe 1);<\/li>\n<li>Gabime t\u00eb flash memory vet.<br \/>\nBER, ndon\u00ebse shum\u00eb i ul\u00ebt, nuk mund t\u00eb jet\u00eb zero;<\/li>\n<li>Gabime n\u00eb autobusin<br \/>\nT\u00eb dh\u00ebnat q\u00eb transmetohen p\u00ebrmes SPI nuk jan\u00eb aspak t\u00eb mbrojtura, mund t\u00eb ndodhin gabime t\u00eb vetme bitesh, si dhe gabime sinkronizimi \u2014 humbja ose shtimi i bit\u00ebve (\u00e7ka shkakton deformime masive t\u00eb t\u00eb dh\u00ebnave);<\/li>\n<li>Gabime \/ d\u00ebshtime t\u00eb tjera<br \/>\nK\u00ebto jan\u00eb gabime n\u00eb kod, \"glitch\" t\u00eb Raspberry, nd\u00ebrhyrje nga alien\u00ebt\u2026<\/li>\n<\/ul>\n<p><\/p>\n<p>Kam formuluar k\u00ebrkesat, plot\u00ebsimi i t\u00eb cilave, sipas mendimit tim, \u00ebsht\u00eb i domosdosh\u00ebm p\u00ebr sigurimin e q\u00ebndrueshm\u00ebris\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>sh\u00ebnimet duhet t\u00eb kalojn\u00eb menj\u00ebher\u00eb n\u00eb memorjen flash, sh\u00ebnimi i vonuar nuk konsiderohet; - n\u00ebse ndodh nj\u00eb gabim, duhet t\u00eb zbulohet dhe trajtohet sa m\u00eb shpejt t\u00eb jet\u00eb e mundur; - sistemi duhet, sa t\u00eb jet\u00eb e mundur, t\u00eb rikuperoj\u00eb funksionimin pas gabimeve.<br \/>\n<em>(nj\u00eb shembull nga jeta \"si nuk duhet t\u00eb jet\u00eb\", me t\u00eb cilin mendoj se t\u00eb gjith\u00eb jemi p\u00ebrballur: pas nj\u00eb rinisjeje emergjente \"u prish\" sistemi i skedar\u00ebve dhe sistemi operativ nuk ngrihet)<\/em><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"idei-podhody-razmyshleniya\">Ide, m\u00ebnyra, reflektime<\/h2>\n<p><\/p>\n<p>Kur fillova t\u00eb mendoj p\u00ebr k\u00ebt\u00eb detyr\u00eb, n\u00eb mendjen time kalonin nj\u00eb mori idesh, p\u00ebr shembull:<\/p>\n<p><\/p>\n<ul>\n<li>p\u00ebrdorimi i kompresimit t\u00eb t\u00eb dh\u00ebnave;<\/li>\n<li>p\u00ebrdorimi i strukturave t\u00eb sofistikuara t\u00eb t\u00eb dh\u00ebnave, p\u00ebr shembull, ruajtja e titujve t\u00eb sh\u00ebnimeve ndaras nga vet\u00eb shenimet, n\u00eb m\u00ebnyr\u00eb q\u00eb n\u00ebse ndodhi nj\u00eb gabim n\u00eb ndonj\u00eb sh\u00ebnim, mund t\u00eb lexohet pa probleme pjesa tjet\u00ebr;<\/li>\n<li>p\u00ebrdorimi i fushave bit p\u00ebr kontrollimin e p\u00ebrfundimit t\u00eb sh\u00ebnimeve n\u00eb rast ndalimi t\u00eb energjis\u00eb;<\/li>\n<li>ruajtja e kontrolleve sumative p\u00ebr gjith\u00e7ka;<\/li>\n<li>p\u00ebrdorimi i ndonj\u00eb lloji t\u00eb kodimit t\u00eb q\u00ebndruesh\u00ebm ndaj nd\u00ebrhyrjeve.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pjesa m\u00eb e madhe e k\u00ebtyre ideve u p\u00ebrdor, disa u vendos\u00ebn t\u00eb braktiseshin. Le t\u00eb shkojm\u00eb radhazi.<\/p>\n<p><\/p>\n<h3 id=\"szhatie-dannyh\">Kompresimi i t\u00eb dh\u00ebnave<\/h3>\n<p><\/p>\n<p>Ngjarjet vet\u00eb, t\u00eb cilat ne i regjistrojm\u00eb n\u00eb revist\u00eb, jan\u00eb mjaft nj\u00ebtrajt\u00ebsore dhe t\u00eb p\u00ebrs\u00ebritura (\"hedhim monedh\u00ebn 5 lek\u00eb\", \"shtypim butonin p\u00ebr t\u00eb marr\u00eb k\u00ebmbimin\", ...). Prandaj, kompresimi duhet t\u00eb jet\u00eb mjaft efikas.<\/p>\n<p><\/p>\n<p>Shpenzimet p\u00ebr kompresim jan\u00eb t\u00eb pap\u00ebrfillshme (procesori yn\u00eb \u00ebsht\u00eb mjaft i fuqish\u00ebm, madje edhe n\u00eb Pi-n\u00eb e par\u00eb kishte nj\u00eb b\u00ebrtham\u00eb me frekuenc\u00eb 700MHZ, n\u00eb modelet aktuale disa b\u00ebrthama me frekuenc\u00eb mbi nj\u00eb gigaherz), shpejt\u00ebsia e komunikimit me magazin\u00ebn nuk \u00ebsht\u00eb e lart\u00eb (disa megabajt n\u00eb sekond\u00eb), madh\u00ebsia e sh\u00ebnimeve \u00ebsht\u00eb e vog\u00ebl. P\u00ebr nj\u00eb rezultat, n\u00ebse kompresimi do t\u00eb ket\u00eb ndonj\u00eb ndikim n\u00eb performanc\u00eb, do t\u00eb jet\u00eb vet\u00ebm pozitiv <em>(absolutisht e par\u00ebnd\u00ebsishme, thjesht po konstaton)<\/em>. Po t\u00eb gjith\u00eb e dim\u00eb se nuk \u00ebsht\u00eb embedded i v\u00ebrtet\u00eb, por nj\u00eb Linux i zakonsh\u00ebm \u2014 k\u00ebshtu q\u00eb implementimi nuk duhet t\u00eb k\u00ebrkoj\u00eb shum\u00eb p\u00ebrpjekje (mjafton t\u00eb lidhim bibliotek\u00ebn dhe t\u00eb p\u00ebrdorim disa funksione prej saj).<\/p>\n<p><\/p>\n<p>Ishte marr\u00eb nj\u00eb pjes\u00eb e logut nga nj\u00eb pajisje n\u00eb funksionim (1.7Mb, 70 mij\u00eb regjistra) dhe fillimisht u kontrollua p\u00ebr kompresion duke p\u00ebrdorur gzip, lz4, lzop, bzip2, xz, zstd q\u00eb ishin n\u00eb kompjuter.<\/p>\n<p><\/p>\n<ul>\n<li>gzip, xz, zstd treguan rezultate t\u00eb ngjashme (40Kb).<br \/>\nM\u00eb habit q\u00eb xz i mod\u00ebs u tregua k\u00ebtu n\u00eb nivelin e gzip ose zstd;<\/li>\n<li>lzip me cil\u00ebsimet e paracaktuara dha nj\u00eb rezultat pak m\u00eb t\u00eb keq;<\/li>\n<li>lz4 dhe lzop treguan nj\u00eb rezultat jo shum\u00eb t\u00eb mir\u00eb (150Kb);<\/li>\n<li>bzip2 tregoi nj\u00eb rezultat p\u00ebr habi t\u00eb mir\u00eb (18Kb).<\/li>\n<\/ul>\n<p><\/p>\n<p>Pra, t\u00eb dh\u00ebnat kompresohen shum\u00eb mir\u00eb.<br \/>\nK\u00ebshtu q\u00eb (n\u00ebse nuk gjejm\u00eb disavantazhe fatale) kompresimi do t\u00eb jet\u00eb! Thjesht sepse m\u00eb shum\u00eb t\u00eb dh\u00ebna do t\u00eb mund t\u00eb ruhen n\u00eb t\u00eb nj\u00ebjt\u00ebn flash.<\/p>\n<p><\/p>\n<p>Le t\u00eb mendojm\u00eb p\u00ebr disavantazhet.<\/p>\n<p><\/p>\n<p>Problemi i par\u00eb: ne tashm\u00eb u dakorduam se \u00e7do regjist\u00ebr duhet t\u00eb shkoj\u00eb menj\u00ebher\u00eb n\u00eb flash. Zakonisht, arkivatori grumbullon t\u00eb dh\u00ebna nga rrjedha hyr\u00ebse derisa t\u00eb vendos\u00eb se \u00ebsht\u00eb koha t\u00eb shkruaj\u00eb n\u00eb dal\u00ebse. Ne na nevojitet menj\u00ebher\u00eb nj\u00eb bllok i compruar t\u00eb dh\u00ebnash dhe ta ruajm\u00eb at\u00eb n\u00eb memorie q\u00eb nuk humbet energjin\u00eb.<\/p>\n<p><\/p>\n<p>Un\u00eb shoh tre rrug\u00eb:<\/p>\n<p><\/p>\n<ol>\n<li>T\u00eb kompresojm\u00eb \u00e7do regjist\u00ebr me ndihm\u00ebn e kompresionit me fjalor n\u00eb vend t\u00eb algoritmeve t\u00eb shqyrtuara m\u00eb sip\u00ebr.<br \/>\nNj\u00eb variant plot\u00ebsisht funksional, por nuk m\u00eb p\u00eblqen. P\u00ebr t\u00eb siguruar nj\u00eb nivel m\u00eb t\u00eb arsyesh\u00ebm kompresimi, fjalori duhet t\u00eb jet\u00eb \"i predispozuar\" p\u00ebr t\u00eb dh\u00ebnat e caktuara, \u00e7do ndryshim do t\u00eb \u00e7oj\u00eb n\u00eb nj\u00eb r\u00ebnie katastrofike t\u00eb nivelit t\u00eb kompresimit. Po, problemin e zgjidh krijimi i nj\u00eb versioni t\u00eb ri t\u00eb fjalorit, por ky \u00ebsht\u00eb nj\u00eb shqet\u00ebsim \u2014 na duhet t\u00eb ruajm\u00eb t\u00eb gjitha versionet e fjalorit; n\u00eb secil\u00ebn rekord na duhet t\u00eb tregojm\u00eb se me cilin version t\u00eb fjalorit \u00ebsht\u00eb kompresuar...<\/li>\n<li>T\u00eb kompresosh \u00e7do rekord me algoritm\u00ebt \"klasik\u00eb\", por n\u00eb m\u00ebnyr\u00eb t\u00eb pavarur nga t\u00eb tjer\u00ebt.<br \/>\nAlgoritmet e shqyrtuara p\u00ebr kompresion nuk jan\u00eb t\u00eb dizajnuara p\u00ebr t\u00eb punuar me regjistra t\u00eb till\u00eb n\u00eb k\u00ebt\u00eb madh\u00ebsi (disa dhjet\u00ebra byte), koeficienti i kompresionit do t\u00eb jet\u00eb duksh\u00ebm m\u00eb i vog\u00ebl se 1 (dmth, rritje e volumit t\u00eb t\u00eb dh\u00ebnave n\u00eb vend t\u00eb kompresimit);<\/li>\n<li>T\u00eb b\u00ebjm\u00eb FLUSH pas \u00e7donj\u00eb regjistri.<br \/>\nN\u00eb shum\u00eb biblioteka t\u00eb kompresionit ka mb\u00ebshtetje p\u00ebr FLUSH. Kjo \u00ebsht\u00eb nj\u00eb komand\u00eb (ose nj\u00eb paramet\u00ebr p\u00ebr procedur\u00ebn e kompresionit), dhe duke e marr\u00eb, arkivatori formon nj\u00eb rrjedh\u00eb t\u00eb kompresuar n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb rikthej\u00eb <strong>t\u00eb gjith\u00eb<\/strong> t\u00eb dh\u00ebnat e pakompresuar, t\u00eb cilat tashm\u00eb ishin marr\u00eb. Nj\u00eb analog i till\u00eb <code>sync<\/code> n\u00eb sistemet e skedar\u00ebve ose <code>commit<\/code> n\u00eb sql.<br \/>\n\u00c7far\u00eb \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, operacionet e ardhshme t\u00eb kompresimit do t\u00eb jen\u00eb n\u00eb gjendje t\u00eb p\u00ebrdorin fjalorin e akumuluar dhe shkalla e kompresimit nuk do t\u00eb vuaj\u00eb aq shum\u00eb si n\u00eb variantin e m\u00ebparsh\u00ebm.<\/li>\n<\/ol>\n<p><\/p>\n<p>Mendoj se \u00ebsht\u00eb e qart\u00eb q\u00eb kam zgjedhur opsionin e tret\u00eb, le t\u00eb ndalemi pak m\u00eb shum\u00eb te ai.<\/p>\n<p><\/p>\n<p>U gjet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bolet.org\/~pornin\/deflate-flush.html\">artikull i shk\u00eblqyer<\/a><\/noindex> p\u00ebr FLUSH n\u00eb zlib.<\/p>\n<p><\/p>\n<p>B\u00ebra nj\u00eb test t\u00eb ngarkes\u00ebs n\u00eb frym\u00ebzim t\u00eb nj\u00eb artikulli, mora 70 mij\u00eb regjistrime t\u00eb logarit nga nj\u00eb pajisje reale, me nj\u00eb madh\u00ebsi faqe prej 60KB <em>(p\u00ebr madh\u00ebsin\u00eb e faqes do t\u00eb kthehemi m\u00eb von\u00eb)<\/em> mora:<\/p>\n<p><\/p>\n<p>T\u00eb dh\u00ebnat burimore<br \/>\nKompresimi gzip -9 (pa FLUSH)<br \/>\nzlib me Z_PARTIAL_FLUSH<br \/>\nzlib me Z_SYNC_FLUSH<\/p>\n<p><strong>V\u00ebllimi, KB<\/strong><br \/>\n1692<br \/>\n40<br \/>\n352<br \/>\n604<\/p>\n<p><\/p>\n<p>N\u00eb pamje t\u00eb par\u00eb, \u00e7mimi q\u00eb sjell FLUSH \u00ebsht\u00eb tep\u00ebr i lart\u00eb, megjithat\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb kemi nj\u00eb zgjedhje t\u00eb varf\u00ebr - ose t\u00eb mos kompresojm\u00eb fare, ose t\u00eb kompresojm\u00eb (dhe shum\u00eb efektivisht) me FLUSH. Nuk duhet t\u00eb harrojm\u00eb se kemi 70 mij\u00eb regjistrime, teprica q\u00eb sjell Z_PARTIAL_FLUSH \u00ebsht\u00eb vet\u00ebm 4-5 byte p\u00ebr regjistrim. Nd\u00ebrsa koeficienti i kompresimit rezultoi t\u00eb ishte pothuajse 5:1, q\u00eb \u00ebsht\u00eb m\u00eb shum\u00eb se nj\u00eb rezultat i shk\u00eblqyer.<\/p>\n<p>\n<b class=\"spoiler_title\">Mund t\u00eb duket befasues, por n\u00eb t\u00eb v\u00ebrtet\u00eb Z_SYNC_FLUSH \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb m\u00eb efikase p\u00ebr t\u00eb b\u00ebr\u00eb FLUSH<\/b><\/p>\n<p>N\u00eb rastin e p\u00ebrdorimit t\u00eb Z_SYNC_FLUSH, kat\u00ebr byte t\u00eb fundit t\u00eb \u00e7do regjistrimi do t\u00eb jen\u00eb gjithmon\u00eb 0x00, 0x00, 0xff, 0xff. Dhe n\u00ebse i dim\u00eb ata - mund t'i heqim, k\u00ebshtu q\u00eb madh\u00ebsia p\u00ebrfundimtare rezulton t\u00eb jet\u00eb vet\u00ebm 324KB.<\/p>\n<p><\/p>\n<p>N\u00eb artikullin q\u00eb citoj, ka nj\u00eb shpjegim:<\/p>\n<p><\/p>\n<blockquote><p>Nj\u00eb bllok i ri i tipit 0 me p\u00ebrmbajtje bosh \u00ebsht\u00eb shtuar.<\/p>\n<p>Nj\u00eb bllok i tipit 0 me p\u00ebrmbajtje bosh p\u00ebrb\u00ebhet nga:<\/p>\n<ul>\n<li>kryesori i bllokut me tre bit;<\/li>\n<li>0 n\u00eb 7 bit t\u00eb barabart\u00eb me zero, p\u00ebr t\u00eb arritur p\u00ebrputhshm\u00ebrin\u00eb e bajt\u00ebve;<\/li>\n<li>sekuenca kat\u00ebr bajt\u00ebshe 00 00 FF FF.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Si\u00e7 \u00ebsht\u00eb e leht\u00eb p\u00ebr t'u v\u00ebrejtur, n\u00eb bllokun e fundit para k\u00ebtyre 4 bajt\u00ebve ndodhin nga 3 deri n\u00eb 10 bit zero. Megjithat\u00eb, praktika ka treguar se bit\u00ebt zero n\u00eb t\u00eb v\u00ebrtet\u00eb jan\u00eb minimalisht 10.<\/p>\n<p><\/p>\n<p>Ajo q\u00eb zbulohet, k\u00ebto blloqe kaq t\u00eb shkurtra t\u00eb t\u00eb dh\u00ebnave zakonisht (p\u00ebrgjith\u00ebsisht?) kodohen me nj\u00eb bllok t\u00eb tipit 1 (bllok i caktuar), i cili domosdoshm\u00ebrisht p\u00ebrfundon me 7 bit zero, k\u00ebshtu q\u00eb marrim 10-17 bit zero me siguri (dhe bit\u00ebt e tjer\u00eb do t\u00eb jen\u00eb zero me nj\u00eb probabilitet rreth 50%).<\/p>\n<p><\/p>\n<p>Pra, n\u00eb t\u00eb dh\u00ebnat e testit, n\u00eb 100% t\u00eb rasteve para 0x00, 0x00, 0xff, 0xff vjen nj\u00eb bajt zero, nd\u00ebrsa m\u00eb shum\u00eb se nj\u00eb t\u00eb tret\u00ebn e rasteve - dy bajt\u00eb zero <em>(ndoshta, shkaku \u00ebsht\u00eb q\u00eb un\u00eb po p\u00ebrdor CBOR binar, nd\u00ebrsa gjat\u00eb p\u00ebrdorimit t\u00eb JSON-it tekstual do t\u00eb haseshin m\u00eb shum\u00eb blloqe t\u00eb tipit 2 - bllok dinamik, p\u00ebrkat\u00ebsisht do t\u00eb haseshin blloqe pa bajt\u00eb zero shtes\u00eb para 0x00, 0x00, 0xff, 0xff)<\/em>.<\/p>\n<p><\/p>\n<p>Prandaj, n\u00eb t\u00eb dh\u00ebnat e testit t\u00eb disponueshme mund t\u00eb arrijm\u00eb t\u00eb q\u00ebndrojm\u00eb n\u00ebn 250KB t\u00eb t\u00eb dh\u00ebnave t\u00eb kompresuara.<\/p>\n<p><\/p>\n<p>Mund t\u00eb kurseni pak m\u00eb shum\u00eb duke u angazhuar n\u00eb hedhjen e bit\u00ebve: tani po injorojm\u00eb pranin\u00eb e disa bit\u00ebve zero n\u00eb fund t\u00eb bllokut, disa bita n\u00eb fillim t\u00eb bllokut gjithashtu nuk ndryshojn\u00eb...<br \/>\nPor k\u00ebtu mora nj\u00eb vendim t\u00eb fort\u00eb p\u00ebr t\u00eb ndalur, ndryshe mund t\u00eb arrija deri te zhvillimi i arkivuesit tim.<\/p>\n<p><\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, un\u00eb nga t\u00eb dh\u00ebnat e mia testuese mora 3-4 byte n\u00eb shkrim, faktori i kompresimit rezultoi m\u00eb shum\u00eb se 6:1. Do t\u00eb jem i sinqert\u00eb: nuk kisha pritur nj\u00eb rezultat t\u00eb till\u00eb, p\u00ebr mendimin tim, gjith\u00e7ka q\u00eb \u00ebsht\u00eb m\u00eb mir\u00eb se 2:1 \u00ebsht\u00eb tashm\u00eb nj\u00eb p\u00ebrfitim q\u00eb justifikon p\u00ebrdorimin e kompresimit.<\/p>\n<p><\/p>\n<p>Gjith\u00e7ka \u00ebsht\u00eb perfekte, por zlib (deflate) p\u00ebrfundimisht \u00ebsht\u00eb nj\u00eb algorit\u00ebm kompresimi i njohur dhe disi i mod\u00ebs s\u00eb vjet\u00ebr. Nj\u00eb ndihm\u00eb e vetme q\u00eb p\u00ebrdor si fjalor 32Kb t\u00eb fundit nga rrjedha e t\u00eb dh\u00ebnave t\u00eb pakompresuara, sot duket e \u00e7uditshme (do t\u00eb thot\u00eb se n\u00ebse ndonj\u00eb bllok t\u00eb dh\u00ebnash \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me at\u00eb q\u00eb ishte n\u00eb rrjedh\u00ebn hyr\u00ebse 40Kb m\u00eb par\u00eb, ai do t\u00eb filloj\u00eb t\u00eb arkivohet p\u00ebrs\u00ebri, dhe nuk do t\u00eb referohet n\u00eb hyrjen e kaluar). N\u00eb arkivuesit modern\u00eb t\u00eb mod\u00ebs, madh\u00ebsia e fjalorit m\u00eb shpesh matet n\u00eb megabajt\u00eb, jo n\u00eb kilobajt\u00eb.<\/p>\n<p><\/p>\n<p>Prandaj, vazhdojm\u00eb hulumtimin ton\u00eb t\u00eb vog\u00ebl p\u00ebr arkivuesit.<\/p>\n<p><\/p>\n<p>Tjetri q\u00eb u provua ishte bzip2 (m\u00eb kujtohet, pa FLUSH tregoi nj\u00eb grad\u00eb fantastike kompresimi, gati 100:1). Fatkeq\u00ebsisht, me FLUSH, ai tregoi performanc\u00eb shum\u00eb t\u00eb dob\u00ebt, madh\u00ebsia e t\u00eb dh\u00ebnave t\u00eb kompresuara rezultoi m\u00eb e madhe se e pakompresuar.<\/p>\n<p>\n<b class=\"spoiler_title\">Hipotezat e mia p\u00ebr arsyet e d\u00ebshtimit<\/b><\/p>\n<p>Libbz2 ofron vet\u00ebm nj\u00eb opsion flush, i cili, duket, pastron fjalorin (analogu i Z_FULL_FLUSH n\u00eb zlib), nuk mund t\u00eb flasim p\u00ebr ndonj\u00eb kompresim efektiv pas k\u00ebsaj.<\/p>\n<p><\/p>\n<p>Dhe i fundit q\u00eb u provua ishte zstd. N\u00eb var\u00ebsi t\u00eb parametrave, ai kompreson ose n\u00eb nivele gzip, por shum\u00eb m\u00eb shpejt, ose m\u00eb mir\u00eb se gzip.<\/p>\n<p><\/p>\n<p>Fatkeq\u00ebsisht, me FLUSH dhe ai tregoi veten \"jo shum\u00eb\": madh\u00ebsia e t\u00eb dh\u00ebnave t\u00eb kompresuara ishte rreth 700Kb.<\/p>\n<p><\/p>\n<p>Un\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/zstd\/issues\/900\">b\u00ebri nj\u00eb pyetje<\/a><\/noindex> n\u00eb faqen e projektit n\u00eb github, mora p\u00ebrgjigje q\u00eb duhej t\u00eb pritej deri n\u00eb 10 byte t\u00eb dh\u00ebnash sh\u00ebrbimi p\u00ebr \u00e7do bllok t\u00eb dh\u00ebnash t\u00eb kompresuara, q\u00eb \u00ebsht\u00eb af\u00ebrt me rezultatet e marra, nuk mund t\u00eb arrij\u00eb deflate n\u00eb asnj\u00eb m\u00ebnyr\u00eb.<\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb pik\u00eb vendosa t\u00eb ndalem me eksperimentet me arkivuesit (nd\u00ebrsa xz, lzip, lzo, lz4 nuk u treguan mir\u00eb ende n\u00eb faz\u00ebn e testimit pa FLUSH, dhe nuk do t\u00eb shqyrtoj algoritme kompresimi m\u00eb ekzotike).<\/p>\n<p><\/p>\n<p>Kthehemi te problemet e arkivimit.<\/p>\n<p><\/p>\n<p>Problemi i dyt\u00eb (si\u00e7 thuhen sipas rendit, dhe jo sipas kuptimit) \u00ebsht\u00eb se t\u00eb dh\u00ebnat e shkurtra p\u00ebrb\u00ebjn\u00eb nj\u00eb rrjedh\u00eb t\u00eb vetme, n\u00eb t\u00eb cil\u00ebn vazhdimisht ka referenca p\u00ebr pjes\u00ebt e m\u00ebparshme. K\u00ebshtu, n\u00eb rast se ndonj\u00eb pjes\u00eb e t\u00eb dh\u00ebnave t\u00eb shkurtra d\u00ebmtohet, ne humbasim jo vet\u00ebm blokun e pap\u00ebrpunuar t\u00eb lidhur me t\u00eb, por edhe t\u00eb gjith\u00eb pasuesit.<\/p>\n<p><\/p>\n<p>Ka dy qasje p\u00ebr zgjidhjen e k\u00ebtij problemi:<\/p>\n<p><\/p>\n<ol>\n<li>Parandaj shfaqjen e problemit \u2014 duke shtuar n\u00eb t\u00eb dh\u00ebnat e shkurtra tepric\u00eb, e cila do t\u00eb lejoj\u00eb identifikimin dhe korrigjimin e gabimeve; p\u00ebr k\u00ebt\u00eb do t\u00eb flasim m\u00eb von\u00eb;<\/li>\n<li>Minimizoni pasojat n\u00eb rastin e shfaqjes s\u00eb problemit<br \/>\nKemi th\u00ebn\u00eb m\u00eb par\u00eb se mund t\u00eb kompresojm\u00eb \u00e7do blok t\u00eb dh\u00ebnash n\u00eb m\u00ebnyr\u00eb t\u00eb pavarur, n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb problemi do t\u00eb zhduket nga vet\u00eb. (D\u00ebmtimi i t\u00eb dh\u00ebnave t\u00eb nj\u00eb bloku do t\u00eb rezultoj\u00eb n\u00eb humbjen e t\u00eb dh\u00ebnave vet\u00ebm t\u00eb atij bloku). Megjithat\u00eb, kjo \u00ebsht\u00eb nj\u00eb rast ekstrem, ku kompresimi i t\u00eb dh\u00ebnave do t\u00eb ishte joefektiv. Ekstremi tjet\u00ebr: p\u00ebrdorimi i t\u00eb gjith\u00eb 4Mb t\u00eb \u00e7ip-it ton\u00eb si nj\u00eb arkiv t\u00eb vet\u00ebm, q\u00eb do t\u00eb na jepte nj\u00eb kompresim t\u00eb shk\u00eblqyer, por pasojat katastrofike n\u00eb rast se ndodhte ndonj\u00eb d\u00ebmtim i t\u00eb dh\u00ebnave.<br \/>\n<em>Po, \u00ebsht\u00eb e nevojshme nj\u00eb kompromis nga pik\u00ebpamja e besueshm\u00ebris\u00eb. Por duhet kujtuar se ne po zhvillojm\u00eb nj\u00eb format ruajtjeje t\u00eb t\u00eb dh\u00ebnave p\u00ebr memorie t\u00eb pavarur nga energjia me BER jasht\u00ebzakonisht t\u00eb ul\u00ebt dhe nj\u00eb periudh\u00eb ruajtjeje t\u00eb deklaruar prej 20 vjet\u00ebsh.<\/em><\/li>\n<\/ol>\n<p><\/p>\n<p>N\u00eb procesin e eksperimenteve, zbulova se humbjet m\u00eb t\u00eb dukshme n\u00eb nivelin e kompresimit fillojn\u00eb n\u00eb blloqet e dh\u00ebnave t\u00eb shkurtra me madh\u00ebsi m\u00eb t\u00eb vog\u00ebl se 10Kb.<br \/>\nM\u00eb par\u00eb u p\u00ebrmend se pami\u0119ti e p\u00ebrdorur ka organizim n\u00eb faqe, nuk shoh arsyet pse nuk duhet t\u00eb p\u00ebrdorim p\u00ebrputhjen \"nj\u00eb faqe - nj\u00eb bllok t\u00eb dh\u00ebnash t\u00eb kompresuara\".<\/p>\n<p><\/p>\n<p>Pra, madh\u00ebsia minimale e arsyeshme e faqes \u00ebsht\u00eb 16Kb (me rezerva p\u00ebr informacionin sh\u00ebrbim). Megjithat\u00eb, nj\u00eb madh\u00ebsi kaq e vog\u00ebl e faqes vendos kufizime t\u00eb r\u00ebnd\u00ebsishme mbi madh\u00ebsin\u00eb maksimale t\u00eb regjistrimit.<\/p>\n<p><\/p>\n<p>Edhe pse deri m\u00eb tani nuk parashikohet regjistrime m\u00eb t\u00eb m\u00ebdha se nj\u00eb kilobajt n\u00eb form\u00eb t\u00eb kompresuar, vendosa t\u00eb p\u00ebrdor faqe me madh\u00ebsi 32Kb (n\u00eb total, kjo rezulton n\u00eb 128 faqe p\u00ebr \u00e7ip).<\/p>\n<p><\/p>\n<p><strong>P\u00ebrmbledhje:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>T\u00eb dh\u00ebnat i ruajm\u00eb t\u00eb kompresuara me zlib (deflate);<\/li>\n<li>P\u00ebr \u00e7do regjistrim vendosim Z_SYNC_FLUSH;<\/li>\n<li>P\u00ebr \u00e7do regjistrim t\u00eb kompresuar, shkurtojm\u00eb bajtat p\u00ebrfundimtar\u00eb <em>(p.sh., 0x00, 0x00, 0xff, 0xff)<\/em>; n\u00eb titull tregojm\u00eb sa shum\u00eb bajta kemi prer\u00eb;<\/li>\n<li>T\u00eb dh\u00ebnat ruhen n\u00eb faqe me 32KB; brenda faqes ka nj\u00eb rrjedh\u00eb t\u00eb vetme t\u00eb dh\u00ebnash t\u00eb kompresuara; \u00e7do her\u00eb q\u00eb fillojm\u00eb kompresimin n\u00eb nj\u00eb faqe, e b\u00ebjm\u00eb at\u00eb nga e para.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dhe, para se t\u00eb p\u00ebrfundojm\u00eb me kompresimin, d\u00ebshiroj t\u00eb theksoj se t\u00eb dh\u00ebnat e kompresuara rezultojn\u00eb n\u00eb disa byte p\u00ebr regjistrim, prandaj \u00ebsht\u00eb jasht\u00ebzakonisht e r\u00ebnd\u00ebsishme t\u00eb mos e fryj n\u00eb informacionin sh\u00ebrbyes, \u00e7do byte ka r\u00ebnd\u00ebsi.<\/p>\n<p><\/p>\n<h3 id=\"hranenie-zagolovkov-dannyh\">Ruajtja e titujve t\u00eb t\u00eb dh\u00ebnave<\/h3>\n<p><\/p>\n<p>Duke qen\u00eb se regjistrimet tona kan\u00eb gjat\u00ebsi t\u00eb ndryshueshme, na nevojitet nj\u00eb m\u00ebnyr\u00eb p\u00ebr t\u00eb p\u00ebrcaktuar vendndodhjen\/kuotat e regjistrimeve.<\/p>\n<p><\/p>\n<p>Un\u00eb njoh tre qasje:<\/p>\n<p><\/p>\n<ol>\n<li>T\u00eb gjitha regjistrimet ruhen n\u00eb nj\u00eb rrjedh\u00eb t\u00eb vazhdueshme, fillimisht vjen titulli i regjistrimit, q\u00eb p\u00ebrmban gjat\u00ebsi, dhe pastaj regjistrimi vet\u00eb.<br \/>\nN\u00eb k\u00ebt\u00eb variant, si titujt, ashtu dhe t\u00eb dh\u00ebnat mund t\u00eb ken\u00eb gjat\u00ebsi t\u00eb ndryshueshme.<br \/>\nN\u00eb thelb, kemi nj\u00eb list\u00eb t\u00eb lidhur nj\u00ebdrejtim, e cila p\u00ebrdoret shpesh;<\/li>\n<li>Titujt dhe regjistrimet ruhen n\u00eb rrjedha t\u00eb ve\u00e7anta.<br \/>\nDuke p\u00ebrdorur tituj me gjat\u00ebsi t\u00eb vazhdueshme, ne sigurojm\u00eb q\u00eb d\u00ebmtimi i nj\u00eb titulli nuk ndikon n\u00eb t\u00eb tjer\u00ebt.<br \/>\nNj\u00eb qasje e till\u00eb p\u00ebrdoret, p\u00ebr shembull, n\u00eb shum\u00eb sisteme skedar\u00ebsh;<\/li>\n<li>Regjistrimet ruhen n\u00eb nj\u00eb rrjedh\u00eb t\u00eb vazhdueshme, kufiri i regjistrimit p\u00ebrcaktohet nga nj\u00eb tregues t\u00eb caktuar (simboli\/ose sekuenca e simboleve, e cila \u00ebsht\u00eb e ndaluar brenda blloqeve t\u00eb t\u00eb dh\u00ebnave). N\u00ebse brenda regjistrimit haset nj\u00eb tregues, ne e z\u00ebvend\u00ebsojm\u00eb at\u00eb me nj\u00eb sekrecion (e shfryt\u00ebzojm\u00eb at\u00eb).<br \/>\nNj\u00eb qasje e till\u00eb p\u00ebrdoret, p\u00ebr shembull, n\u00eb protokollin PPP.<\/li>\n<\/ol>\n<p><\/p>\n<p>Le t\u00eb ilustroj.<\/p>\n<p><\/p>\n<p>Opsioni 1:<br \/>\n<img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/e5a9676ca21eaca07e64ddf9fcd9f2eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebtu \u00ebsht\u00eb shum\u00eb e thjesht\u00eb: duke ditur gjat\u00ebsi e regjistrimit, ne mund t\u00eb llogarisim adres\u00ebn e titullit t\u00eb ardhsh\u00ebm. K\u00ebshtu ne l\u00ebvizim p\u00ebrmes titujve derisa t\u00eb hasim nj\u00eb zon\u00eb q\u00eb \u00ebsht\u00eb e mbushur me 0xff (zon\u00eb e lir\u00eb) ose fundin e faqes.<\/p>\n<p><\/p>\n<p>Opsioni 2:<br \/>\n<img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/4fed4860fb659ab6042be9aeeb5c041a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr shkak t\u00eb gjat\u00ebsi\u00ebs variabile t\u00eb regjistrimeve, ne nuk mundemi t\u00eb parashikojm\u00eb se sa shum\u00eb regjistrime (dhe, p\u00ebr k\u00ebt\u00eb arsye, tituj) do t\u00eb na nevojiten n\u00eb nj\u00eb faqe. Mund t\u00eb ndajm\u00eb titujt dhe t\u00eb dh\u00ebnat n\u00eb faqe t\u00eb ndryshme, por mua m\u00eb p\u00eblqen nj\u00eb qasje tjet\u00ebr: ne vendosim si titujt (t\u00eb q\u00ebndruesh\u00ebm n\u00eb madh\u00ebsi) q\u00eb nga fillimi i faqes, ashtu edhe t\u00eb dh\u00ebnat (me gjat\u00ebsi variabile) q\u00eb nga fundi. Sa her\u00eb q\u00eb ata 'takojn\u00eb' (nuk ka hap\u00ebsir\u00eb t\u00eb lir\u00eb p\u00ebr nj\u00eb regjistrim t\u00eb ri), ne e konsiderojm\u00eb k\u00ebt\u00eb faqe si t\u00eb plot\u00ebsuar.<\/p>\n<p><\/p>\n<p>Varianti 3:<br \/>\n<img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/dfb64009aa7781fcb8a47423ff4160c6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNuk e \u00ebsht\u00eb e nevojshme t\u00eb ruani n\u00eb titull gjat\u00ebsi ose ndonj\u00eb informacion tjet\u00ebr mbi vendndodhjen e t\u00eb dh\u00ebnave, mjafton t\u00eb keni sh\u00ebnjues q\u00eb tregojn\u00eb kufijt\u00eb e regjistrimeve. Megjithat\u00eb, t\u00eb dh\u00ebnat duhet t\u00eb p\u00ebrpunohen gjat\u00eb shkruajtjes\/leximit.<br \/>\nSi sh\u00ebnjues do t\u00eb p\u00ebrdorja 0xff (me t\u00eb cilin mbushet pagina pas fshirjes), n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb zona e lir\u00eb sakt\u00ebsisht nuk do t\u00eb interpretohet si t\u00eb dh\u00ebna.<\/p>\n<p><\/p>\n<p>Tabela krahasuese:<\/p>\n<p><\/p>\n<p>Varianti 1<br \/>\nVarianti 2<br \/>\nVarianti 3<\/p>\n<p><strong>Q\u00ebndrueshm\u00ebria ndaj gabimeve<\/strong><br \/>\n\u2014<br \/>\n+<br \/>\n+<\/p>\n<p><strong>Kompakt\u00ebsia<\/strong><br \/>\n+<br \/>\n\u2014<br \/>\n+<\/p>\n<p><strong>Sfidat e realizimit<\/strong><br \/>\n*<br \/>\n**<br \/>\n**<\/p>\n<p><\/p>\n<p>Opsioni 1 ka nj\u00eb mang\u00ebsi fatale: n\u00ebse ndonj\u00eb nga titujt d\u00ebmtohet, ne humbasim t\u00eb gjith\u00eb zinxhirin q\u00eb pason. Opsionet e tjera lejojn\u00eb rikuperimin e nj\u00eb pjese t\u00eb t\u00eb dh\u00ebnave, madje edhe n\u00eb raste d\u00ebmtimi masiv.<br \/>\nPor k\u00ebtu \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb kujtojm\u00eb se vendos\u00ebm t\u00eb ruajm\u00eb t\u00eb dh\u00ebnat n\u00eb form\u00eb t\u00eb kompresuar, k\u00ebshtu q\u00eb ne humbasim t\u00eb gjitha t\u00eb dh\u00ebnat n\u00eb faqe pas regjistrimit 't\u00eb prishur', k\u00ebshtu q\u00eb megjith\u00ebse n\u00eb tabel\u00eb ka nj\u00eb minus, ne nuk e marrim parasysh at\u00eb.<\/p>\n<p><\/p>\n<p>Kompakt\u00ebsia:<\/p>\n<p><\/p>\n<ul>\n<li>n\u00eb opsionin e par\u00eb na nevojitet t\u00eb ruajm\u00eb n\u00eb titull vet\u00ebm gjat\u00ebsi, n\u00ebse p\u00ebrdorim variabla me gjat\u00ebsi t\u00eb ndryshueshme, n\u00eb shumic\u00ebn e rasteve mund t\u00eb p\u00ebrdorim vet\u00ebm nj\u00eb byte;<\/li>\n<li>n\u00eb opsionin e dyt\u00eb na nevojitet t\u00eb ruajm\u00eb adres\u00ebn fillestare dhe gjat\u00ebsi; regjistrimi duhet t\u00eb ket\u00eb nj\u00eb madh\u00ebsi t\u00eb vazhdueshme, e vler\u00ebsoj n\u00eb 4 byte p\u00ebr regjistrim (dy byte p\u00ebr zhvendosjen dhe dy byte p\u00ebr gjat\u00ebsi);<\/li>\n<li>n\u00eb opsionin e tret\u00eb, ne nevojiten vet\u00ebm nj\u00eb karakter p\u00ebr t\u00eb treguar fillimin e regjistrimit, plus regjistrimi do t\u00eb rritet p\u00ebr shkak t\u00eb ekranizimit me 1-2%. N\u00eb p\u00ebrgjith\u00ebsi, nj\u00eb barazi e af\u00ebrt me opsionin e par\u00eb.<\/li>\n<\/ul>\n<p><\/p>\n<p>Fillimisht e konsiderova opsionin e dyt\u00eb si nj\u00eb opsion kryesor (madje shkrova nj\u00eb realizim). E braktisa at\u00eb vet\u00ebm kur vendosa p\u00ebrfundimisht t\u00eb p\u00ebrdor kompresim.<\/p>\n<p><\/p>\n<p><em>Mbase, ndonj\u00ebher\u00eb do ta p\u00ebrdorim nj\u00eb variant t\u00eb till\u00eb. P\u00ebr shembull, n\u00ebse do t\u00eb merrem me ruajtjen e t\u00eb dh\u00ebnave p\u00ebr nj\u00eb anije q\u00eb lundron midis Tok\u00ebs dhe Marsit - k\u00ebrkesat jan\u00eb krejt\u00ebsisht t\u00eb ndryshme p\u00ebr besueshm\u00ebrin\u00eb, rrezatimi kozmik, ...<\/em><\/p>\n<p><\/p>\n<p>Sa i p\u00ebrket opsionit t\u00eb tret\u00eb: i kam dh\u00ebn\u00eb dy yje p\u00ebr kompleksitetin e realizimit thjesht sepse nuk e p\u00eblqej t\u00eb merrem me ekranizimin, ndryshimin e gjat\u00ebsi gjat\u00eb procesit, etj. Po, ndoshta, jam i nj\u00ebansh\u00ebm, por kodi do t\u00eb shkruhet nga un\u00eb \u2014 pse t\u00eb detyroj veten t\u00eb b\u00ebj at\u00eb q\u00eb nuk m\u00eb p\u00eblqen.<\/p>\n<p><\/p>\n<p><strong>P\u00ebrmbledhje:<\/strong> Ne zgjedhim opsionin e ruajtjes n\u00eb form\u00ebn e zinxhir\u00ebve 'titulli me gjat\u00ebsi - t\u00eb dh\u00ebna me gjat\u00ebsi variabile' p\u00ebr shkak t\u00eb efikasitetit dhe thjesht\u00ebsis\u00eb s\u00eb implementimit.<\/p>\n<p><\/p>\n<h3 id=\"ispolzovanie-bitovyh-poley-dlya-kontrolya-uspeshnosti-operaciy-zapisi\">P\u00ebrdorimi i fushave t\u00eb bit\u00ebve p\u00ebr t\u00eb kontrolluar suksesin e operacioneve t\u00eb shkruarjes<\/h3>\n<p><\/p>\n<p>Tani nuk e mbaj mend se ku e pash\u00eb iden\u00eb, por duket gjith\u00e7ka m\u00eb shum\u00eb k\u00ebshtu:<br \/>\nP\u00ebr \u00e7do regjistrim, p\u00ebrzgjedhim disa bita p\u00ebr t\u00eb ruajtur flamujt.<br \/>\n<em>Si\u00e7 diskutuam m\u00eb par\u00eb, pas erase t\u00eb gjith\u00eb bit\u00ebt jan\u00eb t\u00eb mbushur me 1, dhe ne mund t\u00eb ndryshojm\u00eb 1 n\u00eb 0, por jo p\u00ebrkundrazi.<\/em> Pra, p\u00ebr 'flag nuk \u00ebsht\u00eb vendosur' p\u00ebrdorim 1, p\u00ebr 'flag \u00ebsht\u00eb vendosur' - 0.<\/p>\n<p><\/p>\n<p>Ja se si mund t\u00eb duket vendosja e regjistrimeve me gjat\u00ebsi t\u00eb ndryshueshme n\u00eb flash:<\/p>\n<p><\/p>\n<ol>\n<li>Vendosim flamurin 'regjistrimi i gjat\u00eb filloi';<\/li>\n<li>Regjistrojm\u00eb gjat\u00ebsi;<\/li>\n<li>Vendosim flamurin 'regjistrimi i t\u00eb dh\u00ebnave filloi';<\/li>\n<li>Regjistrojm\u00eb t\u00eb dh\u00ebnat;<\/li>\n<li>Vendosim flamurin 'regjistrimi u p\u00ebrfundua'.<\/li>\n<\/ol>\n<p><\/p>\n<p>P\u00ebrve\u00e7 k\u00ebsaj, do t\u00eb kemi nj\u00eb flamur 'ndodhi nj\u00eb gabim', k\u00ebshtu q\u00eb do t\u00eb kemi gjithsej 4 flamuj bit\u00ebsh.<\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb rast, kemi dy gjendje t\u00eb q\u00ebndrueshme '1111' - regjistrimi nuk ka filluar dhe '1000' - regjistrimi kaloi me sukses; n\u00eb rast t\u00eb nj\u00eb nd\u00ebrprerjeje t\u00eb papritur t\u00eb procesit t\u00eb regjistrimit, do t\u00eb kemi gjendje nd\u00ebrlikuese, t\u00eb cilat m\u00eb pas do t'i zbulojm\u00eb dhe t\u00eb trajtojm\u00eb.<\/p>\n<p><\/p>\n<p>Qasja \u00ebsht\u00eb interesante, por ajo mbron vet\u00ebm nga nd\u00ebprerja e papritur e energjis\u00eb dhe \u00e7\u00ebshtje t\u00eb ngjashme, q\u00eb sigurisht \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, por kjo nuk \u00ebsht\u00eb as e vetmja (dhe as kryesorja) arsye p\u00ebr mund\u00ebsit\u00eb e d\u00ebshtimeve.<\/p>\n<p><\/p>\n<p><strong>P\u00ebrmbledhje:<\/strong> Le t\u00eb vazhdojm\u00eb n\u00eb k\u00ebrkim t\u00eb nj\u00eb zgjidhjeje t\u00eb mir\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"kontrolnye-summy\">Kontrolluar e shumave<\/h3>\n<p><\/p>\n<p>Kontrolluar e shumave gjithashtu ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb siguruar (me nj\u00eb probabilitet t\u00eb mjaftuesh\u00ebm) q\u00eb ne po lexojm\u00eb pik\u00ebrisht at\u00eb q\u00eb duhej t\u00eb ishte regjistruar. Dhe, p\u00ebr dallim nga fushat e bit\u00ebve t\u00eb shqyrtuara m\u00eb par\u00eb, ato funksionojn\u00eb gjithmon\u00eb.<\/p>\n<p><\/p>\n<p>N\u00ebse shqyrtojm\u00eb list\u00ebn e burimeve potenciale t\u00eb problemeve, p\u00ebr t\u00eb cilat fol\u00ebm m\u00eb par\u00eb, kontrolli i shumave \u00ebsht\u00eb n\u00eb gjendje t\u00eb njoh\u00eb gabimin pavar\u00ebsisht nga origjina e tij <em>(p\u00ebrve\u00e7, ndoshta, alien\u00ebve q\u00ebllim keq \u2014 ata mund t\u00eb falsifikojn\u00eb edhe kontrollin e shumave)<\/em>.<\/p>\n<p><\/p>\n<p>Pra, n\u00ebse q\u00ebllimi yn\u00eb \u00ebsht\u00eb t\u00eb kontrollojm\u00eb se t\u00eb dh\u00ebnat jan\u00eb n\u00eb rregull, kontrolli i shumave \u00ebsht\u00eb nj\u00eb ide e shk\u00eblqyer.<\/p>\n<p><\/p>\n<p>Zgjedhja e algoritmit p\u00ebr llogaritjen e kontrollit t\u00eb shumave nuk ngjalli pyetje - CRC. Nga nj\u00ebra an\u00eb, pronat matematikore lejojn\u00eb q\u00eb t\u00eb kapen 100% gabimet e disa llojeve, nga ana tjet\u00ebr - n\u00eb t\u00eb dh\u00ebna t\u00eb rast\u00ebsishme zakonisht ky algorit\u00ebm tregon probabilitetin e kolizionit jo shum\u00eb m\u00eb t\u00eb lart\u00eb se kufiri teorik. <img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/bf9cca3564db7d9d03d3ce49642d3a71.jpg\" style=\"display:block;margin: 0 auto;\" \/>Le t\u00eb mos jet\u00eb algoritmi m\u00eb i shpejt\u00eb, nuk \u00ebsht\u00eb gjithmon\u00eb minimal p\u00ebr numrin e kolizion\u00ebve, por ai ka nj\u00eb cil\u00ebsi shum\u00eb t\u00eb r\u00ebnd\u00ebsishme: n\u00eb testet q\u00eb kam p\u00ebrjetuar, nuk kam hasur n\u00eb modele ku ai d\u00ebshtonte qart\u00eb. Stabiliteti \u00ebsht\u00eb cil\u00ebsia kryesore n\u00eb k\u00ebt\u00eb rast.<\/p>\n<p><\/p>\n<p>Shembuj i nj\u00eb studimi t\u00eb gjer\u00eb: <noindex><a rel=\"nofollow\" href=\"http:\/\/amsoftware.narod.ru\/algo.html\">pjesa 1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/amsoftware.narod.ru\/algo2.html\">pjesa 2<\/a><\/noindex> <em>(linket n\u00eb narod.ru, m\u00eb vjen keq)<\/em>.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, detyra e zgjedhjes s\u00eb kontrollit t\u00eb shum\u00ebs nuk \u00ebsht\u00eb p\u00ebrmbyllur, CRC \u00ebsht\u00eb nj\u00eb familje e t\u00ebr\u00eb kontrollesh shumash. Duhet t\u00eb p\u00ebrcaktohemi p\u00ebr gjat\u00ebsi, e pastaj t\u00eb zgjedhim polinom.<\/p>\n<p><\/p>\n<p>Zgjedhja e gjat\u00ebsi s\u00eb kontrollit t\u00eb shum\u00ebs nuk \u00ebsht\u00eb nj\u00eb \u00e7\u00ebshtje aq e thjesht\u00eb si\u00e7 duket n\u00eb shikimin e par\u00eb.<\/p>\n<p><\/p>\n<p>Le t\u00eb ilustrojm\u00eb:<br \/>\nLe t\u00eb themi se kemi probabilitet gabimi n\u00eb \u00e7do bajt <img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/89a9be2edf2a43cc9115eba37fa02fc8.jpg\" style=\"display:block;margin: 0 auto;\" \/> dhe nj\u00eb kontroll t\u00eb p\u00ebrsosur t\u00eb shum\u00ebs, llogaritim numrin mesatar t\u00eb gabimeve n\u00eb nj\u00eb milion regjistrime:<\/p>\n<p><\/p>\n<p>T\u00eb dh\u00ebnat, bajt<br \/>\nKontrolli i shum\u00ebs, bajt<br \/>\nGabime t\u00eb pa zbuluara<br \/>\nE zbuluar gabime false<br \/>\nN\u00eb total, ndodhit\u00eb e gabuara<\/p>\n<p>1<br \/>\n0<br \/>\n1000<br \/>\n0<br \/>\n1000<\/p>\n<p>1<br \/>\n1<br \/>\n4<br \/>\n999<br \/>\n1003<\/p>\n<p>1<br \/>\n2<br \/>\n\u22480<br \/>\n1997<br \/>\n1997<\/p>\n<p>1<br \/>\n4<br \/>\n\u22480<br \/>\n3990<br \/>\n3990<\/p>\n<p>10<br \/>\n0<br \/>\n9955<br \/>\n0<br \/>\n9955<\/p>\n<p>10<br \/>\n1<br \/>\n39<br \/>\n990<br \/>\n1029<\/p>\n<p>10<br \/>\n2<br \/>\n\u22480<br \/>\n1979<br \/>\n1979<\/p>\n<p>10<br \/>\n4<br \/>\n\u22480<br \/>\n3954<br \/>\n3954<\/p>\n<p>1000<br \/>\n0<br \/>\n632305<br \/>\n0<br \/>\n632305<\/p>\n<p>1000<br \/>\n1<br \/>\n2470<br \/>\n368<br \/>\n2838<\/p>\n<p>1000<br \/>\n2<br \/>\n10<br \/>\n735<br \/>\n745<\/p>\n<p>1000<br \/>\n4<br \/>\n\u22480<br \/>\n1469<br \/>\n1469<\/p>\n<p><\/p>\n<p>Duket se gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb \u2014 zgjidh n\u00eb p\u00ebrputhje me gjat\u00ebsi e t\u00eb dh\u00ebnave t\u00eb mbrojtura gjat\u00ebsi e kontrollit t\u00eb shum\u00ebs me minimumin e ndodhit\u00ebve t\u00eb gabuara \u2014 dhe puna \u00ebsht\u00eb e leht\u00eb.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, me kontroll t\u00eb shkurt\u00ebr t\u00eb shum\u00ebs, lind problemi: ato, ndon\u00ebse zbulojn\u00eb mir\u00eb gabimet e vetme t\u00eb bit\u00ebve, mund t\u00eb pranojn\u00eb rast\u00ebsisht t\u00eb dh\u00ebna krejt\u00ebsisht t\u00eb rast\u00ebsishme me nj\u00eb probabilitet t\u00eb mjaftuesh\u00ebm. N\u00eb Habra kishte nj\u00eb artikull q\u00eb p\u00ebrshkruante <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/428746\/\">problemin n\u00eb jet\u00ebn reale<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Prandaj, p\u00ebr ta b\u00ebr\u00eb p\u00ebrputhjen rast\u00ebsore t\u00eb kontrollit t\u00eb shum\u00ebs praktikisht t\u00eb pamundur, duhet t\u00eb p\u00ebrdorim kontrolle t\u00eb shum\u00ebs me gjat\u00ebsi 32 bit ose m\u00eb shum\u00eb <em>(p\u00ebr gjat\u00ebsi m\u00eb t\u00eb m\u00ebdha se 64 bit zakonisht p\u00ebrdoren funksione kriptografike t\u00eb hash-it)<\/em>.<\/p>\n<p><\/p>\n<p>Pavar\u00ebsisht se m\u00eb her\u00ebt kam th\u00ebn\u00eb se duhet t\u00eb kursejm\u00eb hap\u00ebsir\u00eb me \u00e7do m\u00ebnyr\u00eb t\u00eb mundshme, do t\u00eb p\u00ebrdorim kontroll t\u00eb shum\u00ebs 32-bit (16 bit \u00ebsht\u00eb pak, probabiliteti i kolizionit \u00ebsht\u00eb m\u00eb shum\u00eb se 0.01%; dhe 24 bit, si\u00e7 thon\u00eb, ashtu dhe k\u00ebndej).<\/p>\n<p><\/p>\n<p>K\u00ebtu mund t\u00eb lind\u00eb nj\u00eb kund\u00ebrshtim: a ishim ne duke kursyer \u00e7do bajt gjat\u00eb zgjedhjes s\u00eb kompresimit, p\u00ebr t\u00eb dh\u00ebn\u00eb tani 4 bajta menj\u00ebher\u00eb? nuk do t\u00eb ishte m\u00eb mir\u00eb t\u00eb mos kompresonim dhe nuk shtonim kontrollin e shum\u00ebs? Sigurisht q\u00eb jo, mungesa e kompresimit <em>nuk do t\u00eb thot\u00eb<\/em>, q\u00eb kontrolli i integritetit nuk na nevojitet.<\/p>\n<p><\/p>\n<p>P\u00ebr zgjedhjen e polinomit nuk do t\u00eb shpikim bi\u00e7iklet\u00ebn, por do t\u00eb marrim CRC-32C q\u00eb \u00ebsht\u00eb popullor tani.<br \/>\nKy ky do zbulo 6 gabime bit\u00ebsh n\u00eb paketa deri n\u00eb 22 byte (ndoshta rasti m\u00eb i zakonsh\u00ebm p\u00ebr ne), 4 gabime bit\u00ebsh n\u00eb paketa deri n\u00eb 655 byte (gjithashtu nj\u00eb rast i zakonsh\u00ebm p\u00ebr ne), 2 ose ndonj\u00eb num\u00ebr t\u00eb \u00e7uditsh\u00ebm gabimesh bit\u00ebsh n\u00eb paketa t\u00eb \u00e7do gjat\u00ebsie t\u00eb arsyeshme.<\/p>\n<p>\n<b class=\"spoiler_title\">N\u00ebse dikujt i interesojn\u00eb detajet<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check\">artikulli n\u00eb Wikipedia<\/a><\/noindex> p\u00ebr CRC.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/users.ece.cmu.edu\/~koopman\/crc\/c32\/0x8f6e37a0_len.txt\">Parametrat e kodit crc-32c<\/a><\/noindex> n\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/users.ece.cmu.edu\/~koopman\/crc\/notes.html\">n\u00eb faqen e Kupmanit<\/a><\/noindex> \u2014 ndoshta, specialisti kryesor p\u00ebr CRC n\u00eb planet.<\/p>\n<p><\/p>\n<p>N\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/users.ece.cmu.edu\/~koopman\/networks\/dsn02\/dsn02_koopman.pdf\">artikulli i tij<\/a><\/noindex> \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/users.ece.cmu.edu\/~koopman\/crc\/c32\/0xfa567d89_len.txt\">nj\u00eb kod tjet\u00ebr interesant<\/a><\/noindex>, q\u00eb ofron parametro pak m\u00eb t\u00eb mira p\u00ebr gjat\u00ebsit\u00eb e paketave t\u00eb r\u00ebnd\u00ebsishme p\u00ebr ne, por nuk e kam konsideruar ndryshimin si substancial, dhe jam i mjaftuesh\u00ebm kompetent p\u00ebr t\u00eb zgjedhur nj\u00eb kod t\u00eb personalizuar n\u00eb vend t\u00eb nj\u00eb standaardi dhe t\u00eb mir\u00ebstudiuar.<\/p>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr, pasi t\u00eb dh\u00ebnat tona jan\u00eb t\u00eb kompresuara, lind pyetja: a duhet t\u00eb llogarisim checksum-in p\u00ebr t\u00eb dh\u00ebna t\u00eb kompresuara ose t\u00eb pakompresuara?<\/p>\n<p><\/p>\n<p>Argumentet 'p\u00ebr' llogaritjen e checksum-it t\u00eb t\u00eb dh\u00ebnave t\u00eb pakompresuara:<\/p>\n<p><\/p>\n<ul>\n<li>n\u00eb fund na nevojitet t\u00eb kontrollojm\u00eb integritetin e ruajtjes s\u00eb t\u00eb dh\u00ebnave \u2014 pra, kjo \u00ebsht\u00eb ajo q\u00eb po kontrollojm\u00eb direkt (n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb do t\u00eb kontrollohen gjithashtu gabimet e mundshme n\u00eb realizimin e kompresionit\/dekompresionit, d\u00ebmtimet e shkaktuara nga memorie t\u00eb korruptuara etj.);<\/li>\n<li>algoritmi deflate n\u00eb zlib ka nj\u00eb realizim mjaft t\u00eb pjekur dhe <em>nuk duhet<\/em> avaria me 't\u00eb dh\u00ebna t\u00eb prishura', madje, shpesh ai \u00ebsht\u00eb n\u00eb gjendje t\u00eb zbuloj\u00eb vet\u00eb gabimet n\u00eb rrjedh\u00ebn hyr\u00ebse, duke ulur probabilitetin e p\u00ebrgjithsh\u00ebm t\u00eb moszbulimit t\u00eb gabimeve (kam kryer nj\u00eb test me invertimin e nj\u00eb biti n\u00eb nj\u00eb regjistrim t\u00eb shkurt\u00ebr, zlib zbuloi gabimin n\u00eb rreth nj\u00eb t\u00eb tret\u00ebn e rasteve).<\/li>\n<\/ul>\n<p><\/p>\n<p>Argumentet 'kund\u00ebr' llogaritjes s\u00eb checksum-it t\u00eb t\u00eb dh\u00ebnave t\u00eb pakompresuara:<\/p>\n<p><\/p>\n<ul>\n<li>CRC '\u00ebsht\u00eb i p\u00ebrshtatur' pik\u00ebrisht p\u00ebr gabime t\u00eb pakta bit\u00ebshe, q\u00eb jan\u00eb karakteristike p\u00ebr memorjen flash (nj\u00eb gabim bit n\u00eb nj\u00eb rrjedh\u00eb t\u00eb kompresuar mund t\u00eb sjell\u00eb nj\u00eb ndryshim masiv n\u00eb rrjedh\u00ebn e daljes, ku teorikisht, ne mund 'ta kapim' kolizionin);<\/li>\n<li>nuk m\u00eb p\u00eblqen shum\u00eb ideja t\u00eb d\u00ebrgoj t\u00eb dh\u00ebna potencialisht t\u00eb d\u00ebmtuara p\u00ebr dekompresorin, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.cvedetails.com\/vulnerability-list\/vendor_id-72\/product_id-1820\/GNU-Zlib.html\">nuk e di<\/a><\/noindex>, si do t\u00eb reagoj\u00eb ai.<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb projekt, vendosa t\u00eb largohem nga praktika e zakonshme t\u00eb ruajtjes s\u00eb checksum-it p\u00ebr t\u00eb dh\u00ebna t\u00eb pakompresuara.<\/p>\n<p><\/p>\n<p><strong>P\u00ebrmbledhje:<\/strong> p\u00ebrdorim CRC-32C, llogaritjen e checksum-it e b\u00ebjm\u00eb nga t\u00eb dh\u00ebnat n\u00eb form\u00ebn n\u00eb t\u00eb cil\u00ebn regjistrohen n\u00eb flash (pas kompresimit).<\/p>\n<p><\/p>\n<h3 id=\"izbytochnost\">Shkalla e tep\u00ebrt<\/h3>\n<p><\/p>\n<p>P\u00ebrdorimi i kodimit t\u00eb tep\u00ebrt nuk e p\u00ebrjashton, sigurisht, humbjen e t\u00eb dh\u00ebnave, megjithat\u00eb, ai mund t\u00eb zvog\u00ebloj\u00eb ndjesh\u00ebm (shpesh me shum\u00eb rendi) probabilitetin e humbjes s\u00eb pa rikuperueshme t\u00eb t\u00eb dh\u00ebnave.<\/p>\n<p><\/p>\n<p>Ne mund t\u00eb p\u00ebrdorim lloje t\u00eb ndryshme t\u00eb tep\u00ebrtis\u00eb p\u00ebr t\u00eb korrigjuar gabimet.<br \/>\nKodet e Hamming-ut mund t\u00eb korrigjojn\u00eb gabime t\u00eb vetme bit\u00ebsh, kodet e Reed-Solomon jan\u00eb simbolike, disa kopje t\u00eb t\u00eb dh\u00ebnave bashk\u00eb me shuma kontrolli ose kodimi si RAID-6 mund t\u00eb ndihmojn\u00eb n\u00eb rikuperimin e t\u00eb dh\u00ebnave edhe n\u00eb rastin e d\u00ebmtimeve t\u00eb m\u00ebdha.<br \/>\nN\u00eb fillim isha i p\u00ebrshtatur p\u00ebr p\u00ebrdorimin e gjer\u00eb t\u00eb kodimit t\u00eb q\u00ebndruesh\u00ebm ndaj shqet\u00ebsimeve, por pastaj kuptova se s\u00eb pari duhet t\u00eb kemi nj\u00eb ide se nga cilat gabime duam t\u00eb mbrohemi, dhe pastaj t\u00eb zgjedhim kodimin.<\/p>\n<p><\/p>\n<p>Kemi folur m\u00eb par\u00eb q\u00eb gabimet duhet t\u00eb identifikohen sa m\u00eb shpejt t\u00eb jet\u00eb e mundur. Kur mund t\u00eb p\u00ebrballemi me gabime?<\/p>\n<p><\/p>\n<ol>\n<li>Regjistrimi i pap\u00ebrfunduar (p\u00ebr ndonj\u00eb arsye, energjia u ndal n\u00eb momentin e regjistrimit, Raspberry u ngrit, ...)<br \/>\nFatkeq\u00ebsisht, n\u00eb rastin e till\u00eb gabimi duhet vet\u00ebm t\u00eb injorohet dhe t\u00eb konsiderohen t\u00eb dh\u00ebnat t\u00eb humbura;<\/li>\n<li>Gabimet e regjistrimit (p\u00ebr arsye t\u00eb ndryshme, n\u00eb memorjen flash u regjistrua di\u00e7ka q\u00eb nuk ishte regjistruar)<br \/>\nGabime t\u00eb tilla mund t\u00eb zbulojm\u00eb menj\u00ebher\u00eb, n\u00ebse pas regjistrimit b\u00ebjm\u00eb nj\u00eb lexim kontrollues;<\/li>\n<li>T\u00eb dh\u00ebnat e d\u00ebmtuara n\u00eb memorie gjat\u00eb ruajtjes;<\/li>\n<li>Gabimet e leximit<br \/>\nP\u00ebr t\u00eb korrigjuar mjafton n\u00eb rast mosmarr\u00ebveshje t\u00eb shum\u00ebs kontrolluese t\u00eb p\u00ebrs\u00ebrisim leximin disa her\u00eb.<\/li>\n<\/ol>\n<p><\/p>\n<p>Pra, vet\u00ebm gabimet e tipit t\u00eb tret\u00eb (d\u00ebmtimi spontan i t\u00eb dh\u00ebnave gjat\u00eb ruajtjes) nuk mund t\u00eb korrigjohen pa kodim t\u00eb q\u00ebndruesh\u00ebm ndaj shqet\u00ebsimeve. Mendoj se gabime t\u00eb tilla jan\u00eb akoma jasht\u00ebzakonisht t\u00eb pakta.<\/p>\n<p><\/p>\n<p><strong>P\u00ebrmbledhje:<\/strong> U vendos t\u00eb heqim dor\u00eb nga kodimi i tep\u00ebrt, por n\u00ebse funksionimi tregoi se ky vendim ishte i gabuar, at\u00ebher\u00eb do t\u00eb kthehemi n\u00eb shqyrtimin e \u00e7\u00ebshtjes (me statistik\u00ebn tani t\u00eb grumbulluar mbi defektet, e cila do t\u00eb lejoj\u00eb zgjedhjen e llojit optimal t\u00eb kodimit).<\/p>\n<p><\/p>\n<h3 id=\"prochee\">T\u00eb tjera<\/h3>\n<p><\/p>\n<p>Natyrisht, formati i artikullit nuk lejon t\u00eb argumentohet \u00e7do bit n\u00eb formatin <em>(dhe un\u00eb tashm\u00eb kam shteruar forc\u00ebn)<\/em>, prandaj do t\u00eb kaloj shpejt mbi disa \u00e7\u00ebshtje q\u00eb nuk jan\u00eb prekur m\u00eb par\u00eb.<\/p>\n<p><\/p>\n<ul>\n<li>E vendosur p\u00ebr t\u00eb b\u00ebr\u00eb t\u00eb gjitha faqet 't\u00eb barabarta'<br \/>\nDo t\u00eb thot\u00eb se nuk do t\u00eb ket\u00eb ndonj\u00eb faqe speciale me metadatash, rrjedha t\u00eb ve\u00e7anta etj., n\u00eb vend t\u00eb k\u00ebsaj nj\u00eb rrjedh\u00eb e vetme q\u00eb shkruan t\u00eb gjitha faqet nj\u00ebpasnj\u00ebrisht.<br \/>\nKjo siguron nj\u00eb konsum t\u00eb barabart\u00eb t\u00eb faqeve, munges\u00ebn e nj\u00eb pik\u00eb t\u00eb vetme d\u00ebshtimi, dhe thjesht p\u00eblqehet;<\/li>\n<li>Duhen parashikuar patjet\u00ebr versionet e formatit.<br \/>\nFormati pa numrin e versionit n\u00eb titull \u00ebsht\u00eb e keqe!<br \/>\nMjafton t\u00eb shtoni n\u00eb titullin e faqes nj\u00eb fush\u00eb me nj\u00eb Magic Number (n\u00ebshkrim), e cila do t\u00eb tregoj\u00eb versionin e p\u00ebrdorur t\u00eb formatit. <em>(nuk besoj se n\u00eb praktik\u00eb do t\u00eb ket\u00eb edhe dhjet\u00ebra t\u00eb till\u00eb)<\/em>;<\/li>\n<li>P\u00ebrdorni nj\u00eb titull me gjat\u00ebsi variab\u00ebl p\u00ebr sh\u00ebnimet (t\u00eb cilat jan\u00eb shum\u00eb t\u00eb shumta), duke u p\u00ebrpjekur q\u00eb p\u00ebr shumic\u00ebn e rasteve ta b\u00ebni at\u00eb me gjat\u00ebsi 1 byte;<\/li>\n<li>P\u00ebr kodimin e gjat\u00ebsi s\u00eb titullit dhe gjat\u00ebsi s\u00eb pjes\u00ebs s\u00eb prer\u00eb t\u00eb regjistrimit t\u00eb kompresuar p\u00ebrdorni kode binare me gjat\u00ebsi variab\u00ebl.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kjo ndihmoi shum\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/planetcalc.com\/2481\/\">generaor online<\/a><\/noindex> i kodit Huffman. Dosido p\u00ebr pak minuta arrita t\u00eb gjej kodet e nevojshme me gjat\u00ebsi variab\u00ebl.<\/p>\n<p><\/p>\n<h1 id=\"anchorformatanchoropisanie-formata-hraneniya-dannyh\"><noindex><a rel=\"nofollow\" name=\"format\"><\/a><\/noindex>P\u00ebrshkrimi i formatit t\u00eb ruajtjes s\u00eb t\u00eb dh\u00ebnave<\/h1>\n<p><\/p>\n<h2 id=\"byte-order\">Rendi i byte-ve<\/h2>\n<p><\/p>\n<p>Fushat me nj\u00eb madh\u00ebsi superiore se nj\u00eb byte ruhen n\u00eb formatin big-endian (renditja e byte-ve n\u00eb rrjet), q\u00eb do t\u00eb thot\u00eb se 0x1234 ruhet si 0x12, 0x34.<\/p>\n<p><\/p>\n<h2 id=\"delenie-na-stranicy\">Ndarja n\u00eb faqe<\/h2>\n<p><\/p>\n<p>I gjith\u00eb memorja flash \u00ebsht\u00eb e ndar\u00eb n\u00eb faqe me nj\u00eb madh\u00ebsi t\u00eb barabart\u00eb.<\/p>\n<p><\/p>\n<p>Madh\u00ebsia e faqes p\u00ebrfundohet n\u00eb 32KB, por jo m\u00eb shum\u00eb se 1\/4 e madh\u00ebsis\u00eb totale t\u00eb \u00e7ipit t\u00eb memories (p\u00ebr nj\u00eb \u00e7ip prej 4MB rezulton 128 faqe).<\/p>\n<p><\/p>\n<p>\u00c7do faqe ruan t\u00eb dh\u00ebna indipendent nga t\u00eb tjerat (do t\u00eb thot\u00eb se t\u00eb dh\u00ebnat e nj\u00eb faqe nuk referojn\u00eb n\u00eb t\u00eb dh\u00ebnat e nj\u00eb faqe tjet\u00ebr).<\/p>\n<p><\/p>\n<p>T\u00eb gjitha faqet jan\u00eb t\u00eb num\u00ebruara n\u00eb rendin e natyrsh\u00ebm (n\u00eb rendin e rritjes s\u00eb adresave), duke filluar nga numri 0 (faqa zero fillon n\u00eb adres\u00ebn 0, e para n\u00eb 32KB, e dyta n\u00eb 64KB etj.)<\/p>\n<p><\/p>\n<p>\u00c7ipa e memories p\u00ebrdoret si nj\u00eb buffer ciklik (ring buffer), do thot\u00eb se fillimisht shkrimi shkon n\u00eb faqen me num\u00ebr 0, pastaj n\u00eb faqen me num\u00ebr 1, ..., kur mbushim faqen e fundit, cikli rinis dhe shkrimi vazhdon nga faqja zero.<\/p>\n<p><\/p>\n<h2 id=\"vnutri-stranicy\">Brenda faqes<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/39b45f83dc46bb2fd7081ed2a0b638c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb fillim t\u00eb faqes ruhet nj\u00eb krye faqe 4-byte, pastaj kontrolli i shum\u00ebs (CRC-32C), m\u00eb pas ruhen regjistrimet n\u00eb formatin \"kryefaqe, t\u00eb dh\u00ebna, kontrolli i shum\u00ebs\".<\/p>\n<p><\/p>\n<p>Titulli i faqes (n\u00eb skem\u00eb me ngjyr\u00eb t\u00eb gjelb\u00ebr t\u00eb err\u00ebt) p\u00ebrb\u00ebhet nga:<\/p>\n<p><\/p>\n<ul>\n<li>nj\u00eb fusht me dy byte Magic Number (ai \u00ebsht\u00eb gjithashtu \u2013 shenja e versionit t\u00eb formatit)<br \/>\np\u00ebr versionin aktual t\u00eb formatit e konsiderohet si <code>0xed00 \u2295 numri i faqes<\/code>;<\/li>\n<li>nj\u00eb num\u00ebrues dy-byte \"Versioni i faqes\" (numri i ciklit t\u00eb ri-shkrimit t\u00eb memories).<\/li>\n<\/ul>\n<p><\/p>\n<p>T\u00eb dh\u00ebnat n\u00eb faqe ruhen n\u00eb format t\u00eb kompresuar (p\u00ebrdoret algoritmi deflate). T\u00eb gjitha t\u00eb dh\u00ebnat n\u00eb nj\u00eb faqe kompresohen n\u00eb nj\u00eb rrjedh\u00eb (p\u00ebrdoret nj\u00eb fjalor i p\u00ebrbashk\u00ebt), n\u00eb \u00e7do faqe t\u00eb re kompresimi fillon nga e para. K\u00ebshtu q\u00eb p\u00ebr dekodimin e \u00e7do t\u00eb dh\u00ebne k\u00ebrkohen t\u00eb gjitha t\u00eb dh\u00ebnat e m\u00ebparshme nga kjo faqe (dhe vet\u00ebm nga kjo).<\/p>\n<p><\/p>\n<p>\u00c7do t\u00eb dh\u00ebn\u00eb kompresohet me flamurin Z_SYNC_FLUSH, nd\u00ebrsa n\u00eb fund t\u00eb rrjedh\u00ebs s\u00eb kompresuar gjenden 4 byte 0x00, 0x00, 0xff, 0xff, t\u00eb paraprir\u00eb ndoshta nga nj\u00eb ose dy byte t\u00eb zeros.<br \/>\nK\u00ebt\u00eb sekuenc\u00eb (t\u00eb gjat\u00eb 4, 5 ose 6 byte) e heqim gjat\u00eb shkrimit n\u00eb memorien flash.<\/p>\n<p><\/p>\n<p>Krye-headeri i t\u00eb dh\u00ebn\u00ebs p\u00ebrb\u00ebhet nga 1, 2 ose 3 byte, q\u00eb ruajn\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>nj\u00eb bit (T), q\u00eb tregon tipin e t\u00eb dh\u00ebn\u00ebs: 0 \u2014 kontekst, 1 \u2014 log;<\/li>\n<li>nj\u00eb fush\u00eb me gjat\u00ebsi variable (S) nga 1 deri n\u00eb 7 bit, q\u00eb p\u00ebrcakton gjat\u00ebsi e krye faqes dhe \"bishtit\" q\u00eb duhet t'i shtohet regjistrimit p\u00ebr dekompresim;<\/li>\n<li>gjat\u00ebsin\u00eb e t\u00eb dh\u00ebn\u00ebs (L).<\/li>\n<\/ul>\n<p><\/p>\n<p>TABELA E VLERAVE S:<\/p>\n<p><\/p>\n<p>S<br \/>\nGjat\u00ebsia e headerit, byte<br \/>\nHiqet gjat\u00eb shkrimit, byte<\/p>\n<p><code>0<\/code><br \/>\n1<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>10<\/code><br \/>\n1<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><code>110<\/code><br \/>\n2<br \/>\n4 (<code>00 00 ff ff<\/code>)<\/p>\n<p><code>1110<\/code><br \/>\n2<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>11110<\/code><br \/>\n2<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><code>1111100<\/code><br \/>\n3<br \/>\n4 (<code>00 00 ff ff<\/code>)<\/p>\n<p><code>1111101<\/code><br \/>\n3<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>1111110<\/code><br \/>\n3<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><\/p>\n<p>P\u00ebrdora p\u00ebr t\u00eb ilustruar, nuk e di sa qart\u00eb doli:<br \/>\n<img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/8c9b739eec5af4429395c32b4ba4044a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nE verdha k\u00ebtu tregon fush\u00ebn T, e bardha fush\u00ebn S, e gjelbra L (gjat\u00ebsia e t\u00eb dh\u00ebnave t\u00eb kompresuara n\u00eb byte), e kalt\u00ebrta t\u00eb dh\u00ebnat e kompresuara, e kuqja \u2014 byte p\u00ebrfundimtar\u00eb t\u00eb t\u00eb dh\u00ebnave t\u00eb kompresuara, q\u00eb nuk shkruhen n\u00eb memorien flash.<\/p>\n<p><\/p>\n<p>Pra, headerat e t\u00eb dh\u00ebnave me gjat\u00ebsi m\u00eb t\u00eb zakonshme (deri n\u00eb 63+5 byte n\u00eb format t\u00eb kompresuar) do t'i shkruajm\u00eb me nj\u00eb byte.<\/p>\n<p><\/p>\n<p>Pas \u00e7do t\u00eb dh\u00ebne ruhet nj\u00eb kontrolle CRC-32C, ku si vler\u00eb fillestare (init) p\u00ebrdoret vlera e invertuar e kontrolles s\u00eb m\u00ebparshme.<\/p>\n<p><\/p>\n<p><em>CRC ka pron\u00ebn e \"p\u00ebrgjat\u00eb\" (continuity), funksionon (plus-minus invertimi i bit\u00ebve n\u00eb proces) me k\u00ebt\u00eb formul\u00eb: <img decoding=\"async\" alt=\"Implementimi im i bufrit ring p\u00ebr flash NOR\" src=\"\/wp-content\/uploads\/2019\/12\/b194d6a3d18ae2f4ae5d4054a93c0ea3.jpg\" style=\"display:block;margin: 0 auto;\" \/>.<br \/>\nPra, n\u00eb fakt, ne llogarisim CRC-n\u00eb e t\u00eb gjith\u00eb byte-ve t\u00eb headerave dhe t\u00eb dh\u00ebnave n\u00eb k\u00ebt\u00eb faqe.<\/em><\/p>\n<p><\/p>\n<p>Menj\u00ebher\u00eb pas kontrollit t\u00eb kontrolles ndodhet headeri i t\u00eb dh\u00ebnes t\u00eb ardhshme.<\/p>\n<p><\/p>\n<p>Headeri \u00ebsht\u00eb nd\u00ebrtuar n\u00eb nj\u00eb m\u00ebnyr\u00eb q\u00eb byte-i i tij i par\u00eb t\u00eb jet\u00eb gjithmon\u00eb ndryshe nga 0x00 dhe 0xff (n\u00ebse p\u00ebrball\u00eb byte-it t\u00eb par\u00eb t\u00eb headerit hasim 0xff, at\u00ebher\u00eb kjo \u00ebsht\u00eb nj\u00eb zon\u00eb q\u00eb nuk \u00ebsht\u00eb p\u00ebrdorur; 0x00 sinjalizon nj\u00eb gabim).<\/p>\n<p><\/p>\n<h2 id=\"primernye-algoritmy\">Algoritmet e p\u00ebraf\u00ebrta<\/h2>\n<p><\/p>\n<h3 id=\"chtenie-iz-flesh-pamyati\">Leximi nga memorja flash<\/h3>\n<p><\/p>\n<p>\u00c7do lexim b\u00ebhet me kontrollin e kontrolles.<br \/>\nN\u00ebse suma e kontrollit nuk p\u00ebrputhet, leximet p\u00ebrs\u00ebriten disa her\u00eb me shpres\u00ebn p\u00ebr t\u00eb lexuar t\u00eb dh\u00ebnat e sakta.<\/p>\n<p><\/p>\n<p><em>(kjo ka kuptim, Linux nuk e ruan leximin nga NOR Flash, \u00ebsht\u00eb provuar)<\/em><\/p>\n<p><\/p>\n<h3 id=\"zapis-v-flesh-pamyat\">Shkruaj n\u00eb memorjen flash<\/h3>\n<p><\/p>\n<p>Po shkruajm\u00eb t\u00eb dh\u00ebnat.<br \/>\nPo i lexojm\u00eb ato.<\/p>\n<p><\/p>\n<p>N\u00ebse t\u00eb dh\u00ebnat e lexuara nuk p\u00ebrputhen me ato t\u00eb shkruara, plot\u00ebsojm\u00eb zon\u00ebn me zero dhe sinjalizojm\u00eb nj\u00eb gabim.<\/p>\n<p><\/p>\n<h3 id=\"podgotovka-novoy-mikroshemy-k-rabote\">P\u00ebrgatitja e \u00e7ip\u00ebs s\u00eb re p\u00ebr pun\u00eb<\/h3>\n<p><\/p>\n<p>P\u00ebr inicializim, n\u00eb faqen e par\u00eb (m\u00eb sakt\u00eb, faqja e zero) shkruhet nj\u00eb titull me versionin 1.<br \/>\nPas k\u00ebsaj, n\u00eb k\u00ebt\u00eb faqe shkruhet konteksti fillestar (p\u00ebrmban UUID t\u00eb automatikut dhe konfigurimet default). <\/p>\n<p><\/p>\n<p>Tani, memorja flash \u00ebsht\u00eb e gatshme p\u00ebr pun\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"zagruzka-avtomata\">Ngarkimi i automatikut<\/h3>\n<p><\/p>\n<p>N\u00eb ngarkim, lexohen 8 byte t\u00eb par\u00eb t\u00eb \u00e7do faqeje (titulli + CRC), faqet me numrin magjik t\u00eb panjohur ose CRC t\u00eb gabuar injorohen.<br \/>\nNga faqet \"korrekt\u00eb\" zgjidhen faqet me versionin maksimal, nga to merret faqja me numrin m\u00eb t\u00eb madh.<br \/>\nLexohet regjistrimi i par\u00eb, kontrollohet korrekt\u00ebsia e CRC, prania e flamurit \"kontext\". N\u00ebse gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull \u2014 kjo faqe konsiderohet aktuale. N\u00ebse jo \u2014 rikthehemi n\u00eb faqen e m\u00ebparshme derisa t\u00eb gjejm\u00eb nj\u00eb faqe \"t\u00eb gjall\u00eb\".<br \/>\nn\u00eb faqen e gjetur lexojm\u00eb t\u00eb gjitha regjistrimet, ato me flamurin \"kontext\" i aplikojm\u00eb.<br \/>\nRuajm\u00eb fjalorin zlib (do t\u00eb nevojitet p\u00ebr shkruajtur p\u00ebrs\u00ebri n\u00eb k\u00ebt\u00eb faqe).<\/p>\n<p><\/p>\n<p>Tani, ngarkimi p\u00ebrfundoi, konteksti u rikuperua, mund t\u00eb punojm\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"dobavlenie-zapisi-v-zhurnal\">Shtimi i regjistrimit n\u00eb jurnal<\/h3>\n<p><\/p>\n<p>Shtypim regjistrimin me fjalorin e duhur, duke treguar Z_SYNC_FLUSH. Shikojm\u00eb n\u00ebse regjistrimi i kompresuar ndodhet n\u00eb faqen aktuale.<br \/>\nN\u00ebse nuk ndodhet (ose n\u00eb faqe kishte gabime CRC) fillojm\u00eb nj\u00eb faqe t\u00eb re (shih m\u00eb posht\u00eb).<br \/>\nShkruajm\u00eb regjistrimin dhe CRC. N\u00ebse ndodhi nj\u00eb gabim, fillojm\u00eb nj\u00eb faqe t\u00eb re.<\/p>\n<p><\/p>\n<h3 id=\"novaya-stranica\">Faqja e re<\/h3>\n<p><\/p>\n<p>Zgjidhim nj\u00eb faqe t\u00eb lir\u00eb me numrin minimal (faqja e lir\u00eb \u00ebsht\u00eb ajo me kontroll t\u00eb gabuar n\u00eb titull ose me version m\u00eb pak se aktuali). N\u00ebse nuk ka faqe t\u00eb tilla, zgjidhim faqen me numrin minimal nga ato q\u00eb kan\u00eb versionin e nj\u00ebjt\u00eb me aktualin.<br \/>\nB\u00ebjm\u00eb q\u00eb faqja e zgjedhur t\u00eb fshihet. Kontrollojm\u00eb p\u00ebrmbajtjen me 0xff. N\u00ebse di\u00e7ka nuk \u00ebsht\u00eb n\u00eb rregull, marrim faqen e ardhshme t\u00eb lir\u00eb, etj.<br \/>\nN\u00eb faqen e fshir\u00eb shkruajm\u00eb titullin, regjistrimi i par\u00eb \u00ebsht\u00eb gjendja aktuale e kontekstit, regjistrimi tjet\u00ebr \u00ebsht\u00eb regjistrimi i pa shkruar i jurnalit (n\u00ebse ka).<\/p>\n<p><\/p>\n<h1 id=\"primenimost-formata\">Pranueshm\u00ebria e formatit<\/h1>\n<p><\/p>\n<p>Sipas mendimit tim, ka dal\u00eb nj\u00eb format mjaft i mir\u00eb p\u00ebr ruajtjen e \u00e7do lloj fluksi informacioni q\u00eb mund t\u00eb kompresohet (tekst i thjesht\u00eb, JSON, MessagePack, CBOR, ndoshta protobuf) n\u00eb NOR Flash.<\/p>\n<p><\/p>\n<p>Sigurisht, formati \u00ebsht\u00eb \"i p\u00ebrshtatur\" p\u00ebr SLC NOR Flash.<\/p>\n<p><\/p>\n<p>Nuk duhet p\u00ebrdorur me mbajt\u00ebs me BER t\u00eb lart\u00eb, si NAND ose MLC NOR. <em>(a ekziston ndonj\u00ebher\u00eb nj\u00eb memorje e till\u00eb n\u00eb treg? kam par\u00eb p\u00ebrmendje vet\u00ebm n\u00eb punimet mbi kodet e korrigjimit)<\/em>.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, nuk duhet p\u00ebrdorur me pajisje q\u00eb kan\u00eb FTL t\u00eb tyre: USB flash, SD, MicroSD, etj. <em>(p\u00ebr k\u00ebt\u00eb memorie kam realizuar nj\u00eb format me madh\u00ebsin\u00eb e faqes prej 512 byte, nj\u00eb n\u00ebnshkrim n\u00eb fillim t\u00eb \u00e7do faqeje dhe numra unik t\u00eb regjistrimeve \u2014 ndonj\u00ebher\u00eb nga nj\u00eb flash i \"glitchuar\" \u00ebsht\u00eb e mundur t\u00eb rikuperohen t\u00eb dh\u00ebnat duke lexuar sekuencialisht)<\/em>.<\/p>\n<p><\/p>\n<p>N\u00eb var\u00ebsi t\u00eb detyrave, formati mund t\u00eb p\u00ebrdoret pa ndryshime n\u00eb flash nga 128 Kbit (16 Kb) deri n\u00eb 1 Gbit (128 Mb). N\u00ebse d\u00ebshiron, mund t\u00eb p\u00ebrdoret edhe n\u00eb \u00e7ipe m\u00eb t\u00eb m\u00ebdha, vet\u00ebm, ndoshta, duhet t\u00eb p\u00ebrshtatet madh\u00ebsia e faqes. <em>(Por k\u00ebtu lind pyetja e q\u00ebllimshm\u00ebris\u00eb ekonomike, \u00e7mimi i NOR Flash-it t\u00eb madh nuk \u00ebsht\u00eb p\u00ebr t\u2019u ngush\u00eblluar)<\/em>.<\/p>\n<p><\/p>\n<p>N\u00ebse ndonj\u00eb i interesuar mendon q\u00eb formati \u00ebsht\u00eb interesant dhe d\u00ebshiron ta p\u00ebrdor\u00eb n\u00eb nj\u00eb projekt t\u00eb hapur \u2013 shkruani, do t\u00eb p\u00ebrpiqem t\u00eb gjej koh\u00eb, ta p\u00ebrmir\u00ebsoj kodin dhe ta publikoj n\u00eb github.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">P\u00ebrfundim<\/h1>\n<p><\/p>\n<p>Si\u00e7 e shohim, p\u00ebrfundimisht formati ishte i thjesht\u00eb. <em>dhe edhe mjaft i m\u00ebrzitsh\u00ebm.<\/em>.<\/p>\n<p><\/p>\n<p>N\u00eb artikull \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb pasqyrohet evolucioni i pik\u00ebpamjes time, por besoni: n\u00eb fillim d\u00ebshiroja t\u00eb krijoja di\u00e7ka t\u00eb sofistikuar, t\u00eb pandashme, q\u00eb t\u00eb mund t\u00eb mbijetonte edhe pas nj\u00eb shp\u00ebrthimi b\u00ebrthamor n\u00eb af\u00ebrsi. Megjithat\u00eb, arsyetimi (shpresoj) p\u00ebrfundimisht fitoi dhe p\u00ebrpar\u00ebsit\u00eb u zhvendos\u00ebn drejt thjesht\u00ebsis\u00eb dhe kompaktes\u00ebs.<\/p>\n<p><\/p>\n<p>A mund t\u00eb ndodhi q\u00eb t\u00eb kem qen\u00eb gabim? Po, natyrisht. Mund t\u00eb ndodh\u00eb, p\u00ebr shembull, q\u00eb kemi bler\u00eb nj\u00eb grup \u00e7ipesh t\u00eb pap\u00ebrshtatshme. Ose p\u00ebr ndonj\u00eb arsye tjet\u00ebr, pajisjet nuk do t\u00eb plot\u00ebsojn\u00eb pritshm\u00ebrit\u00eb p\u00ebr besueshm\u00ebri.<\/p>\n<p><\/p>\n<p>A kam un\u00eb nj\u00eb plan p\u00ebr k\u00ebt\u00eb rast? Mendoj se pas leximit t\u00eb artikullit, nuk keni dyshime se un\u00eb kam nj\u00eb plan. Dhe madje jo vet\u00ebm nj\u00eb.<\/p>\n<p><\/p>\n<p>N\u00ebse e marr\u00eb seriozisht, formati \u00ebsht\u00eb zhvilluar nj\u00ebkoh\u00ebsisht si nj\u00eb variant funksional dhe si nj\u00eb \"testim\".<\/p>\n<p><\/p>\n<p>Momentalisht, gjith\u00e7ka funksionin normalisht n\u00eb tryez\u00eb, p\u00ebr nj\u00eb koh\u00eb t\u00eb shkurt\u00ebr zgjidhja do t\u00eb zbatohet. <em>(rreth)<\/em> n\u00eb qindra pajisjeve, do t\u00eb shohim se si do t\u00eb funksionoj\u00eb n\u00eb \"p\u00ebrdorim t\u00eb luft\u00ebs\" (me shpres\u00eb, formati lejon t\u00eb detektohen me besueshm\u00ebri d\u00ebshtimet; k\u00ebshtu q\u00eb do t\u00eb kemi mund\u00ebsin\u00eb t\u00eb mbledhim statistikat e plota). Pas disa muajsh do t\u00eb mund t\u00eb nxjerrim p\u00ebrfundime. <em>(dhe n\u00ebse nuk e kemi fat, at\u00ebher\u00eb edhe m\u00eb her\u00ebt)<\/em>.<\/p>\n<p><\/p>\n<p>N\u00ebse gjat\u00eb p\u00ebrdorimit zbulohen probleme serioze dhe nevojiten p\u00ebrmir\u00ebsime, patjet\u00ebr q\u00eb do t\u00eb shkruaj p\u00ebr k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<h1 id=\"literatura\">Literatura<\/h1>\n<p><\/p>\n<p>Nuk doja t\u00eb hartoja nj\u00eb list\u00eb t\u00eb gjat\u00eb t\u00eb punimeve t\u00eb p\u00ebrdorura, p\u00ebrfundimisht Google e kan\u00eb t\u00eb gjith\u00eb.<\/p>\n<p><\/p>\n<p>K\u00ebtu vendosa t\u00eb l\u00eb nj\u00eb list\u00eb gjetjesh q\u00eb m\u00eb dukeshin ve\u00e7an\u00ebrisht interesante, megjithat\u00eb gradualisht ato u p\u00ebrfshin\u00eb n\u00eb tekstin e artikullit, dhe n\u00eb list\u00eb mbeti vet\u00ebm nj\u00eb pik\u00eb:<\/p>\n<p><\/p>\n<ol>\n<li>Mjeti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/madler\/infgen\/\">infgen<\/a><\/noindex> nga autori zlib. Shton n\u00eb nj\u00eb format t\u00eb kuptuesh\u00ebm p\u00ebrmbajtjen e arkivave deflate\/zlib\/gzip. N\u00ebse duhet t\u00eb merresh me struktur\u00ebn e brendshme t\u00eb formatit deflate (ose gzip) - e rekomandoj me ngulm.<\/li>\n<\/ol>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/479044\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043c\u043e\u043d\u0435\u0442\u043e\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a, \u043a\u0443\u043f\u044e\u0440\u043e\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a, \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u2026 \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0412\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u043d\u0430 \u0444\u043b\u0435\u0448\u043a\u0435 (MicroSD), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e USB-\u043c\u043e\u0434\u0435\u043c\u0430) \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u0430\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0411\u0414. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0430\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 1\u0441, \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53751","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 NOR flash | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-08T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Zhvillimi im i tamponit rrethor n\u00eb NOR flash | ProHoster","description":"Pasht\u00ebshkruan Ka automatik\u00eb tregtar\u00eb t\u00eb zhvilluar vet\u00eb. Brenda ka Raspberry Pi dhe pak mb\u00ebshtetje n\u00eb nj\u00eb pllak\u00eb t\u00eb ve\u00e7ant\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 NOR flash | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-08T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53751","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 08:36:23","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:18:30","updated":"2026-01-24 08:36:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/53751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=53751"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/53751\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=53751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=53751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=53751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}