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