Aplikasyon mwen an nan yon tanpon bag nan flash NOR

pre-istwa

Gen machin lavant nan pwòp konsepsyon nou an. Anndan Franbwaz Pi a ak kèk fil elektrik sou yon tablo separe. Yon moun ki aksepte pyès monnen, yon moun ki aksepte bòdwo, yon tèminal labank konekte... Tout bagay kontwole pa yon pwogram pwòp tèt ou ekri. Tout istwa travay la ekri nan yon boutèy demi lit sou yon kondwi flash (MicroSD), ki Lè sa a, transmèt atravè Entènèt la (lè l sèvi avèk yon modèm USB) nan sèvè a, kote li estoke nan yon baz done. Enfòmasyon sou lavant yo chaje nan 1c, gen tou yon koòdone entènèt senp pou siveyans, elatriye.

Sa vle di, jounal la enpòtan anpil - pou kontablite (revni, lavant, elatriye), siveyans (tout kalite echèk ak lòt sikonstans fòs majeures); Sa a, yon moun ta ka di, se tout enfòmasyon nou genyen sou machin sa a.

pwoblèm

Kondwi Flash montre tèt yo yo dwe aparèy trè enfidèl. Yo echwe ak regilarite privilégiés. Sa a mennen nan tou de D ' machin ak (si pou kèk rezon boutèy la pa t 'kapab transfere sou entènèt) nan pèt done.

Sa a se pa eksperyans nan premye nan lè l sèvi avèk kondui flash, anvan sa a te gen yon lòt pwojè ak plis pase yon santèn aparèy, kote magazin an te estoke sou kondui flash USB, te gen tou pwoblèm ak fyab, nan fwa kantite moun ki echwe nan. yon mwa te nan plizyè douzèn yo. Nou te eseye diferan kondui flash, ki gen ladan sa ki make ak memwa SLC, ak kèk modèl ki pi serye pase lòt, men ranplase kondui flash pa t 'radikalman rezoud pwoblèm nan.

Attention! Li lontan! Si ou pa enterese nan "poukisa", men sèlman nan "ki jan", ou ka ale tou dwat Alafen atik.

desizyon

Premye bagay ki vin nan tèt ou se: abandone MicroSD, enstale, pou egzanp, yon SSD, ak bòt soti nan li. Teyorikman posib, pwobableman, men relativman chè, epi li pa tèlman serye (yon adaptè USB-SATA ajoute; estatistik echèk pou SSD bidjè yo pa ankouraje tou).

USB HDD tou pa sanble yon solisyon patikilyèman atire.

Se poutèt sa, nou te rive nan opsyon sa a: kite demaraj soti nan MicroSD, men sèvi ak yo nan mòd lekti sèlman, epi estoke jounal operasyon an (ak lòt enfòmasyon inik nan yon moso patikilye nan pyès ki nan konpitè - nimewo seri, kalibrasyon Capteur, elatriye) yon lòt kote. .

Sijè a nan FS lekti sèlman pou Franbwaz deja te etidye andedan ak deyò, mwen pa pral rete sou detay aplikasyon nan atik sa a. (men si gen enterè, petèt mwen pral ekri yon mini-atik sou sijè sa a). Sèl pwen mwen ta renmen remake se ke tou de soti nan eksperyans pèsonèl ak nan revizyon nan moun ki te deja aplike li, gen yon pwogrè nan fyab. Wi, li enposib konplètman debarase m de pann, men siyifikativman diminye frekans yo se byen posib. Ak kat yo ap vin inifye, sa ki fè ranplasman pi fasil pou pèsonèl sèvis yo.

Materyèl

Pa te gen okenn dout patikilye sou chwa a nan kalite memwa - NOR Flash.
Agiman:

  • koneksyon senp (pi souvan otobis la SPI, ki ou deja gen eksperyans lè l sèvi avèk, kidonk pa gen okenn pwoblèm pyès ki nan konpitè yo prevwa);
  • pri ridikil;
  • pwotokòl fonksyònman estanda (aplikasyon an deja nan nwayo Linux la, si ou vle, ou ka pran yon twazyèm pati, ki prezan tou, oswa menm ekri pwòp ou a, erezman tout bagay se senp);
  • fyab ak resous:
    soti nan yon fich done tipik: done yo estoke pou 20 ane, 100000 sik efase pou chak blòk;
    soti nan sous twazyèm pati: trè ba BER, postulate pa gen okenn bezwen pou kòd koreksyon erè (kèk travay konsidere ECC pou NOR, men anjeneral yo toujou vle di MLC NOR; sa rive tou).

Ann estime kondisyon yo pou volim ak resous.

Mwen ta renmen ke done yo dwe garanti yo dwe sove pou plizyè jou. Sa a se nesesè pou ke nan ka ta gen nenpòt pwoblèm kominikasyon, istwa a lavant pa pèdi. Nou pral konsantre sou 5 jou, pandan peryòd sa a (menm pran an kont wikenn ak jou ferye) pwoblèm nan ka rezoud.

Kounye a nou kolekte apeprè 100 kb nan mòso bwa pa jou (3-4 mil antre), men piti piti figi sa a ap grandi - detay yo ap ogmante, nouvo evènman yo te ajoute. Anplis de sa, pafwa gen eklat (kèk Capteur kòmanse spamming ak fo pozitif, pou egzanp). Nou pral kalkile pou 10 mil dosye 100 octets chak - megabytes pa jou.

An total, 5MB pwòp (byen konprese) done soti. Plis pou yo (estimasyon ki graj) 1MB done sèvis yo.

Sa vle di, nou bezwen yon chip 8MB si nou pa sèvi ak konpresyon, oswa 4MB si nou itilize li. Nimewo byen reyalis pou kalite memwa sa a.

Kòm pou resous la: si nou planifye ke tout memwa a pral reekri pa plis pase yon fwa chak 5 jou, Lè sa a, plis pase 10 ane nan sèvis nou jwenn mwens pase mil sik reekri.
Kite m 'fè ou sonje ke manifakti a pwomèt san mil.

Yon ti kras sou NOR vs NAND

Jodi a, nan kou, memwa NAND se pi plis popilè, men mwen pa ta sèvi ak li pou pwojè sa a: NAND, kontrèman ak NOR, nesesèman mande pou yo sèvi ak kòd koreksyon erè, yon tab nan blòk move, elatriye, epi tou janm yo nan NAND chips anjeneral pi plis.

Dezavantaj yo nan NOR gen ladan:

  • ti volim (e, kòmsadwa, gwo pri pou chak megaocte);
  • ba vitès kominikasyon (lajman akòz lefèt ke yo itilize yon koòdone seri, anjeneral SPI oswa I2C);
  • ralanti efase (selon gwosè blòk la, li pran soti nan yon fraksyon nan yon segonn a plizyè segonn).

Li sanble ke pa gen anyen kritik pou nou, kidonk nou kontinye.

Si detay yo enteresan, yo te chwazi mikro-sikwi a at25df321a (sepandan, sa a pa enpòtan, gen yon anpil nan analogue sou mache a ki konpatib nan sistèm pinout ak lòd; menm si nou vle enstale yon mikro sikwi ki soti nan yon manifakti diferan ak / oswa yon gwosè diferan, tout bagay ap travay san yo pa chanje a. kòd).

Mwen sèvi ak chofè a ki te bati nan nwayo Linux la; sou Franbwaz, gras a sipò pou kouvri pye bwa aparèy, tout bagay se trè senp - ou bezwen mete kouvri konpile a nan /boot/overlays ak yon ti kras modifye /boot/config.txt.

Egzanp dosye dts

Yo dwe onèt, mwen pa sèten ke li ekri san erè, men li travay.

/*
 * Device tree overlay for at25 at spi0.1
 */

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709"; 

    /* disable spi-dev for spi0.1 */
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            status = "okay";
            spidev@1{
                status = "disabled";
            };
        };
    };

    /* the spi config of the at25 */
    fragment@1 {
        target = <&spi0>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            flash: m25p80@1 {
                    compatible = "atmel,at25df321a";
                    reg = <1>;
                    spi-max-frequency = <50000000>;

                    /* default to false:
                    m25p,fast-read ;
                    */
            };
        };
    };

    __overrides__ {
        spimaxfrequency = <&flash>,"spi-max-frequency:0";
        fastread = <&flash>,"m25p,fast-read?";
    };
};

Ak yon lòt liy nan config.txt

dtoverlay=at25:spimaxfrequency=50000000

Mwen pral kite deskripsyon konekte chip la ak Franbwaz Pi a. Sou yon bò, mwen pa yon ekspè nan elektwonik, yon lòt bò, tout bagay isit la se ordinèr menm pou mwen: mikro-sikwi a gen sèlman 8 pye, nan ki nou bezwen tè, pouvwa, SPI (CS, SI, SO, SCK); nivo yo se menm jan ak sa yo nan Franbwaz Pi a, pa gen okenn fil elektrik adisyonèl ki nesesè - jis konekte 6 broch ki endike yo.

Deklarasyon sou pwoblèm nan

Kòm dabitid, deklarasyon pwoblèm nan ale nan plizyè iterasyon, epi mwen sanble ke li lè pou pwochen an. Donk, ann sispann, mete ansanm sa ki deja ekri, epi klarifye detay ki rete nan lonbraj yo.

Se konsa, nou te deside ke boutèy la pral estoke nan SPI NI Flash.

Ki sa ki NOR Flash pou moun ki pa konnen?

Sa a se memwa ki pa temèt ak ki ou ka fè twa operasyon:

  1. Lekti:
    Lekti ki pi komen: nou transmèt adrès la epi li otan octets ke nou bezwen;
  2. Dosye:
    Ekri nan NOR flash sanble ak yon sèl regilye, men li gen yon sèl patikilye: ou ka sèlman chanje 1 a 0, men se pa vise vèrsa. Pou egzanp, si nou te gen 0x55 nan yon selil memwa, Lè sa a, apre yo fin ekri 0x0f nan li, 0x05 pral deja estoke la. (gade tablo jis anba a);
  3. Efase:
    Natirèlman, nou bezwen kapab fè operasyon an opoze - chanje 0 a 1, sa a se egzakteman sa operasyon an efase se pou. Kontrèman ak de premye yo, li pa opere ak bytes, men ak blòk (blòk efase minimòm nan chip chwazi a se 4kb). Efase detwi tout blòk la epi li se sèl fason pou chanje 0 a 1. Se poutèt sa, lè w ap travay ak memwa flash, ou souvan oblije aliman estrikti done ak fwontyè blòk la efase.
    Anrejistreman nan NOR Flash:

Done binè

Te
01010101

Anrejistre
00001111

Te vin
00000101

Jounal la li menm reprezante yon sekans dosye ki gen longè varyab. Longè tipik yon dosye se apeprè 30 octets (byenke dosye ki gen plizyè kilobyte nan longè pafwa rive). Nan ka sa a, nou travay avèk yo tou senpleman kòm yon seri bytes, men, si w enterese, CBOR yo itilize andedan dosye yo.

Anplis de sa nan boutèy la, nou bezwen sere kèk enfòmasyon "anviwònman", tou de mete ajou epi yo pa: yon sèten ID aparèy, kalibrasyon Capteur, yon "aparèy se tanporèman enfim" drapo, elatriye.
Enfòmasyon sa a se yon seri dosye kle-valè, ki estoke tou nan CBOR. Nou pa gen anpil enfòmasyon sa yo (kèk kilookte maksimòm), epi li mete ajou souvan.
Nan sa ki vin apre nou pral rele li kontèks.

Si nou sonje kote atik sa a te kòmanse, li enpòtan anpil pou asire depo done serye ak, si sa posib, operasyon kontinyèl menm nan evènman an nan echèk pyès ki nan konpitè / koripsyon done.

Ki sous pwoblèm yo ka konsidere?

  • Kouran koupe pandan operasyon ekri/efase. Sa a soti nan kategori a nan "pa gen okenn Trick kont Crowbar."
    Enfòmasyon ki soti nan diskisyon sou stackexchange: lè pouvwa a etenn pandan y ap travay ak flash, tou de efase (mete a 1) ak ekri (mete a 0) mennen nan konpòtman endefini: done yo ka ekri, pasyèlman ekri (di, nou transfere 10 bytes / 80 bits). , men se pa ankò sèlman 45 Bits ka ekri), li posib tou ke kèk nan Bits yo pral nan yon eta "entèmedyè" (lekti ka pwodwi tou de 0 ak 1);
  • Erè nan memwa flash tèt li.
    BER, byenke trè ba, pa ka egal a zewo;
  • Erè bis
    Done transmèt atravè SPI yo pa pwoteje nan okenn fason; tou de erè sèl ti ak erè senkronizasyon ka rive - pèt oswa ensèsyon nan ti (ki mennen nan distòsyon done masiv);
  • Lòt erè / glitches
    Erè nan kòd la, pepen Franbwaz, entèferans etranje...

Mwen te formul egzijans yo, nan ki, nan opinyon mwen, ki nesesè pou asire fyab:

  • dosye yo dwe antre nan memwa flash imedyatman, ekri reta yo pa konsidere; - si yon erè rive, li dwe detekte ak trete osi bonè ke posib; - sistèm nan dwe, si sa posib, retabli de erè.
    (yon egzanp nan lavi "ki jan li pa ta dwe", ki mwen panse ke tout moun te rankontre: apre yon rdemare ijans, sistèm nan fichye "kase" ak sistèm nan fonksyone pa bòt)

Lide, apwòch, refleksyon

Lè mwen te kòmanse reflechi sou pwoblèm sa a, anpil lide te parèt nan tèt mwen, pa egzanp:

  • itilize konpresyon done;
  • sèvi ak estrikti done entelijan, pou egzanp, estoke headers dosye separeman de dosye yo tèt yo, pou ke si gen yon erè nan nenpòt dosye, ou ka li rès la san okenn pwoblèm;
  • sèvi ak jaden ti jan yo kontwole fini an nan anrejistreman lè pouvwa a etenn;
  • magazen chèk pou tout bagay;
  • sèvi ak kèk kalite kodaj ki reziste bri.

Gen kèk nan lide sa yo te itilize, pandan ke lòt yo te deside abandone. Ann ale nan lòd.

Done konpresyon

Evènman yo tèt yo ke nou anrejistre nan jounal la se byen menm jan ak repete ("jete yon pyès monnen 5 ruble", "fè peze bouton an pou bay chanjman", ...). Se poutèt sa, konpresyon yo ta dwe byen efikas.

Konpresyon anlè a se ensiyifyan (prosesè nou an se byen pwisan, menm premye Pi a te gen yon nwayo ak yon frekans nan 700 MHz, modèl aktyèl yo gen plizyè nwayo ak yon frekans nan plis pase yon gigahertz), to echanj la ak depo a ba (plizyè megabyte pa segonn), gwosè dosye yo piti. An jeneral, si konpresyon gen yon enpak sou pèfòmans, li pral sèlman pozitif. (absoliman san kritik, jis deklare). Anplis de sa, nou pa gen yon Linux reyèl entegre, men regilye - kidonk aplikasyon an pa ta dwe mande anpil efò (li ase jis konekte bibliyotèk la epi sèvi ak plizyè fonksyon nan li).

Yo te pran yon moso nan boutèy demi lit la nan yon aparèy k ap travay (1.7 MB, 70 mil antre) epi premye tcheke pou konpresibilite lè l sèvi avèk gzip, lz4, lzop, bzip2, xz, zstd ki disponib sou òdinatè a.

  • gzip, xz, zstd te montre rezilta menm jan an (40Kb).
    Mwen te etone ke xz alamòd la te montre tèt li isit la nan nivo gzip oswa zstd;
  • lzip ak paramèt default te bay rezilta yon ti kras pi mal;
  • lz4 ak lzop te montre rezilta pa trè bon (150Kb);
  • bzip2 te montre yon rezilta etonan bon (18Kb).

Se konsa, done yo konprese trè byen.
Se konsa (si nou pa jwenn defo fatal) pral gen konpresyon! Senpleman paske plis done ka anfòm sou menm kondwi flash la.

Ann reflechi sou dezavantaj yo.

Premye pwoblèm: nou te deja dakò ke chak dosye dwe imedyatman ale nan flash. Tipikman, achiv la kolekte done ki soti nan kouran an opinyon jiskaske li deside ke li se tan yo ekri nan fen semèn nan. Nou bezwen imedyatman resevwa yon blòk konprese nan done epi estoke li nan memwa ki pa temèt.

Mwen wè twa fason:

  1. Konprese chak dosye lè l sèvi avèk konpresyon diksyonè olye pou yo algoritm yo diskite pi wo a.
    Li se yon opsyon konplètman travay, men mwen pa renmen li. Pou asire yon nivo konpresyon plis oswa mwens desan, diksyonè a dwe "adapte" a done espesifik; nenpòt chanjman ap mennen nan nivo konpresyon an tonbe katastwofik. Wi, pwoblèm nan ka rezoud pa kreye yon nouvo vèsyon diksyonè a, men sa a se yon tèt fè mal - nou pral bezwen estoke tout vèsyon diksyonè a; nan chak antre nou pral bezwen endike ak ki vèsyon diksyonè a li te konprese...
  2. Konprese chak dosye lè l sèvi avèk algoritm "klasik", men poukont lòt yo.
    Algoritm konpresyon yo konsidere yo pa fèt pou travay avèk dosye gwosè sa a (dè dizèn de bytes), rapò a konpresyon pral klèman mwens pase 1 (ki se, ogmante volim done olye pou yo konpresyon);
  3. Fè FLUSH apre chak anrejistreman.
    Anpil bibliyotèk konpresyon gen sipò pou FLUSH. Sa a se yon kòmand (oswa yon paramèt nan pwosedi konpresyon), lè li resevwa ki achiv la fòme yon kouran konprese pou ke li ka itilize retabli. tout done san konprese ki deja resevwa. Tankou yon analogue sync nan sistèm dosye oswa commit nan sql.
    Ki sa ki enpòtan se ke operasyon konpresyon ki vin apre yo pral kapab itilize diksyonè a akimile ak rapò a konpresyon pa pral soufri otan ke nan vèsyon anvan an.

Mwen panse ke li evidan ke mwen te chwazi twazyèm opsyon an, ann gade nan li an plis detay.

Jwenn gwo atik sou FLUSH nan zlib.

Mwen te fè yon tès jenou ki baze sou atik la, mwen te pran 70 mil antre nan yon aparèy reyèl, ak yon gwosè paj 60Kb. (nou pral tounen nan gwosè paj pita) te resevwa:

Done kri
Konpresyon gzip -9 (pa gen FLUSH)
zlib ak Z_PARTIAL_FLUSH
zlib ak Z_SYNC_FLUSH

Volim, KB
1692
40
352
604

Nan premye gade, pri a kontribye pa FLUSH twò wo, men an reyalite nou gen ti chwa - swa pa konpresyon nan tout, oswa konpresyon (e trè efektivman) ak FLUSH. Nou pa dwe bliye ke nou gen 70 mil dosye, redondance prezante pa Z_PARTIAL_FLUSH se sèlman 4-5 byte pou chak dosye. Ak rapò a konpresyon yo te tounen prèske 5: 1, ki se pi plis pase yon rezilta ekselan.

Li ka vini kòm yon sipriz, men Z_SYNC_FLUSH se aktyèlman yon fason pi efikas pou fè FLUSH.

Lè w ap itilize Z_SYNC_FLUSH, dènye 4 octets chak antre ap toujou 0x00, 0x00, 0xff, 0xff. Men, si nou konnen yo, Lè sa a, nou pa bezwen estoke yo, kidonk gwosè final la se sèlman 324Kb.

Atik mwen te lye a gen yon eksplikasyon:

Yo mete yon nouvo blòk tip 0 ak sa ki vid.

Yon blòk tip 0 ak sa ki vid konsiste de:

  • Tèt blòk twa-bit la;
  • 0 a 7 bit egal a zewo, pou reyalize aliyman byte;
  • sekans kat byte 00 00 FF FF.

Kòm ou ka fasilman wè, nan dènye blòk la anvan 4 bytes sa yo gen soti nan 3 a 10 bit zewo. Sepandan, pratik te montre ke gen aktyèlman omwen 10 zewo Bits.

Li sanble ke sa yo blòk kout nan done yo anjeneral (toujou?) kode lè l sèvi avèk yon blòk nan kalite 1 (blòk fiks), ki nesesèman fini ak 7 bit zewo, bay yon total de 10-17 bit zewo garanti (ak rès la pral dwe zewo ak yon pwobabilite apeprè 50%).

Se konsa, sou done tès yo, nan 100% nan ka gen yon byte zewo anvan 0x00, 0x00, 0xff, 0xff, ak nan plis pase yon tyè nan ka gen de byte zewo. (petèt reyalite a se ke mwen itilize binè CBOR, ak lè w ap itilize tèks JSON, blòk nan kalite 2 - blòk dinamik ta pi komen, respektivman, blòk san yo pa zewo byte adisyonèl anvan 0x00, 0x00, 0xff, 0xff ta rankontre).

An total, lè l sèvi avèk done tès ki disponib yo, li posib pou anfòm nan mwens pase 250Kb nan done konprese.

Ou ka sove yon ti kras plis pa fè ti jan jungle: pou kounye a nou inyore prezans nan kèk zewo Bits nan fen blòk la, kèk Bits nan kòmansman blòk la tou pa chanje...
Men, Lè sa a, mwen te pran yon desizyon fò pou sispann, otreman nan vitès sa a mwen te kapab fini devlope pwòp achiv mwen.

An total, nan done tès mwen an mwen te resevwa 3-4 bytes pou chak ekri, rapò a konpresyon te tounen plis pase 6:1. Mwen pral onèt: mwen pa t 'atann yon rezilta konsa; nan opinyon mwen, anyen ki pi bon pase 2: 1 se deja yon rezilta ki jistifye itilizasyon konpresyon.

Tout bagay anfòm, men zlib (deflate) se toujou yon algorithm konpresyon akayik, ki byen merite ak yon ti kras ansyen alamòd. Sèlman lefèt ke dènye 32Kb nan kouran done dekonprese yo itilize kòm yon diksyonè sanble etranj jodi a (ki se, si kèk blòk done ki sanble anpil ak sa ki te nan kouran an opinyon 40Kb de sa, Lè sa a, li pral kòmanse achiv ankò, epi yo pa pral refere a yon ensidan anvan). Nan achiv modèn alamòd, gwosè diksyonè a souvan mezire an megabyte olye ke kilobyte.

Se konsa, nou kontinye mini-etid nou an nan achiv yo.

Apre sa, nou teste bzip2 (sonje byen, san FLUSH li te montre yon rapò konpresyon kokenn nan prèske 100: 1). Malerezman, li te fè trè mal ak FLUSH; gwosè a nan done yo konprese yo te vin pi gwo pase done yo dekonprese.

Sipozisyon mwen sou rezon ki fè echèk la

Libbz2 ofri sèlman yon opsyon flush, ki sanble klè diksyonè a (analòg ak Z_FULL_FLUSH nan zlib); pa gen okenn pale sou nenpòt konpresyon efikas apre sa.

Ak dènye yo te teste te zstd. Tou depan de paramèt yo, li konprese swa nan nivo gzip, men anpil pi vit, oswa pi bon pase gzip.

Ay, ak FLUSH li pa t 'fè trè byen: gwosè a nan done yo konprese yo te sou 700Kb.

Я te poze yon kesyon sou paj github pwojè a, mwen te resevwa yon repons ke ou ta dwe konte sou jiska 10 byte nan done sèvis pou chak blòk nan done konprese, ki se tou pre rezilta yo jwenn; pa gen okenn fason yo ratrape ak deflate.

Mwen deside sispann nan pwen sa a nan eksperyans mwen ak achiv (kite m 'fè ou sonje ke xz, lzip, lzo, lz4 pa t' montre tèt yo menm nan etap tès la san FLUSH, epi mwen pa t 'konsidere algoritm konpresyon plis ekzotik).

Ann retounen nan pwoblèm achiv.

Dezyèm (jan yo di nan lòd, pa nan valè) pwoblèm se ke done yo konprese se yon kouran sèl, nan ki gen toujou ap referans a seksyon anvan yo. Kidonk, si yon seksyon nan done konprese domaje, nou pèdi non sèlman blòk ki asosye nan done dekonprese, men tou, tout moun ki vin apre yo.

Gen yon apwòch pou rezoud pwoblèm sa a:

  1. Anpeche pwoblèm nan rive - ajoute redondance nan done yo konprese, ki pral pèmèt ou idantifye ak korije erè; nou pral pale sou sa pita;
  2. Minimize konsekans si yon pwoblèm rive
    Nou te deja di pi bonè ke ou ka konprese chak blòk done poukont li, ak pwoblèm nan pral disparèt pou kont li (domaj nan done yo nan yon blòk ap mennen nan pèt la nan done sèlman pou blòk sa a). Sepandan, sa a se yon ka ekstrèm kote konpresyon done yo pral efikas. Ekstrèm opoze a: sèvi ak tout 4MB nan chip nou an kòm yon sèl achiv, ki pral ba nou konpresyon ekselan, men konsekans katastwofik nan ka ta gen koripsyon done.
    Wi, yon konpwomi nesesè an tèm de fyab. Men, nou dwe sonje ke nou ap devlope yon fòma depo done pou memwa ki pa temèt ak BER trè ba ak yon peryòd depo done deklare nan 20 ane.

Pandan eksperyans yo, mwen te dekouvri ke pèt plis oswa mwens aparan nan nivo konpresyon kòmanse sou blòk done konprese mwens pase 10 KB nan gwosè.
Li te deja mansyone ke memwa yo itilize a paj; Mwen pa wè okenn rezon ki fè korespondans "yon paj - yon blòk nan done konprese" pa ta dwe itilize.

Sa vle di, gwosè minimòm rezonab paj la se 16Kb (ak yon rezèv pou enfòmasyon sèvis). Sepandan, tankou yon ti gwosè paj enpoze restriksyon enpòtan sou gwosè maksimòm dosye a.

Malgre ke mwen poko espere dosye ki pi gwo pase kèk kilobyte nan fòm konprese, mwen deside sèvi ak paj 32Kb (pou yon total de 128 paj pou chak chip).

Rezime:

  • Nou estoke done konprese lè l sèvi avèk zlib (deflate);
  • Pou chak antre nou mete Z_SYNC_FLUSH;
  • Pou chak dosye konprese, nou koupe octets fin yo (egzanp 0x00, 0x00, 0xff, 0xff); nan header a nou endike konbyen bytes nou koupe;
  • Nou estoke done nan paj 32Kb; gen yon sèl kouran done konprese andedan paj la; Nan chak paj nou kòmanse konpresyon ankò.

Epi, anvan m fini ak konpresyon, mwen ta renmen atire atansyon w sou lefèt ke nou sèlman gen kèk byte nan done konprese pou chak dosye, kidonk li trè enpòtan pou pa gonfle enfòmasyon sèvis la, chak octet konte isit la.

Estoke Tèt Done yo

Depi nou gen dosye ki gen longè varyab, nou bezwen yon jan kanmenm detèmine plasman / limit dosye yo.

Mwen konnen twa apwòch:

  1. Tout dosye yo estoke nan yon kouran kontinyèl, premye gen yon header dosye ki gen longè a, ak Lè sa a, dosye a li menm.
    Nan reyalizasyon sa a, tou de header ak done yo ka nan longè varyab.
    Esansyèlman, nou jwenn yon lis yon sèl lye ki itilize tout tan tout tan an;
  2. Tèt ak dosye tèt yo yo estoke nan kouran separe.
    Lè nou itilize headers ki gen longè konstan, nou asire ke domaj nan yon header pa afekte lòt yo.
    Yo itilize yon apwòch ki sanble, pou egzanp, nan anpil sistèm dosye;
  3. Dosye yo estoke nan yon kouran kontinyèl, fwontyè dosye a detèmine pa yon makè sèten (yon karaktè/sekans karaktè ki entèdi nan blòk done). Si gen yon makè andedan dosye a, Lè sa a, nou ranplase li ak kèk sekans (chape li).
    Yo itilize yon apwòch menm jan an, pou egzanp, nan pwotokòl PPP la.

Mwen pral ilistre.

Opsyon 1:
Aplikasyon mwen an nan yon tanpon bag nan flash NOR
Tout bagay se trè senp isit la: konnen longè dosye a, nou ka kalkile adrès la nan pwochen header la. Se konsa, nou deplase nan tit yo jiskaske nou rankontre yon zòn ki ranpli ak 0xff (zòn gratis) oswa nan fen paj la.

Opsyon 2:
Aplikasyon mwen an nan yon tanpon bag nan flash NOR
Akòz longè dosye varyab la, nou pa ka di davans konbyen dosye (ak donk headers) nou pral bezwen pou chak paj. Ou ka gaye tèt yo ak done yo tèt yo nan diferan paj, men mwen pito yon apwòch diferan: nou mete tou de headers yo ak done yo sou yon paj, men headers yo (ki gen gwosè konstan) soti nan kòmansman paj la, ak done (nan longè varyab) soti nan fen an. Le pli vit ke yo "rankontre" (pa gen ase espas gratis pou yon nouvo antre), nou konsidere paj sa a konplè.

Opsyon 3:
Aplikasyon mwen an nan yon tanpon bag nan flash NOR
Pa gen okenn nesesite pou estoke longè oswa lòt enfòmasyon sou kote done yo nan tèt la; makè ki endike limit dosye yo ase. Sepandan, done yo dwe trete lè w ap ekri/lekti.
Mwen ta itilize 0xff kòm yon makè (ki ranpli paj la apre efase), kidonk zòn gratis la pral definitivman pa trete kòm done.

Tablo konparezon:

Opsyon 1
Opsyon 2
Opsyon 3

Tolerans erè
-
+
+

Konpak
+
-
+

Konpleksite aplikasyon
*
**
**

Opsyon 1 gen yon defo fatal: si nenpòt nan tèt yo domaje, tout chèn ki vin apre a detwi. Opsyon ki rete yo pèmèt ou refè kèk done menm nan evènman an nan gwo domaj.
Men, isit la li apwopriye sonje ke nou deside estoke done yo nan yon fòm konprese, epi konsa nou pèdi tout done yo sou paj la apre yon dosye "kase", kidonk menm si gen yon mwens nan tablo a, nou pa fè sa. pran li an kont.

Konpak:

  • nan premye opsyon a, nou bezwen sere sèlman longè a nan header la; si nou itilize nonm antye ki varyab longè, Lè sa a, nan pifò ka nou ka jwenn ak yon byte;
  • nan dezyèm opsyon an nou bezwen estoke adrès la kòmanse ak longè; Dosye a dwe yon gwosè konstan, mwen estime 4 bytes pou chak dosye (de byte pou konpanse a, ak de byte pou longè a);
  • twazyèm opsyon a sèlman bezwen yon karaktè pou endike kòmansman anrejistreman an, plis anrejistreman an tèt li ap ogmante pa 1-2% akòz pwoteksyon. An jeneral, apeprè egalite ak premye opsyon an.

Okòmansman, mwen te konsidere dezyèm opsyon an kòm youn prensipal la (e menm te ekri aplikasyon an). Mwen abandone li sèlman lè mwen finalman deside sèvi ak konpresyon.

Petèt yon jou mwen pral toujou sèvi ak yon opsyon ki sanble. Pou egzanp, si mwen gen fè fas ak depo done pou yon bato vwayaje ant Latè ak Mas, pral gen kondisyon konplètman diferan pou fyab, radyasyon cosmic, ...

Kòm pou twazyèm opsyon a: Mwen te ba li de zetwal pou difikilte pou aplikasyon an tou senpleman paske mwen pa renmen dezòd ak pwoteksyon, chanje longè nan pwosesis la, elatriye. Wi, petèt mwen gen patipri, men mwen pral oblije ekri kòd la - poukisa fòse tèt ou fè yon bagay ou pa renmen.

Rezime: Nou chwazi opsyon nan depo nan fòm lan nan chèn "tèt ak longè - done nan longè varyab" akòz efikasite ak fasilite nan aplikasyon.

Sèvi ak Bit Fields pou kontwole siksè operasyon ekriti yo

Mwen pa sonje kounye a ki kote mwen te resevwa lide a, men li sanble yon bagay tankou sa a:
Pou chak antre, nou asiyen plizyè Bits nan magazen drapo.
Kòm nou te di pi bonè, apre yo fin efase tout bit yo plen ak 1s, epi nou ka chanje 1 a 0, men pa vise vèrsa. Se konsa, pou "drapo a pa mete" nou itilize 1, pou "drapo a mete" nou itilize 0.

Men ki jan mete yon dosye longè varyab nan flash ta ka sanble:

  1. Mete drapo a "longè anrejistreman te kòmanse";
  2. Ekri longè a;
  3. Mete "anrejistreman done te kòmanse" drapo a;
  4. Nou anrejistre done;
  5. Mete drapo "anrejistreman te fini".

Anplis de sa, nou pral gen yon drapo "erè ki te fèt", pou yon total de drapo 4 bit.

Nan ka sa a, nou gen de eta ki estab "1111" - anrejistreman pa te kòmanse ak "1000" - anrejistreman te reyisi; nan evènman an nan yon entèripsyon inatandi nan pwosesis anrejistreman an, nou pral resevwa eta entèmedyè, ke nou ka Lè sa a, detekte ak trete.

Apwòch la enteresan, men li sèlman pwoteje kont pann kouran toudenkou ak echèk menm jan an, ki, nan kou, enpòtan, men sa a se lwen sèlman (oswa menm rezon prensipal la) pou echèk posib.

Rezime: Ann avanse pou nou chèche yon bon solisyon.

Sòm chèk yo

Checksums tou fè li posib pou asire w (avèk pwobabilite rezonab) ke nou ap li egzakteman sa yo ta dwe ekri. Epi, kontrèman ak jaden ti jan yo diskite pi wo a, yo toujou travay.

Si nou konsidere lis potansyèl sous pwoblèm ke nou te diskite pi wo a, Lè sa a, chèk la kapab rekonèt yon erè kèlkeswa orijin li. (eksepte, petèt, pou etranje move - yo ka fòje checksum la tou).

Se konsa, si objektif nou se verifye ke done yo se entak, chèk yo se yon bon lide.

Chwa a nan algorithm pou kalkile sòm chèk la pa t 'leve nenpòt kesyon - CRC. Sou yon bò, pwopriyete matematik yo fè li posib trape sèten kalite erè 100%; nan lòt men an, sou done o aza algorithm sa a anjeneral montre pwobabilite pou kolizyon pa pi gran pase limit teyorik la. Aplikasyon mwen an nan yon tanpon bag nan flash NOR. Li ka pa algorithm ki pi rapid la, ni li toujou minimòm nan an tèm de kantite kolizyon, men li gen yon bon jan kalite trè enpòtan: nan tès yo mwen rankontre, pa te gen okenn modèl nan ki li klèman echwe. Estabilite se bon jan kalite prensipal la nan ka sa a.

Egzanp yon etid volumetrik: pati 1, pati 2 (Lyen ki mennen nan narod.ru, padon).

Sepandan, travay pou chwazi yon sòm chèk pa konplè; CRC se yon fanmi antye nan chèk. Ou bezwen deside sou longè a, epi chwazi yon polinòm.

Chwazi longè checksum la se pa yon kesyon senp jan li sanble nan premye gade.

Kite m ilistre:
Se pou nou gen pwobabilite pou yon erè nan chak byte Aplikasyon mwen an nan yon tanpon bag nan flash NOR ak yon sòm chèk ideyal, ann kalkile kantite mwayèn erè pou chak milyon dosye:

Done, byte
Sòm chèk, byte
Erè ki pa detekte
Deteksyon fo erè
Total fo pozitif

1
0
1000
0
1000

1
1
4
999
1003

1
2
0
1997
1997

1
4
0
3990
3990

10
0
9955
0
9955

10
1
39
990
1029

10
2
0
1979
1979

10
4
0
3954
3954

1000
0
632305
0
632305

1000
1
2470
368
2838

1000
2
10
735
745

1000
4
0
1469
1469

Li ta sanble ke tout bagay se senp - depann sou longè a nan done yo ke yo te pwoteje, chwazi longè a nan chèk la ak yon minimòm de pozitif kòrèk - ak jwe fent la se nan sak la.

Sepandan, yon pwoblèm rive ak chèk kout: byenke yo bon nan detekte erè ti sèl, yo ka ak yon pwobabilite jistis segondè aksepte done konplètman o aza kòm kòrèk. Te gen deja yon atik sou Habré ki dekri pwoblèm nan lavi reyèl.

Se poutèt sa, pou fè yon match sòm chèk o aza prèske enposib, ou bezwen sèvi ak sòm chèk ki se 32 bit oswa pi long nan longè. (pou longè ki pi gran pase 64 bit, yo anjeneral itilize fonksyon kriptografik hash).

Malgre lefèt ke mwen te ekri pi bonè ke nou bezwen pou konsève pou espas pa tout mwayen, nou pral toujou sèvi ak yon chèk 32-bit (16 bit yo pa ase, pwobabilite pou yon kolizyon se plis pase 0.01%; ak 24 bit, kòm yo di, yo pa ni isit la ni la).

Yon objeksyon ka leve isit la: èske nou sove chak byte lè w ap chwazi konpresyon pou kounye a bay 4 byte nan yon fwa? Èske li pa ta pi bon pou pa konprese oswa ajoute yon chèk? Natirèlman pa, pa gen okenn konpresyon pa vle di, ke nou pa bezwen entegrite tcheke.

Lè w ap chwazi yon polinòm, nou pa pral reenvante volan an, men nou pral pran CRC-32C ki popilè kounye a.
Kòd sa a detekte erè 6 bit sou pake jiska 22 bytes (petèt ka ki pi komen pou nou), erè 4 bit sou pake jiska 655 bytes (tou yon ka komen pou nou), 2 oswa nenpòt ki kantite enpè erè ti sou pake. nan nenpòt longè rezonab.

Si yon moun enterese nan detay yo

Atik Wikipedia sou CRC.

Paramèt kòd crc-32c sou Koopman sit entènèt — petèt dirijan espesyalis CRC sou planèt la.

В atik li a gen yon lòt kòd enteresan, ki bay yon ti kras pi bon paramèt pou longè pake yo ki enpòtan pou nou, men mwen pa t 'konsidere diferans lan enpòtan, e mwen te konpetan ase yo chwazi kòd koutim olye pou yo yon sèl estanda ak byen rechèch.

Epitou, depi done nou yo konprese, kesyon an rive: èske nou ta dwe kalkile checksum done konprese oswa dekonprese?

Agiman an favè kalkile checksum done ki pa konprese:

  • Nou finalman bezwen tcheke sekirite nan depo done - kidonk nou tcheke li dirèkteman (an menm tan an, erè posib nan aplikasyon an nan konpresyon / dekonpresyon, domaj ki te koze pa memwa kase, elatriye yo pral tcheke);
  • Algorithm deflate nan zlib gen yon aplikasyon ki gen matirite ak pa ta dwe tonbe ak done antre "kwochi"; Anplis, li se souvan kapab poukont yo detekte erè nan kouran an opinyon, diminye pwobabilite jeneral pou detekte yon erè (te fè yon tès ak envèse yon sèl ti jan nan yon dosye kout, zlib detekte yon erè. nan apeprè yon tyè nan ka yo).

Agiman kont kalkile sòm chèk done ki pa konprese:

  • CRC "prepare" espesyalman pou kèk erè ti jan ki karakteristik memwa flash (yon ti erè nan yon kouran konprese ka lakòz yon chanjman masiv nan kouran pwodiksyon an, sou ki, piman teyorikman, nou ka "trape" yon kolizyon);
  • Mwen pa vrèman renmen lide pase done ki ka kase nan dekonpresyon an, Sa k konnenkijan li pral reyaji.

Nan pwojè sa a, mwen deside devye de pratik jeneralman aksepte nan estoke yon sòm chèk nan done san konprese.

Rezime: Nou itilize CRC-32C, nou kalkile sòm chèk la nan done yo nan fòm kote yo ekri nan flash (apre konpresyon).

Redondans

Itilize nan kodaj redondants pa, nan kou, elimine pèt done, sepandan, li ka siyifikativman (souvan pa anpil lòd nan grandè) diminye chans pou pèt done irevokabl.

Nou ka itilize diferan kalite redondance pou korije erè.
Kòd Hamming ka korije erè yon sèl ti jan, kòd karaktè Reed-Solomon, plizyè kopi done konbine avèk chèk, oswa kodaj tankou RAID-6 ka ede refè done menm nan evènman an nan koripsyon masiv.
Okòmansman, mwen te angaje nan itilizasyon toupatou nan kodaj ki reziste erè, men Lè sa a, mwen reyalize ke nou premye bezwen gen yon lide sou ki erè nou vle pwoteje tèt nou, ak Lè sa a, chwazi kodaj.

Nou te di byen bonè ke erè yo dwe kenbe pi vit ke posib. Nan ki pwen nou ka rankontre erè?

  1. Anrejistreman fini (pou kèk rezon nan moman anrejistreman an te koupe pouvwa a, Franbwaz la te jele, ...)
    Ay, nan evènman an nan yon erè konsa, tout sa ki rete se inyore dosye envalid epi konsidere done yo pèdi;
  2. Erè ekri (pou kèk rezon, sa ki te ekri nan memwa flash la pa t 'sa ki te ekri)
    Nou ka imedyatman detekte erè sa yo si nou fè yon tès li imedyatman apre anrejistreman;
  3. Distòsyon done nan memwa pandan depo;
  4. Lekti erè
    Pou korije li, si sòm chèk la pa matche ak, li se ase repete lekti a plizyè fwa.

Sa vle di, se sèlman erè nan twazyèm kalite a (koripsyon espontane nan done pandan depo) pa ka korije san kodaj ki reziste erè. Li sanble ke erè sa yo toujou trè fasil.

Rezime: li te deside abandone kodaj redondants, men si operasyon montre erè a nan desizyon sa a, Lè sa a, retounen nan konsiderasyon nan pwoblèm nan (ak deja akimile estatistik sou echèk, ki pral pèmèt chwazi kalite a pi bon nan kodaj).

Lòt

Natirèlman, fòma atik la pa pèmèt nou jistifye chak ti jan nan fòma a (ak fòs mwen deja fini), Se konsa, mwen pral yon ti tan ale sou kèk pwen yo pa manyen sou pi bonè.

  • Li te deside fè tout paj "egal"
    Sa vle di, pa pral gen paj espesyal ak metadata, fil separe, elatriye, men olye de yon sèl fil ki reekri tout paj nan vire.
    Sa a asire menm mete sou paj yo, pa gen okenn pwen sèl nan echèk, epi mwen jis renmen li;
  • Li enperatif pou bay vèsyon fòma a.
    Yon fòma san yon nimewo vèsyon nan header la se sa ki mal!
    Li ase pou ajoute yon jaden ki gen yon sèten Nimewo majik (siyati) nan header paj la, ki pral endike vèsyon an nan fòma yo itilize a. (Mwen pa panse ke nan pratik pral gen menm yon douzèn nan yo);
  • Sèvi ak yon header longè varyab pou dosye (ki gen anpil), eseye fè li 1 byte nan pifò ka yo;
  • Pou kode longè header a ak longè pati taye nan dosye konprese a, sèvi ak kòd binè varyab longè.

Te ede anpil dèlko sou entènèt Kòd Huffman. Nan kèk minit sèlman nou te kapab chwazi kòd longè varyab yo mande yo.

Deskripsyon fòma depo done

Byte lòd

Jaden ki pi gwo pase yon byte yo estoke nan fòma big-endian (lòd byte rezo), sa vle di, 0x1234 ekri kòm 0x12, 0x34.

Papyaj

Tout memwa flash divize an paj ki gen menm gwosè.

Gwosè paj default la se 32Kb, men pa plis pase 1/4 nan gwosè total chip memwa a (pou yon chip 4MB, yo jwenn 128 paj).

Chak paj estoke done poukont lòt yo (sa vle di, done sou yon paj pa fè referans ak done sou yon lòt paj).

Tout paj yo nimewote nan lòd natirèl (nan lòd monte adrès), kòmanse ak nimewo 0 (paj zewo kòmanse nan adrès 0, premye paj la kòmanse nan 32Kb, dezyèm paj la kòmanse nan 64Kb, elatriye)

Se chip memwa a itilize kòm yon tanpon siklik (tanpon bag), se sa ki, premye ekri ale nan paj nimewo 0, Lè sa a, nimewo 1, ..., lè nou ranpli dènye paj la, yon nouvo sik kòmanse ak anrejistreman kontinye soti nan paj zewo. .

Anndan paj la

Aplikasyon mwen an nan yon tanpon bag nan flash NOR
Nan kòmansman paj la, yo estoke yon header paj 4-byte, apresa yon checksum header (CRC-32C), apresa dosye yo estoke nan fòma "header, data, checksum".

Tit paj la (vèt sal nan dyagram nan) konsiste de:

  • jaden nimewo majik de-byte (tou yon siy nan vèsyon an fòma)
    pou vèsyon aktyèl la nan fòma a li se kalkile kòm 0xed00 ⊕ номер страницы;
  • kontwa de-byte "Page vèsyon" (memwa nimewo sik reekri).

Antre nan paj la yo estoke nan fòm konprese (yo itilize algorithm deflate a). Tout dosye ki sou yon paj yo konprese nan yon sèl fil (yo itilize yon diksyonè komen), epi sou chak nouvo paj konpresyon rekòmanse. Sa vle di, pou dekonprime nenpòt dosye, tout dosye anvan yo nan paj sa a (e sèlman youn sa a) yo obligatwa.

Chak dosye pral konprese ak drapo Z_SYNC_FLUSH la, epi nan fen kouran konprese a pral gen 4 bytes 0x00, 0x00, 0xff, 0xff, petèt anvan youn oswa de plis zewo byte.
Nou jete sekans sa a (4, 5 oswa 6 octets nan longè) lè nou ekri nan memwa flash.

Tèt dosye a se 1, 2 oswa 3 byte estoke:

  • yon sèl bit (T) ki endike kalite dosye a: 0 - kontèks, 1 - log;
  • yon jaden longè varyab (S) soti nan 1 a 7 bit, defini longè header la ak "ke" ki dwe ajoute nan dosye a pou dekonpresyon;
  • longè dosye (L).

Tablo valè S:

S
Longè header, bytes
Jete sou ekri, byte

0
1
5 (00 00 00 ff ff)

10
1
6 (00 00 00 00 ff ff)

110
2
4 (00 00 ff ff)

1110
2
5 (00 00 00 ff ff)

11110
2
6 (00 00 00 00 ff ff)

1111100
3
4 (00 00 ff ff)

1111101
3
5 (00 00 00 ff ff)

1111110
3
6 (00 00 00 00 ff ff)

Mwen te eseye ilistre, mwen pa konnen ki jan klè li te tounen soti:
Aplikasyon mwen an nan yon tanpon bag nan flash NOR
Jòn isit la endike jaden T a, blan jaden S la, vèt L (longè done yo konprese an byte), ble done yo konprese, wouj octets final yo nan done yo konprese ki pa ekri nan memwa flash.

Kidonk, nou ka ekri tèt dosye ki gen longè ki pi komen (jiska 63 + 5 octets nan fòm konprese) nan yon byte.

Apre chak dosye, yo estoke yon sòm chèk CRC-32C, kote yo itilize valè envèse sòm chèk anvan an kòm valè inisyal la (init).

CRC gen pwopriyete "dire", fòmil sa a ap travay (plis oswa mwens ti envèrsyon nan pwosesis la): Aplikasyon mwen an nan yon tanpon bag nan flash NOR.
Sa vle di, an reyalite, nou kalkile CRC nan tout byte anvan yo nan tèt ak done sou paj sa a.

Dirèkteman swiv sòm chèk la se header nan pwochen dosye a.

Header a fèt nan yon fason ke premye byte li toujou diferan de 0x00 ak 0xff (si olye de premye byte nan header a nou rankontre 0xff, Lè sa a, sa vle di ke sa a se yon zòn ki pa itilize; 0x00 siyal yon erè).

Egzanp Algoritm

Lekti nan memwa Flash

Nenpòt lekti vini ak yon chèk sòm chèk.
Si sòm chèk la pa matche, lekti a repete plizyè fwa nan espwa pou li done ki kòrèk la.

(sa fè sans, Linux pa kache lekti nan NOR Flash, teste)

Ekri nan memwa flash

Nou anrejistre done yo.
Ann li yo.

Si done li yo pa matche ak done ekri yo, nou ranpli zòn nan ak zewo epi siyal yon erè.

Prepare yon nouvo microcircuit pou operasyon

Pou inisyalizasyon, yon header ak vèsyon 1 ekri nan premye (oswa pito zewo) paj la.
Apre sa, kontèks inisyal la ekri nan paj sa a (genyen UUID machin nan ak paramèt default).

Se li, memwa flash la pare pou itilize.

Chaje machin nan

Lè w ap chaje, yo li 8 premye octets chak paj (header + CRC), yo inyore paj ki gen yon Nimewo majik enkoni oswa yon CRC ki pa kòrèk.
Soti nan paj "kòrèk" yo, yo chwazi paj ki gen vèsyon maksimòm, epi yo pran paj ki gen nimewo ki pi wo a.
Yo li premye dosye a, yo tcheke kòrèkteman CRC a ak prezans drapo "kontèks la". Si tout bagay anfòm, paj sa a konsidere kòm aktyèl. Si ou pa, nou tounen nan yon sèl anvan an jiskaske nou jwenn yon "viv" paj.
epi sou paj jwenn nou li tout dosye yo, sa nou itilize ak drapo "kontèks la".
Sove diksyonè zlib la (li pral nesesè pou ajoute nan paj sa a).

Sa a se li, download la fini, kontèks la retabli, ou ka travay.

Ajoute yon antre jounal

Nou konprese dosye a ak diksyonè ki kòrèk la, ki espesifye Z_SYNC_FLUSH. Nou wè si dosye konprese a anfòm sou paj aktyèl la.
Si li pa anfòm (oswa te gen erè CRC sou paj la), kòmanse yon nouvo paj (gade anba a).
Nou ekri dosye a ak CRC. Si yon erè rive, kòmanse yon nouvo paj.

Nouvo paj

Nou chwazi yon paj gratis ak nimewo minimòm (nou konsidere yon paj gratis kòm yon paj ki gen yon checksum ki pa kòrèk nan header la oswa ki gen yon vèsyon mwens pase sa aktyèl la). Si pa gen okenn paj sa yo, chwazi paj ki gen nimewo minimòm nan pami sa yo ki gen yon vèsyon ki egal ak youn aktyèl la.
Nou efase paj chwazi a. Nou tcheke kontni an ak 0xff. Si gen yon bagay ki mal, pran pwochen paj gratis la, elatriye.
Nou ekri yon header sou paj la efase, premye antre a se eta aktyèl la nan kontèks la, pwochen an se antre nan boutèy demi lit ki pa ekri (si gen youn).

Fòma aplikab

Nan opinyon mwen, li te tounen yon bon fòma pou estoke nenpòt kouran enfòmasyon plis oswa mwens konpresib (tèks klè, JSON, MessagePack, CBOR, pètèt protobuf) nan NOR Flash.

Natirèlman, fòma a "adapte" pou SLC NI Flash.

Li pa ta dwe itilize ak medya segondè BER tankou NAND oswa MLC NOR (Èske memwa sa yo menm disponib pou vann? Mwen te sèlman wè li mansyone nan travay sou kòd koreksyon).

Anplis, li pa ta dwe itilize ak aparèy ki gen pwòp FTL yo: USB flash, SD, MicroSD, elatriye (pou memwa sa a mwen te kreye yon fòma ak yon gwosè paj 512 bytes, yon siyati nan kòmansman chak paj ak nimewo dosye inik - pafwa li te posib yo refè tout done yo nan yon kondwi flash "glitched" pa senp lekti sekans).

Tou depan de travay yo, fòma a ka itilize san chanjman sou kondui flash soti nan 128Kbit (16Kb) a 1Gbit (128MB). Si ou vle, ou ka itilize li sou pi gwo chips, men pwobableman ou bezwen ajiste gwosè paj la (Men, isit la kesyon an nan posibilite ekonomik deja leve; pri a pou gwo volim NOR Flash pa ankouraje).

Si yon moun jwenn fòma a enteresan epi li vle sèvi ak li nan yon pwojè ouvè, ekri, mwen pral eseye jwenn tan an, polir kòd la epi poste li sou github.

Konklizyon

Kòm ou ka wè, nan fen fòma a te tounen soti yo dwe senp e menm raz.

Li difisil pou reflete evolisyon nan pwen de vi mwen nan yon atik, men kwè m ': okòmansman mwen te vle kreye yon bagay sofistike, endèstruktibl, ki kapab siviv menm yon eksplozyon nikleyè nan tou pre. Sepandan, rezon (mwen espere) toujou genyen ak priyorite piti piti deplase nan direksyon pou senplisite ak konpak.

Èske li ta ka ke mwen te mal? Wi, asire w. Li ka byen vire soti, pou egzanp, ke nou te achte yon pakèt mikwo-sikwi bon jan kalite. Oswa pou kèk lòt rezon ekipman an pa pral satisfè atant fyab.

Èske mwen gen yon plan pou sa? Mwen panse ke apre ou fin li atik la ou pa gen okenn dout ke gen yon plan. E pa menm pou kont li.

Sou yon nòt yon ti kras pi grav, fòma a te devlope tou de kòm yon opsyon k ap travay ak kòm yon "balon jijman".

Nan moman sa a tout bagay sou tab la ap travay byen, literalman lòt jou a solisyon an pral deplwaye (apeprè) sou dè santèn de aparèy, ann wè sa k ap pase nan operasyon "konba" (ererezman, mwen espere fòma a pèmèt ou seryezman detekte echèk; konsa ou ka kolekte estatistik konplè). Nan kèk mwa li pral posib yo tire konklizyon (e si ou pa gen chans, menm pi bonè).

Si, baze sou rezilta yo nan itilizasyon, pwoblèm grav yo dekouvri epi amelyorasyon yo nesesè, Lè sa a, mwen pral definitivman ekri sou li.

Literati

Mwen pa t 'vle fè yon lis long fatigan nan travay itilize; apre yo tout, tout moun gen Google.

Isit la mwen deside kite yon lis konklizyon ki te sanble patikilyèman enteresan pou mwen, men piti piti yo te imigre dirèkteman nan tèks la nan atik la, ak yon atik rete sou lis la:

  1. Sèvis piblik infgen soti nan otè a zlib. Ka klèman montre sa ki nan deflate/zlib/gzip achiv yo. Si ou gen fè fas ak estrikti entèn nan fòma deflate (oswa gzip), mwen trè rekòmande li.

Sous: www.habr.com

Add nouvo kòmantè