 |

|
|
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 12 24, 01:33. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » Kokį kompiliatorių naudojate ?
|
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
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 26, 17:53 |
|
|
|
|
Be abejo, kai programos eigoje reikia keisti parametrus, toks užrašymas
UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);
yra akivaizdesnis. Jį ir aš dabar stengiuosi naudot.
Bet daugelio registrų reikšmių keisti netenka, kitiems vistiek reikia surašyti pradines reikšmes. Čia ir pasitarnauja tas "blogasis" codevision kodo generatorius. Jo lange paprasčiausiai sužymi varneles ar pasirenki iš galimų variantų. Tai dar aiškiau, ir datasheet esmė prieš nosį.
Be to, jei neklystu UCSR0B = 0x18 sukompiliavus flash'e užims mažiau vietos nei pirmasis užrašymas. |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 26, 18:13 |
|
|
|
|
| degama rašo: |
| Be to, jei neklystu UCSR0B = 0x18 sukompiliavus flash'e užims mažiau vietos nei pirmasis užrašymas. |
Flashe vietos betkuriuo metodu parasius jis uzims lygiai 0. Ar zinai kodel?
EDIT:
reiktu man patikslint. Jei ziurim i tai, kaip programa yra store'inama flashe, tada betkokiu atveju (kad ir kaip tu ta priskyrima parashysi), po transliatoriaus viskas vistiek verciama i ASM ir uzims lygiai tiek pat.
Jei kalbam apie uzimama vieta programos veikimo metu, tai registrai yra atskirai nuo flasho ir tokiu atveju ta priskirta reiksme flashe nieko neuzima. |
|
Paskutinį kartą redagavo Socrates, 2011 06 26, 20:38. Redaguota 1 kartą |
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 26, 22:22 |
|
|
|
|
besigincydami kas geriau pamirsote _VB(), kas kiek sumazina bardaka, bet cia vienbitems reiksmems, o kai nustatomos keliu bitu reiksmes tai keiksmazodis tas (1<<xyz)
nezinau kodel uCU c kalboje neaudojamos tokios union konstrukciojs kaip b: x[,y]
tada reikiama reiksme nurodoma tiesiog .b=x ??? |
|
|
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 26, 22:37 |
|
|
|
|
| AlgisL rašo: |
besigincydami kas geriau pamirsote _VB(), kas kiek sumazina bardaka, bet cia vienbitems reiksmems, o kai nustatomos keliu bitu reiksmes tai keiksmazodis tas (1<<xyz)
nezinau kodel uCU c kalboje neaudojamos tokios union konstrukciojs kaip b: x[,y]
tada reikiama reiksme nurodoma tiesiog .b=x ??? |
briedas kazkoks tokios macro ir isvis jas reiktu panaikint.
O del antro teiginio, tai siulau pasidometi strukturomis. |
|
|
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 26, 22:49 |
|
|
|
|
| as kaip tik apie ta pati, tik klausiu kodel ju niekas nenaudoja, o naudoja iskrypeliskas mazochistines nesamones? |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 01:19 |
|
|
|
|
WinAVR ir kiti AVR GCC toolsai naudoja AVRLibc paketą, kur visi registrai yra nurodomi kaip paprasti C kintamieji naudojant makro komandas
PVZ:
| Kodas: |
| #define DDRD (*(volatile uint8_t *)(0x2A)) |
Tad automatiškai reikėtų perkonfigūruoti AVRLIBC į kitokią strukūrą, kur būtų naudojami union su bit packed struktūromis. Kaip suprantu union su packed bit field struktūromis negali būti pririšami prie hardwaro dėl to kad nukenčia programos portabilumas. Kitas svarus argumentas, naudojant shift (<<) operatorių galima manipuliuoti iš karto keletu bitų registre. Naudojant packet bit struktūras galima manipuliuoti tik vienu bitu vienu metu.
Įdomumo dėlei sumečiau programėlę kur naudoja packed bitfield struktūrą kreipimuisi i registro bitus:
| Kodas: |
#include <avr/io.h>
//union struktura DDRD registrui
typedef union DDRD_u {
//visas baitas
uint8_t u8byte;
//bit-field struktura
struct {
uint8_t B0 :1;
uint8_t B1 :1;
uint8_t B2 :1;
uint8_t B3 :1;
uint8_t B4 :1;
uint8_t B5 :1;
uint8_t B6 :1;
uint8_t B7 :1;
};
} DDRD_u;
//io address + offset = memory address
#define DDRDu (*(volatile DDRD_u *) (0x0A+0x20))
//Iprasta bitu nustatymo forma
void InitPortShift(void)
{
//Pinai PB0,PB1,PB2, PB3 - output (shift)
DDRD|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
}
void InitPortPacket(void)
{
//Pinai PB0,PB1,PB2,PB3 - output (bitfield)
DDRDu.B0=1;
DDRDu.B1=1;
DDRDu.B2=1;
DDRDu.B3=1;
}
int main(void)
{
InitPortShift();
InitPortPacket();
while(1)
{
//loop
}
} |
Žiūrim i .lss failą:
funkcija
| Kodas: |
void InitPortShift(void)
{
//Pinai PB0,PB1,PB2, PB3 - output (shift)
DDRD|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
} |
kompilioujasi i:
| Kodas: |
in r24, 0x0a
ori r24, 0x0F
out 0x0a, r24 |
t.y. nuskaito porto reikšmę, OR su nustatymo reikšme ir vėl įrašoma į registrą. Visi bitai preprocesoriaus yra automatiškai sudedami į vieną kintamąjį.
Sekanti funkcija:
| Kodas: |
void InitPortPacket(void)
{
//Pinai PB0,PB1,PB2,PB3 - output (bitfield)
DDRDu.B0=1;
DDRDu.B1=1;
DDRDu.B2=1;
DDRDu.B3=1;
} |
kompiliuojasi į:
| Kodas: |
sbi 0x0a, 0
sbi 0x0a, 1
sbi 0x0a, 2
sbi 0x0a, 3 |
čia matome, jog kiekvienam bitui nustatyti ir naudojama atskira ASM komanda.
Taigi norint nustaty registro bitų reikšmes naudojant poslinkio metodą norint išsaugoti nenaudojamus bitus (OR operacija) reikia 3 ASM komandų arba trijų MCU taktų.
Naudojant packed bit field struktūrą kievieno bito nustatymui turime rašyti atskirą eilutę. kiekviena eilutė - po vieną papildomą SBI ASM komandą.
Bet kaip minėjau standartiškai AVRLIBC nėra pritaikytas supakuotų bitų struktūroms - tad norint jas naudoti tenka apsirašyti jas patiems.
GCC yra optimizuota bitų nustatymui naudojant postūmį (<<), nematau problemos naudoti ją - nebent tikrai kai kam atrodo tai mazohizmas.
Kadangi iškyla kodo portabilumo klausimai, yra nerekomenduojama naudoti bitfield truktūrų pririšimui prie hardware. Visai kita kalba taupant atmintį naudoti jas saugant įvairias flag reikšmes ir pan.
P.S. beje Algi - įdomią temą užkabinai Panaršęs, pabandžiau sudėlioti viską į savo vietas. Tikiuosi nepersistengiau ir nenuvažiavau į lankas. |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 07:27 |
|
|
|
|
kaip cia pasakius, tuo atveju, kai dalis porto yra output, dalis input, o kita dalis Z, tada sbi ir cbi yra geresnis sprendimas viena bita majacint nei in/logine operacija/out, juolab tarp in ir out gali ivykti nevienas interrupt, kuris bandys pakeist to paties porto bitus  |
|
|
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 17:44 |
|
|
|
|
| AlgisL rašo: |
kaip cia pasakius, tuo atveju, kai dalis porto yra output, dalis input, o kita dalis Z, tada sbi ir cbi yra geresnis sprendimas viena bita majacint nei in/logine operacija/out, juolab tarp in ir out gali ivykti nevienas interrupt, kuris bandys pakeist to paties porto bitus  |
O kaip AVR'e Z busena isstatoma?  |
|
|
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 21:15 |
|
|
|
|
| AlgisL rašo: |
| DDRx nustacius reikiama bita i "1" |
DDRx nustacius i 1 gausi prievada kaip OUTPUT ir ten niekaip nepadarysi Z busenos. Is esmes Z busena teisingiausiai butu input with weak pull-up, tokiu atveju isivaizduoju turetu but DDRx=0, PORTx=1. |
|
|
|
|
|
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 22:39 |
|
|
|
|
Z busena gaunama irasius I PORT ir DDR nulius jei PORT bus vienetas kai DDR 0 tai tada turesim pullup.
beje del namipuliavimo bitais reikia nepamirsti kad asamblerio SBI/CBI komanda naudoja 2 ciklus kai PORT komanda naudoja viena cikla.
tai jei svarbu greitis geriau atskiru bitu neadresuoti. |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 27, 23:36 |
|
|
|
|
su AVR tik pradedu, gal susimaisiau del DDRx reiksmes (specialiai pazejau datasytan, tikrai 1 out), o sbi/cbi ir turi du ciklus sunaudot, nes realiai skaito DDRx i ALU, keicia bita ir tik tada iraso atgal. kiek kitaip yra su AVR32 branduoliu, kiek paskaitinejau, ten galima adresuoti ir tik bitus.
PORT komandu rinkinys pakeisti reikiama reiksme uzima ne 1 takta, o visus tris, nes pradzioj nuskaitoma porto reiksme registran, veliau atliekama manipuliacija ir tik veliau irasoma i porta. taigis sbi/cbi vistiek laimi 1 cikla ir kas svarbiausia - nepertraukiama interrupto, kai kitokios manipuliacijos neteisingai programuojant labai netgi gali sukelti kolizijas.
del viso kito ginco, tai priklauso nuo kompiliatoriaus optimizacijos ir jei kompiliatorius nera bukas, tai esant ijungtai optimizacijai sugebetu viska suvesti ir i ta pati pavojinga in/manipulate/out arba sbi/cbi, priklausomai kas greiciau, trumpiau ir t.t. |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 28, 02:21 |
|
|
|
|
sakykim mes norim sigeneruoti koki nors impulsa, tai
jei naudosin SBI/CBI
eikes 4 taktu
bet jei naudosim PORT komanda tai nes galim pirma isirasyti norimus varisntus i registrus.
sakykim
a=PINA;
b=A | 1;
while{
PORTA=a;
PORTA=b;
}
veiks beveik dvigubiai greiciau |
|
|
|
|
|
 |
 |
Kokį kompiliatorių naudojate ? |
Parašytas: 2011 06 28, 07:16 |
|
|
|
|
cia irgi logiska, bet jei reiktu reaguoti pertraukime ir reiktu kuo maziau veluoti, tai velgi laimi sbi/cbi. nuo situacijos tai priklauso ir kaip optimizuoja kompiliatorius.
taip jau nusistovejo, kad mikrovaldikliu softe bitus skaiciuoja pagal poslinkiu skaiciu norimai maskei gauti, o ne kaip visam normaliam pasaulyje iskarto gatava maske.
jei seniau bit7=0b10000000, tai dabar bit7=7, nors jei atliktum a!=bit7 be << tai gautum visai kitoki rezultata, bet taip jau nutare tie, kurie rase pradines bibliotekas mikrovaldikliams ir viskas. aisku galima apsirasyt savaip ir gaut elegantiskesni koda, bet jau tie autoriai nemokejo ar tingejo isnaudoti ENUM operatoriu visais imanomais budais. |
|
|
|
|
|
|
 |
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 |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Must have farming mods
Farming simulator modhub,
Best farming simulator mods |
|

|
 |