Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MC9S08, arhitektura, performanse, programiranje i razvojni alati

[es] :: Elektronika :: Mikrokontroleri :: MC9S08, arhitektura, performanse, programiranje i razvojni alati

Strane: 1 2 3

[ Pregleda: 11146 | Odgovora: 46 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon MC9S08, arhitektura, performanse, programiranje i razvojni alati14.12.2006. u 23:18 - pre 211 meseci
Prisustvujem raspravi dva studenta elektronike o tome koji je bolji mikrokontroler. Rasprava neme ni kraja ni rezultata, dok se u jednom trenutku ne pojavi, u prolazu, jedan asistent, te oni zatražiše od njega da presudi, onako stručno. On im reče: Raspravljate se bez svrhe, mlađi koriste PIC, nesto stariji 8051 a još stariji Motorolu. To im reče i ode.

I stvarno, počeo sam sa 8051 uz veliko razočaranje, jer sam pre toga koristio mikroprocesor Z80. Bilo je kao da sam se vratio deceniju nazad, mali RAM, nikakvi adresni modovi, užasan skup instrukcija, direktno nedostupan ceo adresni prostor i mnogo drugih mičnih stvari. Za sledeći projekat sam ozbiljno prelistao arhitekture, setove instrukcija, adresne modove svih, pre 10 god. raspoloživih mikrokontrolera, i odlučio sam se za motoroline mikrokontrolere jer imaju 'normalnu' arhitekturu, ubedljivo najmanje troše programsku memoriju, imaju najbolju tajmersku jedinicu, a po ostalim performansama su slićni ostalim mikrokontrolerima.

Sada koristim familiju MC908 i MC9S08 za koju sam napravio sopstveni razvojni alat za programiranje na asembleru. Asemblerski jezik koji sam definisao može se opisati sa: Zamislite PASCAL (sa deklaracijama tipova: array, record, set i t. d. i sa repeat, while if..then..else i case..of strukturama, kao i sa procedurama, funkcijama i makroima) u kojem se umesto PASCAL iskaza koriste asemblerski iskazi (naredbe). Naravno, uz to je integrisan simulator, dibager i programator mikrokontrolera.

Moja analiza pokazuje da se najviše vremena troši na razvoj softvera nekog projekta. Cilj mi je da se to vreme skrati, i odlučio sam se da pokrenem projekat PASCAL kompajlera za ovu familiju mikrokontrolera. Kako je Wirth-ova definicija PASCALA (ISO7185) nedovoljna za to, opredelio sam se za dopune koje se već nalaze u DELPHI-ju.

Kako ni to nije dovoljno odlučio sam da čijem mišljnja ljudi koji se stalno bave programiranjem. Nije dovoljno samo moje iskustvo, vrlo su inspirativna iskustva drugih. Kada sam razvijao asemblerski kompajler, konsultovao sam svoje kolege. Sada je moguće razviti široku diskusiju o tome kakav treba da bude dobar razvojni sistem za mikrokontrolere (prepravka kompajlera za druge tipove mikrokontrolera je manji deo posla ako se generisanje mašinskog koda odvoji u posebne module). Verujem da Vam je dosadilo izmišljanje imena labelama kada programirate u asembleru, a ne mogu da zamislim da se u 21 veku programira na C-u koji zbog kompatibilnosti koristi linkere razvijene polovinom prošlog veka.

Ima li kolega koji koriste Motorolu, neka se jave.

Ima li zainteresovanih da definišemo razviojni alat za mikrokontrolere. Postojeće razvojne alate nisu pravili oni koji se svakodnevno sreću sa problemima u programiranju mikrokontrolera, što ne znači da se nisu trudili da nam olakšaju posao. Ipak sami programeri mogu najbolje da definišu kakav bi za njih bio idealan alat za razvoj softvera.

Pozdrav svima.

 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati22.12.2006. u 23:17 - pre 211 meseci
Svaka čast kolega,
koliko sam ukapirao ti već imaš gotov kompajler.
Ajd kaži u čemu si pisao, da li si koristio neke
generatore za skener i parser pa malo da razmrdamo temu.

 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati23.12.2006. u 06:42 - pre 211 meseci
Dragi i jedinstveni mradomir,

taman izgubih nadu da se na ovom forumu neko stvarno ozbiljno bavi programiranjem i
aplikacijama mikrokontrolera, kad sinoc videh tviju poruku. Zahvalan sam ti zbog toga,
ali dok ovo pisem spremam se na put do Beograda, ali sutra cu ti detaljnije odgovoriti.

Za editovanje izvornih tekstova kupio sam komponentu SynataxMemo sa odgovarajucim
parserom.

Evo, dok cekam kolegu sa kojim putujem u Bgd da ti napisem da sam prvu verziju napisao
pod DOS-om, jer sam programirao u asembleru i mrzeo sam da stalno izmisljam nazive
labelama, i da se uzasavam od pomiski da nesto kasnije (eventualno zbog gresaka) moram
da menjam tekst programa. Inace volim da kazem da se programiranje svodi na testiranje i
ispravljanje gresaka, jer uvek pocinjemo sa jasnom idejom, ali pravimo greske u njenoj implementaciji.

Kasnije sam napisao novu verziju za Windows, usavrsavao je i sada sam poceo da pisem
PASCAL kompajler. Naravno, kompajler pisem u DALPHI-ju.

Voleo bih da svoje iskustvo podelim sa nekim, i da cujem druge, ne samo zbog PASCAL kompajlera
vec i zbog usavrsavanja asemblerskog kompajlera.

Dok ovo budes citao, verovatno cu biti u putu, pa te molim da mi napises nesto o tvojim
iskustvima: koje mikrokontrolere koristis, koje razvojne alata koristis i sta ti u svemu tome
najvise smeta.

Srdacan pozdrav.

 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati24.12.2006. u 00:48 - pre 211 meseci
Odlično, što se tiče delphija našli smo se.
Imao sam i epizode sa javom, lazarusom
i još par jezika, sve kao nebili izbegao da
platim softver. Ali na kraju ti ipak dođe iz
dup... u glavu (valjda se tako kaže) i ja
odlučih da platim borlandu, kad izađe
Turbo Delphi, pa se sad češkam iza uva
i još malo razmišljam.

Hm, razvojni alati?
Pa 90% atmel i (nerado priznajem) baskom.
AVR studio za Tiny seriju, i kada je potrebna
brzina i preciznost.
Pic samo kad moram, u kombinaciji, naravno,
sa PicBasic-om.
Bilo je tu još raznih procesora od 8051, Z80...
Jedino mi je krivo što nikada nisam koristio
Motorolu, ali šta ćeš.

Simulacija i razni debageri, jtagovi i ostalo
nikad pa ni onda. Serijska komunikacija ili
LCD displej pa debaguj.

Od hardvera: sednem, smislim, nacrtam,
uradim ploču, sastavim, pa onda softver.
Nikakav razvojni sistem. Zvuči komplikovano
ali za neke prostije stvari ovaj proces
može da se završi za jedan dan.

O čemu smo ono pričali... a kompajleri.
Pa većina stvari se svodi na if then,
definisanje promenljivih, malo računanja,
i naravno SET ovaj bit, RESET onaj bit
(naravno malo karikiram). Nerviraju me
built in komande tipa CONFIG TIMER1 = PWM.
Ovo po pravilu neradi (a možda sam ja
glup pa ne razumem), tu se latim data
sheeta pa bit po bit, registar po registar.
Ooo... a biser u baskomu je kada sa komentarom
program neće da radi, obrišem komentar,
on proradi, ma daj... Ajde to debaguj.
Ali OK sve ima svoju cenu.

Dakle za dobar kompajler je potrebno:
200 grama margarina, uf ne taj papir.
A ha, stabilan skener, stabilan parser.
Pod stabilan mislim maksimalno istestiran,
i jasna struktura da može da se opiše
u par rečenica. Dobar primer je Wirth-ov
COCO/R.
Grafičko okruženje potpuno odvojeno od
kompajlera.
I još par stvari kojih u pola dva ujutru
ne mogu da se setim.

Počeo sam da pišem pascal kompajler
pre par godina (a ko nije?), stignem
do generacije mašinskog koda i...
tu stanem, pa ispočetka.
I tako par puta.
Zašto?
Zato što mi se nesviđa šta sam dobio.
Radi to, ali bih se ubrzo izgubio u šumi
izvornog koda.
Nema veze, imam vremena pa polako.
Sve više shvatam da se strpljenjem
dolazi do kvaliteta (ili ti što je brzo
to je i kuso - tako nešto). Naravno
ne treba preterivati sa strpljenjem.

Ima u našem okruženju dosta ljudi
koji se bave ovom tematikom, koji
su uradili dosta kvalitetne kompajlere
(ME tim i kolega Vladimir - OshonSoft).
Ali za sada da vidimo šta možemo mi
amateri da uradimo.
Zato dajte predloge, pitanja, sportsku
prognozu i sve što ima veze sa
konstrukcijom kompajlera.

Uf, al je ovo bilo dugačko.





 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati24.12.2006. u 15:17 - pre 211 meseci
Za mradomir,

Izabrao sam Motorolu, jer sam i ja pre toga radio sa mikroprocesorima, a 8051 i PIC
imaju CPU i instrukcije koje su daleko ispod onoga sto je imao, na primer Z80. To
cini programiranje na asembleru vrlo teskim, umesto da se koncetrisem na softverski
problem, ja mora da vodim racuna o stranicenju memorije (PIC) ili o tome da ako
su varijable u prostoru od 128 do 255 onda direktnim adresiranjem se obracam registrima,
a indirektnim varijablama u RAM-u. Za lokacije iznad 255 moram da se mucim sa pointerskim
registrom, uzas, ali me je dotuklo to sto ne mogu direktno da se obracam podacima na
steku.

Imao sam prilike da vidim statistiku iz 1998, po kojoj su mikrokontroleri MC68HC11 prodati
u kolicini od 600 miliona komada. Tu cifru, mislim, da do sada nije postigao ni jedan
mikrokontroler.

Logicno je da sam nastavi da radim sa MC908 familijom koja broji skoro 200 tipova i ima
podfamiliju 9S08 koja ima brzinu na bus-u od 20 MHz. U proseku jedna asemblerska instrukcija
je duzine 1.9 bajta a ima prosecno trajanje 3 ciklusa. Ovo sam merio na netrivijalnom
programu koji izracunava DES, TDES i MAC funkcije. Isti algoritam sam primenio i na
AT89C51R i dobio sam 49% duzi kod i 2 puta vise potrosenih bajtova RAM-a. Medjutim,
broj ciklusa kod AT89C51R je bio duplo manji. Kad se radi o brzini to znaci da bi AT89C51R
istom brzinom izvrsavao program ako bi imao brzinu na bus-u od 100ns, sto do sada nisam
nasao ni kod jednog tipa iz ove familije. Mozda kod nekog drugog proizvodjaca koji
frekvenciju oscilatora ne deli sa 12 vec sa 4.

Brzine svih mikrokontrolera su u najvecem broju slucajeva zadovoljavajuce, pa je meni
mnogo vazno koliko cu potrositi bajtova flash-a. Sampion u trosenju flash-a je AVR.

Vidim, da u praksi radis isto sto i ja, i meni je razvojana plocica ustvari prototip
uredjaja. To mi je olaksano jer svi motorolini kontroleri imaju monitor ROM sa potrebnim
funkcijama za loadovanje programa i dibagiranje. To narocito vazi za 9S08 podfamiliju
koja ima ugradjen BDC (background debug controller) koji u BDM (background debug mode)
moze da loaduje program, ili da cita i ili upisuje u memorijska lokacije, a da sve vreme
kontroler radi normalnom brzinom. To je ugradjeno u moj razvojni alat, i moguce je pratiti
vrednosti raznih varijabli u posebnom prozoru.

Iz prakticnih razloga, napravio sam CPU jezgro sa kontrolerom, RS232 drajverom, serijskim
EEPROM-m (za pamcenje vecih kolicina podataka) i satom realnog vremena, na cetvoroslojnoj
stampi (zbog otpornosti na elektromagnetne smetnje) dimanzija 54 x 45 mm sa dva 40-o pinsaka
konektora na koja su izvedeni svi signali. Tu plocicu koristim u svim uredjajima.

Jezgro je napravljeno za:
MC9S08GB60 (60kB flash-a, 4kB RAM-a, 56 I/O linija, 2 serijske
komunikacije, I2C, 8 tajmerskih kanala, 10-o bitni AD, napajanje od 1.8V do 3.6V,
kristal od 32KHz do 100KHz ili od 1MHz do 16MHz, interni oscilator tacnosti +/-0.5% tipicno
+/-2% za ceo temperaturno opseg -40C do +85C, FLL kolo za sintetizovanje taktne
frekvencije i t. d.) cena 6.439EUR i

MC9S08GB32 (32kB flash-a i 2KB RAM-a, ostalo je isto) cena 5.091EUR.

Koristim i MC9S08GT16 (16KB flash-a, 1KB RAM-a, ostalo isto) ali je kuciste manje
i koristim ga direktno na ploci prototipa. Cena 3.258EUR.

Pravio sam mnogo analiza, zakljucio sam da je kod svih proizvodjaca priblizno ista
cena kvadratnog milimetra silicijuma. Tako da kolko platis toliko dobijes tranzistora
na silicijumu. Opredelio sam se za Motorolu jer su ti tranzistori bolje rasporedjeni
nego kod drugih.

Toliko za upoznavanje sta i kako radimo, ako zelis mogu ti poslati na mail uputstvo
za ASM+ pisano za 68HC11, a MEGAASM, koji je za MC908, se neznatno razlikuje, ali ga
nemam u intgralnom obliku. Uputstvo ASM+ sam napravio jer sam prodavao taj razvojni
sistem i od toga ziveo 2 godine u vreme najvece krize kod nas.

Pozdrav.

 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati24.12.2006. u 16:31 - pre 211 meseci
E sada me Motorola definitivno zanima.
Salji uputstvo na mradomir(majmunsko a)gmail.com

Sto se tiče pic-a iste stvari i mene nerviraju,
banka ova banka ona, ne znam šta su time uštedeli.
Nisam probao seriju 18, mislim da je tu druga priča.
Atmel je to malo elegantnije odradio.

Skidam datasheet za motorolu pa ćemo pričati.

Tema malo odstupa od naslova ali nema veze,
radije bi da pričamo o kompajlerima nego da
mlatimo praznu slamu, ko je bolji Motorola, Microchip ili Atmel.

Ajde da pročitam uputstvo pa da nastavimo.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati24.12.2006. u 18:00 - pre 211 meseci
Poslao sam ti neke tekstove koje sam ranije pisao.

Drzacemo se teme, ovo je tek pocetak.

Pozdrav.
 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati24.12.2006. u 22:45 - pre 211 meseci
Ha, izgleda da čitamo i iste knjige.
Ispred sebe imam Pascal priručnik
(Kathleen Jensen, Niklaus Wirth)
koji je izgleda bio osnova za vaš
kompajler.
Zaista opsežno uputstvo, koje
pokriva dosta stvari o kojima sam
i sam razmišljao.

Zarad ostalih ljudi koje možda ovo
zanima da kažem da se kompajler zasniva
na EBNF (Extended Backus-Naur Form) koju
je za pascal definisao Niklaus Wirth.
Korak je formu proširio i prilagodio
je specifičnim potrebama programiranja
mikrokontrolera.
Evo i nešto konkretno što sam napisao
pre par godina, a u suštini je skraćena
verzija korak-ove sintakse:

Code:

Pascal = Program EOF .
Program = ZaglavljePrograma ";" Blok "." .
ZaglavljePrograma = "PROGRAM" ident .
(*------------------------------------------------------------------------------*)
Blok = 
DeklaracioniDeoLabela 
DeklaracioniDeoKonstanti 
DeklaracioniDeoTipova
DeklaracioniDeoPromenljivih
DeklaracioniDeoProceduraIFunkcija
IskazniDeo
.
(*------------------------------------------------------------------------------*)
DeklaracioniDeoLabela = [ "LABEL" Labela { "," Labela } ";" ].
Labela = ident | number .
(*------------------------------------------------------------------------------*)
DeklaracioniDeoKonstanti = [ "CONST" DefinicijaKonstante ";" { DefinicijaKonstante ";" } ] .
DefinicijaKonstante = ident "=" Konstanta .
Konstanta = [ Predznak ] (NeoznaceniBroj | IdentifikatorKonstante) | string .
Predznak = "+" | "-" .
NeoznaceniBroj = number | float | hexnumber .
IdentifikatorKonstante = ident .
(*------------------------------------------------------------------------------*)
DeklaracioniDeoTipova = [ "TYPE" DefinicijaTipa ";" { DefinicijaTipa ";" } ] .
DefinicijaTipa = ident "=" Tip .
Tip = "BOOLEAN" | "BYTE" | "WORD" | "INTEGER" | "SINGLE" | "ARRAY" | "STRING" | "CHAR" .
(*------------------------------------------------------------------------------*)
DeklaracioniDeoPromenljivih = [ "VAR" DeklaracijaPromenljivih ";" { DeklaracijaPromenljivih ";" } ] .
DeklaracijaPromenljivih= ListaIdentifikatora ":" Tip .
ListaIdentifikatora  = ident { "," ident } .
(*------------------------------------------------------------------------------*)
DeklaracioniDeoProceduraIFunkcija = { ( DeklaracijaProcedure | DeklaracijaFunkcije ) ";" } .
DeklaracijaProcedure = "PROCEDURE" ident [ListaFormalnihParametara] ";" Blok .
DeklaracijaFunkcije = "FUNCTION" ident [ListaFormalnihParametara] ":" Tip ";" Blok .
ListaFormalnihParametara = "(" OdeljakFormalnihParametara { ";" OdeljakFormalnihParametara } ")" .
OdeljakFormalnihParametara = SpecifikacijaVrednosnihParametara | SpecifikacijaPromenljivihParametara .
SpecifikacijaVrednosnihParametara = ListaIdentifikatora ":" Tip .
SpecifikacijaPromenljivihParametara = "VAR" ListaIdentifikatora ":" Tip .
(*------------------------------------------------------------------------------*)
IskazniDeo = SlozeniIskaz .
SlozeniIskaz = "BEGIN" SledIskaza "END" .
SledIskaza = Iskaz ";" { Iskaz ";" } .
Iskaz = [Labela ":"] ( ProstIskaz | StrukturiraniIskaz ) .
ProstIskaz = PrazniIskaz | IskazDodeleVrednosti | ProcedurniIskaz | IskazGoto .
StrukturiraniIskaz = SlozeniIskaz | UslovniIskaz | IskazPonavljanja .
(*------------------------------------------------------------------------------*)
PrazniIskaz = .
IskazDodeleVrednosti = Promenljiva ":=" Izraz .
Promenljiva = ident [ "[" (number | ident) "]" ] .
ProcedurniIskaz = ident [ ListaStvarnihParametara ] .
ListaStvarnihParametara = "(" StvarniParametar { "," StvarniParametar } ")" .
StvarniParametar = Promenljiva | Broj .
Broj = ( [ Predznak ] float ) | number .
IskazGoto = "GOTO" Labela .
(*------------------------------------------------------------------------------*)
UslovniIskaz = IskazIf | IskazCase .
IskazPonavljanja = IskazWhile | IskazRepeat | IskazFor .
IskazIf = "IF" LogickiIzraz "THEN" Iskaz [ "ELSE" Iskaz ] .
IskazCase = "CASE" ProstIzraz "OF" Slucaj ";" { Slucaj ";" } "END" .
IskazWhile = "WHILE" LogickiIzraz "DO" Iskaz .
IskazRepeat = "REPEAT" SledIskaza "UNTIL" LogickiIzraz .
IskazFor = "FOR" ident ":=" ProstIzraz ( "TO" | "DOWNTO" ) ProstIzraz "DO" Iskaz .
(*------------------------------------------------------------------------------*)
LogickiIzraz = Izraz .
Slucaj = Konstanta { "," Konstanta } ":" Iskaz .
(*------------------------------------------------------------------------------*)
Izraz = ProstIzraz [ RelacioniOperator ProstIzraz ] .
ProstIzraz = [ Predznak ] Sabirak { OperatorSabiranja Sabirak } .
Sabirak = Cinilac { OperatorMnozenja Cinilac } .
Cinilac = NeoznacenaKonstanta | Promenljiva | OznakaFunkcije | NeoznaceniBroj 
            | string | (ident [ ListaStvarnihParametara ]) | ( "NOT" Cinilac ) | ( "(" Izraz ")" ) .
RelacioniOperator = "=" | "<>" | "<" | "<=" | ">" | ">=" .
OperatorSabiranja = "+" | "-" | "OR" .
OperatorMnozenja = "*" | "/" | "DIV" | "MOD" | "AND" .
NeoznacenaKonstanta = NeoznaceniBroj | string | IdentifikatorKonstante .
OznakaFunkcije = ident [ ListaStvarnihParametara ] .
(*------------------------------------------------------------------------------*)
END Pascal .



Moram da napomenem da je ovo osiromašena
sintaksa pascala, ali je neka osnova za početak.

 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati25.12.2006. u 20:19 - pre 211 meseci
Za M. Radomira (predpostavljam)

Dakle, za sada smo vrlo kompadibilni.

Voleo bih da cujem tvoje utiske o MC9S08 familiji, onako uzgred dok pokusavamo da definisemo dobar razvojni alat.

Par puta sam bio kod Nese koji drzi Mikroelektroniki. Hteo je da mu za male pare napravim PASCAL kompajler, sa njegovim
svim pravima. Nije mi se svidjalo sto je trazio da je najvaznije da program treba da seva ekranima u svim bojama, bez obzira
koliko je kompajler dobar. Nisam prihvatio, ali vidom da nudi neke MikroPaskale koje sam probao i ne zasluzuju nikakvu paznju.
To je C (ali los) u odeci PASCAL-a.

Predlazem da prvo definisemo sta da izbacimo iz Virtove definicije paskala, a sta da ubacimo ili izmenimo da bi bio pogodan
za programiranje mikrokontrolera.

Mislim da nije potrebno sledece:

1. Varijantni zapisi, mada oni stede memoriju, ali mislim da ce to biti vrlo retka potreba (imam ih u MegaAsembleru,
ali ih nisam nikad koristio);
2. Pakovani tipovi;
3. Iskaz with;
4. Iskaz GoTo (iz pedagoskih razloga);
5. New i Dispose;
6. Definisanje fajlova kao tipa (mada nisam siguren, bolje je ako zakljucimo da ne treba);
7. Definicija procedure u proceduri, isto i za funkcije. Dakle bez gnezdjenja kao u C-u;
8. var formalni parametar bi zamenio formalnim parametrom koji je pointer, mnogo je
jednostavnije za implementaciju, a ne predstavlja izuzetak (ne unosi asimetriju u definiciji jezika).
9. Mehanizam za pravljenje ulancanih struktura podataka.

Razmorti ovo i kritikuj ako imas drukciji stav, takodje dodaj i ono sto mislis da nije potrebno a ja nisam naveo.
Razmisljaj sta treba dodati, jer je to sledece.

Pozdrav
 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati26.12.2006. u 02:15 - pre 211 meseci
Moji utisci o MC9S08.
Hm, pa set instrukcija me vratio u vreme
komodora (lda, sta :-). Naravno dosta je prosiren.
Nije mi jasna razlika izmedju HCS08 i HC08 serije.
Mislim da je HCS novija tehnologija, ali HC su
raznovrsniji sto se tice periferija (USB, RF, CAN...).
Mozda mozes da mi razjasnis to.
Ovaj Background debugging dosta mocna stvar.

Imam utisak da je mali izbor razvojnih alata,
ali zato i vodimo ovaj razgovor.

Odluka da zadrzis kompajler za sebe je ispravna.
I drugi su imali takve predloge, pa neko se upeca,
neko ne. Po onome uputstvu sto sam video ti imas
zaista upotrebljiv alat.
Kada je u pitanju sarenilo i boje to je sekundarno,
ali nije zanemarljivo. Naravno zna se prioritet,
stabilan kompajler pa tek onda sminka.

Nebojsin Pascal sam video ali samo povrsno,
tako da ne bih da komentarisem.

Da vidimo spisak za izbacivanje:

1. Variant, ni ovako ga nisam koristio, dakle...

2. Packed, hm, njegovom upotrebom bi se teoretski
smanjila potrosnja memorije, ali samo teoretski,
dakle leti napolje. Al mi ovo ide :)

3. with, ovo bih ostavio za raspravu kasnije.

4. Goto, znam da nije pedagoski, ali mislim da nije teska
implementacija, pa bih ga ja ostavio.

5. New i Dispose, zahtevaju pracenje memorijskih resursa
u toku izvrsavanja koda, sto opet povlaci za sobom
utrosak programske memorije... bla, bla, bla, leti napolje.

6. File, pa, ne znam sta da ti kazem. Bilo bi tesko jer, na primer,
AssignFile(myFile,'proba.txt') mora da se odradi u run time-u.
Mozda kada bi se u definiciji odredio naziv fajla:

var
myFile : File 'MMC:\proba.txt' of byte;

onda bi kompajler znao da kada naidje na: Write(myFile, 100)
generisace kod za upis u MMC, ili tako nesto. Sta mislis?

7. Procedure u proceduri, slazem se, out.

8...

Vec je tri sata AM i ne bih da lupam gluposti.
Nastavak sutra ujutru, ili bese danas...

 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati28.12.2006. u 19:57 - pre 211 meseci
Izvinjavam se za malo kašnjenje.

Da nastavim:

8.VAR formalni parametar, ako govorimo o deklaraciji procedure:

DeklaracijaProcedure = "PROCEDURE" ident [ListaFormalnihParametara] ";" Blok .

pa dalje imamo,

ListaFormalnihParametara = "(" OdeljakFormalnihParametara { ";" OdeljakFormalnihParametara } ")" .
OdeljakFormalnihParametara = SpecifikacijaVrednosnihParametara | SpecifikacijaPromenljivihParametara .
SpecifikacijaVrednosnihParametara = ListaIdentifikatora ":" Tip .
SpecifikacijaPromenljivihParametara = "VAR" ListaIdentifikatora ":" Tip .

logično mi je da se promenljive u "SpecifikacijaPromenljivihParametara"
prosledjuju preko steka kao pointer na promenljivu,
dok se promenljive u "SpecifikacijaVrednosnihParametara"
prenose po vrednosti, odnosno na steku im se dodeljuje
memorijski prostor, tako da bilo koja operacija nad
promenljivom ne menja izvornu promenljivu, jel.
Šta ti misliš?

9.Mehanizam za pravljenje ulančanih struktura podataka.
Ako misliš ono "pointer na sledeći", slažem se,
jer to zahteva dinamičke promenljive, što je sa
malo memorije, po meni, besmisleno.

Uf, da vidimo šta da dodamo.

1. Oduševilo me tvoje rešenje sa makroima u MegaAsembleru.
Zarad ostalih ljudi citiraću deo uputstva da znaju o
čemu pričamo:


Makroi predstavljaju snaznu podrsku svakom programskom jeziku,
a narocito asembleru. Na mestu navodjenja makroa, ne vrsi se
njegovo pozivanje, kao kada su procedure u pitanju, vec se vrsi
takvozvano ukljucivanje makroa. Ukljucivanje makroa podrazumeva
njegovo prevodjenje i insertovanje tako dobijenog koda, u kod programa.

Makro u MegaASM ima svoje formalne parametre koji se zamenjuju stvarnim
parametrima na mestu ukljucenja makroa. Formalni parametri makroa nisu
tipizirani, pa jedan makro moze da radi sa stvarnim parametrima razlicitih
tipova. Da bi se u makrou prepoznali parametri, MegaASM ima sledece funkcije:

- VarOf(Ime formalnog parametra) - vraca true ako je formalni parametar varijabla
- TypeOf(Ime varijable ili tipa) - vraca indentifikator tipa formalnog parametra
- DynamicOf(Ime varijable) - vraca true ako je varijabla dinamicka, odnosno kreirana na steku.
- SizeOf(Ime varijable ili tipa) - vraca duzinu formalnog parametra izrazenu brojem bajtova
- Exist(Ime formalnog parametra) - vraca true ako postoji odgovarajuci stvarni parametar.
Ovo obezbedjuje da se makro poziva sa razlicitim brojem stvarnih parametara.
- ErrorMSG(‘string poruke’) - ispisuje poruku na mestu rezervisanom za greske koje prijavljuje asembler
- _if..then..else nije funkcija, sluzi za uslovno kompajliranje programa (ne za uslovno izvrsenje)


Zašto mi je ovo zanimljivo?
Uvek sam se pitao kako bi moglo da se implementira recimo:

Code:
  
  var 
    a:byte;
  begin
    LCD 'Hello world';
    LCD a;
  end;


a da to ne bude ugrađena procedura u kompajler.
Ovo bi moglo da se postigne sa "overload" direktivom,
odnosno definisanjem više procedura sa istim imenom,
a različitim parametrima, ali može i da se uradi sa
makroima i uslovnim kompajliranjem.

E sad, makroi bi mogli da se implementiraju u pascal
u vidu procedura sa direktivom "inline".
Primer:

procedure MyProc(x:Integer); inline;

Direktiva inline govori kompajleru da ne generiše poziv procedure
već da je uvrsti direktno u kod.
Ovo je podržano u Delphiju sa nekim ograničenjima.
Takođe bih dodao "$" ispred gornjih funkcija, pa
bi dobili nešto kao:

{$IF Exist(i)}
... // ovo se izvršava
{$ELSE}
... // ovo se ne izvršava
{$IFEND}

Što već podseća na Delphi.


Već imamo dosta tema za priču, pa ne bih dalje da
proširujem.

U vezi tačke 8 mislim da bi bilo dobro da
definišemo šta se dešava kada se pozove
procedura ili funkcija, u zavisnosti od
tipa formalnih parametara. Šta ide na stek,
kojim redosledom, i tako to.



 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati29.12.2006. u 12:41 - pre 211 meseci
Poslao sam ti seme sa minimalnim objasnjenjem (jer vidim da si poznavalac ove materije)
da pokazem da na prototipskoj plocici moze da se razvija softver (sto je ogromna prednost)
sa minimalnim dodatnim hardverom. Sa ona tri opisana slucaja pokriveno je sve sto zahteva
cela familija MC908. Ostaje mi da napravim jednu interfejs kutijicu koja bi podrala sve
(i BDM) i time bi konacno resio generalno sve probleme. Ali to je prica za kasnije, sada
je najvaznije da definisemo jezik i njegovu sintaksu.



Sa 1 i 2 smo saglasni.

Stavka 3 WITH je dobra iz dva razloga:
1. krace pisanje, ali manje citjivo;
2. kada komajler naidje na WITH, on izracuna adresu varijable uz WITH, i za sva polja
koja propadaju varijabli uz With, samo dodaje ofset. Ako je Varijabla tipa record
nista se ne dobija jer staticki record ima staticke adrese plja i direktno ih uzima
kompajler. Ako je varijabla uz WITH array onda ionako se na nju mora dodati ofset
do odredjenog elementa niza. Sve u svemu malo komplikuje kompajler a rezultat je
isti.Neka ovo ostane za kasnije kada budemo govorili o implementsciji.

4. GOTO postoji, i Virt je uveo samo zbog toga sto postoji i u drugim jezicima. Ja nikada
isam upotrebio GOTO iako sam napisao vise stotina hiljada linija na DELPHI-ju. Nisam
je video ni kod drugih, osim kada je neko zeleo da pokaze kako ne treba programirati.
Doduse EXIT i BREAK rade sto i GOTO ali pod odredjenim uslovima. GOTO se ne bi moglo
koristiti proizvoljno i njegova upotreba bi bila ogranicena, GOTO ne sme da ostavi
neki visak na steku kada se upotrebi. Ali kako ie implementacija ovog iskaza jednostavna
ostavimo je na za kraj. (bilo bi interesantno da i drugi povodom ovog iskaza nesto
napisu).

5. i 7. Potpuno smo saglasni.

6. Nisam nacisto, ako se sa ASIGN odredila neka komunikacija, onda bi se fajl poslao
na nju. Ovo se moze resiti i drukcije bez tipa FILE OF, stvarni ne znam koliko
bi takav mehanizam bio efikasan i prihvatljiv od korisnika.

8. E ovde se desilo nesto cime je Virt povredio neke od pravila dobrog sefinisanog jezika.
Uniformnost i ortogonalnost su ugrozene kada se napisa:

procedure Pera(var Mika:word;laza:word);

Zasto vazi nesto posebno kada se varijabla ne prenosi po vrednosti, vec se referencira adresom.
Ionako se u zaglavlju procedure (funkcije) vrsi deklaracija formalnih parametra bez simbola
VAR koji je namenjen za deklaraciju varijabli. Moram da priznam da je ovo zbunjujuce,
i kada zelim da neku varijablu prenesem po adresi desi mi se da zaboravim na ono VAR.
Osim tofa u izrazima gde se koristi formalna varijabla deklarisana sa VAR ona se drukcije
kompajlira sto je izuzetak za kompajler. Doduse moguse je predhodno napisati i drukcije:

procedure Pera(Mika : tPointNaWord;laza:word);

predhodno je definisan tip tPointNaWord, a formalna varjabla Mika se koristi kao
Mika^. Ovo ne pravi izuzetak za kompajler a u formalnim parametrima se vidi eksplicitno
da se prenosi pointer na varijablu Mika. Osim toga procedur u kompajleru koja prevodi
deklaraciju varijabli direktno, bez izuzetaka, se moze primeniti i na prevod deklaracije
formalnih parametara.

Kada govorimo o prosledjivanju stvarnih parametara onda se oni stavljaju na stek (uz
proveru kompatibilnosti u dodeli), pa se potom poziva procedure (sa jsr), a iza nje
treba skinuti sa steka sve stvarne parametre. To je komplikovano ureaditi u pozvanoj
procedure, jer se iza stvarnih parametara nalazi adresa povreatka. Kada se radi o
pozivu funkcije, prvo se na steku odvoji mesto za vrednost koju vraca funkcija, pa se
tek onda stavljaju stvarni parametri. Iza poziva funkcije, skidaju se stvarni parametri,
a ako se vrednost funkcije dodeljuje varijabli skida se i ona, a ako je funkcija stvarni
parametar neke funkcije ili procedure, onda aona ostaje na steku.

U vezi sa vovim ja bih dopunio pravilo za tipove formalnih parametara. Naime tip formalnog
parametra moze biti samo ime tipa koji je predhodno definisan. Ja bih uveo nesto kao:

procedure Pera(Mika : ^word;laza:word);

gde ne bih smatrao ^word definiciju novog tipa vec kao definisan tip. Oznaka za pointer
je samo stvar tehnicke prirode.

Na ovaj nacin bi cela stvar bila jasnija i manje podlozna gresci, jer bi kompajler otkrio
gresku ako je varijabla definisana kao pointer, a u iskazima se koristi kao obicna
varijabla.

9. potpuno smo saglasni.

Sto se tice makroa, zapazio si da oni mogu da ukljucuju druge makroe i da pozivaju razlicite
procedure. Takodje si zapazio da makro moze da vraca vrednost ker ako se napise:

Laza := ImeMakroa(<stavrniparametri makroa>);

u makrou postoji varijabla result koja dobija osobine varijable Laza i sa njom se u makrou
moze manipulisati, a sve se odnosi na varijable LAZA. Na ovaj nacin napravio modul sa makorioma
gde sam napravo makroe za dodeljivanje i sva matematicke operacije. Dakle, makroi mogu
da podignu nivi asemblera i da omoguce neko zrnce onoga sto imaju objektno orijentisani
jezici.

Ispred _if nisam hteo da koristim $ jer ako se ime iza toga sastoji od hexa znakova parser
to moze vratiti token na hexa broj. Mislim da to nije ni mnogo vazno.

Ako nemamo vise nista za izbacivanje ili modifikovanje, onda treba da napravimo listu sta
se izbacuje a sta modifikuje. Posle toga sledi obimniji posao sta treba dodati i konacno
definisati sintaksu jezika.

Zaboravih: skup sam, kao sto si mozda primetio, skup elemenata ogradio vertikalnim crtama
ane kao sto je u PASKAL-u srednjim zagradama. To mi je bilo potrebno da bi se uocila
razlika u asembleru. Virt u scoje vreme nije imao standardizovanu tastaturu pa je ostao
pri onim znacima koji su sigurno postojali. Dve uspravne zagrade su ujedno operator 2 na.
To znaci:

|3| = 8 ili
|3,5| = 40 i slicno.

Miskim da je ovo zgodno narocito za asembler kada redni broj bita prevodis u masku.

Pozdrav.

PS

Neki prijatelji mi kazu sta ce ti PASKAL kada je MegaAsembler efikasan i lak za koriscenje.
Ipak Lakse se odrzava softver posan na PASKAL-u, pa ako se napravi i za druge
kontrolere, onda isti, vec razvijeni softver moze da se koristi i za njih.
 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati05.01.2007. u 01:34 - pre 210 meseci
Dakle 1 i 2 smo rešili.

3.WITH, slažem se sa konstatacijom. Samo sam hteo da ostavim
za kasnije jer bih da ubacim klase. Naravno bilo bi dosta
ograničenja i ne bi bilo klasično objektno programiranje
zbog nedostatka memorije, ali bih da postignemo recimo:

Timer1.Pwm.DutyCycle:=50;

Ako ti se sviđa ideja razradio bih je detaljnije.

4.GOTO, Kada sve završimo i neznamo više šta da radimo
ubacićemo i GOTO (što bi naš narod rekao - otom potom).

5. i 7. OK

6.Namera mi je bila da komunikaciju sa uređajima kao što
su MMC kartice, Hard Diskovi i ostali "masovni mediji"
svedem na par procedura (AssignFile, Write, CloseFile..).
Naravno da može i:

Procedure Write_Ide_Hard_Disk(b:byte);

Na računarima koji su stariji rođaci kontrolera nebitno
je da li upisujemo na flopy ili hard disk, to se reguliše
na nižem nivou.

Mada ovo i nije neophodno za početak, pa glasam za izbacivanje.

8.Hm... Slažem se potpuno. Ni meni nije jasno zašto je wirth
ubacio VAR u formalne parametre. U stvari opet sam pregledao
literaturu. Navodno on razlikuje dve vrste parametara:

- value parameter,
- reference parameter.


Ovaj drugi on naziva i "variable parameter" pa otuda ono VAR.
Probao sam i u Delphiju, prijavljuje grešku ako pokušam recimo:

procedure MojaProcedura(var a:byte);

pa pozovem:

MojaProcedura(100);

odnosno prihvata samo poziv procedure sa promenljivom u parametru:

MojaProcedura(x);

Zato se i zove "variable parameter".
Ti kada si napisao:

procedure Pera(Mika:^word;laza:word);

u stvari misliš na isto što i wirth kada napiše:

procedure Pera(VAR Mika:word;laza:word);

I u jednom i u drugom slučaju na steku se dodeljuje
memorija promenljivoj Mika koja je tipa pointer na word.
Razlika je samo u sintaksi.

Ovo VAR u parametrima nema isto značenje kao i VAR u deklaraciji promenljivih.
Wirth njime želi da kaže da kompajler u pozivu procedure prihvata samo
promenljivu, a ne konstantu ili funkciju.

Možda je i razlog zbog čega je to tako uradio smanjenje upotrebe
pointera u kodu, odnosno prebacio je brigu o njima na kompajler.

Tvoje rešenje je više logičnije, ali ja bih ipak glasao za VAR,
najviše zbog inercije u programiranju. Ako sam navikao na neki
standard (u ovom slučaju Delphi) mislim da psihološki teže
prihvatam stvari koje odstupaju od njega. Jeste da ćeš sebi
olakšati život, ali ćeš kod programera da pokreneš sumnju
zašto nisi uradio nešto "kao sav normalan svet" :=) iako je
tvoj način logičniji. U stvari to je možda i moj lajt motiv (ili tako nešto):
ugurati što više stvari u okvire standarda (Borlandovo proširenje Pascala).

Iz istog razloga sam predložio i ono $ ispred IF.
Inače stavljaju se i vitičaste zagrade pa mislim
da parser sa: {$IF Exist(i)} neće imati problema.

9.OK

10.Što se tiče vertikalnih zagrada, koliko sam razumeo
dolazi do kolizije sa relativnim adresiranjem u
asembleru i setovima podataka u paskalu (oba koriste [] ).
Pravo da ti kažem tražio sam par minuta znak |
dok su uglaste zagrade tu na dohvat ruke, pa kao
što reče Zdravko Čolić u onoj reklami "ne bi ja tu ništa menjo".
Vidim i da u HCS08 seriji uglaste zagrade ne postoje u asembleru,
ili grešim. Mislim da je bolja varijanta korigovati asembler da
koristi vertikalne zagrade (ako ima potrebe). Ipak mi pišemo
paskal, pa bi on trebao da ima prednost u odnosu na asembler.

Nije loše ovo sa rednim brojevima, ako si primetio ubacio sam
za broj 10 vertikalne zagrade. Mislim da kako pokrećemo
nove teme trebali bi da dodajemo brojeve, na taj način
ćemo zadržati fokus.

Dakle da dodam:

11.Makroi, šta misliš o mom predlogu za direktivu inline?

procedure MyProc(x:Integer); inline;

12.Prebacujem iz 3. klase, za with se slažem da je suvišan.
Dakle ako ti se sviđa:

Timer1.Pwm.DutyCycle:=50;

malo ću se pozabaviti time. Mislim da implementacija
ne bi trebalo da bude teška.

Da rezimiram:
rešili smo 1, 2, 3, 4, 5, 6, 7, 9.
ostaje 8, 10, 11, 12.

PS

Neka prijatelji samo usavršavaju asembler,
a mi ćemo da pređemo na pascal :-)


 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati05.01.2007. u 15:06 - pre 210 meseci
Dakle izbacujemo:

1. Varijantne zapise;
2. Pakovane tipove;
3. Iskaz with;
4. Iskaz GoTo (za sada);
5. New i Dispose;

6. Nije lose da se definise fajl na neku od raspolozivih komunikacija.
Upis u fajl bi bio slanje na komunikaciju. Citanje fajla bi bilo
citanje primljenih podataka. Svaki fajl bi imao dva bafera, jedan
za citanje jedan za slanje. Njima bi se pristupalo sa Read i Write.
Baferi bi bili kruzni sa dva pointera, jedan koriste Read i Write,
a drugi sam mehanizam slanja odnosno prijema podataka. Za fajlove bi
morali da imamo dve preddefinisane funkcije koje vracaju boolean
i to za pun bafer za slanje i prazan bafer za prijem. ReWrite cini
bafer za slanje praznim. Mehanizam za upravljanje diskovima i slicno
zahteva pisanje drajvera sto je komplikovano, za to treba omoguciti
korisniku da sam napise drajver, ako bas hoce. Za ovo sto predlazem
treba definisati sintaksu, pa ako je komplikovano treba odustati.
Mozda je bolje napraviti modul sa svim sto je potrebno za kontrolu
komunikacija.
7, Definicija procedura u proceduri (odnosi se i na funkcije)

8. Slazem se sa tvojom dilemom. Ja sam samo hteo da olaksam implementaciju.
Ako napisem:

procedure Mika(var Pera:word);

to koristim kao:

Pera := 100;

ili:

procedure Mika(Pera:^word);

to koristim kao:

Pera^ := 100;

u implementaciji se stvarno prevodi izraz: Pera^ := 100;. Ako ostane var
onda u prevodu izraza svaku formalnu varijablu moram da proveravam dali
je deklarisana sa var i da smatram da je iza nje simbol ^ iako nije. Osim
toga program za mikrokontrolere ce zahtevati i pointere koji su konstanta,
ali to moze da se resi formalnim parametrom koji je tipa pointer. Iako se
implementacija sastoji od bezbroj lakih stvari, na granici sam da prihvatim
da se zadrzi var. Evo sad sam presao granicu, zadrzacemo var.

9. Mehanizam za pravljenje ulancanih struktura podataka.

10. U PASCAL-u nema kolizije za upotrebu [] za skupove. To nije slucaj sa
asemblerom. Sintaksa koju koristim u MegaAsembleru se koristi kod 16-to i
32-o bitnih motorolinih kontrolera, ali i kod drugih. Lako se pravi greska,
a tesko otkriva kada zaboravis # ispred imena konstante. Mala je verovatnoca
da zaboravis obe zagrade. Osim toga zagrade me asociraju na memoriju kao
niz bajtova, a kod indeksnog adresiranja kao na niz bajtova na koji
ukazuje indeksni registar. S obzirom da moramo imati ASM..END strukturu,
a u asembleru nema izraza, mozemo uvesti operator 2 na kao sto sam opisao
jer ce on moci da se koristi u asembleru (i nema neku drugu svrhu), a u
PASCAL-u bi on bio samo operator koji vraca celobrojnu vrednost koja nije
tipa skup. Dakle, skup bi bio ogradjen sa []. Ja ovde poceh da pricam sta
da dodamo, valjda cu se setiti ovoga kada budemo tu temu razmatrali.

11. Dobri kompajleri kada utvrde da se neka procedura ili funkcija poziva
samo jednom i nikad vise onda oni insertuju kod procedure, bas kao sto
ti hoces da navedes eksplicitno. To je opet izuzetak u implementaciji
pri cemu nastaju neki problemi:

- dali treba da postoje formalni parametri, ako treba onda se nepotrebno
kopiraju stvarni u njih. Ako se ne kopiraju, onda procedura menja
stvarne parametre, sto ne bi smelo.

- ako se zeli da ovo bude zamena za macro onda ona to nije, jer takva
procedura mora da se ponasa isto bez obzira kako se poziva.

Ja to ne bih ubacio, nije cisto, cistije je da postoje makroi sa jasno
definisanim i predvidljivim osobinama.

12. Da, nije losa ideja, lepo izgleda i cini mi se da nije tesko za implementaciju.
Dovoljno je da record sadrzi polje koje je procedura ili funkcija i da se to
nazove klasom koja moze da se dodeli nekoj istanci (kao sto si naveo Timer1).
Obradi ovo malo detaljnije, kako ce sintaksno biti definisani metodi i svojstva,
mislim da ce tu nasledjivanje da funkcionise lako. Ali, narocito obrati paznju
na korisnost. Inkapsulaciju ionako obezbedjujemo unutar modula, ovo bi bilo
dodatno, dali je i potrebno??. Korisnost ce mi biti presudna. Ionako mislim
da je objektno programiranje prilicno trapavo. Ako budemo mogli da napravimo
klase za sve module koje poseduje jedan mikrokontroler, a da se one koriste
nezavisno od varijacija mikrokontrolera onda bi korisnost bila vrlo izgledna.
Ali sa druge strane modul vec ima neke karakteristike istance odredjene klase,
a njih ce mo sigurno imati. Stvarno je tesko izvagati. Bojim se da sebi ne
postavimo pretezak zadatak, a koliko vidim ni ti, kao i ja ne raspolazes sa
mnogo slobodnog vremena.

Ono sto si napisao

Timer1.Pwm.DutyCycle:=50;

moglo bi biti u modulu: Tajmeri koji bi u interface sekciji imao deklarisanu
varijablu Pwm tipa record sa poljem DutyCycle. Za sve tipove tajmera i
mikrokontroler moralo bi da postoje odgovarajuci moduli Tajmeri sa istom
interface sekcijom (da bi se koristili na isti nacin) a privatni deo modula
bi bio pisan za odgovarajuci tajmer. Slicno bi bilo i za klase, morali bi da
imamo klase za svaki razliciti tajmer. Naravno, moze to biti i jedna kalasa,
ali bi nas to odvelo u potpuno implementiranje objektnog programiranja. Ima li
svrhe to raditi za mikrokontrolere i aplikacije koje su najcesce.

Hajde da razmislimo do iza Bozica pa da se onda konacno dogovorimo. Ovo su ipak
stvari za temu sta dodati Virtovom PASCAL-u.

Pozdrav

PS: Zeza me nesto server (ili sta vec) pa nisam uspeo da ti posaljem el. postom
ono sto sam obecao.

PS-PS: Mozda primecujes da izbegavam strane izraze, malo se bavim (amaterski)
proucavanjem naseg jezika i drago mi je sto mi je zapalo da mi on
bude maternju, mozda bi ga trebalo zastititi kao kulturnu bastinu jer
sve ide ka tome da nestane.
 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati13.01.2007. u 23:47 - pre 210 meseci
Sretna Srpska Nova godina.

Hm, da vidimo.

1-5. Slažemo se.

6. Ubedio si me. Malo je komplikovano za početak.

7-10. Sve je jasno.

11. Da, pokušao sam da pomešam babe i žabe pa ne ide.
Znači dodaju se makroi u sintaksu.

12. Nije mi palo na pamet da se isto može postići
sa modulima (Unit za neupućene). Dosta čistije
rešenje nego implementacija klasa koje u stvari
to i nisu.
Da pojasnim malo: klase su opisi objekta, koji
se u memoriji kreiraju na osnovu svojih klasa.
Više objekata može imati istu klasu.
Pošto su mikrokontroleri obično ograničeni sa
memorijom nema smisla uvoditi objektno programiranje.
Možda jednog dana, ali ne sada.

Što se tiče sintakse nemam više ideja.
Možda bi ti nešto dodao?

Pretpostavljam da je sledeće definisanje EBNF.
Da li imaš nešto već urađeno?
Da li da ovde postavimo kompletnu sintaksu?
Mogao bih i ja da uradim jedan deo.

Da ne trčim pred rudu, ali posle nam ostaje
da popričamo i o praktičnoj realizaciji
kopajlera, odnosno njegovoj internoj strukturi,
kao i o izgledu razvojnog okruženja.

PS
Da li je neko došao dovde sa čitanjem, ili samo mene
i tebe zanima ova tematika?

 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati14.01.2007. u 14:24 - pre 210 meseci
Ono sto se izbacuje konacno:

1. Izbacuje se simbol “with”, “packed”, “new”, “dispose”;
2. Alternativa za “^” ne postoji, a alternativa za “[“ i “]” (definisano je da budu "(."
i ".)") kada se radi o skupovnim vrednostima je “|” (da bi se i u ASM koristile
varijable skupovnog tipa);

3. Skraceni oblik pisanja visedimenzionih nizova;
4. Varijantni zapisi;
5. Mehanizam pravljenja ulancanih listi;
6. Bafer promenljiva (deklarisanje fajlova)? (samo ako ne moze da se osmisli za ilazno
izlazne komunikacione funkcije);

7. Gnezdjenje procedura i funkcija;
8. Saglasni niz kao formalni parametar;
9. Formalni procedurealni i funkcijski parametri;
10. Rewrite, Put, Reset, Get, Read, Write zavisno od stavke 6;
11. Preddeklarisane funkcije Pack i Unpack;
12. Preddeklarisane funkcije eof, eoln i page zavisno od stavke 6;
13. Programski parametri.


Ono sto se prosiruje i sto se dodaje:

1. Celobrojni tipovi se prosiruju, tako da postoji:

Code:

Naziv tipa    Duzina u bajtovima        Opseg vrednosti

Byte                    1                              0..255
Shortint                1                            -128..127
Integer                 2                         -32768..32767
Word                    2                             0..65535
Longint                 4                         -2e31..2e31-1
Longword                4                             0..2e32-1

2. Brojevi u pokretnom zarezu:

Za aplikacije mikrokontrolera dovoljno je imati samo jedan tip real sa 3 bajta mantise i
jednim bajtom za eksponent. Mislis li da je ovo dovoljna ova preciznost?

3. String kao osnovni tip:

Maksimalno string moze zauzimati 256 bajta. Prvi bajt stringa je takodje tipa char,
ali njegova ordinalna vrednost predstavlja stvarnu duzinu stringa. Rad sa stringovima
je brzi kada su oni ovako definisani, nego kada je kraj stringa oznacen nulom.
Mana je sto su ograniceni na najvise 255 karaktera, ali to je vise nego dovoljno za sve
aplikacije mikrokontrolera. Slazes li sa sa ovim?

4. Struktura asm..end za pisanje u asembleru. Asemblerske naredbe moraju da koriste
sva imena onako kako su deklarisana. Stek pointer na ulasku i izlasku iz ove strukture
mora imati istu vrednost, inace treba prijaviti gresku tokom kompajliranja.
Nije moguc skok van asm..end strukture, ali je moguce pozivanje drugih procedure
ili funkcija.

5. Lokalna varjabla treba da moze da se deklarise kao staticka ili dinamicka. Bolje
je da predpostavljana deklaracija bude staticka lokalna varijabla (sa njom
kompajler pravi brzi i kraci kod), a da se sa var dynamic eksplicitno naznaci
deklaracija lokalnih dinamickih varijabli.

6. Uvesti operator @ koji se pise ispred imena varjable i vraca pointer na tip
varijable. Pointer, zavisno od implementacije, treba da je neoznacen dvobajtni
broj (odgovara za MC908 i jos neke, problem ce biti kod onih koji mogu da imaju
duzi kod od 64K, a RAM manji od toga, pa ce pointer zbog malog broja slucajeva
morati da bude duzi od 2 bajta) a da je njegova nil vrednost $FFFF (sto takodje
odgovara za MC908, moze biti 0 za neke druge mikrokontrolere, vazno je da to bude
lokacija na kojoj ne moze da bude ni jedna varijabla, tipizirana konstanta, procedura,
funkcija ili vektor).

7. Uvesti operatore shl i shr. Ako se udesno pomera oznacena varijabla onda se radi o
aritmetickom a ne logickom pomeranju. Po prioritetu ovi operatori su u grupi
operatora mnozenja.

8. Uvesti netipizirani pointer, i koristiti ga za dobijanje adresa procedura ili
funkcija. Ovo je potrebno za pravljenje tabela procedura ili fukcija (komplikuje
implementaciju i prljavo je). Imas li neku drugu ideju kako bi pravili tablicu
poziva procedura?

9. Pri definisanju konstanti, sa desne strane treba da je umesto konstante izraz
sa konstantnim vrednostima.

10. Ime programa treba da je jednako imenu fajla koji sadrzi izvorni tekst programa,
inace se prijavljuje greska.

11. Uvesti simbol uses iza koga sledi lista imena modula koji se na tom mestu ukljucuju.
Moguce je upotrebiti vise puta simbol uses.

12. Uvesti module. Modul mora da sadrzi interfejs sekciju koja se prostire od zaglavlja
modula do simbola implementation. Ono sto je deklarisano u interfejs sekciji treba da
je dostupno svim modulima koji se ukljucuju posle njega. Takodje, primarni modul
(program) ima pristup svim deklaracijama u interfejs sekciji svih modula koji su
pre toga ukljuceni. Iskazni deo modula mora biti prazan. Jedan modul ne moze da
ukljuci drugi modul, to je i nepotrebno ako je modul definisan kako je gore napisano.
Ime modula treba da je jednako imenu fajla koji sadrzi izvorni tekst modula.

13. Uvesti kontrolu toka prevodjenja sa: _if..then, _if..then..else i _case..of. Kao
uslov za _if i _case mora biti izraz od konstanti.

14. Uvesti kompajlerske funkcije koje vracaju konstantu u vreme kompajliranja:
- SizeOf(Ime) gde je ime, ime varijable ili tipa i vraca celobrojnu vrednost
jednaku duzini varijable ili tipa u bajtovima;

- TypeOf(Ime) gde je ime, ime varijable ili tipa i vraca celobrojnu vrednost kao handler
na tip

- DynamicOf(Ime) gde je ime ime varijable, vraca boolean vrednost true ako je varijabla
dinamicka, inace vraca false;

- ExistOf(Ime) gde je ime, ime formalnog parametra makroa i vraca true ako je njemu
prosledjen stvarni parametar;

- ErrorMSG(String) prekida kompajliranje i kao gresku ispisuje string.

- Hi(Ime) gde je ime, ime varijable ili tipa (samo za redne ripove), vraca najvecu
moguci vrednost koju tip moze da ima;

- Lo(Ime) gde je ime, ime varijable ili tipa (samo za redne ripove), vraca najmanju
moguci vrednost koju tip moze da ima;

- High(Ime) gde je ime, ime varijable ili tipa, i vraca najvecu vrednost indeksa
niza (najveci moguci broj elemenata) ako je tip niz, inace 1 ako nije.


15. Uvesti preddefinisane funkcije:

- Length(Ime) ako je ime, ime string varijable vraca stvarnu duzinu stringa sto je isto
kao ordinalna vrednost prvog bajta stringa, ako je ime skupovne varijable vraca broj
elemenata skupa (0 za prazan skup). Tip koji vraca je byte;

16. Uvesti exit za izlaz iz procedure ili funkcije i break za napustanje ponavljajucih
struktura:

17. Uvesti posebnu varijablu result koja vraca rezultat funkcije umesto da se kao
varijabla upotrebljava ime funkcije (Neka se ne ljuti Virt, ali isto ime da bude za
funkciju i lokalnu varijablu ne ide);

Opste specificnosti:

1. Uz simbol var (kada se deklarisu staticke varijable) dodaje se simbol da blize odredi
memorijski prostor varijable. Za MC908 bi trebalo da moze da se napise var zeropage,
a za druge nesto drugo. Ako toga nema onda se varijable redom rasporedjuju u memoriji.
2. Interrupt procedura iza zaglavlja ima simbol interrupt i adresu interrupt vektora.
Vidim da C kompajleri imaju jednu interrupt proceduru, pa se u njoj ispituje koji
je mehanizam pokrenuo interrupt, i saglasno tome se izvrsava odgovarajuci kod. To je
glupo, moduo za komunikaciju koji ima svoje interrupt-e treba da inkapsulira procedure
koje opsluzuju te interrupt-e.

3. Uvesti tipizirane konstante, koje se ponasaju kao varijable (sem sto se u njih ne
moze izvrsiti upis) i koje se smestaju u kod programa. Sluze, izmedju ostalog za
pravljenje tabela.

4. Uvesti simbol absolute koji uz deklaraciju varijable forsirano postavlja varijablu
na adresu specificiranu vrednoscu iza ovog simbola.

5. Uvesti binarni format pisanja celih brojeva.


Ako imas jos neku ideju izlozi je.

Pozdrav

PS: Ne mogu da ti meilom posaljem atacovan AVR PASCAL (oko 870KB) jer ga tvoj server odbija. Uspesno
saljem na druge adrese.

 
Odgovor na temu

Nebojsa Mijovic
Nebojsa M
Sky
Podgorica

Član broj: 20843
Poruke: 186
*.crnagora.net.



+1 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati29.01.2007. u 19:25 - pre 210 meseci
Svaka Vam Cast momci drago mi je da vidim ovako punu saradnju ja sam pocetnik moram pronaci nekog sa kim bih razgovarao oko pocetnickih stvari.Ako Vas ne ometam zelio bih da me posavjetujete oko programiranja.Pozdrav
BOZE,

Daj mi smirenost da prihvatim ono sto ne mogu da promenim,
hrabrosti da promenim ono sto mogu
i mudrosti da to dvoje razlikujem.
 
Odgovor na temu

mradomir
mradomir
Novi Sad

Član broj: 123964
Poruke: 169
82.208.225.*



+28 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati30.01.2007. u 04:52 - pre 210 meseci
Drago mi je da neko ovo čita.
Slobodno pitaj Nebojša, šta te zanima,
pokušaću da pomognem, a verujem da će i Korak.

Da nastavim priču (večeras nema spavanja).
Kako se ne bi ponavljali navešću samo tačke
o kojima imam nešto da kažem. Ako koju preskočim
znači da se slažem.

1. Našao sam da je i Wirth kasnije u "Pascal-S"
izbacio goto i with (samo da se zna).

11. Po meni kompajler bi po default-u trebao
da "pakuje" podatke. Video sam C koji, da bi
preneo bajt kao parametar procedure, koristi
dva bajta memorije??? Pretpostavljam da je
to zaostatak u kodu koji je pisan za ko zna
koji procesor pa prepravljan za kontroler.
Stvarno ružno izgleda.
(sada vidim da to i Delphi radi, e j.....).

Dodavanje:

1. Dodao bih boolean.

2. Hm..., floating point.
Pa sa preciznošću se slažem, stvarno nisam imao
potrebe za nečim boljim.
Samo tip ne bih nazvao "real", jer on podrazumeva
8 bajtova preciznosti. Više bi odgovaralo "single"
4 bajta, ili možda "float".

3. String 256 bajtova, apsolutno se slažem.

5. E ovde si me izgubio. Ako misliš na dinamičke
promenljive kreirane sa New, apsolutno sam protiv.
Obično baratamo sa veoma malim resursima, pa bi
korišćenje dinamičkih promenljivih moglo dovesti
do situacije da na stolu sve radi kako treba, a
u praksi u jednom momentu se desi OutOfMemory.
Pojasni malo ovu tačku, imam osećaj da nisam
najbolje razumeo.

6. Razumem, ali ne razumem čemu bi ovaj mehanizam
služio. Ti bi u memoriji držao strukturu tipa promenljive?
Molim te pojasni malo.
U čemu bi bila razlika između @ i ^ ?
Da ne misliš možda na pointer na promenljivu, a ne na
tip promenljive?

8. U delphiju se koristi:
@MojaProcedura
ili
Addr(MojaProcedura)
Prvo rešenje je sasvim OK.

11. Ne znam šta bi se postiglo upotrebom
uses više puta? Ne škodi u svakom slučaju.

12. Da. To nije baš tako u paskalu, moduli
ne vide jedan drugog, osim ako se ne nalaze
u uses sekciji samog modula (if you know what i mean).
Delphi ne dopušta cirkularno povezivanje:
Code:

unit Unit1;
interface
uses Unit2;
// ...

unit Unit2;
interface
uses Unit1;
// ...

To mi je zasmetalo dosta puta, tako da se
slažem sa tobom. Samo što bih dodao pravilo
da ako procedura iz Unita1 hoće da pozove
proceduru u Unitu2 mora da navede i ime Unit-a:

Unit2.MojaProcedura;

Time bi se izbegla zabuna koja može da nastane
korišćenjem istih imena za procedure i promenljive (i, j, x, y).

14. Samo bih promenio sintaksu zbog kompatibilnosti.

- Lo bi trebalo da bude Low (Lo je funkcija koja vraća donji
bajt od integer-a).

- Hi u High iz istog razloga.

- High bi trebao da se menja zbog gornjeg razloga.
Pravilno bi bilo Length, ali to ne odgovara zato
što funkcija length vraća rezultat u runtime-u,
a nama treba konstanta u toku kompajliranja.
Možda _Length sa donjom crtom, što sugeriše da
se koristi u makroima?

17. Podržavam.

Opste specificnosti:

3. Moglo bi nešto kao:

const MojString: array[0..12] of Char = 'Hello world!';

ili kraće:

const MojString = 'Hello world!';

ili

const MojNiz = array of byte = [1,2,3,5,7,11];

5. Da ne zaboravimo heksadecimalni.

Da dodam:

- Include bi bilo lepo.

- Kako bi ubacili ovo:

if PinB.7=1 then ...

To se svodi na jednu mašinsku instrukciju (pardon dve),
nešto mi se ne sviđa varijanta kao u C-u:

if ((PinB & 0x80) == 0x80)

- Ako prethodno "prođe" onda može i:

PortB.7:=1;

Znam da ćeš ovde pomenuti uniformnost :-)
Tačka bi trebalo da bude operator. Valjda.
Moram još malo da razmislim.

Pozdrav






 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati30.01.2007. u 17:43 - pre 210 meseci
Vidim da smo blizu da i ovu fazu zavrsimo.
Dakle:

11. I ja sam video isto sto i ti. Ne zaboravi da C koristi linkere razvijene
50-tih godina, i da je int tip po difoltu u C-u. Naravno takvu glupost necemo
implementirati. U DELPHI-ju je to nevazno jer sa radi o 32-o bitnoj masini.

Dodavanje:

1. Naravno obavezno ide boolean, ono je samo prosirenje celobrojnih tipova.
2. Nemam nista protiv naziva tipa float

5. I druge zbunim kada kazem lokalna dinamicka. Tada mislim na to da je svaka
lokalna varijabla dinamicka, stvara se kada se pozove procedura, a unistava
se kada se izadje iz procedure. Najlakse je da se pravi na steku. Ali, postoji
i staticka lokalna koja stalno postoji ali moze da joj se pristupa samo iz procedure
u kojoj je deklarisana. To se cesto koristi. Ako ima dovoljno memorijskog
prostora onda je najefikasnije da sve lokalne varijable budu staticke. Kada to
nije slucaj onda je resenje dinamicka lokalna varijabla. Ona se ne pravi sa new
vec je pravi sam poziv procedure ili funkcije. Dakle, necemo imati new i dispose.
Jedina dilema je kako oznaciti da se zeli dinamicka ili staticka lokalna varijabla.
ili treba iza var staviti static ili dynamic. Ako se ne stavi nista onda se podrazumeva
jedna ili druga, zavisno kako se opredelimo. Na AVR-u kada pristupas lokalnoj
dinamickoj varijabli, morao bi da drzis vrednost stek pointera u neki indeksni registar
sto nije neka velika cena jer ti ostaju jos 2 indeksna registra. U dilemi sam sta
da bude po difoltu (kada se iza var ne pise nista) staticka ili dinamicka varijabla.

6. Aha, nisam bio precizan. Pointer svojom vrednoscu ukazuje na memorijsku lokaciju,
ali odredjenog tipa. Pointer se u deklaraciji pise kao pointer na tip, a kasnije
se odredjuje njegova vrednost:
Code:

           IntPoint = ^integer;

           Mika,Laza : integer;

           IntPoint := @Mika;
           Laza := IntPoint^; //je isto sto i Laza := Mika

Posto nemamo new ovo je jedini nacin da se pointeru dodeli zeljena vrednost. Primer
je trivijalan, ali bi se koristio kod slozenih struktura podataka.

8. Slazem se, ali kog je tipa @MojaProcedura. To jeste pointer ali na koji tip? Ako
koristimo procedureu Adr(MojaProcedura) i ona vraca celobrojnu vrednost, onda je
to cistije i mogu da se prave tablice poziva procedura gde je element tablice
tipa word. Operator @ treba da ima osobinu da uvek vraca pointer i to ne treba
mesati. Pre sam za funkciju Adr() koja vraca adresu ne kao pointer vec kao ceo
broj i da se kao parametar moze koristiti i varijabla. Ovo spusta nivo jezika,
ali je prikladno za ono sto zelimo da napravimo.

11. Posto ne znam kakva ce konacno biti implementacija modula, moze biti korisno da se
uses vise puta navodi. Kada se sa uses ukljuce neki moduli, onda je njemu dostupno
sve iz primarnog modula sto je deklarisano do uses. Nekim modulima moze da zatreba
nesto drugo ili cak ono sto je u interface sekciji nekog modula. Takav modul treba
da bude ukljucen kasnije. DELPHI dozvoljava da se vise puta pojavi uses, pa ja to
u ovom trenutku ne bih ograncavao.

Razmisljao sam i ja o Unit2.MojaProcedura; Odlicna ideja je da kada pises unit
ne razmisljas o imenima. U prvoj verziji MegaASM-a je u uses uz ime unit-a isla
lista imena koja se uvoze, a u unit-u u zaglavlju je isla lista imena koja se izvoze.
Ova imena nisu morala da budu ista, ali sam morao da pravim tablicu za povezivanje
imena. Tvoj predlog bi takodje resio problem istih imena. Ali ovde je problem
definicije imena. Ako se ime sastoji i od imena unit-a u kojem je definisano,
onda '.' ne moze da bude u imenu, sto komplikuje definiciju. Ako bi unit imao neke
osobine klase, onda ...? Da razmislimo, ali svaki pojam koji uvodimo mora da bude
definisan i da vazi univerzalno.

14. Lo i Hi sam zamislio da budu:
Code:

              Lo(integer) = -32768;
              Hi(integer) = 32767;

              tBoje = (crno, belo, zuto);
              Lo(tBoje) = crno;
              Hi(tBoje) = zuto;

Ove funkcije se koriste tokom kompajliranja. Korisno za proveru prekoracenja.

Inace pristup bajtu bi bio:
Code:

              Mika : longint;

              Mika := $12345678;

              Mika.0 = $78;
              Mika.1 = $56;
              Mika.2 = $34;
              Mika.3 = $12;

Dakle Varijabla.N gde je N ceo broj vraca ceo broj tipa byte.

High(Ime) bi bilo isto sto i Hi(tipIndeksa) ako se radi o nizu.

Length je funkcija je tu pre svega zbog stringa. Posto nemamo dinamickih nizova, onda
ona za sve ostalo nema neku veliku vaznost.

Opste specificnosti:

3. Tipizirana konstanta je u stvari varijabla u koju nuije moguc upis jer se nalazi
u flash-u. Zato ona mora imati tip. Kada napises:
Code:

         const MojString: array[0..12] of Char = 'Hello world!';

   to bi bilo:

         const
           MojString : string = 'Hello world!';

   ili da bi manje zauzelo memoriju

         const
           MojString : string[12] = 'Hello world!';

   Dakle neophodan je tip. Tako da tvoje:

         const MojNiz = array of byte = [1,2,3,5,7,11];

   treba da bude:

         const
           MojNiz = array[0..5] of byte = (1,2,3,5,7,11);  

Slazes se?

5. Da podrazumevao sam heksadecimalni.

Include je editorska funkcija, na njenom mestu se samo insertuje neki tekst, moze i ne
smeta ali nema sustinski znacaj za ovo o cemu diskutujemo.

U pravu si, treba pokloniti paznju radu sa bitivima. Ja sam to zamislio ovako:
Code:

           var
             PortA : set of (lista imena svih 8 bita) absolute AdresaPortaA;

           setovanje bita:

             PortA := PortA+[ImeBita];

           klirovanje:

             PortA := PortA-[ImeBita];

           testiranje:

             if ImeBita in PortA then

ovo je po definiciji PASCAL-a, a implementacija ce koristiti naredbe kontrolera
za rad sa bitovima


Pogledaj sta od ovoga moze da prodje, pa da se koncentrisemo na ono gde smo u dilemi
(moduli i slicno)

Pozdrav
 
Odgovor na temu

pelctronics
Beograd

Član broj: 133821
Poruke: 74
*.astra-net.com.



Profil

icon Re: MC9S08, arhitektura, performanse, programiranje i razvojni alati23.02.2007. u 22:26 - pre 209 meseci
Dajte nesto konkretno neki link uputstvo gde naci alate?Bez alata nema zanata...
Pozdrav.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: MC9S08, arhitektura, performanse, programiranje i razvojni alati

Strane: 1 2 3

[ Pregleda: 11146 | Odgovora: 46 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.