c: MISRA2012

Miroslav Draxal evik na volny.cz
Pátek Březen 26 16:21:00 CET 2021


!            TMR1H = (uint8_t) (20.1F / 1.1F); 
0x140C: MOVLW 0x12
0x140E: MOVWF TMR1H, ACCESS
!            double tmp = 20.1F / 1.1F;
0x1410: MOVLW 0x8C
0x1412: MOVWF obj_size_RAM, ACCESS
0x1414: MOVLW 0x2E
0x1416: MOVWF dividend, ACCESS
0x1418: MOVLW 0x92
0x141A: MOVWF number, ACCESS
0x141C: MOVLW 0x41
0x141E: MOVWF divisor, ACCESS
!            uint8_t x = (uint8_t) tmp;
0x1420: MOVFF obj_size_RAM, 0x1
0x1422: NOP
0x1424: MOVFF dividend, 0x2
0x1426: NOP
0x1428: MOVFF number, 0x3
0x142A: NOP
0x142C: MOVFF divisor, 0x4
0x142E: NOP
0x1430: CALL 0x300C, 0
0x1432: NOP
0x1434: MOVF 0x1, W, ACCESS
0x1436: MOVWF denom, ACCESS
!            TMR1H = x;
0x1438: MOVFF denom, TMR1H
0x143A: NOP

Tento zápis zbaští jak překladač tak MISRA, ale výsledek zase nezbaštím JÁ. 
Zajímavý problém....
Míra

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jan Waclawek
Sent: Friday, March 26, 2021 3:58 PM
To: HW-news
Subject: RE: c: MISRA2012

>Ten volatile na to přeci nemá vliv. 

KTORY volatile?

Mate tam dva.

https://list.hw.cz/pipermail/hw-list/2021-March/536695.html

            volatile double tmp = 20.1 / 1.1; //alebo iny float typ pre
danu platformu

Tento volatile prekladacu hovori, ze tmp je ten "register v procesore",
nesmie vynechat ziadny zapis a citanie a nesmie predpokladat nic o jeho
obsahu. Teda ked pride na toto:

            volatile uint8_t x = (uint8_t) tmp;

tak prekladac musi precitat tmp, ktory je typu double, a kedze dopredu
nevie, co z neho precita (lebo ste oznacili tmp za volatile), tak musi
zavolat tu konverziu z double na int.

To druhe volatile si nechajte, tam vidite, ako ten vypocet dopadol.
t.j. vyskusajte

double tmp = 20.1 / 1.1; //alebo iny float typ pre danu platformu
volatile uint8_t x = (uint8_t) tmp;

Prekladac toto NEMUSI zoptimalizovat; ale to s tymi dvomi volatile NESMIE
zoptimalizovat.

wek



>-----Original Message-----

>Ten volatile na to přeci nemá vliv. 
Nebo ano? Možná jste to přehlédl či nečetl, tohle je výraz pro navození
aktuálního problému. Volatile tam mám kvůli tomu, aby mi kompilátor tu
proměnou přeložil, nevyloučil jí z překladu, protože nikde jinde není
použita. Mám do teď, že pokud použiji volatile, tak říkám kompilátoru,
tuhle proměnnou použij a nekoukej, jestli se někde používá nebo ne. Ale,
pokud jsou povoleny veškeré optimalizace, tak např. výpočty s touto
proměnnou optimalizuj. Tak nějak si volatile spojuji s registry procesoru,
do kterého se třeba jenom zapisuje. Kdyby tam nebylo to volatile, tak se
to zoptimalizuje a žádný zápis se do registru neprovede. Pokud se z
registru v programu nečte a není volatile, tak se optimalizací zápis do
něj nerealizuje. 
>V podstatě mohu použít. 
>TMR1H = (uint8_t) (20.1F / 1.1F); // Tady řve MISRA
>TMR1H = (uint8_t) (18,27272727272727F); // tady je pro změnu vše OK.
>
>Míra
>
>
>
>-----Original Message-----
>
>No tak nedajte volatile k tmp.
>
>wek
>
>----- Original Message ---------------
>
>>Jak píšete, " vypocet kompilator urobil compile time"
>>
>>
>>-----Original Message-----
>>
>>>> chci, aby to tu konstantu vypočítalo při překladu
>>> Aby mi to při přeložilo.
>>
>>Tak co vlastne chcete, aby Vam ten vypocet kompilator urobil compile time,
>>alebo aby to prelozil a tym padom sa vypocet vykonal runtime?
>>
>>Hovorim o volatile specificky pri premennej tmp.
>>
>>wek
>>
>>
>>----- Original Message ---------------
>>>To volatile je tam pouze ze studijních důvodů. Aby mi to při přeložilo.
>>>Míra
>>>
>>>-----Original Message-----
>>>
>>>> Asi jsem měl napsat, že chci, aby to tu konstantu vypočítalo při překladu. Tohle je očesané na kost, abych se nějak dopídil k rozuzlení.
>>>
>>>No tak potom tam nesmiete pchat to volatile k tomu tmp.
>>>
>>>wek
>>>


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list