Čo je to krúžková vyrovnávacia pamäť?

Krúžková vyrovnávacia pamäť je tiež známa ako fronta alebo cyklická vyrovnávacia pamäť a je bežnou formou fronty. Ide o populárny, ľahko implementovaný štandard a hoci je reprezentovaný ako kruh, je v základnom kóde lineárny. Prsteňová fronta existuje ako pole pevných dĺžok s dvoma ukazovateľmi: jeden predstavuje začiatok fronty a druhý - za chvost. Nevýhodou metódy je jej pevná veľkosť. V prípade frontov, kde sa prvky musia pridávať alebo odstraňovať uprostred, a nie len na začiatku a na konci vyrovnávacej pamäte, implementácia ako prepojený zoznam je najlepší prístup.

Teoretický základ vyrovnávacej pamäte

Pre používateľov je jednoduchšie vybrať účinnú štruktúru polí po pochopení základnej teórie. Cyklus vyrovnávacej pamäte je dátová štruktúra, v ktorej je pole spracované a vizualizované vo forme slučiek, to znamená, že indexy sa po dosiahnutí dĺžky poľa vrátia na hodnotu 0. To sa deje na dvoch poliach na poli: "hlava" a "chvost". Keď sa údaje pridajú do vyrovnávacej pamäte, index nadpisu sa posunie nahor. Podobne, keď sú odstránené, chvost sa tiež pohybuje nahor. Definícia hlavy, chvosta, smeru pohybu, miesta záznamu a čítania závisí od realizácie schémy.


Kruhové nárazníky sú príliš efektívne používané na riešenie problémov spotrebiteľa. Jeden tok vykonania je zodpovedný za tvorbu údajov a druhý za spotrebu. V zabudovaných zariadeniach s veľmi nízkou a strednou úrovňou je výrobca prezentovaný vo formáte ISR (informácie získané zo senzorov) a spotrebiteľ - vo formehlavný cyklus udalosti. Funkciou cyklických vyrovnávacích pamätí je to, že sú realizované bez nutnosti zámkov v prostredí jedného výrobcu a jedného spotrebiteľa. To z nich robí ideálnu informačnú štruktúru pre vstavané aplikácie. Ďalším rozdielom je, že neexistuje presný spôsob rozlíšenia vyplneného sektora od prázdneho. Je to preto, že v obidvoch prípadoch sa hlava spojí s chvostom. Existuje veľa spôsobov a prostriedkov na to, aby sa s tým vyrovnali, ale väčšina z nich spôsobuje väčšiu mätúcu a komplikovanú čitateľnosť.


Ďalšia otázka, ktorá vzniká vo vzťahu k cyklickému bufferu. Je potrebné vynulovať nové údaje alebo preregistrovať existujúce údaje, keď sú plné? Špecialisti tvrdia, že neexistuje zrejmé zvýhodnenie nad sebou a jej implementácia závisí od konkrétnej situácie. Ak sú tieto aplikácie relevantnejšie pre aplikáciu, použite metódu prepísania. Na druhej strane, ak sú spracovávané v režime "prvý príchod - prvý", potom nové, keď je vyplnená prstencová vyrovnávacia pamäť, odmietnete. Počnúc realizovať, definovať dátové typy a spôsoby

Vykonávanie krúžok línie

: jadro, tlačiť a pop. V postupoch "push" a "pop" vypočítajte "takéto" body presunu pre miesto, kde sa uskutoční aktuálne nahrávanie a čítanie. Ak toto umiestnenie ukazuje na chvost, potom je vyrovnávacia pamäť plná a údaje nie sú zaznamenané. Podobne, ak je "hlava" rovná "chvostu", je prázdna a z nej nie je nič čítané.

Štandardná prípad použitia

Sekundárny proces spracovania tzv programuna extrahovanie dát z vyrovnávacej pamäte Java. Mala by byť zahrnutá do kritických sekcií, ak kontajner číta viac ako jednu niť. Chvost sa presunie k nasledujúcemu posunu pred čítaním informácií, pretože každý blok je jeden bajt a rezervuje rovnaké množstvo v vyrovnávacej pamäti, keď je objem úplne nabitý. V pokročilejších implementáciách cyklického pohonu však jednotlivé oddiely nemusia byť nevyhnutne rovnakej veľkosti. V takýchto prípadoch sa pokúsia zachrániť aj posledný bajt, pridať ďalšie kontroly a hranice. V takýchto schémach, ak sa chvost pohybuje pred čítaním, informácie, ktoré by mali byť prečítané, môžu byť potenciálne prepísané novo prenášanými údajmi. Vo všeobecnosti sa odporúča čítať ako prvé a potom posúvať ukazovateľ chvosta. Najprv určite dĺžku vyrovnávacej pamäte a potom vytvorte inštanciu "circ_bbuf_t" a priraďte ukazovateľ na "maxlen". V takomto prípade musí byť kontajner celosvetový alebo nahromadený. Napríklad, ak potrebujete 32-bajtový zväzok kruhov, vykonajte nasledujúce prílohy (pozri obrázok nižšie).

Špecifikácia funkčných požiadaviek

Typ údajov "ring_t" bude typ dát, ktorý obsahuje ukazovateľ do vyrovnávacej pamäte, jeho veľkosť, hlavičku a index chvosta a počítadlo údajov. Funkcia inicializácie "ring_init ()" inicializuje vyrovnávaciu pamäť na základe získania ukazovateľa štruktúry kontajnera vytvoreného funkciou volania s určenou veľkosťou. Funkcia ring_add () pridá bajt do ďalšieho voľného miesta v vyrovnávacej pamäti.Funkcia odstránenia ring_remove () odstráni bajt z najstaršieho dostupného priestoru v kontajneri. Ring nahliadnuť na funkciu «ring_peek () bude čítať počet bajtov« uint8_t, count ' »s novým kruhového bufferu poskytnuté ako parameter, ale neodstráni žiadna hodnoty prečítané z kontajnera. Vráti počet skutočne čítaných bajtov.
Funkcia ring_clear () nastaví "Chvost" rovnajúcu sa "Head" a načíta sa "0" vo všetkých pozíciách vyrovnávacej pamäte.

Vytvorenie vyrovnávacej pamäte v C /C ++

Vzhľadom na obmedzené zdroje vstavaných systémov dátových štruktúr s cyklickej vyrovnávacej pamäte nachádza vo väčšine pevnej veľkosti projektov, ktoré pôsobia ako v prípade, že pamäť bola od prírody a kontinuálne ring. Nie je potrebné usporiadať údaje, pretože pamäť sa generuje a používa a indikátory hlavy /konca sú opravené. Pri vytváraní knižnice cyklických vyrovnávacích pamätí používatelia potrebujú pracovať s knižnicnými rozhraniami API, a nie priamo meniť štruktúru. Preto sa používa zapuzdrenie kruhového tlmivého roztoku na "C". Týmto spôsobom vývojár uloží implementáciu knižnice a zmení ju podľa potreby, bez toho, aby ju koncoví používatelia vyžadovali aj na jej aktualizáciu.

Užívatelia môžu pracovať s «circular_but_t» typu ukazovateľ popisovač je vytvorený, ktoré možno použiť namiesto. Tým sa eliminuje potreba presunúť kurzor na implementáciu funkcie .typedefcbuf_handle_t. Vývojári potrebujú vytvoriť rozhranie API pre knižnicu. Spolupracujú s knižnicou kruhovej vyrovnávacej pamäte "C" pomocou nepriehľadného typu deskriptora,ktorý sa vytvorí počas inicializácie. Zvyčajne zvoľte ako základný typ údajov "uint8_t". Môžete však použiť ľubovoľný konkrétny typ, dávať pozor, aby správne spracoval základnú vyrovnávaciu pamäť a počet bajtov. Používatelia komunikujú s kontajnerom podľa požadovaných postupov:
  • Inicializujte kontajner a jeho veľkosť.
  • Vynulujte kruhový kontajner.
  • Pridajte dáta do vyrovnávacej pamäte kruhu v bode "C".
  • Získate nasledujúcu hodnotu z kontajnera.
  • Požiadajte o informácie o aktuálnom počte položiek a maximálnej kapacite.
  • A "plný" a "prázdny" prípady vyzerajú rovnako: "hlavu" a "chvost", indikátor úrovne. Existujú dva prístupy, ktoré rozlišujú medzi plným a prázdnym:
  • Kompletný stav konca + 1 == hlava.
  • Prázdna stavová hlava == chvost.
  • Implementácia funkcií knižnice

    Na vytvorenie kruhového kontajnera použite jeho štruktúru na ovládanie stavu. Ak chcete uložiť zapuzdrenie, štruktúra je definovaná v súbore .c knižnice a nie v hlavičke. Pri inštalácii budete musieť sledovať:
  • Základný dátový buffer.
  • Maximálna veľkosť.
  • Aktuálna poloha hlavy sa zvyšuje pridaním.
  • Súčasný chvost sa zvyšuje po odstránení.
  • Vlajka označujúca naplnenú nádobu alebo nie.
  • Teraz, keď je kontajner navrhnutý, implementuje funkcie knižnice. Každá rozhranie API vyžaduje inicializovaný deskriptor vyrovnávacej pamäte. Namiesto zablokovania kódu podmienenými vyhláseniami požiadajte o schválenie, aby ste presadili požiadavkyAPI vo veľkom štýle.
    Implementácia nebude aktuálne orientovaná, ak do základnej knižnice cyklických repozitárov nebol pridaný žiadny zámok. Pre inicializáciu API klientov, ktorí poskytujú základnú veľkosť vyrovnávacej pamäte, ju preto vytvorte na boku knižnice, napríklad na zjednodušenie "malloc". Systémy, ktoré nemôžu používať dynamickú pamäť, by mali zmeniť funkciu "init" tak, aby používali inú metódu, napríklad výber zo statického fondu kontajnerov. Ďalším prístupom je prelomenie zapuzdrenia, čo užívateľom umožňuje staticky deklarovať kontajnerové štruktúry. V tomto prípade je potrebné aktualizovať "circular_buf_init", aby ste získali ukazovateľ alebo "init", vytvorili štruktúru zásobníka a vrátili ho. Keďže je zapuzdrenie narušené, používatelia ho môžu zmeniť bez knižničných postupov. Po vytvorení kontajnera vyplňte hodnotu a spôsobte "reset". Pred návratom z "init" systém zabezpečí, že kontajner je prázdny.

    Pridávanie a mazanie údajov

    Pridávanie a odstraňovanie údajov z vyrovnávacej pamäte vyžaduje manipuláciu z indikátorov "head" a "tail". Keď sa pridá do kontajnera, vložte novú hodnotu do aktuálnych "head" -sites a presuňte ju. Po odstránení dostanú hodnotu súčasného indikátora "chvosta" a podporia "chvost". Ak chcete presunúť index "tail" a tiež "head", musíte skontrolovať, či vkladanie spôsobí hodnotu "full". Keď je vyrovnávacia pamäť už plná, presuňte "chvost" o krok dopredu "hlava".
    Po posúvaní ukazovateľa vyplňte "úplné" publikovanie,kontrola rovnosti "head == tail". Modulárne používanie operátora spôsobí, že po dosiahnutí maximálnej veľkosti sa nastavia hodnoty "head" a "tail" na hodnotu "0". Tým sa zabezpečí, že "head" a "tail" budú vždy platné databázy kontajnera základných údajov: "static void advance_pointer (cbuf_handle_t cbuf)". Môžete vytvoriť podobnú pomocnú funkciu, ktorá sa nazýva pri odstraňovaní hodnôt z vyrovnávacej pamäte.

    Rozhranie šablóny

    Aby implementácia C ++ podporovala akýkoľvek typ údajov, postupujte podľa šablóny:
  • Vynulujte vyrovnávaciu pamäť na čistenie.
  • Pridávanie a odstraňovanie údajov.
  • ​​
  • Kontrola plného /prázdneho stavu.
  • Kontrola aktuálneho počtu položiek.
  • Kontrola celkovej kapacity kontajnera.
  • Aby nedošlo k zanechaniu žiadnych údajov po zničení vyrovnávacej pamäte, používajú sa inteligentné ukazovatele C ++, aby sa zabezpečilo, že používatelia môžu spravovať údaje.
    V tomto príklade vyrovnávacia pamäť C ++ simuluje väčšinu implementačnej logiky C, ale výsledkom je oveľa čistejší a opakovane použiteľný dizajn. Navyše, kontajner C ++ používa "std :: mutex" na poskytnutie aktuálne orientovanej implementácie. Pri vytváraní triedy vyberte dáta pre hlavnú vyrovnávaciu pamäť a nastavte jej veľkosť. Tým sa eliminuje réžia vyžadovaná implementáciou C. Na rozdiel od toho konštruktor C ++ nespôsobí "reset", pretože určuje počiatočné hodnoty členov, kruhový kontajner beží v správnom stave. Chybové správanie vráti vyrovnávaciu pamäť do prázdneho stavu. Pri implementácii cyklického kontajnera "veľkosti" C ++ a"Kapacita" udáva počet položiek vo fronte, nie veľkosť v bajtoch.

    Ovládač UART STM32

    Po spustení vyrovnávacej pamäte musí byť integrovaný do ovládača UART. Najprv ako globálny prvok v súbore je preto potrebné deklarovať:
  • "descriptor_rbd" a vyrovnávacia pamäť "_rbmem: static rbd_t _rbd";
  • "statické znaky
    ".
  • Keďže ide o ovládač UART, v ktorom má byť každý znak 8-bitový, je možné vytvoriť pole znakov. Ak sa používa režim 9 alebo 10 bitov, každý prvok by mal byť "uint16_t". Kontajner sa vypočíta tak, aby sa zabránilo strate dát. Moduly frontu často obsahujú štatistické informácie, ktoré umožňujú sledovať maximálne využitie. V inicializačnej funkcii "uart_init" musí byť vyrovnávacia pamäť inicializovaná volať "ring_buffer_init" a prenášať štruktúru atribútu na každého člena, ktorému sú dohodnuté hodnoty priradené. Ak je úspešne inicializovaný, modul UART je vyvedený z resetovania, príjem IFG2 je povolený.
    Druhou funkciou, ktorá sa má zmeniť, je "uart_getchar". Čítanie prijatého znaku z periférneho zariadenia UART sa nahradí čítaním z frontu. Ak je fronta prázdna, funkcia musí vrátiť -1. Ďalej musíte implementovať UART a získať ISR. Otvorte súbor s hlavičkou "msp430g2553.h", prejdite nadol na sekciu vektorov prerušenia, kde nájde vektor s názvom USCIAB0RX. Pomenovanie znamená, že sa používa v moduloch USCI A0 a B0. Stav prerušenia príjmu USCI A0 možno prečítať z IFG2. Ak je nainštalovaný, vlajka by sa mala vymazať a údaje v prijímacej priehradke sa umiestnia do vyrovnávacej pamätepomocou "ring_buffer_put".

    skladovanie UART údajov

    Toto úložisko poskytuje informácie o tom, ako čítať dáta z UART pomocou DMA, keď je počet bajtov pre príjem nie je známy. Rodina mikrokontrolérov vyrovnávacia pamäť STM32 môže pracovať v rôznych režimoch:
  • ANKETA (bez DMA, bez IRQ) - Žiadosť musí dotaz bitov stave zistiť, či nový znak a prečítať si to dosť rýchlo, aby boli všetky bajty. Veľmi jednoduchá implementácia, ale nikto ho nepoužíva v reálnom živote. Nevýhody - je ľahké vynechať prijaté znaky v dátových paketoch, funguje len pri nízkych prenosových rýchlostiach.
  • režimu (bez DMA) prerušiť - kruhový buffer, beží UART prerušenia a pokračuje CPU pre spracovanie nástroj pre príjem dát. Najrozšírenejší prístup vo všetkých aplikáciách dnes funguje dobre v strednom rozsahu. Nevýhody - prerušenie konania sa vykonáva u každého prijatého symbolu môže zastaviť ďalšie úlohy v oblasti vysoko výkonných mikroprocesorov s mnohými prerušeniami, zatiaľ čo operačný systém, keď dostávali dátové pakety.
  • Spôsob DMA pre prenos dát z RX USART zaregistruje do pamäte v hardvéru. V tejto fáze sa interakcia s aplikáciou nevyžaduje, s výnimkou potreby spracovať údaje prijaté aplikáciou. Môže byť veľmi jednoduché pracovať s operačnými systémami. Optimalizované pre vysoké dátové rýchlosti & gt; 1Mbps a aplikácie s nízkym výkonom, v prípade veľkých dátových paketov sa môže zvýšiť veľkosť vyrovnávacej pamätefunkčnosť.
  • Implementácia ARDUINO

    Puzdro Arduino Ribbon sa vzťahuje na dizajn dosiek a programovacie prostredie, ktoré sa používa na prácu. Jadrom Arduino je mikroprocesor série Atmel AVR. Je to AVR, ktorá vykonáva väčšinu práce a v mnohých ohľadoch doska Arduino okolo AVR poskytuje funkčnosť - ľahko pripojiteľné kontakty, sériové rozhranie USB pre programovanie a komunikáciu. Mnohé z bežných kariet Arduino v súčasnosti používajú krúžkovú vyrovnávaciu pamäť s staršími základnými doskami ATmega 328, ktoré používajú ATmega168 a ATmega8. Dosky ako Mega vyberajú zložitejšie možnosti, napríklad 1280 a podobne. Čím rýchlejšie a nulové, tým lepšie využitie ARM. Existuje asi desať rôznych dosiek Arduino s názvami. Môžu mať rôzne množstvo pamäte typu flash, porty RAM a vstupy /výstupy s vyrovnávacou pamäťou AVR.
    Premenná "roundBufferIndex" sa používa na ukladanie aktuálnej pozície a pri pridávaní do vyrovnávacej pamäte dôjde k obmedzeniu poľa.
    Toto sú výsledky vykonávania kódu. Čísla sú uložené v vyrovnávacej pamäti a keď sú plné, začnú prepisovať. Takže môžete získať posledné čísla N.
    V predchádzajúcom príklade bol index použitý na prístup k aktuálnej pozícii vyrovnávacej pamäte, pretože stačí vysvetliť operáciu. Vo všeobecnosti je však normálne používať ukazovateľ. Toto je upravený kód na použitie ukazovateľa namiesto indexu. V podstate rovnaká operácia ako predchádzajúca a získané výsledky sú podobné.

    Vysokovýkonné operácie CAS

    Disruptor jeVysokokvalitná knižnica pre streamovanie správ, vyvinutá a otvorená pred niekoľkými rokmi spoločnosťou LMAX Exchange. Vytvorili tento softvér na zvládnutie obrovskej návštevnosti (viac ako 6 miliónov TPS) vo svojej maloobchodnej finančnej platforme. V roku 2010 prekvapili každého, ako rýchlo by ich systém mohol byť, po dokončení všetkých obchodných logiky v jednom vlákne. Napriek tomu, že jedno vlákno bolo dôležitým riešením, disruptor pracuje v prostredí s viacerými vláknami a je založený na kruhovej vyrovnávacej pamäti - prúdu, v ktorom už nie sú potrebné zastarané údaje, pretože je viac čerstvé a relevantnejšie. V tomto prípade bude fungovať buď vrátenie falošnej logickej hodnoty alebo zámok. Ak žiadne z týchto riešení nevyhovuje používateľom, môže byť implementovaná vyrovnávateľná vyrovnávacia pamäť, ale iba keď je naplnená, a to nielen vtedy, keď výrobca dosiahne koniec poľa. Zmena veľkosti bude vyžadovať presun všetkých prvkov do novo prideleného väčšieho poľa, ak sa použije ako základná dátová štruktúra, čo je samozrejme nákladná operácia. Existuje veľa ďalších vecí, ktoré spôsobujú, že disruptor je rýchly, napríklad správy v dávkovom režime. Qtserialport (sériový port) kruhový buffer je zdedený od QIODevice, môže byť použitý na získanie rôznych sériových informácií a zahŕňa všetky dostupné sériové zariadenia. Sériový port je vždy otvorený v monopolnom prístupe, čo znamená, že iné procesy alebo vlákna nemôžu pristupovať k otvorenému seriáluprístavu Prstencové vyrovnávacie pamäte sú veľmi užitočné pri programovaní pre "C", napríklad môžete odhadnúť prúd bajtov prichádzajúcich cez UART.

    Súvisiace publikácie

    Najväčšia vyrovnávacia pamäť Aliexpressu: ako ju získať, recenzie