Hej Troels:
Troels Thomsen wrote:
> > Derfor er det, at jeg tæller oppefra og ned, så
> > det bliver vendt rigtigt til little-endian-maskinen.
>
> Smart nok, hvis det virker, og gør det vel ?
Det ved jeg ikke, jeg håbede at gruppen kunne svare på det. Ville
gerne teste det selv, men der har lige været nogle andre problemer med
processoren, som gjorde jeg ikke kunne arbejde på den. Rent teoretisk
ville jeg da tro, at det kunne virke.
> > Men kan forstå sådan på
> >dig, at den første uint16_t har input_str[1] som sin MSB, og
> > input_str[0] som sin LSB, ligesom jeg også forventede.
>
> I princippet kan du ikke vide, uden at læse compilermanualen, om de padder
> hver int med to bytes mere, således at startadresserne for alle integers går
> op i 4, men da det er en 8 bit mikro, er det helt usansynligt.
Det ville jeg også tro.
> >Jeg kører 16MHz 8 bit mikro, og den har _meget_ travlt,
>
> Ok, af interesse : hvordan det?
> Altså man kan have en processor der sådan i middel ikke laver en disse, men
> som så har et barsk krav til reaktionstid på et bestemt event, som den så
> ikke kan nå på ex 10 us. Er det sådan den har travlt, eller er det virkeligt
> set over en større horisont at den har travlt ? Altså processerer data
> langsommere end de kommer ind ? eller ?
Kort fortalt: Processoren sidder på et såkaldt robostix-board, og
skal indsamle data fra en mængde sensorer, som virker vidt
forskelligt. Et magnetometer med SPI-interface (vha. bit-banging, da
Atmega'ens egen SPI-port bruges andetsteds), fire Hall-sensorer som
giver en puls ca. 30 gange i sekundet, en IMU der sender pakker 100
gange i sekundet, et R/C-modul skal også samples tidsmæssigt så
præcist som muligt (gøres vha. interrupts på op- og ned-flanker), og
PWM skal styres (hvilket dog foregår automatisk i hardwaren). Udover
det, vil et gumstix-board spørge ca 100 gange i sekundet over I2C
efter nye samples. Til hver eneste af sensorerne er der tilknyttet
noget relativt avanceret monitorering af sensoren, så vi kan finde ud
af, om sensoren er ok, ellers skal det rapporteres videre op i
systemet. Og udover det, skal den kunne beregne noget kontrol, så den
helikopter den er monteret på, ikke styrter ned. Normalt er det
Gumstix'ens opgave at beregne dette, men i nødstilfælde må
robostix'en tage over, ligesom det også er den, der skal assistere en
menneske-pilot, hvis denne vælger at styre helikopteren.
Jeg tror fint på, at det kan lade sig gøre (sagt på en anden måde,
vi har ikke rigtigt noget valg :-> ), øjnede bare lige en mulighed for
optimering, og udvidelse af min egen horisont omkring C.
> >Derudover synes jeg til stadighed, at tiden for afvikling af en
> >interrupt service rutine bør holdes på et absolut minimum, for at
>
> Men alligevel bygger du protokolparseren ind i interruptfunktionen !
> Checker du også crc interrupttime?
> Hvis du mener dette alvorligt, så er det eneste du skal gøre interupttime at
> smide karakterer ind i en circular buffer, og så lade en funktion du kalder
> ofte (f.eks. ude i dit main loop hvis du har et sådant) pille karakterer ud
> , parse dem, tage aktion, etc. Det synes jeg fungerer strålende. Du får
> selvfølgelig lidt forsinkelse fra sidste byte er puttet i bufferen, til din
> main funktion kommer rundt til check funkionen. Men dine funktioner i main
> er vel ikke blokerende, så det bliver højst nogle få ms , eller ?
Der er ingen blokerende kald i main, så det kan fint lade sig gøre.
Mht. til den cirkulære buffer, så er det helt klart også en
mulighed, men jeg kan måske ikke forstå hvordan den skulle kunne
være hurtigere end blot at læse dataene direkte ind i input_str (som
jo også er en streng-buffer).
> > hvor mange clock-cycles, den bruger på at lave ...
> > t = input_str[1] << 8 + input_str[0];
>
> Mikroprocessorer er meget deterministiske. Hvis din compiler kan lave
> assembler listings, så kan du meget tit bare sammenligne antal assembler
> linier de to eksempler genererer. Hvis du skal have det i ms, skal du lige
> studere lidt. Svjh har eksempelvis en Atmel Mega 128 en clock to cycle ratio
> på 4 , og alle instruktioner (næsten) er single cycle, så ved 4Mhz kører den
> 1 mio cycles per sek, dvs 1us per assembler instruktion.
Jeg skal se hvad jeg kan få compileren til. Det er da også muligt, at
compileren helt selv kan finde ud af, at den bare med det samme kan
putte input_str[1] ind i highbyten og input_str[0] ind i lowbyten,
hvordan det så end vender på den enkelte processor - jeg kender ikke
så meget til compilerens indre, men at bitshifte 8 pladser på en 8
bit processor overlader jo ikke meget til fantasien for en rimelig
compiler med bare nogenlunde optimering
AVRfreaks.net har en design note #007, hvor der står: "The AVR
Register file architecture allows handling and switching between Little
and Big Endian without any code overhead" - og de bruger bitshift og or
i et tilhørende eksempel. Så måske det er den rette løsning, hvis
jeg forstår dem rigtigt.
> Hvis du kan få vendt bytene i dit struct således at du bare kan losse dem
> ind, så er det da svært at modstå fristelsen. Det kan jeg godt se. Især hvis
> du har ret i at dette udgør en væstentlig del af performanceproblemet.. Der
> er altid flere ting der skal kigges på alligevel, når man skifter processor.
>
> Hvilken processor taler vi om?
http://gumstix.com/store/catalog/product_info.php?products_id=139
>
> tpt
Takker igen for dit svar, tror efterhånden det ender med bitshift og
or
Mvh
Jesper