Arduino - 32 bitu promenna ze 4 byte

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Čtvrtek Prosinec 19 13:07:30 CET 2024


Ve vetvich switche to snad neslo nikdy a nikde, ona je otazka, jak si 
predstavit obor platnosti takove promenne. Resenim je udelat pro pvetev 
blok a je to jasne.

Vyjimky jsem jednou zkusil v C++ pro STM32 a hned jsem to zas vypnul - 
Hello world mel snad100kB programu a mraky dat, to na embeded systemy 
asi neni ;-)

Dne 19.12.2024 v 13:01 Pavel Hudeček napsal(a):
> Zajímavý. Nějak jsem si zvyknul, že v c++ můžu založit proměnnou 
> kdekoli, ne jen na začátku bloku. No asi to teda má výjimky.
>
> Zajímavý je, že jsem tuhle potřebu, zakládat je ve switchi, měl 
> vždycky jen na MCU. Když toho bylo víc, dělal jsem bloky do, když míň, 
> tak univerzální proměnný nad switchem. Ale vždycky jsem si myslel, že 
> to je jen specifikum MCU kompilátorů. Teď jsem to teda zkusil ve VS22 
> a nejde taky.
>
> Víc mi teda ale vadí, že pro AVR nemůžu použít templatový vychytávky z 
> novějších C++. Třeba když chci inicializovat pole hodnotama 
> vypočtenejma podle funkce. A samozřejmě try taky dost chybí. Třeba 
> is_same se dá snadno dodělat a normálně používat v templatech, ale ... 
> se dodělat nedaj.
>
> PH
>
> Dne 19.12.2024 v 11:16 Zuffa Jan napsal(a):
>> DD,
>>
>> Definovat premenne v bloku switch nedovoli ani kompilator od MS
>> cize to bude asi standard.
>>
>> j.
>>
>> -----Original Message-----
>> From: Hw-list <hw-list-bounces na list.hw.cz> On Behalf Of Pavel Hudecek
>> Sent: Thursday, December 19, 2024 10:11 AM
>> To: hw-list na list.hw.cz
>> Subject: Re: Arduino - 32 bitu promenna ze 4 byte
>>
>> Ono je to celý vytažený z místa, kde okolnosti vedly k tomuhle 
>> uspořádání. Jednak základní myšlenka byla, že všechny řádky v týhle 
>> části budou stejný, aby se v případě potřeby dalo snadno obrátit pořadí.
>>
>> Druhá věc je, že to je uvnitř switche a tam z nějakého záhadného 
>> důvodu kompilátor pro AVR odmítá zakládat proměnné, takže jsou před 
>> switchem založený různý univerzální, který se pak používaj uvnitř. 
>> Jako chápu že asi byli lýný dělat třeba try, nebo templaty s ... (což 
>> je jinak často mnohem lepší než klasika va_arg), ale proč tohle? wtf??
>>
>> PH
>>
>> Dne 19.12.2024 v 1:55 Miroslav Šinko napsal(a):
>>> pri optimalizaciach asi nema zmysel riesit redundantne zapisy.
>>>
>>> mna to zaujalo hned, aj cele tie shifty. ale nema to cenu moc riesit,
>>> ked to funguje a nie je to vyslovene zle zapisane.
>>>
>>> toto by som ja takto nepisal:
>>>>>       uint64_t u64;
>>>>>       while (1) {
>>>>>
>>>>>           //u64=0ULL;
>>>>>           //u64 <<= 8; u64 |= SIGROW.SERNUM5;
>>> ked uz uint64_t u64
>>> a chcem ju nastavit na 0, tak rovno tu a nie v kode, t.j.takto:
>>> uint64_t u64 = 0; //a tu su postfixy nepodstatne, 0 je 0 a pozor!
>>> inicializovanie premennej pri deklaracii predchadza problemom. vy ste
>>> ju inicializovali v kode, ok. ale v kolkych pripadoch sa na to
>>> zabudne? kolkokrat sme sa na tom popalili?
>>> (recnicka orazka)
>>>
>>> no a prvy posun nuly je zbytocny.. t.j. co som napisal je ok, ale v
>>> tomto pripade by som zacal takto inicializaciou na prvu potrebnu 
>>> hodnotu:
>>> uint64_t u64 = SIGROW.SERNUM5; //mozno plus nejake pretypovanie ..atd
>>>
>>> miro
>>>
>>> On 18.12.2024 21:28, Pavel Hudeček wrote:
>>>> Pardon, chybička se vloudila:-)
>>>>
>>>> Nemělo bejt +1, ale +n.
>>>> A to má dost velkej vliv na skóre:
>>>>
>>>> původní: 470, bez 1. shiftu taky 470
>>>> upravená: 790, bez toho shiftu ovšem 450.
>>>>
>>>> Všechno ale s -Og. Po zapnutí -Os všechny 4 možnosti 378 :-)
>>>>
>>>> PH
>>>>
>>>> Dne 18.12.2024 v 21:05 Pavel Hudeček napsal(a):
>>>>> Je to trochu složitější:-)
>>>>>
>>>>> int main(void) {
>>>>>
>>>>>      uint64_t u64;
>>>>>      while (1) {
>>>>>
>>>>>          //u64=0ULL;
>>>>>          //u64 <<= 8; u64 |= SIGROW.SERNUM5;
>>>>>          u64 <<= 8; u64 = SIGROW.SERNUM5;
>>>>>
>>>>>          u64 <<= 8; u64 |= SIGROW.SERNUM4;
>>>>>          u64 <<= 8; u64 |= SIGROW.SERNUM3;
>>>>>          u64 <<= 8; u64 |= SIGROW.SERNUM2;
>>>>>          u64 <<= 8; u64 |= SIGROW.SERNUM1;
>>>>>          u64 <<= 8; u64 |= SIGROW.SERNUM0;
>>>>>
>>>>>           // aby byla jistota, že to celý neodoptimalizuje
>>>>>          u64++;
>>>>>          for (uint8_t n=0; n<8; n++) {
>>>>>              PORTA.OUT = *(((uint8_t *)&u64)+1);
>>>>>          }
>>>>>      }
>>>>> }
>>>>>
>>>>> Zakomentovaná varianta 444 B, vylepšená 478.
>>>>>
>>>>> Až po odmazání prvního u64 <<= 8; se to zlepší na 442 a původní
>>>>> zůstane na 444.
>>>>>
>>>>> Takže nakonec je to o 2 B lepší. Ale zas ta původní varianta má
>>>>> snadno modifikovatelné pořadí, což byla základní myšlenka proč jsem
>>>>> to tak napsal.
>>>>>
>>>>> PH
>>>>>
>>>>>
>>>>> Dne 18.12.2024 v 16:53 Petr Labaj napsal(a):
>>>>>> Je zajímavé, že jste oba použili podobnou konstrukci, která je
>>>>>> podle mě suboptimální.
>>>>>> Když už jste teda zvolili ty shifty místo nějakých rychlejších
>>>>>> možností.
>>>>>>
>>>>>> První řádek by měl být podle mě dosazovací.
>>>>>>
>>>>>> Tedy nějak takto:
>>>>>> adc_value = (long)d[0] << 24;
>>>>>> adc_value += (long)d[1] << 16; ...
>>>>>>
>>>>>> A u pana Hudečka ještě bez toho úvodního nulování:
>>>>>>   u64 <<= 8; u64 = SIGROW.SERNUM5;
>>>>>>   u64 <<= 8; u64 |= SIGROW.SERNUM4;
>>>>>> ...
>>>>>>
>>>>>> PL
>>>>>>
>>>>>> ******************
>>>>>>
>>>>>> Dne 18.12.2024 v 9:56 Jirka Mww napsal(a):
>>>>>>>   adc_value += (long)d[0] << 24;
>>>>>>>   adc_value += (long)d[1] << 16;  adc_value += (long)d[2] << 8;
>>>>>>>   adc_value += (long)d[3];
>>>>>>>
>>>>>> Dne 18.12.2024 v 13:26 Pavel Hudeček napsal(a):
>>>>>>> u64=0ULL;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM5;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM4;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM3;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM2;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM1;
>>>>>>>                  u64 <<= 8; u64 |= SIGROW.SERNUM0;
>> _______________________________________________
>> 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