Re: GCC sloučení do správného typu

Jindroush jindroush na seznam.cz
Čtvrtek Říjen 7 10:02:58 CEST 2021


On 07.10.2021 9:59, Jindrich Fucik wrote:
> Dne 7.10.2021 v 9:24 Jindroush napsal(a):
>> On 07.10.2021 9:03, Jindrich Fucik wrote:
>>> mám tu jednu takovou spíš akademickou otázku. Nejprve popíšu 
>>> prostředí. Hardware je ESP8266, programovaný v Arduino IDE, takže 
>>> překladač je GCC.
>>>
>>> ESP je připojeno sériovou linkou do zařízení, které komunikuje 
>>> sedmibitově. zařízení je založeno na 8bit intel platformě, data jsou 
>>> tedy integery 16 bit (znaménkové). Při posílání se nejprve posílá 
>>> MSB, první dva bity, pak prostředních 7 a pak posledních 7 LSB. Data 
>>> přečtu jako pole "byte" (což je jen alias k unsigned char). Pokud se 
>>> pokusím to rozepsat po bitech tak je to takto:
>>>
>>> precteno byte[3]
>>> |0 0 0 0  0 0 D15 D14| |0 D13 D12 D11  D10 D9 D8 D7| |0 D6 D5 D4 D3 
>>> D2 D1 D0|
>>>
>>> A teď otázka - jak nejefektivněji na tom ESP poskládat zpátky int, 
>>> který zachová znaménko? 
>>
>> pokud mate int16_t na tom esp, tak asi nejak jako, pokud je 
>> zajisteno, ze to, co jste vyse napsal jako '0' je vzdy 0.
>> int16_t res = ( precteno[0] << 14 ) || ( precteno[1]) << 7 ) || 
>> precteno[2];
>> Netusim samozrejme, jak drahy je na takovem procesoru shift a v jak 
>> 'dlouhe' smycce to je.
>>
>
> To je právě to, co je na mé otázce akademické. Takhle od boku to 
> napsat je jednoduché, ale jestli je to ta nejlepší cesta? Jestli se 
> třeba nevyplatí ten int16_t rozkládat na dva chary a naplnit je 
> samostatně? 
Na to je jednoducha odpoved - dejte si to do opravdu dlouhe smycky a 
zmerte si to. Stejne se bez nasobeni (drahe) nebo shiftu (levnejsi) 
neobejdete.

-- 
Jindroush <jindroush at seznam.cz>



Další informace o konferenci Hw-list