Тонкости программирования в IAR

Не секрет, что для решения одной и той же задачи, два человека выберут различные пути. Точнее, решения не будут идентичными - похожими в общих чертах, но различными в деталях. Это утверждение справедливо и для "пары" автор компилятора - программист.

Поэтому, для создания эффективных программ, необходимо знать об этих "деталях". Единственным способом изучения "деталей" является анализ ассемблерного кода, получаемого после компиляции.

Опуская вопрос необходимости использования лицензионного продукта, попытаюсь описывать "обнаруженные" тонкости.

18.01.09г.

Как "укоротить" прерывание?

Задача: Измерение времени между двумя событиями. (AVR)

Решение: Используем ТС1. TC1 работает с нужной частотой. При возникновении первого события запоминается текущее значение ТС1, а при возникновении второго события текущее значение сравнивается с предыдущим. Для анализа времени превыщающего "емкость" ТС1 будем подсчитывать число переполнений ТС1.

Итак, используем два прерывания: "переполнение" и "захват", при этом предполагается, что число переполнений может достигать 1000 раз.

На первый вгляд, решение такое:

// прерывание по захвату
...
NowTime = CountOvr * 65536 + (ICR1H * 256 + ICR1L);
...
// остальной код не показан
...

, где CountOvr находится как:

// прерывание по переполнению
...
CountOvr++; // размерность int
...

Понятно, что NowTime должна иметь размерность long.

Анализ кода показал, что при входе в прерывание сохраняется только необходимое количество регистров, а просмотр системным include'ов выявил наличие определения 16-битного ригстра ICR1.

Таким образом, long NowTime было решено заменить на int NowCountOvr и int NowTC1. В результате код приобрел вид:

// прерывание по захвату
...
NowCountOvr = CountOvr;
NowTC1 = ICR1;
...

При этом, емкость (расход) RAM не увеличился ([long] = [int]+[int]), а вот результирующий код сократился почти ВДВОЕ!! (19 команд против 36).

Возможный оверхед при вичислении общего времени считаю допустимым, так как он буден находиться НЕ в прерывании.

На главную

Hosted by uCoz