sodjan skrev:Har frågan om flyttal något med kontexten kring volatile att göra?
Eller var det bara en generell fråga inkastad i flödet? Nu så går det
ju inte att svara generellt på frågan om flyttal, "det beror på". På en
processor med hårdvarustöd för flyttal så har det ju så klart mindre
betydelse än på processorer utan det. Men, det är ju oklart varför
du frågar också, så det går inte riktigt att svara på det...
Och OK, uppenbarligen så genererar HAL lite underliga kommenterar
på ologiska platser. OK...
OK på dig med sojan Annars så får du ett tack för hjälpen också. Ja, det var mest bara en införkastad fråga för att reta upp dig Skämt och sido.
Det är intressant att du som väldigt erfaren hävdar att HAL genererar lite underliga kommentarer på ologiska platser. Kan du verkligen säga så till STM? Det kanske finns en utmärkt anledning att placera kommentarerna där? Jag håller övrigt med dig, men samtidigt måste man ha en baktanke att CubeMX gjordes inte över en natt. Ville bara notera detta.
Googlade runt lite och det kanske bara var tur att det funkade med volatile.
Data överförs tydligen med DMA (HAL_ADC_start_DMA) och där
kastar jag in handduken, det kan jag inte, och tänker inte lära mej förrän jag behöver det.
Rekommenderar dock Al att fösöka hitta nåt exempel att ta efter, det finns en del där ute.
Rick81 skrev:Så kör alltid volatile på variabler i interuptfunktioner.
Nja.
Kör alltid volatile på de globala variabler som modifieras i interruptfunktioner. För lokala variabler finns det ingen anledning. Och för variabler som bara läses i interruptet finns det sällan någon anledning, om man hanterar dem vettigt.
Det finns väl fall där man vill att en lokal variabel ska bevara
sitt värde mellan anrop. Minns om om det är "volatile" där
dock, eller kanske "static"...
> som modifieras i interruptfunktioner.
Inte enbart. Det gäller alla variabler som kan ändras på ett sätt
som inte är uppenbart för kompilatorn. I/O portar, minne som
uppdateras via DMA o.s.v.
D.v.s. att i detta fall borde "volatile" hjälpa även om det var DMA (?)...
Sojan. Om du undrar varför jag ställde denna fråga, angående om flyttal, har med att jag har just insett att jag kommer tappa en fin upplösning om jag kastar om 32 bit till 8 bit bara för att min UART är 8 bit (ASCII), medan min ADC är 12 bit.
Om jag vill sända 12 bit över 8 bits UART, då måste jag dela upp 12 bit till 4 bit och 8 bit och sedan addera ihop dem efter dem har passerat UART:en.
Finns det något sätt i C där man kan konvertera om en 12 bit's värde till en array på 12 bitar?
Eller innebär detta att jag måste skapa en array som har 15 olika element, där jag kapar upp mitt 12 bits adc värde i 15 värden. Exempel om jag får värdet 4095 så betyder det att:
4095 % 255 = 15
Alltså blir det en array på 17 element som har de första 16 elementen 255 och sista 15. Då vet jag exakt hur mycket jag skickar för varje gång. Totalt är det 3 stycken ADC värden på 12 bit som jag ska skicka. Så det blir en array då på 17*3 = 51.
Är detta ett korrekt sätt att göra?
Senast redigerad av Al_Bundy 5 januari 2019, 16:38:36, redigerad totalt 1 gång.
volatile i lokala variabler kan ha sin nytta ibland.
När optimieringen fixar bort variabeln och man inte ser den i debuggern.
Alternativ att du sänder dina 12bits som 16bits -> 2st 8bit uart char. Blir oftast enklare.
Eller att du sänder multipler av ett par 12bits. Blir det 3 bytes.
Det finns två problem (båda hanterbara) med binära värden över
seriell förbindelse. Dels så är det svårare att felsöka, det blir bara
"skräm" i ett terminalfönster. Och dels så kommer många värden
att generera de olika "kontrolltecknen" som ligger i de lägsta 32
ASCII värdena. Man får CR/LF/Xon/Xoff/Bell/Null och allt annat
som, beroende på hur det ser ut i andra änden, kan ställa till det.