Što je međuspremnik prstena?

Prstenasti međuspremnik poznat je i kao red čekanja ili ciklički međuspremnik i uobičajeni je oblik reda čekanja. To je popularan, lako implementiran standard i iako je predstavljen kao krug, u osnovnom kodu je linearan. Prstenasti Red postoji kao niz fiksne duljine s dva pokazivača: jedan predstavlja početak reda, a drugi rep. Nedostatak metode je njegova fiksna veličina. Za redove u kojima se stavke moraju dodavati i brisati u sredini, a ne samo na početku i na kraju međuspremnika, poželjniji je pristup implementaciji kao povezanog popisa.

Teorijske osnove međuspremnika

Teorijske osnove međuspremnika

Korisniku je lakše odabrati učinkovitu strukturu niza nakon razumijevanja temeljne teorije. Kružni međuspremnik-struktura podataka u kojoj se niz obrađuje i vizualizira kao petlje, tj. indeksi se vraćaju na 0 nakon postizanja duljine niza. To se postiže pomoću dva pokazivača na niz: "AIPS " i" AIPS ". Kada se podaci dodaju u međuspremnik, pokazivač zaglavlja pomiče se prema gore. Slično tome, kada se uklone, rep se također pomiče prema gore. Određivanje glave, repa, smjera njihovog kretanja, mjesta pisanja i čitanja ovise o provedbi sheme.

Kružni odbojnici pretjerano se učinkovito koriste za rješavanje problema potrošača. Odnosno, jedna nit izvršenja odgovorna je za proizvodnju podataka, a druga za potrošnju. U ugrađenim uređajima s vrlo niskom i srednjom razinom, proizvođač je predstavljen u formatu (informacije dobivene od senzora), a potrošač u obliku glavne petlje događaja.

Značajka cikličkih međuspremnika je da se implementiraju bez potrebe za zaključavanjem u okruženju jednog proizvođača i jednog potrošača. To ih čini idealnom informacijskom strukturom za ugrađene programe. Sljedeća razlika - ne postoji točan način razlikovanja ispunjenog sektora od praznog. To je zato što se u oba slučaja glava stapa s repom. Postoji mnogo načina i zaobilaznih rješenja za rješavanje ovoga, ali većina uvodi veliku zbrku i otežava čitljivost.

Još jedno pitanje koje se postavlja u vezi s cikličkim međuspremnikom. Trebam li izbaciti nove podatke ili prebrisati postojeće kad je pun? Stručnjaci kažu da ne postoji jasna prednost jednog nad drugim, a njegova provedba ovisi o konkretnoj situaciji. Ako su potonji značajniji za aplikaciju, upotrijebite metodu prepisivanja. S druge strane, ako se njima rukuje u načinu "prvi dođe - prvi posluži", odbacit će nove kada je međuspremnik prstena pun.

Implementacija cikličkog reda

Počevši s implementacijom, definiraju se vrste podataka, a zatim metode: Ace, Ace i ACE. U postupcima "IAS " i" IAS "izračunavaju se" sljedeće " točke pomaka za mjesto na kojem će se odvijati trenutno pisanje i čitanje. Ako sljedeće mjesto pokazuje na rep, Međuspremnik je pun i podaci se više ne zapisuju. Slično tome, kada je " IPA "jednak" IPA", prazan je i iz njega se ništa ne čita.

Implementacija cikličkog reda

Standardni slučaj upotrebe

Pomoćni postupak poziva se postupkom aplikacije za dohvaćanje podataka iz prstenastog međuspremnika. Trebao bi biti uključen u kritične odjeljke ako se spremnik čita više od jedne niti. Rep se pomiče na sljedeći pomak prije nego što se informacije pročitaju, jer je svaki blok jedan bajt i rezervira sličnu količinu u međuspremniku kada je volumen u potpunosti učitan. Ali u naprednijim implementacijama cikličkog pogona, pojedinačne particije ne moraju biti iste veličine. U takvim se slučajevima pokušava zadržati čak i zadnji bajt dodavanjem više provjera i granica.

U takvim shemama, ako se rep pomiče prije čitanja, informacije koje treba pročitati mogu se potencijalno prebrisati novoiznesenim podacima. Općenito je dobra ideja prvo pročitati, a zatim pomaknuti repni pokazivač. Prvo odredite duljinu međuspremnika, a zatim stvorite instancu "nine_ nine_name" i dodijelite pokazivač "ACE" . U ovom slučaju spremnik mora biti globalni ili biti u stogu. Tako, na primjer, ako vam je potreban međuspremnik prstena duljine 32 bajta, u aplikaciji izvršite sljedeće (cm. slika ispod).

Standardni slučaj upotrebe

Specifikacija funkcionalnih zahtjeva

Tip podataka "nena_name" bit će tip podataka koji sadrži pokazivač na međuspremnik, njegovu veličinu, indeks zaglavlja i repa, brojač podataka.

Funkcija inicijalizacije "nine_nap ()" inicijalizira međuspremnik na temelju dobivanja pokazivača na strukturu spremnika stvorenog pozivajućom funkcijom koja ima unaprijed definiranu veličinu.

Značajka dodavanja poziva "ina_nap ()" dodati će bajt sljedećem dostupnom razmaku u međuspremniku.

Funkcija brisanja prstena "ina_nap ()" uklonit će bajt sa najstarijeg važećeg mjesta u spremniku.

Ring pogled na funkcije "ring_peek ()" će biti pročitati broj bajtova "uint8_t `count`" od prstena tampon u novi koji je ponuđen kao parametar, bez brisanja bilo kakvih vrijednosti, pročitanih iz kontejnera. Vratit će broj stvarno pročitanih bajtova.

Funkcija čišćenja prstena "ina_ ina ()" postavit će " ina "jednako" ina "i učitati" 0 " na sve položaje međuspremnika.

Stvaranje međuspremnika u Ace / Ace ++

Zbog ograničenih resursa ugrađenih sustava, strukture podataka s cikličkim međuspremnikom mogu se naći u većini projekata fiksne veličine koji rade kao da je memorija po prirodi kontinuirana i kružna. Podaci se ne moraju preuređivati jer se memorija generira i koristi, a ispravljaju se pokazivači glave/repa. Tijekom stvaranja cikličke biblioteke međuspremnika, korisnici trebaju raditi s Knjižničnim oceanima, a ne izravno mijenjati strukturu. Stoga koristite enkapsulaciju prstenastog međuspremnika na "Si". Na taj će način programer zadržati implementaciju knjižnice, mijenjajući je prema potrebi, ne zahtijevajući da je i krajnji korisnici ažuriraju.

Korisnici ne mogu raditi s pokazivačem "ine_ ine_ ine", stvara se vrsta ručke koja se umjesto toga može koristiti. To će eliminirati potrebu za usmjeravanjem pokazivača u implementaciji funkcije ".typedefcbuf_handle_t». Programeri trebaju sastaviti svoje biblioteke za knjižnicu. Oni stupaju u interakciju s bibliotekom prstenastog međuspremnika "Internet" koristeći neprozirnu vrstu ručke koja se stvara tijekom inicijalizacije. Uobičajeno je odabrati "IPA 8_ IPA" kao osnovni tip podataka. Ali može se koristiti bilo koja određena vrsta, pazeći da se pravilno postupa s osnovnim međuspremnikom i brojem bajtova. Korisnici komuniciraju s spremnikom izvršavanjem obveznih postupaka:

  1. Inicijalizirajte spremnik i njegovu veličinu.
  2. Resetirajte kružni spremnik.
  3. Dodati podatke u međuspremnik prstena na "Si".
  4. Dobivanje sljedeće vrijednosti iz spremnika.
  5. Zatražite informacije o trenutnom broju elemenata i maksimalnom kapacitetu.
Resetirajte kružni spremnik

I" puni "i" prazni " slučajevi izgledaju isto: "head" i "tail", pokazivači su jednaki. Postoje dva pristupa koja razlikuju puni i prazni:

  1. Potpuno stanje od + 1 = = .
  2. Prazno stanje interneta == .

Implementacija funkcija knjižnice

Da biste stvorili kružni spremnik, koristite njegovu strukturu za kontrolu stanja. Da bi se sačuvala enkapsulacija, struktura je definirana unutar knjižnice "."datoteka", a ne u zaglavlju. Tijekom instalacije morat ćete pratiti:

  1. Osnovni međuspremnik podataka.
  2. Maksimalna veličina.
  3. Trenutni položaj glave povećava se dodavanjem.
  4. Trenutni rep koji se povećava uklanjanjem.
  5. Zastava koja označava je li spremnik pun ili ne.

Sada kada je spremnik dizajniran, implementiraju funkcije knjižnice. Svaki od A Internet zahtijeva inicijalizirani deskriptor međuspremnika. Umjesto da začepljuju kod uvjetnim izjavama, primjenjuju se izjave kako bi se osiguralo da su zahtjevi U Stilu.

Zahtjevi U Stilu

Implementacija neće biti orijentirana na nit, osim ako su brave dodane u temeljnu biblioteku za kružnu pohranu. Da bi inicijalizirali spremnik, oceani imaju klijente koji pružaju osnovnu veličinu međuspremnika, pa ga kreiraju na strani knjižnice, na primjer, radi jednostavnosti " interneta ". Sustavi koji ne mogu koristiti dinamičku memoriju moraju modificirati funkciju" interneta " kako bi koristili drugu metodu, poput dodjele iz statičkog spremišta spremnika.

Drugi pristup je razbijanje enkapsulacije, što korisnicima omogućuje statičko deklariranje struktura spremnika. U ovom slučaju, "aima_ aima_ aimaa_" treba ažurirati kako bi se uzeo pokazivač ili "aimaaaaaaaaa", stvorila struktura stoga i vratila je. Međutim, budući da je enkapsulacija slomljena, korisnici će je moći mijenjati bez knjižničnih postupaka. Nakon što je spremnik stvoren, popunite vrijednosti i pozovite "reset". Prije nego što se vrati iz "interneta", sustav osigurava da je spremnik stvoren u praznom stanju.

Spremnik je stvoren u praznom stanju

Dodavanje i brisanje podataka

Dodavanje i uklanjanje podataka iz međuspremnika zahtijeva manipulaciju pokazivačima "internet" - i "internet". Kada se doda u spremnik, umetne se nova vrijednost u trenutnu "head"-mjestu i promovirati ga. Kada se izbriše, dobiva se trenutna vrijednost "tail"-pokazivača i promoviraju"internet". Ako trebate promovirati "tail"-pokazivač, kao i "Internet", treba provjeriti uzrokuje li umetanje vrijednosti "full". Kad je međuspremnik već pun, pomaknite "iphine" korak ispred "iphine".

Dodavanje i brisanje podataka

Nakon što je pokazivač napredovao, ispunite "full"-zastava, testiranje jednakosti "head == tail". Modularna upotreba operatora rezultirat će resetiranjem vrijednosti "IPA" i "IPA" u "0", kada će se postići maksimalna veličina. To osigurava da će " IP "i" IP " uvijek biti valjani indeksi osnovnog spremnika podataka: "static void advance_pointer (cbuf_handle_t cbuf)". Može se stvoriti slična pomoćna funkcija koja se poziva kada se vrijednost ukloni iz međuspremnika.

Sučelje klase predloška

Da bi implementacija IAS ++ podržala bilo koju vrstu podataka, izvršite predložak:

  1. Resetiranje međuspremnika za čišćenje.
  2. Dodavanje i brisanje podataka.
  3. Provjera punog / praznog stanja.
  4. Provjera trenutnog broja stavki.
  5. Provjera ukupnog kapaciteta spremnika.
  6. Kako ne bi ostavili nikakve podatke nakon što je međuspremnik uništen, koristite pametne pokazivače Inap ++ kako biste osigurali da korisnici mogu upravljati podacima.
Sučelje klase predloška

U ovom primjeru, međuspremnik IAS ++ oponaša većinu logike implementacije IAS-a, ali rezultat je mnogo čišći i višekratni dizajn. Uz to, koristi se i spremnik za IAS ++ "std::mutex" da bi se osigurala implementacija usmjerena na nit. Prilikom stvaranja klase dodijelite podatke glavnom međuspremniku i postavite njegovu veličinu. To eliminira režijske troškove koji su potrebni s implementacijom Nazionara. Za razliku od njega, graditelj Interneta ++ ne uzrokuje "reset", budući da određuju početne vrijednosti za varijable člana, kružni spremnik izvodi se u ispravnom stanju. Ponašanje resetiranja vraća međuspremnik u prazno stanje. U implementaciji cikličkog spremnika, as ++ "as " I" as " izvještava o broju stavki u redu, a ne o veličini u bajtovima.

VOZAČ32

Nakon što se međuspremnik pokrene, trebao bi biti integriran u upravljački program. Prvo kao globalni element u datoteci, pa se mora deklarirati:

  • "descriptor_rbd" i međuspremnik "_rbmem: static rbd_t _rbd";
  • "static char _rbmem [8]".

Budući da se radi o upravljačkom programu za internet, gdje svaki znak mora biti 8-bitni, stvaranje niza znakova je prihvatljivo. Ako se koristi 9-ili 10-bitni način, tada bi svaki element trebao biti "uint16_t". Spremnik se izračunava tako da se izbjegne gubitak podataka.

Često moduli čekanja sadrže statističke podatke koji omogućuju praćenje maksimalne upotrebe. U funkciji inicijalizacije "nine_name" međuspremnik se mora inicijalizirati pozivanjem "nine_name_name" i prosljeđivanjem strukture atributa sa svakim članom kojem su dodijeljene vrijednosti o kojima se raspravlja. Ako se uspješno inicijalizira, modul AMAPINE izlazi iz resetiranja, prekid prijema je dopušten u amapine2.

VOZAČICA32

Druga značajka koju treba promijeniti je "uart_getchar". Čitanje primljenog znaka s perifernog uređaja UMP-a zamjenjuje se čitanjem iz reda čekanja. Ako je red prazan, funkcija bi trebala vratiti -1. Dalje, morate implementirati iPhone da biste dobili iPhone. Otvorite datoteku zaglavlja "msp430g2553.h", pomaknite se prema dolje do odjeljka vektora prekida, gdje pronalaze vektor pod nazivom INA0 ina. Imenovanje podrazumijeva da je to ono koje koriste moduli ACEP 0 i ACEP 0. Status prekida prijema AMAIN0 može se pročitati iz Amain2. Ako je postavljena, zastavicu treba izbrisati, a podatke u pretincu za primanje staviti u međuspremnik pomoću "ine_ ine_ ine".

Repozitorij podataka

Ovo spremište daje informacije o tome kako čitati podatke s interneta pomoću interneta kada je broj bajtova za primanje unaprijed nepoznat. U obitelji mikrokontrolera, prstenasti međuspremnik AIMINI32 može raditi u različitim načinima rada:

  1. Način anketiranja (bez interneta, bez interneta) - Aplikacija mora anketirati statusne bitove kako bi provjerila je li prihvaćen novi znak i pročitala ga dovoljno brzo da dobije sve bajtove. Vrlo jednostavna implementacija, ali nitko je ne koristi u stvarnom životu. Protiv - lako je propustiti primljene znakove u paketima podataka, radi samo za male brzine prijenosa.
  2. Prekidni način rada (nije dostupan u vezi s oceanom) - međuspremnik u obliku prstena pokreće prekid, a CPU prelazi u uslužni program za obradu prijema podataka. Najčešći pristup u svim aplikacijama danas, dobro funkcionira u rasponu srednjih brzina. Protiv - postupak obrade prekida izvodi se za svaki primljeni znak, može zaustaviti druge zadatke u mikrokontrolerima visokih performansi s velikim brojem prekida i istovremeno operativni sustav kada primi paket podataka.
  3. Način rada za prijenos podataka iz registra za prijenos podataka u korisničku memoriju na hardverskoj razini. U ovom trenutku interakcija s aplikacijom nije potrebna, osim potrebe za obradom podataka koje aplikacija prima. Može vrlo lako raditi s operativni sustavi. Optimizirano za velike brzine prijenosa podataka > 1 aplikacije s malim napajanjem, u slučaju velikih paketa podataka, povećanje veličine međuspremnika može poboljšati funkcionalnost.

Implementacija u NASA-i

Me uspremnik s prstenom odnosi se i na dizajn ploča i na programsko okruženje koje se koristi za rad. Jezgra Ama je mikrokontroler serije Ama. Većina posla obavlja se na mnogo načina, a na mnogo načina ina ploča oko Ina predstavlja funkcionalnost-igle koje se lako povezuju, ina-serijsko sučelje za programiranje i komunikaciju.

Mnoge uobičajene ploče za internet trenutno koriste prstenasti Međuspremnik za 328, a starije ploče za internet 168 i ainpa8. Ploče poput iPhone odabiru složenije opcije poput 1280 i slično. Što su brži i brži, to bolje koristite i bolje. Postoji desetak različitih ploča s imenima. Mogu imati različite količine flash memorije, RAM-A I I / O priključaka s prstenastim međuspremnikom.

Prstenasti međuspremnik

Koristi se varijabla" internet" za pohranu trenutnog položaja, a kada se doda u međuspremnik, pojavit će se ograničenje niza.

ograničenja niza

Ovo su rezultati izvršavanja koda. Brojevi se pohranjuju u međuspremnik i kad se popune, počinju se prepisivati. Na taj se način mogu dobiti najnoviji brojevi.

Najnoviji brojevi

Prethodni primjer koristio je indeks za pristup trenutnom položaju međuspremnika jer je dovoljan da objasni operaciju. Ali općenito, normalno je da se koristi pokazivač. Ovo je modificirani kod za upotrebu pokazivača umjesto indeksa. U osnovi, operacija je ista kao i prethodna, a dobiveni rezultati su slični.

Operacije visokih performansi

Operacije visokih performansi

Iphine je biblioteka visokih performansi za prijenos poruka između niti, koju je prije nekoliko godina razvila i otvorila tvrtka iphine. Oni su izgradili ovaj softver za rukovanje ogromnim prometom (više od 6 milijuna IAS) u svojoj maloprodajnoj financijskoj trgovinskoj platformi. 2010. godine iznenadili su sve koliko brzo njihov sustav može biti radeći svu poslovnu logiku u jednoj niti. Iako je jedna nit bila važan koncept u njihovom rješenju, a Internet radi u okruženju s više niti i temelji se na međuspremniku prstena-niti u kojoj zastarjeli podaci više nisu potrebni jer dolaze noviji i relevantniji.

U tom će slučaju raditi ili vraćanje lažne logičke vrijednosti ili zaključavanje. Ako nijedno od ovih rješenja ne zadovoljava korisnike, moguće je implementirati međuspremnik koji mijenja veličinu, ali samo kad se napuni, a ne samo kad proizvođač dosegne kraj niza. Promjena veličine zahtijevala bi premještanje svih elemenata u novo dodijeljeni veći niz ako se koristi kao osnovna struktura podataka, što je naravno skupa operacija. Ima ih mnogo druge stvari zbog kojih se čini da su oceani brzi, poput skupne potrošnje poruka.

Međuspremnik prstena "qtserialport" (serijski port) nasljeđuje se od interneta, može se koristiti za dobivanje različitih serijskih informacija i uključuje sve dostupne serijske uređaje. Serijski port je uvijek otvoren u ekskluzivnom pristupu, što znači da drugi procesi ili niti ne mogu pristupiti otvorenom serijskom priključku.

Prstenasti međuspremnici vrlo su korisni u programiranju na "Si", na primjer, može se procijeniti protok bajtova koji dolaze preko oceana.

Članci o toj temi