Matrisberäkningar med för STM32?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Matrisberäkningar med för STM32?
Om man vill är det inget problem att allokera minne dynamiskt vid programstart Sedan kan det vara praktiskt att ha en flagga för varje matris för att se om den är ledig eller inte.
Re: Matrisberäkningar med för STM32?
Objektorienterad funktionalitet fixade Bjarne S för drygt 35 år sedan när han skapade C++. Använd C++ om du vill köra objektorienterat. Jag skulle inte rekommendera C++ för inbyggda system. Kolla gärna på MISRA att använda som hjälp vid embeddedprogrammering.Al_Bundy skrev:
Jag tycker att man borde kunna retunera flera värden samtidigt, utan att använda pekare. Detta skulle vara bra. Och lägg till objektorientering i C!
Sockret?
Mr Andersson beskriver väldigt bra ovan vad vi menar med socker.
Re: Matrisberäkningar med för STM32?
Heltal är bra och snabbt.Jag vet inte annars vad jag ska använda.
Och alla STM32 har inte FPU
Re: Matrisberäkningar med för STM32?
Jag ska lägga detta på minnet mitt. Just nu måste jag planera för att skriva om:
Till
En nyfiken fråga! Ska man anpassa koden efter ANSI C eller C99? Jag vet att vissa företag kör fortfarande med gammal C standard. Varför vet jag inte.
Kod: Markera allt
*(ptr + i*n + j)
Kod: Markera allt
A[i][j]
Re: Matrisberäkningar med för STM32?
Du behöver inte anpassa nånting, egentligen. dock fram till C11 så har det tillkommit en del saker, främst med "multithreading" och liknande.
Sen är frågan, vad du menar med ANSI-C, eftersom det egentligen inte finns något sådant, dock gissar jag att du menar C89.
Desto äldre standard, desto bättre kompabilitet.
Dock, eftersom GCC stöder de senaste standarderna, så spelar det ingen roll.
Sen är frågan, vad du menar med ANSI-C, eftersom det egentligen inte finns något sådant, dock gissar jag att du menar C89.
Desto äldre standard, desto bättre kompabilitet.
Dock, eftersom GCC stöder de senaste standarderna, så spelar det ingen roll.
Re: Matrisberäkningar med för STM32?
Okej. int32_t istället för float och inte använda dynamisk allokering.
Då väljer jag C11.
Då väljer jag C11.
Re: Matrisberäkningar med för STM32?
Du kan villkora koden mot existens av FPU.
typ:
#ifdef FPU_1PREC
#define float float
#endif
#ifdef FPU_2PREC
#define float double
#endif
#ifdef NO_FPU
#define float int32_t
#endif
dock är det lite farligt och du bör använda ett annat namn än float när du sedan skpar dina variable, och byta ut "float" i första kollumnen ovan mot detta
Till exempel
#ifdef FPU_1PREC
#define al_bundy_type float
#endif
#ifdef FPU_2PREC
#define al_bundy_type double
#endif
#ifdef NO_FPU
#define al_bundy_type int32_t
#endif
då använder du "al_bundy_type" när du skapar dina variabler
typ:
#ifdef FPU_1PREC
#define float float
#endif
#ifdef FPU_2PREC
#define float double
#endif
#ifdef NO_FPU
#define float int32_t
#endif
dock är det lite farligt och du bör använda ett annat namn än float när du sedan skpar dina variable, och byta ut "float" i första kollumnen ovan mot detta
Till exempel
#ifdef FPU_1PREC
#define al_bundy_type float
#endif
#ifdef FPU_2PREC
#define al_bundy_type double
#endif
#ifdef NO_FPU
#define al_bundy_type int32_t
#endif
då använder du "al_bundy_type" när du skapar dina variabler
Senast redigerad av TomasL 15 januari 2019, 01:40:42, redigerad totalt 1 gång.
Re: Matrisberäkningar med för STM32?
Japp.
https://www.st.com/en/microcontrollers/stm32f401re.html
https://www.st.com/en/microcontrollers/stm32f401re.html
Så det går helt enkelt snabbare att använda heltal än flyttal.The STM32F401xD/xE devices are based on the high-performance ARM®Cortex® -M4 32-bit RISC core operating at a frequency of up to 84 MHz. Its Cortex®-M4 core features a Floating point unit (FPU) single precision which supports all ARM single-precision data-processing instructions and data types. It also implements a full set of DSP instructions and a memory protection unit (MPU) which enhances application security.
Re: Matrisberäkningar med för STM32?
Nej, inte nödvändigtvis, om du har en FPU, och din kompilator kan utnyttja den, så är flyttal lika snabbt, för det mesta.
Man får helt enkelt testa vilket som är snabbast
Man får helt enkelt testa vilket som är snabbast
Re: Matrisberäkningar med för STM32?
Kan jag inte bara använda int32_t när jag beräknar och kasta om det till float när jag vill skriva ut det på skärmen?TomasL skrev:Du kan villkora koden mot existens av FPU.
typ:
#ifdef FPU_1PREC
#define float float
#endif
#ifdef FPU_2PREC
#define float double
#endif
#ifdef NO_FPU
#define float int32_t
#endif
dock är det lite farligt och du bör använda ett annat namn än float när du sedan skpar dina variable, och byta ut "float" i första kollumnen ovan mot detta
Till exempel
#ifdef FPU_1PREC
#define al_bundy_type float
#endif
#ifdef FPU_2PREC
#define al_bundy_type double
#endif
#ifdef NO_FPU
#define al_bundy_type int32_t
#endif
då använder du "al_bundy_type" när du skapar dina variabler
Re: Matrisberäkningar med för STM32?
Varför krångla till det, lättare att göra tvärtom, skriva ut en int, och sätta decimalkommat där du vill ha det, för det mesta är ju man ointresserad av mer än en decimal, möjligtvis två.
Re: Matrisberäkningar med för STM32?
Okej! Där lurade du mig lille Tomas. Jag får nog behålla floats då.TomasL skrev:Nej, inte nödvändigtvis, om du har en FPU, och din kompilator kan utnyttja den, så är flyttal lika snabbt, för det mesta.
Man får helt enkelt testa vilket som är snabbast
Jag kommer sitta vid 32-bits CPU:er som har FPU. Det är en sådan kod jag skriver till. Inte till dem som inte har FPU.
Re: Matrisberäkningar med för STM32?
Inte när det kommer till QR-faktorisering. Där kan värderna stiga upp till e+308 om den känner för det. Så det är viktigt att man ständigt dividerar värderna för att hålla ned talet, tills QR konvergerar till sina rätta matriser.TomasL skrev:Varför krångla till det, lättare att göra tvärtom, skriva ut en int, och sätta decimalkommat där du vill ha det, för det mesta är ju man ointresserad av mer än en decimal, möjligtvis två.
QR används för lösa linjära beräkningar som har brus.
När det kommer till systemidentifiering så finns det inte ett enda heltal. Minst 4 decimaler brukar jag använda.
Re: Matrisberäkningar med för STM32?
Detta är orsaken varför jag valde allokera minne.
Men om jag sätter ett macro i en huvudfil declareFunctions.h.
Sedan kör jag denna funktion.
Då får jag utskriften.
P.S Hittade en fiende till Tomas. Undra vilken dynamit han skulle ha använt om jag hade sagt detta?
https://www.quora.com/Why-is-malloc-har ... ed-systems
Kod: Markera allt
float values2[6][6] = { { 2, 3, 1, 0.5, 4, 44.3 },
{ 4, 5, 7, 0.1, 1, 5.3 },
{ 5, 3, 6, 19.2, 9, 34.2 },
{ 1, 4, 1, 4, 7, 4.24 },
{ 3, 1, 6, 2, 6, 5.3 },
{ 3, 1, 6, 2, 6,6.23}};
int column = sizeof(values2[0]) / sizeof(float);
int row = sizeof(values2) / sizeof(values2[0]);
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
testFunction(values2);
>> Number of rows: 6
>> Number of columns: 6
Kod: Markera allt
#define columns(arr) ((int) sizeof(arr[0]) / sizeof(float))
#define rows(arr) ((int) sizeof(arr) / sizeof(arr[0]))
Kod: Markera allt
#include "declareFunctions.h"
void testFunction(float** arr){
int m = columns(arr);
printf("Kolumnen är m = %d", m);
}
Det blir nog ingen omskrivning. Jag får helt enkelt acceptera att C kan inte hantera 2D arrayer igenom funktioner. Eller så får man gå över till C++.Kolumnen är m = 2
P.S Hittade en fiende till Tomas. Undra vilken dynamit han skulle ha använt om jag hade sagt detta?
https://www.quora.com/Why-is-malloc-har ... ed-systems
Fråga: Why is malloc() harmful in embedded systems?
Svar:
I’ve used malloc() in embedded systems for decades. malloc() is only harmful if you don’t know what you are doing and/or you are not paying attention to detail.
Myself, I don’t consider malloc() harmful.
Re: Matrisberäkningar med för STM32?
Nattugglor? hehe
Tänker du dej att göra en mikro-version av matlab (eller matlab-syntax i alla fall)? Dvs att användaren interaktivt ska kunna ange olika matlab-rader och de utförs?
Det har en stor betydelse för hur man lägger upp programmet och utformar de olika funktionerna du jobbar med.
Har man en stängd miljö som en µC kan sägas vara och all beräkning är på förväg känd så gör man på ett visst sätt
för att få allt så effektivt och förutsägbart som möjligt.
Har du däremot en interaktiv miljö där man på förväg inte kan säga exakt ordning på beräkningar så måste man göra
det hela flexibelt så att alla tänkbara situationer kan hanteras.
Tänker du dej att göra en mikro-version av matlab (eller matlab-syntax i alla fall)? Dvs att användaren interaktivt ska kunna ange olika matlab-rader och de utförs?
Det har en stor betydelse för hur man lägger upp programmet och utformar de olika funktionerna du jobbar med.
Har man en stängd miljö som en µC kan sägas vara och all beräkning är på förväg känd så gör man på ett visst sätt
för att få allt så effektivt och förutsägbart som möjligt.
Har du däremot en interaktiv miljö där man på förväg inte kan säga exakt ordning på beräkningar så måste man göra
det hela flexibelt så att alla tänkbara situationer kan hanteras.