/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Memcpy
Fra : Repzak


Dato : 11-03-05 23:10

Hej

Når man bruger den function i en 16bit uC kan den så selv finde ud af at
lave int copy's ?

det vil tage meget læpngere tid hvis den laver det i char ?

compiler : Imagecraft HC12
HC12 uC

Kasper



 
 
Bertel Brander (12-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 12-03-05 00:02

Repzak wrote:
> Hej
>
> Når man bruger den function i en 16bit uC kan den så selv finde ud af at
> lave int copy's ?
>
> det vil tage meget læpngere tid hvis den laver det i char ?
>
> compiler : Imagecraft HC12
> HC12 uC
>

Måske.

Min erfaring er at kompilere til små embeddede processorer
har en meget simpel memcpy, der kopierer en byte ad gangen.
Dette for at slippe for at checke alignement for dest og src, osv.

Hvis du skal kopiere mange int's er det måske bedre at lave din egen
intcpy funktion (evt i assembler).

Men det var måske bedre at finde en løsning hvor der ikke skal
kopieres.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Vittrup (12-03-2005)
Kommentar
Fra : Michael Vittrup


Dato : 12-03-05 01:37



Bertel Brander (12-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 12-03-05 01:58

Michael Vittrup wrote:
> On Sat, 12 Mar 2005, Bertel Brander wrote:
>
>
>>Min erfaring er at kompilere til små embeddede processorer
>>har en meget simpel memcpy, der kopierer en byte ad gangen.
>>Dette for at slippe for at checke alignement for dest og src, osv.
>
>
> Omvendt er *min* erfaring, at det simpelthen (stort set..) ikke kan gøres
> hurtigere, end ved brug af memcpy. Der skal checkes for alignment i
> starten og slutningen af ens hukommelsesområde, men alt derimellem
> kopieres hurtigst muligt.. men det kommer selvfølgelig an på hvad du mener
> med "små embeddede processorer".
>
>
>
>>Hvis du skal kopiere mange int's er det måske bedre at lave din egen
>>intcpy funktion (evt i assembler).
>
>
> Ikke enig - anvender man den integrerede memcpy, er der faktisk ret stort
> chance for at den udnytter processoren 100%. Det er ikke dumme folk, der
> har implementeret den! Besværer man sig selv med at skrive en memcpy
> kommer den vel typisk op på en 90-95% udnyttelse..

Hvis man ved at det er ints der skal kopieres behøver man ikke checke
for alignment.

En standard memcpy har ingen chance for at vide om src og dest og
størrelsen er aligned og skal derfor, runtime, bruge tid på at
checke det, hvis størrelsen på det der skal kopieres er lille
er dette overhead ikke lille.

Jeg har arbejdet med en kompiler hvor memcpy var implementeret i C,
på samme måde som man ville lære det i et grundkursus i C.
Det kan man let lave bedre i assembler.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Vittrup (12-03-2005)
Kommentar
Fra : Michael Vittrup


Dato : 12-03-05 09:23



Thomas Lykkeberg (12-03-2005)
Kommentar
Fra : Thomas Lykkeberg


Dato : 12-03-05 10:48

On Sat, 12 Mar 2005 01:57:47 +0100, Bertel Brander
<bertel@post4.tele.dk> wrote:

>Hvis man ved at det er ints der skal kopieres behøver man ikke checke
>for alignment.
Hvorfor nu ikke det!? Hvordan kan man være så sikker på at disse
"ints" ikke ligger i en byte-aligned buffer?

Jeg vil tro at dette er en generel misforståelse når man arbejder på
embeddede platforme, og ikke mindst hvis man sender data imellem
forskellige platforme.

Den compiler jeg arbejder med pt., ADS v1.2 til ARM v5TE, har iøvrigt
en meget effektiv implementation af memcpy, memset og memmove.

/Thomas

Bertel Brander (12-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 12-03-05 14:41

Thomas Lykkeberg wrote:
> On Sat, 12 Mar 2005 01:57:47 +0100, Bertel Brander
> <bertel@post4.tele.dk> wrote:
>
>
>>Hvis man ved at det er ints der skal kopieres behøver man ikke checke
>>for alignment.
>
> Hvorfor nu ikke det!? Hvordan kan man være så sikker på at disse
> "ints" ikke ligger i en byte-aligned buffer?
>
> Jeg vil tro at dette er en generel misforståelse når man arbejder på
> embeddede platforme, og ikke mindst hvis man sender data imellem
> forskellige platforme.

Hvis man har:
int Array[1230], *p = something();
memcpy(Array, p, Whatever);

Ved man at src og dest og størrelse er alligned og der er
ingen grund til at checke for alignment (medmindre
something bryder reglerne og returnerer en unaligned
pointer).

Det gælder generelt hvis man har int og long. På nogle
platforme kan man også gå ud fra at det gælder for struct.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Thomas Lykkeberg (12-03-2005)
Kommentar
Fra : Thomas Lykkeberg


Dato : 12-03-05 19:42

On Sat, 12 Mar 2005 14:41:08 +0100, Bertel Brander
<bertel@post4.tele.dk> wrote:

>Ved man at src og dest og størrelse er alligned og der er
>ingen grund til at checke for alignment (medmindre
>something bryder reglerne og returnerer en unaligned
>pointer).
Se det er lige det jeg mener - hvis reglerne brydes!

/Thomas

Bertel Brander (13-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 13-03-05 00:25

Thomas Lykkeberg wrote:
> On Sat, 12 Mar 2005 14:41:08 +0100, Bertel Brander
> <bertel@post4.tele.dk> wrote:
>
>
>>Ved man at src og dest og størrelse er alligned og der er
>>ingen grund til at checke for alignment (medmindre
>>something bryder reglerne og returnerer en unaligned
>>pointer).
>
> Se det er lige det jeg mener - hvis reglerne brydes!

Hvis something() returnerer en unaligned int pointer
er memcpy det mindste problem.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Repzak (12-03-2005)
Kommentar
Fra : Repzak


Dato : 12-03-05 13:49


"> Når man bruger den function i en 16bit uC kan den så selv finde ud af at
> lave int copy's ?
>
> det vil tage meget læpngere tid hvis den laver det i char ?
>
> compiler : Imagecraft HC12
> HC12 uC


Hej

Tak for svarende, min gruppe man har lavet en memcpy i c kode og det ser ud
til at være hurtigere, tjekket med en LED der blinker for hver gang....

det er ikke nemt at lave det uden copy, men det er 1500bytes der skal
kopieres hver gang, så der er jo lidt forskel...

Kasper
(Det er ikke til at implementere det så det kun er pointere :(, og slet ikke
på mit niveu, har haft nok med bare at få det til at virke med alle de
pointere der er i uIP)






Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste