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

Miroslav Šinko sinkomiro na gmail.com
Pondělí Listopad 10 01:40:55 CET 2014


 > 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
>
>


Další informace o konferenci Hw-list