Aiwatar da na'urar buffer na zobe a NOR flash

prehistory

Akwai injinan siyarwa na ƙirar mu. Ciki da Rasberi Pi da wasu wayoyi akan wani allo daban. Ana haɗa mai karɓar tsabar kuɗi, mai karɓar lissafin, tashar banki… Ana sarrafa komai ta hanyar shirin da aka rubuta da kansa. Dukkan tarihin aikin an rubuta shi zuwa ga log a kan faifan faifai (MicroSD), wanda kuma ana watsa shi ta hanyar Intanet (ta amfani da modem na USB) zuwa uwar garken, inda aka adana shi a cikin rumbun adana bayanai. Ana ɗora bayanan tallace-tallace a cikin 1c, akwai kuma hanyar yanar gizo mai sauƙi don saka idanu, da sauransu.

Wato, mujallar tana da mahimmanci - don lissafin kuɗi (kudi, tallace-tallace, da dai sauransu), saka idanu (duk nau'ikan gazawar da sauran yanayi mai ƙarfi); Wannan, wanda za a iya cewa, shi ne duk bayanan da muke da shi game da wannan na'ura.

matsala

Filashin filasha suna nuna kansu a matsayin na'urori marasa dogaro sosai. Sun kasa tare da kishi na yau da kullun. Wannan yana haifar da raguwar lokacin inji kuma (idan saboda wasu dalilai ba za a iya canja wurin log ɗin akan layi ba) zuwa asarar bayanai.

Wannan dai ba shi ne karon farko da aka fara amfani da na’urar filasha ba, kafin nan akwai wani aiki da ke dauke da na’urori sama da dari, inda aka ajiye mujallar a kan na’urorin kebul na USB, haka nan kuma an samu matsala wajen dogaro da kai, a wasu lokutan adadin wadanda suka kasa yin amfani da su. wata daya ya kasance a cikin dozin. Mun gwada filasha daban-daban, ciki har da masu alamar da ke da ƙwaƙwalwar SLC, kuma wasu samfuran sun fi sauran aminci, amma maye gurbin filasha bai magance matsalar ba.

Tsanaki An dade ana karantawa! Idan ba ku da sha'awar "me yasa", amma kawai a "yadda", za ku iya tafiya kai tsaye A karshe labarai.

yanke shawara

Abu na farko da ke zuwa a zuciya shine: watsar da MicroSD, shigar, misali, SSD, sannan a taya shi. A ka'ida mai yiwuwa, mai yiwuwa, amma in mun gwada da tsada, kuma ba abin dogaro ba (ana ƙara adaftar USB-SATA; ƙididdigar gazawar SSDs na kasafin kuɗi su ma ba su da ƙarfafawa).

USB HDD kuma baya kama da mafita mai ban sha'awa musamman.

Saboda haka, mun zo wannan zabin: bar booting daga MicroSD, amma amfani da su a cikin karanta-kawai yanayin, da kuma adana aiki log (da sauran bayanai na musamman ga wani yanki na hardware - serial number, firikwensin calibrations, da dai sauransu) wani wuri kuma. .

An riga an yi nazarin batun FS-kawai karantawa don raspberries a ciki da waje, ba zan tsaya kan cikakkun bayanan aiwatarwa ba a cikin wannan labarin. (amma idan akwai sha'awa, watakila zan rubuta ƙaramin labarin akan wannan batu). Abinda kawai zan so in lura shine duka daga kwarewa na sirri da kuma daga sake dubawa na waɗanda suka riga sun aiwatar da shi, akwai riba a cikin aminci. Ee, ba shi yiwuwa gaba ɗaya kawar da raguwa, amma rage yawan mitar su yana yiwuwa sosai. Kuma katunan suna zama haɗin kai, wanda ke sa maye gurbin sauƙaƙawa ga ma'aikatan sabis.

Kayan aiki

Babu wata shakka ta musamman game da zaɓin nau'in ƙwaƙwalwar ajiya - NOR Flash.
Hujja:

  • haɗi mai sauƙi (mafi sau da yawa bas ɗin SPI, wanda kun riga kun sami gogewa ta amfani da shi, don haka ba a hango matsalolin hardware ba);
  • farashi mai ban dariya;
  • daidaitattun ka'idojin aiki (aiwatar ta riga ta kasance a cikin kernel Linux, idan kuna so, zaku iya ɗaukar ɓangare na uku, wanda shima yake nan, ko ma rubuta naku, sa'a komai mai sauƙi ne);
  • aminci da albarkatu:
    daga takarda na yau da kullun: ana adana bayanai har tsawon shekaru 20, 100000 zagayowar gogewa ga kowane toshe;
    daga tushen ɓangare na uku: ƙananan BER, yana ba da buƙatu don lambobin gyara kuskure (wasu ayyuka suna la'akari da ECC don NOR, amma yawanci har yanzu suna nufin MLC NOR; wannan kuma yana faruwa).

Bari mu ƙididdige buƙatun don girma da albarkatu.

Ina so a ba da tabbacin adana bayanan na kwanaki da yawa. Wannan wajibi ne don haka idan akwai matsalolin sadarwa, tarihin tallace-tallace ba a rasa ba. Za mu mai da hankali kan kwanaki 5, a wannan lokacin (har ma da la'akari da karshen mako da hutu) ana iya magance matsalar.

A halin yanzu muna tattara kusan 100kb na rajistan ayyukan a kowace rana (shigarwa dubu 3-4), amma sannu a hankali wannan adadi yana girma - daki-daki yana ƙaruwa, ana ƙara sabbin abubuwa. Bugu da ƙari, wani lokacin akwai fashe (wasu firikwensin fara spamming tare da maganganun ƙarya, alal misali). Za mu lissafta don rikodin 10 dubu 100 bytes kowane - megabyte kowace rana.

Gabaɗaya, 5MB na tsaftataccen bayanai (na matsawa sosai) yana fitowa. Ƙari gare su (kyakkyawan kima) 1MB na bayanan sabis.

Wato muna buƙatar guntu 8MB idan ba mu yi amfani da matsawa ba, ko 4MB idan muka yi amfani da shi. Lambobi na gaske don irin wannan ƙwaƙwalwar ajiya.

Game da albarkatun: idan muka shirya cewa za a sake rubuta duk ƙwaƙwalwar ajiya ba fiye da sau ɗaya a kowace kwanaki 5 ba, to fiye da shekaru 10 na sabis muna samun kasa da dubun sake rubutawa.
Bari in tunatar da ku cewa masana'anta yayi alkawarin dubu ɗari.

Kadan game da NOR vs NAND

A yau, ba shakka, ƙwaƙwalwar NAND ya fi shahara, amma ba zan yi amfani da shi don wannan aikin ba: NAND, sabanin NOR, dole ne ya buƙaci yin amfani da lambobin gyaran kuskure, tebur na ɓangarori masu kyau, da dai sauransu, da kuma kafafun ƙafafu. NAND kwakwalwan kwamfuta yawanci fiye da.

Lalacewar NOR sun haɗa da:

  • ƙananan ƙara (kuma, daidai da haka, babban farashin kowace megabyte);
  • ƙananan saurin sadarwa (mafi yawa saboda gaskiyar cewa ana amfani da serial interface, yawanci SPI ko I2C);
  • jinkirin gogewa (dangane da girman toshe, yana ɗauka daga ɗan juzu'i na daƙiƙa da yawa).

Da alama babu wani abu mai mahimmanci a gare mu, don haka muka ci gaba.

Idan cikakkun bayanai suna da ban sha'awa, an zaɓi microcircuit ku 25df321a (duk da haka, wannan ba shi da mahimmanci, akwai analogues da yawa akan kasuwa waɗanda suka dace a cikin pinout da tsarin umarni; ko da idan muna son shigar da microcircuit daga masana'anta daban-daban da / ko girman daban-daban, komai zai yi aiki ba tare da canza canjin ba. code).

Ina amfani da direban da aka gina a cikin kernel na Linux; akan Rasberi, godiya ga tallafin bishiyar bishiyar na'urar, komai abu ne mai sauqi - kuna buƙatar sanya murfin da aka haɗa a /boot/overlays kuma ɗan gyara /boot/config.txt.

Misali fayil dts

A gaskiya, ban tabbata cewa an rubuta shi ba tare da kurakurai ba, amma yana aiki.

/*
 * 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?";
    };
};

Kuma wani layi a cikin config.txt

dtoverlay=at25:spimaxfrequency=50000000

Zan bar bayanin haɗa guntu zuwa Rasberi Pi. A gefe guda, ni ba gwani ba ne a cikin kayan lantarki, a gefe guda, duk abin da ke nan banal har ma da ni: microcircuit yana da ƙafafu 8 kawai, wanda muke buƙatar ƙasa, iko, SPI (CS, SI, SO, SCK). ); Matakan daidai suke da na Rasberi Pi, ba a buƙatar ƙarin wayoyi - kawai haɗa filaye 6 da aka nuna.

Tsara matsalar

Kamar yadda aka saba, bayanin matsalar yana tafiya ta hanyoyi da yawa, kuma yana gani a gare ni cewa lokaci ya yi don na gaba. Don haka bari mu tsaya, mu tattara abin da aka riga aka rubuta, mu fayyace bayanan da suka rage a inuwa.

Don haka, mun yanke shawarar cewa za a adana log ɗin a cikin SPI KO Flash.

Menene NO Flash ga waɗanda ba su sani ba?

Wannan ƙwaƙwalwar mara ƙarfi ce wacce zaku iya aiwatar da ayyuka uku da ita:

  1. Karatu:
    Mafi yawan karatun: muna watsa adireshin kuma muna karanta yawancin bytes kamar yadda muke bukata;
  2. Rikodi:
    Rubutu zuwa NO filasha yayi kama da na yau da kullun, amma yana da nau'i ɗaya: kawai kuna iya canza 1 zuwa 0, amma ba akasin haka ba. Misali, idan muna da 0x55 a cikin tantanin ƙwaƙwalwa, to bayan rubuta 0x0f zuwa gare shi, 0x05 za a adana a can. (duba tebur a ƙasa);
  3. Goge:
    Tabbas, muna buƙatar samun damar yin kishiyar aiki - canza 0 zuwa 1, wannan shine ainihin abin da aikin shafewa yake. Ba kamar na farko biyu ba, yana aiki ba tare da bytes ba, amma tare da tubalan (mafi ƙarancin gogewa a cikin guntu da aka zaɓa shine 4kb). Goge yana lalata toshe gabaɗaya kuma ita ce hanya ɗaya tilo don canza 0 zuwa 1. Don haka, lokacin aiki tare da ƙwaƙwalwar walƙiya, sau da yawa dole ne ku daidaita tsarin bayanai zuwa iyakokin toshewar.
    Yin rikodi a cikin NOR Flash:

Bayanan binary

Ya kasance
01010101

An yi rikodin
00001111

Ya zama
00000101

Logon da kansa yana wakiltar jerin bayanan tsawon tsayin canji. Matsakaicin tsayin rikodin yana da kusan 30 bytes (ko da yake bayanan da ke da tsayin kilobytes da yawa a wasu lokuta suna faruwa). A wannan yanayin, muna aiki tare da su kawai azaman saitin bytes, amma, idan kuna sha'awar, ana amfani da CBOR a cikin bayanan.

Baya ga log ɗin, muna buƙatar adana wasu bayanan “saitin”, duka an sabunta su ba: takamaiman ID na na'ura, ƙirar firikwensin, tuta "an kashe na'urar na ɗan lokaci", da sauransu.
Wannan bayanin saitin bayanan ƙima ne, kuma ana adana shi a cikin CBOR. Ba mu da yawa daga wannan bayanin (kaɗan kilobytes a mafi yawa), kuma ana sabunta shi sau da yawa.
A cikin abin da ya biyo baya za mu kira shi mahallin.

Idan muka tuna inda wannan labarin ya fara, yana da matukar mahimmanci don tabbatar da ajiyar bayanan abin dogara kuma, idan zai yiwu, ci gaba da aiki ko da a cikin yanayin gazawar hardware / lalata bayanai.

Wadanne tushen matsaloli za a iya la'akari?

  • Kashe wuta yayin aikin rubutu/ gogewa. Wannan ya fito ne daga nau'in "babu dabara a kan crowbar."
    Bayani daga tattaunawa A kan stackexchange: lokacin da aka kashe wutar yayin aiki tare da walƙiya, duka biyu suna goge (saitin zuwa 1) kuma rubuta (saitin zuwa 0) suna haifar da halayen da ba a bayyana ba: ana iya rubuta bayanai, an rubuta juzu'i (ce, mun canja wurin 10 bytes / 80 bits). , amma ba tukuna 45 kawai za a iya rubutawa ba), yana yiwuwa kuma wasu daga cikin raƙuman za su kasance a cikin yanayin "matsakaici" (karanta zai iya samar da duka 0 da 1);
  • Kurakurai a cikin ƙwaƙwalwar filashin kanta.
    BER, ko da yake yana da ƙasa sosai, ba zai iya zama daidai da sifili ba;
  • Kuskuren bas
    Bayanan da aka watsa ta hanyar SPI ba a kiyaye su ta kowace hanya; duka biyu kurakurai guda ɗaya da kurakurai na aiki tare na iya faruwa - asara ko saka rago (wanda ke haifar da ɓarna mai yawa);
  • Wasu kurakurai/glitches
    Kurakurai a cikin lambar, Rasberi glitches, tsoma bakin baki...

Na tsara abubuwan da ake buƙata, waɗanda cikar su, a ganina, ya zama dole don tabbatar da dogaro:

  • dole ne rikodin su shiga cikin ƙwaƙwalwar walƙiya nan da nan, ba a la'akari da jinkirin rubutawa; - idan kuskure ya faru, dole ne a gano shi kuma a sarrafa shi da wuri-wuri - tsarin dole ne, idan zai yiwu, dawo da kurakurai.
    (misali daga rayuwa "yadda bai kamata ba", wanda ina tsammanin kowa ya ci karo da shi: bayan sake yin gaggawar gaggawa, tsarin fayil ya "karye" kuma tsarin aiki ba ya taya)

Ra'ayoyi, hanyoyi, tunani

Lokacin da na fara tunanin wannan matsala, ra'ayoyi da yawa sun mamaye kaina, misali:

  • amfani da matsawa bayanai;
  • yi amfani da tsarin bayanai masu wayo, alal misali, adana masu rubutun rakodi daban da faifan da kansu, ta yadda idan akwai kuskure a kowane rikodin, zaku iya karanta sauran ba tare da wata matsala ba;
  • yi amfani da filayen bit don sarrafa kammala rikodin lokacin da aka kashe wuta;
  • kantin sayar da checksums don komai;
  • yi amfani da wani nau'in coding mai jurewa amo.

An yi amfani da wasu daga cikin waɗannan ra'ayoyin, yayin da wasu aka yanke shawarar a yi watsi da su. Mu je cikin tsari.

Matsa bayanai

Abubuwan da suka faru da kansu waɗanda muke yin rikodin su a cikin jarida suna da kamanni kuma ana iya maimaita su ("sun jefa tsabar kudin ruble 5", "latsa maɓallin don ba da canji", ...). Saboda haka, matsawa ya kamata ya zama tasiri sosai.

Matsakaicin saman ba shi da mahimmanci (na'urarmu tana da ƙarfi sosai, har ma da Pi na farko yana da cibiya ɗaya tare da mitar 700 MHz, samfuran yanzu suna da nau'ikan nau'ikan nau'ikan nau'ikan nau'ikan sama da gigahertz), ƙimar musanya tare da ajiya yana da ƙasa (da yawa). megabytes a sakan daya), girman bayanan kadan ne. Gabaɗaya, idan matsawa yana da tasiri akan aiki, zai kasance tabbatacce ne kawai. (cikakkiyar rashin zargi, kawai furtawa). Bugu da ƙari, ba mu da ainihin abin da aka saka, amma Linux na yau da kullum - don haka aiwatarwa bai kamata ya buƙaci ƙoƙari mai yawa ba (ya isa kawai don haɗa ɗakin karatu da amfani da ayyuka da yawa daga gare ta).

An ɗauko wani yanki na log ɗin daga na'urar aiki (1.7 MB, shigarwar dubu 70) kuma an fara bincika don matsawa ta amfani da gzip, lz4, lzop, bzip2, xz, zstd da ke kan kwamfutar.

  • gzip, xz, zstd sun nuna irin wannan sakamako (40Kb).
    Na yi mamakin cewa xz na gaye ya nuna kansa a nan a matakin gzip ko zstd;
  • lzip tare da saitunan tsoho sun ba da sakamako mafi muni;
  • lz4 da lzop ba su nuna sakamako mai kyau ba (150Kb);
  • bzip2 ya nuna kyakkyawan sakamako mai ban mamaki (18Kb).

Don haka, an matse bayanan sosai.
Don haka (idan ba mu sami lahani masu mutuwa ba) za a sami matsawa! Kawai saboda ƙarin bayanai na iya dacewa da filasha iri ɗaya.

Mu yi tunani game da rashin amfani.

Matsala ta farko: mun riga mun yarda cewa kowane rikodin dole ne nan da nan ya fara walƙiya. Yawanci, mai adana bayanai yana tattara bayanai daga rafi na shigarwa har sai ya yanke shawarar cewa lokaci ya yi da za a rubuta a karshen mako. Muna buƙatar mu karɓi gurɓataccen toshe na bayanai nan da nan kuma mu adana su cikin ƙwaƙwalwar da ba ta da ƙarfi.

Ina ganin hanyoyi uku:

  1. Matsa kowane rikodin ta amfani da matsi na ƙamus maimakon algorithms da aka tattauna a sama.
    Zaɓin aiki ne gaba ɗaya, amma ba na son shi. Don tabbatar da ingantaccen matakin matsawa ko žasa, ƙamus dole ne a “daidaita” zuwa takamaiman bayanai; kowane canji zai haifar da matakin matsawa ya faɗi cikin bala'i. Ee, ana iya magance matsalar ta hanyar ƙirƙirar sabon sigar ƙamus, amma wannan ciwon kai ne - za mu buƙaci adana duk nau'ikan ƙamus; a kowace shigarwa za mu buƙaci nuna da wane nau'in ƙamus ne aka matse shi...
  2. Matsa kowane rikodin ta amfani da algorithms "classical", amma ba tare da sauran ba.
    Algorithms na matsawa da ake la'akari da su ba a tsara su don yin aiki tare da bayanan wannan girman (dubban bytes), ma'auni na matsawa zai kasance a fili kasa da 1 (wato, ƙara yawan bayanai maimakon matsawa);
  3. Yi FLUSH bayan kowane rikodin.
    Yawancin ɗakunan karatu na matsawa suna da goyan baya ga FLUSH. Wannan umarni ne (ko ma'auni ga tsarin matsawa), bayan karɓar abin da ma'ajiyar ajiyar ta samar da rafi da aka matsa don a iya amfani da shi don dawo da shi. duk bayanan da ba a matsawa wanda aka riga aka karɓa. Irin wannan analog sync a tsarin fayil ko commit ku sql.
    Abin da ke da mahimmanci shi ne cewa ayyukan matsawa na gaba za su iya amfani da ƙamus da aka tara kuma adadin matsawa ba zai sha wahala ba kamar yadda yake a cikin sigar da ta gabata.

Ina tsammanin a bayyane yake cewa na zaɓi zaɓi na uku, bari mu dubi shi dalla-dalla.

An samo babban labarin game da FLUSH a cikin zlib.

Na yi gwajin gwiwa bisa labarin, na ɗauki 70 da aka shigar da log daga na'urar gaske, tare da girman shafi 60Kb. (zamu dawo girman shafin daga baya) samu:

Asalin bayanai
Matsi gzip -9 (babu FLUSH)
zlib tare da Z_PARTIAL_FLUSH
zlib tare da Z_SYNC_FLUSH

girma, KB
1692
40
352
604

A kallo na farko, farashin da FLUSH ke bayarwa yana da yawa, amma a zahiri muna da zaɓi kaɗan - ko dai ba don matsawa kwata-kwata ba, ko don damfara (kuma yadda ya kamata) tare da FLUSH. Kada mu manta cewa muna da rikodin 70, sake fasalin da Z_PARTIAL_FLUSH ya gabatar shine kawai 4-5 bytes a kowane rikodin. Kuma rabon matsawa ya juya ya zama kusan 5: 1, wanda ya fi kyakkyawan sakamako.

Yana iya zama abin mamaki, amma Z_SYNC_FLUSH ita ce hanya mafi inganci don yin FLUSH

Lokacin amfani da Z_SYNC_FLUSH, bytes 4 na ƙarshe na kowane shigarwa koyaushe zai kasance 0x00, 0x00, 0xff, 0xff. Kuma idan mun san su, to ba dole ba ne mu adana su, don haka girman karshe shine kawai 324Kb.

Labarin da na danganta shi yana da bayani:

An saka sabon nau'in 0 tare da komai a ciki.

Nau'in nau'in 0 tare da komai a ciki ya ƙunshi:

  • madaidaicin toshe uku-bit;
  • 0 zuwa 7 ragowa daidai da sifili, don cimma daidaituwar byte;
  • jerin byte hudu 00 00 FF FF.

Kamar yadda zaku iya gani cikin sauƙi, a cikin toshe na ƙarshe kafin waɗannan 4 bytes akwai daga 3 zuwa 10 sifili. Koyaya, aikin ya nuna cewa a zahiri akwai aƙalla sifili 10.

Ya bayyana cewa irin waɗannan gajerun tubalan na bayanai yawanci (ko da yaushe?) suna ɓoye ta amfani da toshe na nau'in 1 (kafaffen toshe), wanda dole ne ya ƙare da 7 sifili ragowa, yana ba da jimlar 10-17 garantin sifili ragowa (kuma sauran za su kasance). zama sifili tare da yuwuwar kusan 50%).

Don haka, akan bayanan gwaji, a cikin 100% na lokuta akwai sifili byte ɗaya kafin 0x00, 0x00, 0xff, 0xff, kuma a cikin fiye da kashi uku na lokuta akwai bytes sifili biyu. (wataƙila gaskiyar ita ce ina amfani da binary CBOR, kuma lokacin amfani da rubutu JSON, tubalan nau'in 2 - toshe mai ƙarfi zai zama gama gari, bi da bi, toshe ba tare da ƙarin sifili ba kafin 0x00, 0x00, 0xff, 0xff za a ci karo da su).

Gabaɗaya, ta amfani da bayanan gwajin da ake da su, yana yiwuwa a shiga ƙasa da 250Kb na bayanan da aka matsa.

Kuna iya adana ɗan ƙara kaɗan ta yin ɗan juggling: don yanzu mun yi watsi da kasancewar ƴan sifili kaɗan a ƙarshen toshe, kaɗan a farkon toshe kuma ba sa canzawa.
Amma sai na yanke shawara mai ƙarfi don dakatarwa, in ba haka ba a wannan matakin zan iya ƙarasa haɓaka nawa archiver.

Gabaɗaya, daga bayanan gwaji na na karɓi bytes 3-4 a kowane rubutu, ƙimar matsawa ya zama fiye da 6:1. Zan yi gaskiya: Ban yi tsammanin irin wannan sakamako ba; a ganina, wani abu mafi kyau fiye da 2: 1 ya riga ya zama sakamakon da ya tabbatar da amfani da matsawa.

Komai yana da kyau, amma zlib (deflate) har yanzu tsoho ne, wanda ya cancanta kuma ɗan ƙaramin tsoho-tsohuwar matsawa algorithm. Gaskiyar cewa 32Kb na ƙarshe na rafin bayanan da ba a haɗa shi ba a matsayin ƙamus yana da ban mamaki a yau (wato, idan wasu bayanan bayanan sun yi kama da abin da ke cikin rafin shigarwa 40Kb da suka wuce, to za a sake adana shi. kuma ba zai koma ga abin da ya faru a baya ba). A cikin kayan tarihi na zamani na zamani, ana auna girman ƙamus sau da yawa a megabytes maimakon kilobytes.

Don haka za mu ci gaba da karatunmu na ƙananan kayan tarihi.

Na gaba mun gwada bzip2 (tuna, ba tare da FLUSH ba ya nuna ma'aunin matsawa na kusan 100: 1). Abin takaici, ya yi rauni sosai tare da FLUSH; girman bayanan da aka matsa ya juya ya zama mafi girma fiye da bayanan da ba a matsawa ba.

Tunanina game da dalilan gazawar

Libbz2 yana ba da zaɓi mai gogewa guda ɗaya kawai, wanda da alama yana share ƙamus (mai kama da Z_FULL_FLUSH a cikin zlib); babu maganar kowane tasiri mai tasiri bayan wannan.

Kuma na ƙarshe da aka gwada shine zstd. Dangane da sigogi, yana matsawa ko dai a matakin gzip, amma da sauri, ko mafi kyau fiye da gzip.

Alas, tare da FLUSH bai yi kyau sosai ba: girman bayanan da aka matsa ya kusan 700Kb.

Я yayi tambaya a kan shafin github na aikin, na sami amsa cewa yakamata ku ƙidaya har zuwa 10 bytes na bayanan sabis don kowane toshe bayanan da aka matsa, wanda ke kusa da sakamakon da aka samu; babu wata hanyar da za ku iya cim ma lalata.

Na yanke shawarar dakatarwa a wannan lokacin a cikin gwaje-gwajen da na yi tare da masu adana kayan tarihi (bari in tunatar da ku cewa xz, lzip, lzo, lz4 ba su nuna kansu ba ko da a matakin gwaji ba tare da FLUSH ba, kuma ban yi la'akari da ƙarin algorithms matsawa ba).

Mu koma kan matsalolin adana kayan tarihi.

Matsala ta biyu (kamar yadda suke fada cikin tsari, ba a kima ba) ita ce, damtsen bayanan rafi guda ne, wanda a cikinsa ake ci gaba da yin nuni ga sassan da suka gabata. Don haka, idan wani sashe na bayanan da aka matse ya lalace, ba za mu rasa kawai toshe bayanan da ba a haɗa su ba, har ma da duk waɗanda ke gaba.

Akwai hanyar magance wannan matsala:

  1. Hana matsalar faruwa - ƙara sakewa zuwa bayanan da aka matsa, wanda zai ba ku damar ganowa da gyara kurakurai; za mu yi magana game da wannan a gaba;
  2. Rage sakamako idan matsala ta faru
    Mun riga mun faɗi cewa za ku iya damfara kowane block ɗin bayanai da kansa, kuma matsalar za ta ɓace da kanta (lalacewar bayanan block ɗaya zai haifar da asarar bayanai kawai don wannan block). Koyaya, wannan lamari ne mai tsananin gaske wanda matsawar bayanai ba zai yi tasiri ba. Sabanin matsananci: yi amfani da duk 4MB na guntu ɗin mu azaman ma'ajin ajiya guda ɗaya, wanda zai ba mu kyakkyawan matsewa, amma sakamakon bala'i idan akwai ɓarnatar bayanai.
    Ee, ana buƙatar sasantawa dangane da abin dogaro. Amma dole ne mu tuna cewa muna haɓaka tsarin ajiya na bayanai don ƙwaƙwalwar ajiya mara ƙarfi tare da ƙarancin BER da ayyana lokacin ajiyar bayanai na shekaru 20.

A lokacin gwaje-gwajen, na gano cewa fiye ko žasa hasara mai iya gani a cikin matakin matsawa yana farawa akan tubalan da aka matse bayanan ƙasa da 10 KB a girman.
A baya an ambaci cewa ƙwaƙwalwar da aka yi amfani da ita tana shafi; Ban ga dalilin da zai sa ba za a yi amfani da wasiƙun "shafi ɗaya - tubali ɗaya na matse bayanan ba".

Wato, mafi ƙarancin girman girman shafi shine 16Kb (tare da ajiyar bayanan sabis). Koyaya, irin wannan ƙaramin girman shafi yana sanya hani mai mahimmanci akan matsakaicin girman rikodin.

Ko da yake har yanzu ban yi tsammanin bayanan da suka fi 'yan kilobytes ba a cikin nau'i mai matsi, na yanke shawarar yin amfani da shafukan 32Kb (don jimlar shafuka 128 a kowace guntu).

Takaitawa:

  • Muna adana bayanan da aka matsa ta amfani da zlib (deflate);
  • Ga kowane shigarwa mun saita Z_SYNC_FLUSH;
  • Ga kowane rikodi da aka matsa, muna datsa bytes masu biyo baya (misali 0x00, 0x00, 0xff, 0xff); a cikin taken mun nuna adadin bytes da muka yanke;
  • Muna adana bayanai a cikin shafuka 32Kb; akwai rafi guda ɗaya na matse bayanai a cikin shafin; A kowane shafi za mu sake fara matsawa.

Kuma, kafin a gama da matsawa, Ina so in jawo hankalin ku ga gaskiyar cewa muna da ƴan bytes na matsawa bayanai a kowane rikodin, don haka yana da matukar mahimmanci kada a faɗaɗa bayanan sabis ɗin, kowane byte yana ƙidaya anan.

Ajiye Bayanan Bayani

Tunda muna da bayanan tsawon tsayi mai canzawa, muna buƙatar ko ta yaya ƙayyade jeri/ iyakoki na bayanan.

Na san hanyoyi guda uku:

  1. Ana adana duk bayanan a cikin rafi mai ci gaba, da farko akwai taken rikodin mai ɗauke da tsayi, sannan rikodin kanta.
    A cikin wannan siffa, duka kanun labarai da bayanai na iya zama masu tsayi dabam dabam.
    Mahimmanci, muna samun jerin abubuwan haɗin kai guda ɗaya wanda ake amfani dashi koyaushe;
  2. Ana adana masu kai da bayanan kansu a cikin rafuka daban-daban.
    Ta yin amfani da rubutun kai na tsayin daka, muna tabbatar da cewa lalacewa ɗaya ba ta shafi sauran ba.
    Ana amfani da irin wannan hanya, alal misali, a yawancin tsarin fayil;
  3. Ana adana bayanai a cikin rafi mai ci gaba, ana ƙayyade iyakar rikodin ta wani alamar (halaye/ jerin haruffa waɗanda aka haramta a cikin tubalan bayanai). Idan akwai alama a cikin rikodin, sa'an nan mu maye gurbin shi da wasu jerin (tsẽrar da shi).
    Ana amfani da irin wannan hanya, alal misali, a cikin tsarin PPP.

Zan kwatanta.

Zabin 1:
Aiwatar da na'urar buffer na zobe a NOR flash
Komai abu ne mai sauqi qwarai a nan: sanin tsawon rikodi, za mu iya ƙididdige adireshin na gaba. Don haka muna motsawa ta cikin kanun labarai har sai mun haɗu da yanki mai cike da 0xff (yankin kyauta) ko ƙarshen shafin.

Zabin 2:
Aiwatar da na'urar buffer na zobe a NOR flash
Saboda tsayin rikodi mai ma'ana, ba za mu iya faɗi a gaba nawa rikodin (saboda haka masu kai) za mu buƙaci kowane shafi ba. Kuna iya yada rubutun kai da bayanan da kansu a cikin shafuka daban-daban, amma na fi son wata hanya ta daban: muna sanya duka masu rubutun kai da bayanan a shafi ɗaya, amma masu rubutun (na girman girman) sun fito ne daga farkon shafin, kuma bayanai (na tsawon m) ya zo daga ƙarshe. Da zaran sun “haɗu” (babu isasshen sarari kyauta don sabon shigarwa), muna ɗaukar wannan shafin cikakke.

Zabin 3:
Aiwatar da na'urar buffer na zobe a NOR flash
Babu buƙatar adana tsayi ko wasu bayanai game da wurin bayanan a cikin taken; alamomin da ke nuna iyakokin bayanan sun isa. Koyaya, dole ne a sarrafa bayanan lokacin rubutu/ karantawa.
Zan yi amfani da 0xff a matsayin alama (wanda ya cika shafin bayan gogewa), don haka ba shakka ba za a kula da yankin kyauta azaman bayanai ba.

Teburin kwatanta:

Zabin 1
Zabin 2
Zabin 3

Haƙuri na kuskure
-
+
+

Yardaje
+
-
+

Ƙaddamar aiwatarwa
*
**
**

Zaɓin 1 yana da aibi mai muni: idan ɗaya daga cikin kawunan ya lalace, an lalatar da duk sarƙar da ta biyo baya. Zaɓuɓɓukan da suka rage suna ba ku damar dawo da wasu bayanai ko da a cikin yanayin lalacewa mai yawa.
Amma a nan yana da kyau mu tuna cewa mun yanke shawarar adana bayanan a cikin nau'i mai ma'ana, don haka mun rasa duk bayanan da ke kan shafin bayan rikodin "karya", don haka ko da yake akwai raguwa a cikin tebur, ba mu ba. yi la'akari da shi.

Ƙarfafawa:

  • a cikin zaɓi na farko, muna buƙatar adana tsayi kawai a cikin taken; idan muka yi amfani da lambobi masu tsayi masu tsayi, to a mafi yawan lokuta za mu iya samun byte ɗaya;
  • a cikin zaɓi na biyu muna buƙatar adana adireshin farawa da tsayi; rikodi dole ne ya kasance mai girman gaske, Na kiyasta 4 bytes a kowace rikodin (bytes biyu don kashewa, da bytes biyu don tsayi);
  • zaɓi na uku yana buƙatar haruffa ɗaya kawai don nuna farkon rikodin, da kuma rikodin kanta zai ƙaru da 1-2% saboda garkuwa. Gabaɗaya, kusan daidaito tare da zaɓi na farko.

Da farko, na yi la'akari da zaɓi na biyu a matsayin babba (har ma da rubuta aiwatarwa). Na bar shi ne kawai lokacin da na yanke shawarar yin amfani da matsawa.

Wataƙila wata rana har yanzu zan yi amfani da irin wannan zaɓin. Misali, idan zan yi aiki da ajiyar bayanai don jirgin ruwa da ke tafiya tsakanin Duniya da Mars, za a sami buƙatu daban-daban don dogaro, hasken sararin samaniya, ...

Amma ga zaɓi na uku: Na ba shi taurari biyu don wahalar aiwatarwa kawai saboda ba na son yin rikici tare da garkuwa, canza tsayi a cikin tsari, da dai sauransu. Ee, watakila ina son zuciya, amma dole ne in rubuta lambar - me yasa ka tilasta kanka don yin abin da ba ka so.

Takaitawa: Mun zaɓi zaɓin ajiya a cikin nau'i na sarƙoƙi "kai tare da tsayi - bayanai na tsawon tsayi" saboda inganci da sauƙin aiwatarwa.

Amfani da Filayen Bit don Kula da Nasarar Ayyukan Rubutu

Ban tuna yanzu inda na sami ra'ayin ba, amma yana kama da wani abu kamar haka:
Ga kowane shigarwa, muna keɓance ragi da yawa don adana tutoci.
Kamar yadda muka fada a baya, bayan shafe dukkan sassan suna cike da 1s, kuma za mu iya canza 1 zuwa 0, amma ba akasin haka ba. Don haka don "tuta ba a saita" muna amfani da 1, don "an saita tuta" muna amfani da 0.

Ga abin da sanya rikodi mai tsayi mai canzawa cikin filasha zai yi kama da:

  1. Saita tuta "An fara rikodi tsawon";
  2. Yi rikodin tsayi;
  3. Saita tutar "An fara rikodin bayanai";
  4. Muna rikodin bayanai;
  5. Saita “ƙarshen rikodin” tuta.

Bugu da kari, za mu sami “kuskure ya faru” tuta, don jimlar tutoci 4.

A wannan yanayin, muna da jihohi biyu masu zaman kansu "1111" - rikodi bai fara ba kuma "1000" - rikodi ya yi nasara; a yayin da ba zato ba tsammani na tsarin rikodi, za mu karbi matsakaicin jihohi, wanda za mu iya ganowa da sarrafa.

Hanyar yana da ban sha'awa, amma kawai yana kare kariya daga rashin wutar lantarki kwatsam da kuma irin wannan gazawar, wanda, ba shakka, yana da mahimmanci, amma wannan yana da nisa daga kawai (ko ma babban) dalili na yiwuwar gazawar.

Takaitawa: Mu ci gaba don neman mafita mai kyau.

Takaddun shaida

Checksum kuma yana ba da damar tabbatar da (tare da yuwuwar yuwuwar) cewa muna karanta ainihin abin da ya kamata a rubuta. Kuma, ba kamar filayen bit ɗin da aka tattauna a sama ba, koyaushe suna aiki.

Idan muka yi la'akari da jerin abubuwan da za su iya haifar da matsalolin da muka tattauna a sama, to, checksum zai iya gane kuskure ba tare da la'akari da asalinsa ba. (sai dai, watakila, ga baƙi masu ƙeta - za su iya ƙirƙira checksum kuma).

Don haka idan manufarmu ita ce tabbatar da cewa bayanan ba su da inganci, ƙididdigar ƙima babban tunani ne.

Zaɓin algorithm don ƙididdige adadin kuɗi bai haifar da wata tambaya ba - CRC. A gefe guda, kaddarorin ilimin lissafi suna ba da damar kama wasu nau'ikan kurakurai 100%; a gefe guda, akan bayanan bazuwar wannan algorithm yawanci yana nuna yuwuwar karon da ba ta da girma fiye da ƙayyadaddun ka'ida. Aiwatar da na'urar buffer na zobe a NOR flash. Yana iya zama ba mafi sauri algorithm ba, kuma ba koyaushe ne mafi ƙanƙanta dangane da adadin haɗuwa ba, amma yana da inganci mai mahimmanci: a cikin gwaje-gwajen da na ci karo da su, babu alamu waɗanda a fili ya gaza. Kwanciyar hankali shine babban inganci a wannan yanayin.

Misalin nazarin juzu'i: part 1, part 2 (hanyoyi zuwa narod.ru, yi hakuri).

Duk da haka, aikin zaɓin kididdigar kuɗi bai cika ba; CRC gabaɗayan dangin kuɗi ne. Kuna buƙatar yanke shawara akan tsayi, sannan zaɓi polynomial.

Zaɓin tsayin checksum ba tambaya mai sauƙi bane kamar yadda ake gani a farkon kallo.

Bari in kwatanta:
Bari mu sami yuwuwar kuskure a kowane byte Aiwatar da na'urar buffer na zobe a NOR flash da ingantaccen checksum, bari mu lissafta matsakaicin adadin kurakurai a kowane rikodin miliyan:

Data, byte
Checksum, byte
Kurakurai da ba a gano ba
Gano kuskuren ƙarya
Jimillar tabbataccen ƙarya

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

Zai yi kama da cewa duk abu mai sauƙi ne - dangane da tsawon bayanan da ake kiyayewa, zaɓi tsawon adadin adadin kuɗi tare da ƙananan abubuwan da ba daidai ba - kuma dabarar tana cikin jaka.

Koyaya, matsala ta taso tare da gajeriyar rajista: kodayake suna da kyau a gano kurakurai guda ɗaya, suna iya da yuwuwar babban yuwuwar karɓar bayanan bazuwar gaba ɗaya daidai. An riga an sami labarin kan Habré da ke kwatantawa matsala a rayuwa ta gaske.

Don haka, don yin wasan bazuwar checksum kusan ba zai yuwu ba, kuna buƙatar amfani da cak ɗin da suke da tsayi 32 ko tsayi. (don tsayin da ya fi 64 ragowa, yawanci ana amfani da ayyukan hash na sirri).

Duk da cewa na rubuta a baya cewa muna buƙatar adana sarari ta kowane hali, har yanzu za mu yi amfani da 32-bit checksum (bits 16 ba su isa ba, yiwuwar karo ya fi 0.01%; da 24 ragowa, kamar yadda suke. ka ce, ba a nan ko can) .

Wani ƙin yarda zai iya tasowa a nan: shin mun adana kowane byte lokacin zabar matsawa don yanzu ba da bytes 4 a lokaci ɗaya? Shin, ba zai fi kyau a damƙa ko ƙara checksum ba? Tabbas ba haka bane, babu matsawa ba ya nufin, cewa ba ma buƙatar bincikar mutunci.

Lokacin zabar polynomial, ba za mu sake ƙirƙira dabaran ba, amma ɗauki mashahurin CRC-32C yanzu.
Wannan lambar tana gano kurakuran bit 6 akan fakiti har zuwa 22 bytes (watakila shari'ar da aka fi sani a gare mu), kurakurai 4 akan fakiti har zuwa bytes 655 (kuma shari'ar gama gari a gare mu), 2 ko kowane adadin kuskuren bit akan fakiti. na kowane m tsawon.

Idan wani yana sha'awar cikakkun bayanai

Labarin Wikipedia ku CRC.

Alamar lamba crc-32c a kan Yanar Gizo na Koopman - watakila babban masanin CRC a duniya.

В labarinsa ne wani lambar ban sha'awa, wanda ke ba da mafi kyawun sigogi don tsayin fakitin da suka dace da mu, amma ban yi la'akari da bambanci mai mahimmanci ba, kuma na isa isa don zaɓar lambar al'ada maimakon daidaitattun kuma bincike mai kyau.

Har ila yau, tun da an matse bayanan mu, tambaya ta taso: shin za mu ƙididdige adadin adadin da aka matse ko ba a haɗa ba?

Hujjar da ke goyon bayan ƙididdige ƙididdige ƙididdiga na bayanan da ba a matsawa ba:

  • A ƙarshe muna buƙatar bincika amincin ajiyar bayanai - don haka za mu bincika kai tsaye (a lokaci guda, kurakurai masu yuwuwa a cikin aiwatar da matsawa / ragewa, lalacewa ta hanyar karyewar ƙwaƙwalwar ajiya, da sauransu za a bincika);
  • Algorithm na deflate a cikin zlib yana da ingantaccen aiwatarwa kuma bai kamata ba fada tare da bayanan shigar da “karkace”; haka kuma, sau da yawa yana iya gano kurakurai da kansa a cikin rafi na shigarwa, yana rage yuwuwar rashin gano kuskure gabaɗaya (an gudanar da gwaji tare da juyar da bit guda a cikin ɗan gajeren rikodin, zlib ya gano kuskure. a cikin kusan kashi uku na lokuta).

Hujja game da ƙididdige ƙididdige ƙididdiga na bayanan da ba a matsawa ba:

  • An “daidaita CRC” musamman don ƴan kurakurai kaɗan waɗanda ke da halayen ƙwaƙwalwar walƙiya (wani kuskure a cikin rafi da aka matsa zai iya haifar da babban canji a cikin rafi na fitarwa, wanda, a zahiri kawai, zamu iya “kama” karo);
  • Ba na jin daɗin ra'ayin isar da yuwuwar ɓaryayyen bayanai ga mai kashewa, Wa ya saniyadda zai mayar da martani.

A cikin wannan aikin, na yanke shawarar karkata daga tsarin da aka yarda da shi na adana jimlar adadin bayanan da ba a matsawa ba.

Takaitawa: Muna amfani da CRC-32C, muna ƙididdige ƙididdige ƙididdiga daga bayanan a cikin hanyar da aka rubuta su zuwa walƙiya (bayan matsawa).

Maimaituwa

Yin amfani da lambar ƙididdigewa ba, ba shakka, yana kawar da asarar bayanai, duk da haka, yana iya mahimmanci (sau da yawa ta yawancin umarni na girma) rage yuwuwar asarar bayanan da ba za a iya dawo da su ba.

Za mu iya amfani da nau'ikan sakewa daban-daban don gyara kurakurai.
Lambobin hamma suna iya gyara kurakurai guda ɗaya, lambobin halayen Reed-Solomon, kwafin bayanai da yawa haɗe tare da cak, ko rufaffiyar kamar RAID-6 na iya taimakawa wajen dawo da bayanai ko da a yanayin cin hanci da rashawa.
Da farko, na himmatu ga yawaita amfani da codeing mai jure kurakurai, amma sai na gane cewa da farko muna buƙatar samun ra'ayin irin kurakuran da muke son kare kanmu daga, sannan mu zaɓi codeing.

Mun fada a baya cewa ana buƙatar kama kurakurai da sauri. A waɗanne wurare ne za mu iya fuskantar kurakurai?

  1. Rikodin da ba a gama ba (saboda wasu dalilai a lokacin rikodin an kashe wutar, Rasberi ya daskare, ...)
    Alas, a cikin irin wannan kuskuren, abin da ya rage shi ne watsi da bayanan da ba daidai ba kuma la'akari da bayanan da aka rasa;
  2. Rubuta kurakurai (saboda wasu dalilai, abin da aka rubuta zuwa ƙwaƙwalwar filasha ba abin da aka rubuta ba)
    Za mu iya gano irin waɗannan kurakurai nan da nan idan muka yi gwajin karantawa nan da nan bayan yin rikodin;
  3. Karɓar bayanai a cikin ƙwaƙwalwar ajiya yayin ajiya;
  4. Kuskuren karatu
    Don gyara shi, idan checksum bai dace ba, ya isa a maimaita karatun sau da yawa.

Wato kurakurai nau'i na uku ne kawai (lalacewar bayanai a lokacin ajiya) ba za a iya gyara su ba tare da yin la'akari da kurakurai ba. Da alama irin waɗannan kurakuran har yanzu ba su da yuwuwa.

Takaitawa: an yanke shawarar yin watsi da coding mai yawa, amma idan aiki ya nuna kuskuren wannan yanke shawara, to koma zuwa la'akari da batun (tare da kididdigar da aka riga aka tattara akan gazawar, wanda zai ba da damar zaɓar mafi kyawun nau'in coding).

Wasu

Tabbas, tsarin labarin ba ya ƙyale mu mu tabbatar da kowane abu a cikin tsari (kuma karfina ya riga ya kare), don haka a taqaice zan yi tsokaci kan wasu batutuwan da ba a tabo ba a baya.

  • An yanke shawarar sanya dukkan shafuka su zama "daidai"
    Wato, ba za a sami shafuka na musamman da ke da metadata, zaren daban, da sauransu ba, amma a maimakon haka zare guda ɗaya wanda ke sake rubuta duk shafuka bi da bi.
    Wannan yana tabbatar da ko da lalacewa a kan shafuka, babu wani batu na rashin nasara, kuma ina son shi;
  • Yana da mahimmanci don samar da sigar sigar.
    Tsarin ba tare da lambar sigar ba a cikin taken mugu ne!
    Ya isa ƙara filin da ke da takamaiman Lambar Sihiri (sa hannu) zuwa taken shafi, wanda zai nuna nau'in tsarin da aka yi amfani da shi. (Ba na jin cewa a aikace za a sami ko da dozin daga cikinsu);
  • Yi amfani da madaidaicin tsayin kai don rikodin (wanda akwai da yawa), ƙoƙarin sanya shi tsayi 1 byte a mafi yawan lokuta;
  • Don ɓoye tsayin kan kai da tsawon ɓangaren da aka gyara na rikodi da aka matse, yi amfani da lambobin binary masu tsayi masu tsayi.

Taimaka sosai janareta na kan layi Lambobin Huffman. A cikin 'yan mintoci kaɗan mun sami damar zaɓar lambobin tsayin tsayin da ake buƙata.

Bayanin tsarin adana bayanai

odar Byte

Filayen da suka fi girma byte ɗaya ana adana su a cikin tsarin babban-endian (tsari na hanyar sadarwa), wato, 0x1234 an rubuta shi azaman 0x12, 0x34.

Pagination

Duk žwažwalwar ajiya na walƙiya an raba shi zuwa shafuka masu girman daidai.

Girman shafin tsoho shine 32Kb, amma bai wuce 1/4 na jimlar girman guntu ƙwaƙwalwar ajiya ba (don guntu 4MB, ana samun shafuka 128).

Kowane shafi yana adana bayanai ba tare da wasu ba (wato bayanai a shafi ɗaya ba ya yin la'akari da bayanai akan wani shafi).

Ana lissafta dukkan shafuka bisa tsari na dabi'a (a jerin adireshi masu hawa), farawa da lamba 0 (sifilin shafi yana farawa a adireshin 0, shafi na farko yana farawa a 32Kb, shafi na biyu yana farawa a 64Kb, da sauransu).

Ana amfani da guntun ƙwaƙwalwar ajiya azaman buffer na keke (ring buffer), wato, rubutun farko yana zuwa shafi na 0, sannan lamba 1, ..., idan muka cika shafi na ƙarshe, sabon zagayowar yana farawa kuma yana ci gaba da rikodin daga shafi na sifili. .

Ciki shafin

Aiwatar da na'urar buffer na zobe a NOR flash
A farkon shafin, ana adana taken shafi na 4-byte, sa'an nan kuma an adana bayanan kai (CRC-32C), sannan ana adana bayanan a cikin tsarin "header, data, checksum".

Taken shafin (koren datti a cikin zane) ya ƙunshi:

  • filin Magic Number-byte-byte (kuma alamar sigar sigar)
    don sigar yanzu na tsarin ana lissafta shi azaman 0xed00 ⊕ номер страницы;
  • counter-byte-biyu “Sigar Shafi” (lambar zagayowar ƙwaƙwalwar ajiya).

Ana adana abubuwan shigarwa akan shafin a cikin nau'i mai matsewa (ana amfani da algorithm deflate). Duk bayanan da ke shafi ɗaya ana matsa su cikin zare ɗaya (ana amfani da ƙamus na gama-gari), kuma akan kowane sabon shafi yana fara sabon salo. Wato, don rage kowane rikodin, duk bayanan da suka gabata daga wannan shafin (kuma wannan kawai) ana buƙata.

Kowane rikodin za a naɗe shi da tutar Z_SYNC_FLUSH, kuma a ƙarshen rafin da aka matsa za a sami bytes 4 0x00, 0x00, 0xff, 0xff, mai yuwuwa gaba ɗaya ko biyu ƙarin sifili bytes.
Muna zubar da wannan jeri (tsawon 4, 5 ko 6 bytes) lokacin rubutawa zuwa ƙwaƙwalwar ajiya.

Babban rikodin shine 1, 2 ko 3 bytes adanawa:

  • daya bit (T) yana nuna nau'in rikodin: 0 - mahallin, 1 - log;
  • filin tsayi mai canzawa (S) daga 1 zuwa 7 ragowa, yana bayyana tsawon rubutun da kuma "wutsiya" wanda dole ne a ƙara shi zuwa rikodin don lalatawa;
  • tsayin rikodin (L).

Teburin darajar S:

S
Tsawon kai, bytes
An jefar da shi akan rubutu, 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)

Na yi ƙoƙari in kwatanta, ban san yadda abin ya kasance a fili ba:
Aiwatar da na'urar buffer na zobe a NOR flash
Yellow anan yana nuna filin T, farin filin S, koren L (tsawon matsewar bayanai a cikin bytes), shuɗi da matsa lamba, ja ƙarshen bytes ɗin da aka matsa wanda ba a rubuta shi zuwa ƙwaƙwalwar ajiya ba.

Don haka, zamu iya rubuta rubutun rubutun mafi tsayi (har zuwa 63+5 bytes a cikin nau'i mai matsi) a cikin byte ɗaya.

Bayan kowane rikodi, ana adana adadin cak na CRC-32C, wanda a cikinsa ake amfani da jujjuyar ƙimar kuɗin da ya gabata azaman ƙimar farko (init).

CRC tana da mallakar “lokacin”, dabarar da ke gaba tana aiki (da ko rage juzu'i a cikin tsari): Aiwatar da na'urar buffer na zobe a NOR flash.
Wato, a zahiri, muna ƙididdige CRC na duk bayanan da suka gabata na rubutun kai da bayanai akan wannan shafin.

Kai tsaye bin checksum shine taken rikodin na gaba.

An tsara rubutun ta yadda baiti na farko ya bambanta da 0x00 da 0xff (idan maimakon byte na farko na rubutun muka ci karo da 0xff, to wannan yana nufin cewa wannan yanki ne mara amfani; 0x00 yana nuna kuskure).

Misali Algorithms

Karatu daga Flash Memory

Duk wani karatu yana zuwa tare da checksum check.
Idan lissafin bai yi daidai ba, ana maimaita karatun sau da yawa a cikin bege na karanta daidaitattun bayanai.

(wannan yana da ma'ana, Linux baya karantawa daga NOR Flash, gwada)

Rubuta zuwa žwažwalwar ajiya

Muna rikodin bayanan.
Mu karanta su.

Idan bayanan da aka karanta ba su dace da bayanan da aka rubuta ba, za mu cika yankin da sifili kuma muna siginar kuskure.

Ana shirya sabon microcircuit don aiki

Don farawa, ana rubuta rubutun da ke da sigar 1 zuwa shafi na farko (ko sifili).
Bayan haka, an rubuta mahallin farko zuwa wannan shafin (ya ƙunshi UUID na na'ura da saitunan tsoho).

Shi ke nan, ƙwaƙwalwar filashin tana shirye don amfani.

Ana loda injin

Lokacin lodawa, ana karanta bytes 8 na farko na kowane shafi (header + CRC), shafukan da ba a san Lambar Sihiri ko CRC da ba daidai ba ana watsi da su.
Daga shafukan "daidai", an zaɓi shafuka masu matsakaicin sigar, kuma ana ɗaukar shafin da mafi girman lamba daga gare su.
Ana karanta rikodin farko, ana duba daidaiton CRC da kasancewar tuta ta “yanayin”. Idan komai yana da kyau, ana ɗaukar wannan shafin a halin yanzu. Idan ba haka ba, za mu sake komawa zuwa na baya har sai mun sami shafin "rayuwa".
kuma a kan shafin da aka samo mun karanta duk bayanan, waɗanda muke amfani da su tare da tutar "yanayin".
Ajiye ƙamus na zlib (za a buƙaci don ƙara zuwa wannan shafin).

Shi ke nan, zazzagewar ta cika, an dawo da mahallin, kuna iya aiki.

Ƙara Shigar Jarida

Muna danne rikodin tare da ƙamus daidai, muna ƙayyadaddun Z_SYNC_FLUSH. Muna ganin ko matsin rikodin ya dace akan shafin na yanzu.
Idan bai dace ba (ko akwai kurakuran CRC akan shafin), fara sabon shafi (duba ƙasa).
Mun rubuta rikodin da CRC. Idan kuskure ya faru, fara sabon shafi.

Sabon shafi

Muna zaɓar shafi na kyauta tare da mafi ƙarancin lamba (muna ɗaukar shafi na kyauta don zama shafi mai cike da ƙima mara kyau a cikin taken ko tare da sigar ƙasa da na yanzu). Idan babu irin waɗannan shafuka, zaɓi shafin da mafi ƙarancin lamba daga waɗanda ke da sigar daidai da ta yanzu.
Muna goge shafin da aka zaɓa. Muna bincika abubuwan da ke ciki tare da 0xff. Idan wani abu ba daidai ba, ɗauki shafi na kyauta na gaba, da sauransu.
Muna rubuta rubutun kan shafin da aka goge, shigarwa ta farko ita ce halin yanzu na mahallin, na gaba shine shigarwar log da ba a rubuta ba (idan akwai).

Tsarin aiki

A ra'ayi na, ya zama kyakkyawan tsari don adana duk wani rafukan bayanai masu matsewa ko žasa (rubutu a sarari, JSON, MessagePack, CBOR, mai yiwuwa protobuf) a cikin NOR Flash.

Tabbas, tsarin an “daidaita” don SLC NOR Flash.

Kada a yi amfani da shi tare da manyan kafofin watsa labarai na BER kamar NAND ko MLC NOR (shin irin wannan ƙwaƙwalwar ajiya har ma ana siyarwa?.

Haka kuma, bai kamata a yi amfani da shi tare da na'urorin da ke da nasu FTL: USB flash, SD, MicroSD, da dai sauransu (don irin wannan ƙwaƙwalwar ajiyar na ƙirƙiri tsari mai girman shafi na 512 bytes, sa hannu a farkon kowane shafi da lambobin rikodin musamman - wani lokacin yana yiwuwa a dawo da duk bayanan daga faifan filasha ta “glitched” ta hanyar karanta jeri mai sauƙi).

Dangane da ayyukan, ana iya amfani da tsarin ba tare da sauye-sauye akan faifai ba daga 128Kbit (16Kb) zuwa 1Gbit (128MB). Idan ana so, zaku iya amfani da shi akan manyan kwakwalwan kwamfuta, amma tabbas kuna buƙatar daidaita girman shafin (Amma a nan tambayar yiwuwar tattalin arziƙin ta riga ta taso; farashin babban girma NOR Flash ba ya ƙarfafawa).

Idan wani ya sami tsari mai ban sha'awa kuma yana so ya yi amfani da shi a cikin aikin budewa, rubuta, zan yi ƙoƙarin nemo lokacin, goge lambar kuma sanya shi akan github.

ƙarshe

Kamar yadda kake gani, a ƙarshe tsarin ya zama mai sauƙi har ma da ban sha'awa.

Yana da wuya a yi la'akari da juyin halitta na ra'ayi a cikin labarin, amma ku yarda da ni: da farko ina so in haifar da wani abu mai mahimmanci, wanda ba zai iya lalacewa ba, wanda zai iya tsira har ma da fashewar nukiliya a cikin kusanci. Duk da haka, dalili (Ina fata) har yanzu ya ci nasara kuma a hankali abubuwan da suka fi dacewa sun koma ga sauƙi da sauƙi.

Zai iya zama cewa na yi kuskure? Ee, tabbas. Yana iya zama da kyau, alal misali, cewa mun sayi batch na ƙananan ƙananan microcircuits. Ko saboda wasu dalilai kayan aikin ba za su dace da tsammanin dogaro ba.

Shin ina da shirin wannan? Ina tsammanin cewa bayan karanta labarin ba ku da shakka cewa akwai wani shiri. Kuma ba ma kadai ba.

A wani ɗan ƙaramin bayani mai mahimmanci, an haɓaka tsarin duka azaman zaɓin aiki kuma azaman “balloon gwaji”.

A halin yanzu duk abin da ke kan tebur yana aiki lafiya, a zahiri sauran rana za a tura mafita (kimanin) a kan ɗaruruwan na'urori, bari mu ga abin da ke faruwa a cikin aikin "yaƙi" (abin farin ciki, ina fata tsarin ya ba ku damar gano gazawar dogara, don haka za ku iya tattara cikakkun kididdiga). A cikin 'yan watanni zai yiwu a zana ƙarshe (kuma idan kun yi rashin sa'a, ko da a baya).

Idan, dangane da sakamakon amfani, an gano matsaloli masu tsanani kuma ana buƙatar ingantawa, to tabbas zan rubuta game da shi.

Litattafai

Ba na so in yi dogon jerin ayyukan da aka yi amfani da su; bayan haka, kowa yana da Google.

Anan na yanke shawarar barin jerin binciken da suka yi kama da ni musamman ban sha'awa, amma a hankali sun yi ƙaura kai tsaye cikin rubutun labarin, kuma abu ɗaya ya kasance a cikin jerin:

  1. Mai amfani infgen daga marubucin zlib. Za a iya nuna abubuwan da ke cikin deflate/zlib/gzip a sarari. Idan dole ne ku magance tsarin ciki na tsarin deflate (ko gzip), Ina ba da shawarar sosai.

source: www.habr.com

Add a comment