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