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