Нашел немного инфы по asm-вставкам здесь (может кому будет полезна):
http://www.simple-devices.ru/attachments/a...AVR_04_2011.pdfhttp://www.simple-devices.ru/attachments/a...AVR_05_2011.pdfВ пдфке по второй ссылке, говориться что в asm-вставку операнды можно передавать по имени, т.е. вместо:
CODE
asm(«in %0, %1» : «=r» (value) : «I» (_SFR_IO_ADDR(PORTD)) );
можно писать:
CODE
asm volatile («in [x1], [x2]» : [x1] «=r» (value) : [x2] «I» (_SFR_IO_ADDR(PORTD)) );
У меня почему то это не вышло, писал следующее:
CODE
asm volatile(
"push R0 \n"
"push R1 \n"
"muls %0, %1 \n" // загрузить синус
"pop R1 \n"
"pop R0"
:
:[SINVAL] "d" (sinVal), [COSVAL] "d" (cosVal)
);
В чём я ошибся?
Цитата(Сергей Борщ @ Mar 30 2012, 09:32)

Хотите более надежное решение - изучите соглашение о вызовах и напишите отдельный узкий кусок программы чисто на асме или в крайнем случае на инлайн-асме, а лучше выложите свой код и возможно фуромчане насоветукют вам, как его улучшить не прибегая к извращениям. Поверьте, это возможно.
Конечно, последую Вашему совету... А у Вас не найдется, что почитать? По поводу переноса на другой компилятор... сейчас такого вопроса не стоит и скарей всего не когда и не будет.
Вот кусок коды на С который хочу заставить работать быстрей:
CODE
// вычисляем вещественную и мнимую части
int8_t sinVal = 2;// pgm_read_byte(&FsinTable[FLookignForFreq][CurVal]);
int8_t cosVal = -3;//pgm_read_byte(&FcosTable[FLookignForFreq][CurVal]);
FsummRe[FLookignForFreq] += (int32_t) (Values[CurVal]*cosVal);
FsummIm[FLookignForFreq] += (int32_t) (Values[CurVal]*sinVal);
CurVal++;
if(CurVal >= FAMOUNT_POINTS)
{
ADCA.CTRLA = 0;
Flags = ADC_CONVERSION_COMPLETE;
}
DMA.CH0.CTRLB |= (1 << 4) | (1 << 5); // clear interrupt flags
Собствненно узкое место здесь:
CODE
FsummRe[FLookignForFreq] += (int32_t) (Values[CurVal]*cosVal);
FsummIm[FLookignForFreq] += (int32_t) (Values[CurVal]*sinVal);
Здесь делаю перемножение двух знаковых одно-байтовых чисел и после всё кладу в "сумматор", так я должен делать 256 раз (выше сказанное делается 2 раза, 1 раз для FsummRe и 1 раз для FsummIm). 8x8 == 16 разрядов и поскольку всё кладу в сумматор 256 раз, то конечный результат для FsummRe и FsummIm будет 24 разрядный.
Вот, что получаю от компилятора:
CODE
FsummRe[FLookignForFreq] += (int32_t) (Values[CurVal]*cosVal);
000003EF LDS R30,0x2427 Load direct from data space
000003F1 LDI R31,0x00 Load immediate
000003F2 LDS R26,0x2431 Load direct from data space
000003F4 LDI R27,0x00 Load immediate
000003F5 SUBI R26,0xCA Subtract immediate
000003F6 SBCI R27,0xDA Subtract immediate with carry
000003F7 LD R18,X Load indirect
000003F8 CLR R19 Clear Register
000003F9 SBRC R18,7 Skip if bit in register cleared
000003FA COM R19 One's complement
000003FB LSL R30 Logical Shift Left
000003FC ROL R31 Rotate Left Through Carry
000003FD LSL R30 Logical Shift Left
000003FE ROL R31 Rotate Left Through Carry
000003FF MOVW R16,R30 Copy register pair
00000400 SUBI R16,0xD8 Subtract immediate
00000401 SBCI R17,0xDC Subtract immediate with carry
00000402 MOVW R14,R18 Copy register pair
00000403 LSL R14 Logical Shift Left
00000404 ROL R15 Rotate Left Through Carry
00000405 ADD R18,R14 Add without carry
00000406 ADC R19,R15 Add with carry
00000407 COM R19 One's complement
00000408 NEG R18 Two's complement
00000409 SBCI R19,0xFF Subtract immediate with carry
0000040A CLR R20 Clear Register
0000040B SBRC R19,7 Skip if bit in register cleared
0000040C COM R20 One's complement
0000040D MOV R21,R20 Copy register
0000040E MOVW R26,R16 Copy register pair
0000040F LD R22,X+ Load indirect and postincrement
00000410 LD R23,X+ Load indirect and postincrement
00000411 LD R24,X+ Load indirect and postincrement
00000412 LD R25,X Load indirect
00000413 SBIW R26,0x03 Subtract immediate from word
00000414 ADD R18,R22 Add without carry
00000415 ADC R19,R23 Add with carry
00000416 ADC R20,R24 Add with carry
00000417 ADC R21,R25 Add with carry
00000418 ST X+,R18 Store indirect and postincrement
00000419 ST X+,R19 Store indirect and postincrement
0000041A ST X+,R20 Store indirect and postincrement
0000041B ST X,R21 Store indirect
0000041C SBIW R26,0x03 Subtract immediate from word
Честно, особо не вникал как конкретно делает компилятор... По мне можно сделать так:
1) взять нужные значения и перемножить знаково используя MULS
2) после произвести знаковое сложение 24 разрядного "сумматора" и полученного 16 разрядного результата перемножения
По этому, как мне кажется, реализовать это дело можно намного проще и быстрее...
Жду Ваших комментариев...