OT gcc inline assembler mimo tela fcie; was: AC Load Analyzer

Miroslav Mraz mraz na seznam.cz
Pondělí Listopad 10 09:16:10 CET 2014


Vida, offsetof, to mě fakt nenapadlo, dík.

Mrazík

On 11/10/2014 01:40 AM, Miroslav Šinko wrote:
> > Možná někdo přijde na to, jak udělat
> > čistě v C
>
> Netvrdim, ze je to uplne ciste, alebo ze je to prehladnejsie, ako Vas
> zapis v asm :-) Ale ako cvicenie to bolo dobre a v GCC to funguje
> napr. nasledovne (mam tu avr-gcc 4.5.1)
>
> #define USB_STRING_DESCRIPTOR_TYPE 0xAA //len priklad
>
> #define VALUES    "\x09\x04"
> #define STRING_MANUFACTURER "M\0r\0a\0z\0i\0k\0 \0l\0a\0b\0s\0.\0\n"
>
> typedef struct __attribute__((packed))
> {
>   uint8_t size_1;
>   uint8_t USB_StringDescriptorType1;
>   uint8_t values[sizeof(VALUES)-1];    //minus ukoncovacia \0
>   uint8_t size_2;
>   uint8_t USB_StringDescriptorType2;
>   uint8_t manufacturer[sizeof(STRING_MANUFACTURER)-1];     //minus \0
> }USB_STRING_DESCRIPTOR;
>
> const USB_STRING_DESCRIPTOR PROGMEM descr=
> {
>   //vypocet dlzky pola vramci struktury
>   offsetof(USB_STRING_DESCRIPTOR, size_2) -
>     offsetof(USB_STRING_DESCRIPTOR, USB_StringDescriptorType1),
>   USB_STRING_DESCRIPTOR_TYPE,
>   VALUES,
>   //vypocet dlzky pola na konci struktury
>   sizeof(USB_STRING_DESCRIPTOR) -
>     offsetof(USB_STRING_DESCRIPTOR,  USB_StringDescriptorType2),
>   USB_STRING_DESCRIPTOR_TYPE,
>   STRING_MANUFACTURER
> };
>
> vysledok:
> 00000120 <descr>:
> 03 aa 09 04 1a aa 4d 00 72 00 61 00 7a 00 69 00 ......M.r.a.z.i.
> 6b 00 20 00 6c 00 61 00 62 00 73 00 2e 00 0a    k. .l.a.b.s....
>
> miro
>
>
>
> On 9.11.2014 23:06, Miroslav Mraz wrote:
>> Ano, problém byl asi v tom Extended, tedy v propojení s C. Protože jak
>> jsem tak koukal, tak asm mimo tělo funkce používám už dost dlouho -
>> třeba na string descriptory pro USB např.:
>>
>> // Index 0x00: LANGID Codes
>> "USB_StringDescriptor:\n\t"
>> ".byte (label_1 - .)\n\t" // <- délka následujícího pole, v C problém
>> ".byte USB_STRING_DESCRIPTOR_TYPE\n\t"
>> ".byte 0x09, 0x04\n"
>> // Index 0x01: Manufacturer string
>> "label_1:\n\t" // počítá se za překladu k této značce
>> ".byte (label_2 - .)\n\t"
>> ".byte USB_STRING_DESCRIPTOR_TYPE\n\t"
>> ".byte 'M,0,'r,0,'a,0,'z,0,'i,0,'k,0,' ,0,'l,0,'a,0,'b,0,'s,0,'.,0\n"
>> // Index 0x02: Product
>> "label_2:\n\t"
>> ...
>>
>> Protože neumím dostat tu délku nějak rozumně v C do konstanty a nechci
>> kvůli tomu dělat kopii do RAM. Možná někdo přijde na to, jak udělat
>> čistě v C, ale mě nic nenapadá.
>>
>> Mrazík
>>
>>
> _______________________________________________
> 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