Цитата(zltigo @ Oct 1 2008, 12:38)

Вы бы показали какую функцию хочется "заоптимизировать", а то я тоже "остаюсь при своем мнении"

Ну во первых я нигде и словом не обмолвился что хочу что-то оптимизировать.
Более того, считаю свои познаниями в ассемблере ниже среднего уровня и стараюсь писать код только на С.
Код который я был ВЫНУЖДЕН написать на асмовских вставках производит измерение тактовый частоты микроконтроллера, с помощью асинхронного осциллятора на часовом кварце. И поэтому мне необходимо знать сколько тактов длиться одно измерение.
Также у меня требования к коду, это работоспособность оного на любом уровне оптимизации компилятора. А теперь добавилось требование это работоспособность под IAR.
А по сему чтобы не зависеть от опций компилятора при сборке библиотеки (а моим конечным продуктом является не конечное работоспособное устройство, а библиотека с набором функций) я сделал вставки на асме.
Не стал делать функции на чистом асме по одной простой причине. Для avr нет никакого стандарта передачи параметров в функцию и обратно подобно thumb-interwork для arm. И поэтому каждый производитель asm компилятора бузует свои правила кто во что горазд. А асмовская вставка в сишный код позволяет невилировать это разнообразия-безобразия за счёт С компилятора. Так что всё таки это не пижонство

, а суровые будни программиста.
Вот моя функция целиком
Код
/******************************************************************************
Calculates number of cycles during EXTERNAL_TICKS period.
Parameters:
none
Returns:
number of the cycles.
******************************************************************************/
static uint16_t halMeasurement(void)
{
register volatile uint16_t cnt asm ("r24") = 0;
ASM (
"push r21 \n\t"
"lds r21, 0x00B6 \n\t" /* ASSR |= (1 << AS2) */
"ori r21, 0x80 \n\t" /* ASSR |= (1 << AS2) */
"sts 0x00B6, r21 \n\t" /* ASSR |= (1 << AS2) */
"ldi r21, 0x01 \n\t" /* TCCR2B = 1 << CS20 */
"sts 0x00B1, r21 \n\t" /* TCCR2B = 1 << CS20 */
"pop r21 \n\t"
);
cnt = 0;
ATOMIC_SECTION_ENTER
#if EXTERNAL_TICKS == 100
ASM (
".set EXTERNAL_TICKS, 0x64 \n\t"
"push r21 \n\t"
"ldi r21, 0 \n\t" /* TCNT2 = 0 */
"sts 0x00B2, r21 \n\t" /* TCNT2 = 0 */
"__l0: \n\t"
"lds r21, 0x00B6 \n\t"
"andi r21, 0x1B \n\t"
"brne __l0 \n\t" /* while (ASSR & 0x1B); */
"__l1: \n\t"
"adiw r24, 0x01 \n\t" /* cnt ++ (2 cycle) */
"lds r21, 0x00B2 \n\t" /* read TCNT2 */
"subi r21, EXTERNAL_TICKS \n\t" /* TCNT2 - EXTERNAL_TICKS */
"brmi __l1 \n\t" /* if TCNT2 > EXTERNAL_TICKS then exit */
"pop r21 \n\t"
);
ATOMIC_SECTION_LEAVE
return cnt;
}
#else
#error " EXTERNAL_TICKS must be 100 "
#endif
Первую асмовскую вставку можно было бы и не деалть, а оставить код на С, но её я написал для тренировки

. А вот без второй я думаю обойтись нельзя.