c: MISRA2012

Miroslav Draxal evik na volny.cz
Pátek Březen 26 10:43:59 CET 2021


Při 
const uint8_t tmpA = 20.1F * 10.0F;
samozřejmě řve překladač.
const uint8_t tmpA = (uint8_t) 20.1F * 10.0F;
Tohle se zas nelíbí MISRe a navíc to počítá přímo při běhu v procesoru.

Nic z toho, co se zde napsalo, nepomohlo.
Tu MISRU, dá se říct, že studuji. Jsou tam pravidla, která, když se to NESTANE, jsem neměl tušení, že to může nastat. V tom je fakt dobrá. Dost věcí jsem si opravil. 
Ne všechna pravidla jsou pro mě dobrá. 
Co se týče tohohle problému, jde o to , že mám knihovnu, kde se vypočítávají hodnoty do registrů určující rychlost sériového portu (a jinde i spoustu dalších konatatnt). Ta je závislá na taktu procesoru a pár dalších nastavení. Vypočte se to při překladu a je to. A aby se to počítalo při inicializaci procesoru v jádře je přeci totálně mimo.  
Na netu jsem zatím taky nic nenašel. 

Míra

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Ondrej
Sent: Friday, March 26, 2021 8:41 AM
To: hw-list na list.hw.cz
Subject: Re: c: MISRA2012

Pak by mohlo pomoci const

const float tmp = 20.1F / 1.1F;

x = (uint8_t)tmp;


nebo

const uint8_t tmpA = 20.1F * 10.0F;

const uint8_t tmpB = 1.1F * 10.0F;

x = tmpA / tmpB;


Minimálně ten float místo double stojí za úvahu, pokud jde o optimalizaci.


Ondrej



Dne 25.3.2021 v 19:04 Miroslav Draxal napsal(a):
> 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í.
> Překladač to samozřejmě správně vypočte na 18.
>
> !            volatile uint8_t x = (uint8_t) (20.1 / 1.1);
> 0x1412: MOVLW 0x12
> 0x1414: MOVWF obj_size_RAM, ACCESS
>
>
>
> !            volatile double tmp = 20.1 / 1.1; //alebo iny float typ pre danu platformu
> 0x1416: MOVLW 0x8C
> 0x1418: MOVWF dividend, ACCESS
> 0x141A: MOVLW 0x2E
> 0x141C: MOVWF number, ACCESS
> 0x141E: MOVLW 0x92
> 0x1420: MOVWF divisor, ACCESS
> 0x1422: MOVLW 0x41
> 0x1424: MOVWF denom, ACCESS
> !            volatile uint8_t x = (uint8_t) tmp;
> 0x1426: MOVFF dividend, 0x1
> 0x1428: NOP
> 0x142A: MOVFF number, 0x2
> 0x142C: NOP
> 0x142E: MOVFF divisor, 0x3
> 0x1430: NOP
> 0x1432: MOVFF denom, 0x4
> 0x1434: NOP
> 0x1436: CALL 0x300E, 0
> 0x1438: NOP
> 0x143A: MOVF 0x1, W, ACCESS
> 0x143C: MOVWF obj_size_RAM, ACCESS
>
> Takhle ne.
> Míra
>
>
> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Miroslav Šinko
> Sent: Thursday, March 25, 2021 6:28 PM
> To: HW-news
> Subject: Re: c: MISRA2012
>
> Skuste
>
> double tmp = 20.1 / 1.1;  //alebo iny float typ pre danu platformu
> uint8_t x = (uint8_t) tmp;
>
> miro
>
> št 25. 3. 2021 o 18:02 Miroslav Draxal <evik na volny.cz> napísal(a):
>> Dobrý den,
>>
>> Pokud
>>
>> uint8_t x = (uint8_t) (20.1 / 1.1);
>>
>>
>>
>> [misra-c2012-10.8] The value of a composite expression shall not be cast to a different essential type category or a wider essential type
>>
>> uint8_t x = (uint8_t) (20.1 / 1.1);
>>
>>                     ^
>>
>> Jak to správně přetypovat, aby to bylo košér. Čtu kde co, ale nějak mě nenapadá řešení. Pomůžete?
>>
>> Míra
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
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