c: MISRA2012

Jan Waclawek konfera na efton.sk
Pátek Březen 26 16:36:45 CET 2021


No fajn, takze ten prekladac prave vyuzil to "NEMUSI optimalizovat".

Nikde nie je napisane, ze optimalne riesenie musi existovat. Norme C ako aj
MISRA je uplne lahostajna Vasa spokojnost... (korektnejsie povedane,
spotrebovane prostriedky).

Mozno by ste mohli skusit prehodnotit zapis tych konstant a drzat sa
celociselnych konstant a vyrazov.

wek

----- Original Message ---------------

Subject: RE: c: MISRA2012
   From: "Miroslav Draxal" <evik at volny.cz>
   Date: Fri, 26 Mar 2021 16:21:00 +0100
     To: "'HW-news'" <hw-list at list.hw.cz>

>!            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-----

>
>>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
>>>>
>



Další informace o konferenci Hw-list