Arduino - 32 bitu promenna ze 4 byte
Pavel Hudeček
edizon na seznam.cz
Čtvrtek Prosinec 19 14:46:19 CET 2024
No a pak paradoxně můžu udělat na PC template, kterej vygeneruje
konstantní pole s 256 hodnotama 32767*sin od 0 do pí/2, který tam k
ničemu nevyužiju, ale na MCU, kde by se hodilo, smůla, musím si ho
externím nástrojem předgenerovat a vložit do zdrojáku, nebo přilinkovat.
Nejde template s ... abych udělal funkci co má libovolný počet
parametrů, aniž by tam byl navíc první, ze kterýho plyne kolik je těch
dalších.
PH
Dne 19.12.2024 v 14:24 David Obdrzalek napsal(a):
> Víceméně základní pravidlo na mikrokontrolerech je, že není rozumné používat to, co
> by se z hlediska jazyka muselo vyhodnocovat/rozhodovat za běhu. Co dokáže udělat
> kompilátor při překladu, bývá OK. Samozřemě až na věci, které jsou sice dané při
> překladu, ale jsou s větší paměťovou nebo algoritmickoou náročností, protože paměti
> pro data ani program není moc.
> Anebo taky věci, které využívají komfort operačního systému, protože ted tady není.
>
> D.O.
>
> On 19 Dec 2024 at 13:01, Pavel Hudeček wrote:
>
>> 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
>
>
> _______________________________________________
> 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