Sida 12 av 20

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 22:13:56
av bearing
DanielM skrev:Bara så ni vet det så funderar jag på att ta TomasL's råd att ändra om float till long :) Eller uint32_t med andra ord.

Jag hoppas det ska gå bra att bara ersätta floats med heltalsberäkning? Inget annat jag behöver ta hänsyn till?
Jag tänker använda typedef.
Om du bara ska göra heltalsberäkningar behöver du ju inte använda floats. En sak du behöver ta hänsyn till är att produkterna, resultatet av beräkningarna, inte blir för stora i mellanstegen eller det slutliga steget (overflow). Finns några andra saker att ta hänsyn till också, som en van programmerare gör automatiskt. Men du är ju inte det, är inte van, vilket gör mig orolig.

För att kunna räkna med decimaltal kan man "flytta kommatecknet", d.v.s använda "fixed point", som Tomas varit inne på. Även många andra har föreslagit detta i alla andra trådar du startat. Hur som helst, fixed point kräver en del klurande och god förståelse för vad man gör (på bit-nivå). Din saknad av kunskap om detta gör mig orolig.

Till Matlab finns Dspace TargetLink, som automatiskt hanterar fixed point. D.v.s man kan betrakta signalerna som floats. Man kan mata systemet med massor av testfall, extremvärden på data, eller verkliga loggar. Man kan dessutom visuellt plotta signalerna både som float och fixed point i samma plot, för att avgöra hur "taggiga" de blir med fixed point, och ev. skala om dem för bättre upplösning (så länge det inte blir overflow någonstans). Finns massor med fina hjälpmedel för att se till att allt står rätt till när man går från float till fixed point. TargetLink är i princip standard inom bilindustrin i Tyskland.

Eftersom att du ska använda ovanligt stora matriser, och samtidigt koda för hand, d.v.s utan att gå via grafisk programmering som hjälpmedel, tror jag det blir mycket svårt för dig att verifiera att din fixed-point-lösning är buggfri vid alla kombinationer av indata. Så jag tycker att du ska fortsätta med floats. Annars gör du mig orolig.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 22:25:20
av TomasL
Vi skalar all värden från AD-omvandlare mm så de är 40x dvs, när vi gör en utskrift av ett värde, så delar vi med 4 (2 högerskift) och sätter decimaltecknet för en decimal (/10), vi är bara intresserade av en decimal, och följaktligen kalibrerar vi AD-omvandlarna efter detta.
Dock alla beräkningar utförs med 40x

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:18:24
av DanielM
Okej, Det var de jag frågade för någon sida sedan hur man dividerar och multiplicerar med bitoperationer. Jag uppfattade ditt svar som att det var en ren barnlek och man behövde inte ändra något.
TomasL skrev:För att det skall vara effektivt, så behöver du skala om dina data på lämpligt sätt, samt fundera på hur matematiken ser ut, dvs utnyttja processorn till det maximala, dvs använda skiftoperationer i stället för division och multiplikation osv.
Du kan helt enkelt inte bara ta det befintliga och typedefa dina floats till heltal, det funkar inte.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:19:21
av DanielM
TomasL skrev:Vi skalar all värden från AD-omvandlare mm så de är 40x dvs, när vi gör en utskrift av ett värde, så delar vi med 4 (2 högerskift) och sätter decimaltecknet för en decimal (/10), vi är bara intresserade av en decimal, och följaktligen kalibrerar vi AD-omvandlarna efter detta.
Dock alla beräkningar utförs med 40x
Så om vi har int a = 40 och int b = 2. Hur delar jag detta med binär räkning? Eller hex eller vad man ska säga.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:24:18
av TomasL
Vad skall du dela med vad?

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:26:18
av DanielM
Vi säger a/b.

Låt även b = 3. Hur blir det då?

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:29:33
av bearing
DanielM skrev:
TomasL skrev:Vi skalar all värden från AD-omvandlare mm så de är 40x dvs, när vi gör en utskrift av ett värde, så delar vi med 4 (2 högerskift) och sätter decimaltecknet för en decimal (/10), vi är bara intresserade av en decimal, och följaktligen kalibrerar vi AD-omvandlarna efter detta.
Dock alla beräkningar utförs med 40x
Så om vi har int a = 40 och int b = 2. Hur delar jag detta med binär räkning? Eller hex eller vad man ska säga.
Det beror på vad du har valt för skala, och ifall siffrorna du visar är innan eller efter omskalning. Du gör först en vanlig division med processorns DIV-instruktion (alltså / i C), och sen måste kvoten ofta skiftas något/några steg åt något håll (>> eller <<). För att kunna behålla alla värdesiffror kan du behöva utföra skiftningen på täljaren innan divisionen. Så länge täljaren inte får overflow eller tappar värdesiffror vid skiftningen.

Baserat på dina exempel gissar jag att du inte förstått vad fixed point är. Samt att du missat att du faktiskt kan använda processorns divisons-instruktion. Verkar som att du tror att du behöver använda liggande stolen. Liggande stolen används bara i assembler-programmering ifall processorn saknar instruktioner för division.

Men det verkar ju vara som vanlig här. Du ignorerar inlägg och fortsätter på inställd kurs, obekymrad av att kursen är fel och att kompassen har stark deviation. Inget nytt under solen.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:41:13
av TomasL
Problemet är väl att man måste vara rätt duktig i matte, eftersom man måste skriva om alla funktioner, så att multiplikationer och divisioner är jämt delbara med 2.
Om man har den kunskapen, så kan man göra under.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:42:38
av TomasL
om du skall dela a med b där b==2 , så a>>1, enkelt uttryckt.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:43:21
av DanielM
>> Men det verkar ju vara som vanlig här. Du ignorerar inlägg och fortsätter på inställd kurs.

Visa mig ett exempel då istället för att kritisera? Liggande stolen är lite för gammalt för mig. Sådant lärde jag mig inte när jag gick i skolan.
Vi hade datorer och räknare för våran lärare tyckte ändå att det var ingen idé att repitera division och addition från lågstadiet.

På universitetet var det MATLAB som gällde. Fanns ingen handräkning där.

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:45:04
av DanielM
TomasL skrev:om du skall dela a med b där b==2 , så a>>1, enkelt uttryckt.
Aha! Smart! Men om b == 3 då? Då är det ett annat uttryck?

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:47:08
av TomasL
Det är väl det som är problemet.
Själv lärde jag mig med Sticka och P&P


Ja, du får helt enkelt göra om ekvationerna så att du alltid använder divisorer med 2

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:48:10
av DanielM
Det var tider det. Innan dess så fick man räkna med stenar och fingrar. Påminner mig lite om Monty Python "Men jag då? Jag har...X..värre än dig" :wink:

Kanske det finns ett färdigt bibliotek som jag kan använda mig utav?

Vad tror du om denna funktion?

https://github.com/cruxrebels/Interview ... tegers.cpp

Kod: Markera allt

int Solution::divide(int dividend, int divisor) {
    int sign = 1;
    if (dividend<0){sign = -sign;}
    if (divisor<0){sign = -sign;}
     
    unsigned long long tmp = abs((long long)dividend);
    unsigned long long tmp2 = abs((long long)divisor);
            
    unsigned long c = 1;
    while (tmp2 < tmp){
        tmp2 = tmp2<<1;    
        c = c<<1;
    }
     
    long long res = 0;
    while (tmp>=abs((long long)divisor)){
        while (tmp2 <= tmp){
            tmp -= tmp2;
            res = res+c;
        }
        tmp2=tmp2>>1;
        c=c>>1;    
    }
     
    return (sign*res >= INT_MAX ||  sign*res < INT_MIN) ? INT_MAX : sign*res;
}

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 6 december 2019, 23:52:34
av TomasL
Bibliotek till vad, dina funktioner/formler får du skriva själv, naturligtvis

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Postat: 7 december 2019, 00:00:25
av DanielM
Men sådant borde väll redan många andra ha skrivit för länge sedan?