 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 04 10, 06:11. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » Žiedinio buferio panaudojimas:
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
 |
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 15:32 |
|
|
|
Darant kontrolerius nėra greitesnio budo, kaip hiperterminalo panaudojimas.
Kadangi per Uartą perdavimas lėtas palyginus su kontoleriio darbu, dažniausiai sėdi funkcijoje, kol siunčia dešrą. Šiam reikalui siūlau naudoti žiedinį buferį. Sugalvotą berods IBM klaviatūrai.
Privalumai: Nebereikia sėdėti funkcijoje, nebereikia sekti pabaigos simbolio arba ilgio, buferio ilgis gali dvigubai -1 trumpesnis būti nei ilgiausia dešra.
Algoritmas nesudėtingas, turi du indeksus pradžios ir pabaigos. Kai įrašinėji keiti pabaigos indeksą ir paleidi pertraukimus, kai Uart siunčia keičia pradžios simbolį, kai sutampa uždraudžia pertraukimus ir viskas. Įdėsiu ARMo kodą.
Kodas: |
#define kiek_max 256
unsigned char buferio_pabaiga =0;
unsigned char buferio_pradzia =0;
unsigned char Tx_buferis[kiek_max];
void USART2_IRQHandler(void) // čia paimtas gabalas
{
if( USART_GetITStatus(USART2, USART_IT_TXE) == SET)
{
if (buferio_pradzia != buferio_pabaiga)
{
USART2 -> DR = Tx_buferis[buferio_pradzia];
buferio_pradzia++;
}
else
{
USART2 -> CR1 &= 0xFFFFFF7F; // draudžiu pertraukimus
}
}
}
void Uzkrauti_ziedini_buferi1(char *s, unsigned char kiek)
{
unsigned char i, b;
b= buferio_pabaiga; // lokalus kintamasis, kad nebalamutint siuntimo
for (i = 0; i < kiek; i++)
{
b++;
Tx_buferis[b] = *s;
s++;
}
buferio_pabaiga =b;
USART2 -> CR1 |= 0x00000080; // leidžiu pertraukimus
}
|
Gal skliaustu kiekis sutampa neskaičiavau, kofiguracijos nedėjau.
Trukumas: pirmas užkrovimas praleidžia 0 elementą, nenorėjau galvos sukti. Panaudoti kintamieji unsigned char tai baitas, jei incrementuosi 0xFF gausi 0. Funkcijai reikia nurodyti simboliu kiekį. Va tiek galit naudoti, gal palengvins gyvenimą.
Pvz:
Kodas: |
Uzkrauti_ziedini_buferi1(" | 1 Labas |\r\n", 38);
|
Kadangi terminalas bedrauja AScii kodu tai vesit skaičiu, pirmiausi reikia pasiversti į Ascii sibolius.....
[/code] |
|
|
|
|
 |
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 16:52 |
|
|
|
1) pakeitus kiek_max reiksme kitokia nei 256 - algoritmas dirbs neteisingai;
2) jei b++ darytum po duomenu irasymo, o ne pries, tai ir pirma kart viskas butu ok;
3) jei i buferi is eiles paduotum "desru", kuriu ilgis virsytu laisva vieta, tai ir vel nieko gero;
4) jei uzpildant buferi perduotum ilgi sveikai besidalinanti is 256 (arba 0), tai ir vel gautum efektus. |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 17:09 |
|
|
|
kiek_max taip ir sugalvotas buvo, jei keisi dydį data tikrinimo algoritmo reiks.
Jei siunti kelias dešras, neužmiršk, kad siuntimas vyksta ir atsilaisvina vieta, taip užpildyti nesunku....
Tas pirmas kartas tai po reseto, po to kaip iš pypkės eina...
O aplamai tai principas ir tobulumui ribų nėra....
b++ prieš todėl, kad pabaiga ir pradžia sutampa reikia indeksą padydint...
Malonu greit gaudaisi....  |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 17:20 |
|
|
|
koks tikslas naudoti ziedini buferi?
ar ne poaprasciaus tiesiog paprastas buferis nes betkokiu atveju komanda reikia priimti visa pries vykdant.
tai tokiu atveju tiesiog rasom viska i buferi o gavus \n simboli perduodam visa buferi vykdymui o ivykdzius trinam viska lauk ir laukiam naujos komandos. |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 17:24 |
|
|
|
O jei komanda viena, o išsiųsti daug, analogas kodas, kad spjaudytų laukan....
Fainas daiktas, panaudokit patiks....  |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 18:05 |
|
|
|
Siūlyčiau rašant protingus patarimus pamiršti tokius tik tau vienam suprantamus žodžius kaip <dešra> ir panašiai. |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 18:10 |
|
|
|
Na jau nuo senų laikų "dešra" vadindavom visa tai kas išeidavo per com_portą. Pastaba teisinga priimu.  |
|
|
|
|
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 21:34 |
|
|
|
gali rasyti ir taip:
#define max_kiek 0x20 // let buffer size to 2^n
USART2 -> DR = Tx_buferis[buferio_pradzia];
buferio_pradzia = ++buferio_pradzia & (max_kiek-1);
do {
int laisva = buferio_pabaiga > buferio_pradzia;
if(laisva < 0) laisva = max_kiek-laisva;
} while(laisva < kiek);
Tx_buferis[b++] = *s++;
b &= (max_kiek-1); |
|
Paskutinį kartą redagavo AlgisL, 2016 12 02, 21:49. Redaguota 1 kartą |
|
|
|
 |
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 21:49 |
|
|
|
Ties & skliaustų gal reikia, pas mane dvi funkcijos viena pertraukimų kita užkraut. Su = ++ pasiusi du tuos pačius simbolius pabaigoje ir pradžioje...
Mandrai labai, už loginės sandaugos idėją dėkavoju...
Išeidamas iš užkrovimo paleidi pertraukimus pagal požymį siuntimo registras tuščias ir pradeda siusti. Gali vėl porciją duomenų užkrauti siuntimas vyksta kol pradžia nepasiveja pabaigos. Kai pasivijo sustoja ir laukia, kol vėl porciją duomenų užkrausi, toliau jokio laukimo. Sustoja kai pradžia pasivijo pabaigą, bet tas baitas jau būna išsiųstas, rašo į sekančią ląstelę. |
|
Paskutinį kartą redagavo krienas, 2016 12 02, 22:06. Redaguota 1 kartą |
|
|
|
 |
 |
Žiedinio buferio panaudojimas: |
Parašytas: 2016 12 02, 21:54 |
|
|
|
++kintamasis juk yra preinkrementas
kintamasis++ atatinkamai postinkrementas
buf[idx++] = *s++; cia vieno baito (nes tipas unsigned char) perkelimas su automatiniu postinkrementu, o kad butu perkeliama is karto po kelis baitus, tai buferio tipas turi buti atatinkamai 16 ar daugiau bitu! |
|
|
|
|
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
LEGO
Mänguköök,
mudelautod,
nukuvanker |
 |
KCD2 Mods
Installing KCD 2 Mods,
KCD 2 Guides,
KCD 2 Cheats |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
GTA 6 Wiki
GTA 6 Map,
GTA 6 Characters,
GTA 6 News |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|

|
 |