Цитата(Сергей Борщ @ Jun 20 2010, 10:36)

Да еще и результат компиляции такого цикла может быть разным для разных уровней оптимизации и разных версий компилятора.
Если в системе есть тикающий таймер, который работает на частоте проца, то совсем нечего делать.
delay_us( ) сведется к
{
unsigned StartTime = *TIMER_CURR;
while( *TIMER_CURR - StartTime < n);
}
Если нет, то ассемблер ведь имеется.... а значит все не так уж скверно.
Пишем и размещаем где угодно
Код
__asm void delay_cycles(unsigned n)
{
do_wait
DEC r0
BNE do_wait
BX lr
}
Затем калибруем для получения "delay_us".
Как сделать. Ну напр так, при инициализации:
1. запустить таймер с частотой PCLK (где PCLK - при возможности сделать равной MCLK - частоте проца)
2. выполнить 1000 раз delay_cycles( n ), где n - число больше 0 но не больше чем частота MCLK / Mhz / 3
3. прочитать таймер, получить число тактов "Ticks" начиная со старта теста.
4. посчитать реальное время Tmks (в микросекундах) затраченное на 1000 пусков delay_cycles( n ), как Ticks * 10^6 / PCLK.
5. раcсчитать реальное Ncycles с которым необходимо запускать delay_cycles( Ncycles) чтобы получить задержку в 1us, по простой пропорции:
Ncycles = n * 1000 / Tmks
6. Проверить точность Ncycles (проходом с п.1 по п.4)
7. ну и подкрутить delay_cycles() парочкой NOP'ов если потребуется.