 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.13 Kraj: Kobarid
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Nov 22, 2004 9:11 pm Naslov sporočila: |
|
|
Zanimivo, zna kdo to napisat še v assemblerju. A "pušča" bascomov prevajalnik za sabo tudi assemblersko kodo. Prav zanimivo bi jo bilo videt. Če na oko pogledaš tvoj bascomov ter moj assmblerski programček sta si dokaj "podobna" pa, če prav gre celo za različno družino mikrokontrolerjev
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.13 Kraj: Kobarid
|
Objavljeno: Pon Nov 22, 2004 9:48 pm Naslov sporočila: |
|
|
Uh, tako dolllgo je od tega, ko sem pisal v assemblerju. Ce prav ustrajas se lahko tudi potrudim in napisem se v assemblerju. Sicer pa C naredi tudi assembler kodo. Bascom ne. Tako na hitro sem napisal tudi v Cju. Ne poznam ukaza za rotiranje v levo in desno. No namesto tega sem dal kar ukaz naj pristeje 1 in rezultat prevedene kode je 312 bytov. Glede na to da sta ukaza ADD in RL oba dolga 1 byte kaksnih vecjih razlik v kodi nebi smelo biti.
Sicer pa Silvo saj je vec ali manj podobno. Bascom 8051 ter AVR se le malenkostno razlikuje. V C-ju pa menda koda z minimalnimi popravki deluje na vseh uCjih ....
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Nov 22, 2004 10:09 pm Naslov sporočila: |
|
|
Citiram: |
Ce prav ustrajas se lahko tudi potrudim in napisem se v assemblerju |
ma ne, saj ne gre za "tekmovanje" ampak zgolj za informativno primerjavo. Zanimivo bi bilo da bi nekdo to napisal v Picbasic-u. Bi sicer sam probal a nimam naloženega - poleg tega bi se ga moral še učit Sem pa sedaj razmišljal, če bi tole hotel izvesti s klasično logiko bi potreboval kar nekaj čipov
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Pon Nov 22, 2004 11:57 pm Naslov sporočila: |
|
|
Tole je zelo na hitro spackano skupaj. Nisem niti preveril na testni plošči, upam pa, da dela. Verjamem, da obstajajo tudi boljše rešitve, ampak za test, ...
Koda: |
/* ----- PIC16F84A rider.c --------- */
#include <16f84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define BIT_MASKA 14
/* -- Rider gor/dol --*/
unsigned char bitmaska[BIT_MASKA] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};
/* -- Glavni program -- */
main() {
/* -- Pripravi porte -- */
set_tris_b(0x0); /* Port B[0:7] Izhod */
/*-- Neskoncna zanka --*/
while(1) {
unsigned char i;
for(i=0;i<BIT_MASKA;i++) {
output_b(~bitmaska[i]); /* maska na port */
delay_ms(500); /* Pavza */
};
};
}
/* ----- EOF PIC16F84A rider.c ----- */ |
V prilogi še .hex in asembler listing za primerjavo.
Lp, Frenki
Opis: |
|
 Download |
Ime datoteke: |
rider.zip |
Velikost datoteke: |
1.64 KB |
Downloadano: |
18 krat |
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Pet Nov 26, 2004 12:42 am Naslov sporočila: |
|
|
Da se še jaz vtaknem v to debato:
C prevajalnik je PICC Lite (HI-TECH Software) in je brezplačna zadeva.
Da ne bi izumil tople vode sem v C prevajalnik skorajda prepisal Frenkijev program.
Koda izgleda takole:
Koda: |
#include <pic.h>
#include "delay.h"
__CONFIG (HS & WDTDIS & UNPROTECT);
#define BIT 14
unsigned char bitki[BIT] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};
main()
{
TRISB = 0x0;
while(1)
{
unsigned char i;
for(i=0; i<BIT; i++)
{
PORTB = bitki[i];
DelayMs(250);
DelayMs(250);
}
}
}
|
(Pavza je napisana tako, da vrednosti večje od 256 ne morem vnesti, zato je dvakrat po 250.)
No, ko sem stvar prevedel -> 546 bajtov velika hex datoteka. To znese kar 90 besed programskega pomnilnika! Za primerjavo: Frenkijev program se prevede v 529 bajtov, kar znese 86 besed p.p. medtem ko Silvotov program (248B) zasede samo 34 besed p.p.
Pomislil sem, ali je C program morda možno napisati bolj spretno? Mislim da težko - saj že sedaj obsega samo par besed...
Zelo podobno sem program napisal tudi v BASIC-u. Prevajalnik je integriran v PIC Simulator IDE.
Koda:
Koda: |
Dim bitek(14) As Byte
bitek(0) = 1
bitek(1) = 2
bitek(2) = 4
bitek(3) = 8
bitek(4) = 16
bitek(5) = 32
bitek(6) = 64
bitek(7) = 128
bitek(8) = 64
bitek(9) = 32
bitek(10) = 16
bitek(11) = 8
bitek(12) = 4
bitek(13) = 2
Dim x As Bit
x = 1
TRISB = 0
Dim i As Byte
While x
For i = 0 To 13
PORTB = bitek(i)
WaitMs 500
Next i
Wend
|
Program se prevede v kar 632B veliko datoteko. To znese 113 besed p.p.
Mislim, da je ta prevajalnik napisan nekoliko nerodno in bi s kakšnim drugim dosegel boljše rezultate...
Zanima me kako se vse skupaj obnaša pri kakšnem velikem programu?
Nobenega programa pa nisem probal na testni plošči - enkrat sem spustil čez simulator in naj bi delalo...
V prilogi pa primerjava disasemblanih hex datotek...
Opis: |
C in Basic Hex, ter disasemblani hexi |
|
 Download |
Ime datoteke: |
c_bas_test.zip |
Velikost datoteke: |
7.73 KB |
Downloadano: |
7 krat |
|
|
Nazaj na vrh |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Pet Nov 26, 2004 9:20 am Naslov sporočila: |
|
|
Program mislim, da bi moral teči, vendar ne ravno tako kot je bilo sprva mišljeno - vrednosti v tabeli niso OK - tole bo ledico ugašalo. Vidi se, da sem spackal brez kaj veliko razmišljanja. No, če pustim to ob strani, stvar je kljub vsemu dovolj podobna, da je o tem možno debatirati. En segment problema je seveda poraba programskega pomnilnika, drugi - po moje tudi nezanemarljiv pa poraba rama. Rešitev s takšno tabelo v danem primeru ni dobra. Stvar bi bilo treba realno napisat nekoliko drugače. Verjamem sicer, da ročno napisani assembler kodi ne bom prišel niti blizu po optimizaciji, vendar bom čez vikend vseeno poskusil še na drug način.
Lp, Frenki
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Pet Nov 26, 2004 2:21 pm Naslov sporočila: |
|
|
Napisal sem več kratkih c programčkov, od katerih pa se je najbolje izkazal tale:
Koda: |
#include <pic.h>
#include "delay.h"
__CONFIG (HS & WDTDIS & UNPROTECT);
unsigned char i=0;
void main()
{
TRISB = 0x0;
PORTB = 1;
DelayMs(250);
DelayMs(250);
while(1)
{
for(i=0; i<14; i++)
{
if(i<7)
{
PORTB *= 2;
DelayMs(250);
DelayMs(250);
}
else
{
PORTB /= 2;
DelayMs(250);
DelayMs(250);
}
}
}
}
|
Prevede se v 391B in zasede 61 besed programskega pomnilnika. Še vedno skoraj 2x večje od zbirniške kode, a ni več tako slabo kot prej. Bi bilo lahko še boljše?
Naj dodam še, da skoraj popolnoma enak program napisan v Basicu zavzame kar 154 besed p.p. Meni se zdi malo čudno - rabim drug prevajalnik?
V prilogi hex in disasemblan file.
Opis: |
Hex in disasemblana oblika |
|
 Download |
Ime datoteke: |
hex_disasm.zip |
Velikost datoteke: |
828 Bytov |
Downloadano: |
4 krat |
Nazadnje urejal/a Umnik Pet Nov 26, 2004 9:15 pm; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.89
|
Objavljeno: Pet Nov 26, 2004 3:05 pm Naslov sporočila: |
|
|
Delay je v kodi 6x, to vsekakor ni dobro. Ali je to inline rutina? Koliksen je sizeof(int)?
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Pet Nov 26, 2004 7:14 pm Naslov sporočila: |
|
|
Slawc hvala za namig - pomotoma sem namreč enkrat napisal int namesto char. Tip int je dolg dva bajta, char pa samo en bajt. Popravil sem tudi zgornji post.
Pregledal sem kako se prevede moja pavza;
preden kličem pavzo v W nalozim 250 in potem kličem pavzo. To pomeni dva ukaza namesto enega. Ker moram vsako 500Ms pavzo klicati dvakrat to pomeni 4 ukaze namesto enega. Uou! Drugače pa je pavza prevedena povsem normalno.
Definitivno bi moral to pavzo napisati drugače. Je pa tudi problem, ker mi prevajalnik za vsako stvar briše RP0, tako da se 'zihr' nahaja v Bank 0.
Nisem pa razumel tole z inline rutino? Če si želel vedeti ali je 'integrirana' v prevajalnik - ni. Dobil sem jo posebej, saj bi jo napisal sam pa ne znam...
|
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.89
|
Objavljeno: Sob Nov 27, 2004 2:17 am Naslov sporočila: |
|
|
inline pomeni vrinjena, to pomeni, da se funkcija ne klice ampak se kar skopira v vse tiste dele kjer je funkcija napisana. V tvojem primeru, bi imel delay v programu 6x napisan.
|
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70831.83
|
Objavljeno: Sre Apr 06, 2005 10:06 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika.
|
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.89
|
Objavljeno: Sre Apr 06, 2005 11:43 pm Naslov sporočila: |
|
|
Par komentarjev:
- ne mores primerjat kode za x51 in arm.
- programa nista enaka.
ARM primer ima startup datoteko v katerem se vzpostavi PLL, MAM in stack za vsak mode. Po defaultu je vkljucen tudi debug info. Nova koda:
Koda: |
#include <LPC21xx.H> /* LPC21xx definitions */
void wait ()
{
volatile int i;
for (i=0;i<100;i++);
}
int main (void) {
unsigned int j; /* LED var */
IODIR1 = 0xFF0000; /* P1.16..23 defined as Outputs */
while (1) { /* Loop forever */
for (j = 0x010000; j < 0x800000; j <<= 1) { /* Blink LED 0,1,2,3,4,5,6 */
IOSET1 = j; /* Turn on LED */
wait (); /* call wait function */
IOCLR1 = j; /* Turn off LED */
}
for (j = 0x800000; j > 0x010000; j >>=1 ) { /* Blink LED 7,6,5,4,3,2,1 */
IOSET1 = j; /* Turn on LED */
wait (); /* call wait function */
IOCLR1 = j; /* Turn off LED */
}
}
}
|
Velikost .text sekcij (.data in .bss 0 - jasno, ko pa ni globalnih spremenljivk)
z -O2
ARM 504
Thumb 472
z -Os
ARM 504
Thumb 456
Sedaj pa s skoraj minimalnim startup filetkom (brez PLL, brez MAM, samo en stack, v supervisor modu)
z -O2
ARM 344
Thumb 312
z -Os
ARM 344
Thumb 296
BTW, se da to se dodatno sfrizirat (ampak ne .c koda!!!).
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|