WNär man inte använder flytande punkt
Det första man behöver inse är att flytande punkt betyder inte betyder "Jag behöver decimaler". Det är här som cirka 95% av alla inbäddade programmerare missbrukar flytande punkt misslyckas.
Kuren för den misstro är att inse att internt bör programmet använda en enhet som är vettigt för MCU att använda, inte en som är meningsfull för människor.
Om du till exempel mäter ström i mA med en 10-bitars ADC på chipet, är den praktiska enheten att använda i "fasta råa ADC-värden från 0 till 1024". I C-programmering betyder det en uint16_t
eller eventuellt en uint_fast16_t
. Inte en int
och absolut inte en float
.
Att använda enheten mA inuti firmware-beräkningar är bara bekvämt för den mänskliga programmerarens hjärna, om den inte kan hantera abstrakta enheter. Men det är obekvämt för programmet, för det betyder att du måste skala om alla avläsningar till och eventuellt lägga till avrundningsfelaktigheter när du gör det. Plus skalningskoden är bara uppblåst. Och det kommer sannolikt att inkludera delning, vilket kan vara smärtsamt för många MCU: er.
Ja, du läser strömmen i mA. Men om du inte behöver skriva ut strömmen på en skärm eller något till en mänsklig användare, är den enheten faktiskt inte till hjälp. Gör mA-skalning på penna och papper medan du utformar algoritmen istället för att dra den till din firmware.
W När du använder flytande punkt
- Om din MCU har en FPU och du faktiskt behöver göra avancerad matematik bör du använda flytande punkt. Annars bör du inte.
"Avancerad matematik" betyder inte nödvändigtvis avancerad ur programmerarens perspektiv, utan ur programvarans perspektiv."Advanced" inkluderar saker som kvadratrötter, geometri eller trigonometri, användning av matematik.h
i allmänhet, komplexa siffror, AI-matematik etc. Saker som skulle vara smärtsamma att implementera i fast punkt.