Опять уперся в теже самые ворота.
Имею прерывание по таймеру:
Код:
|
void TIM2_IRQHandler (void)
{
u32 i;
TIM2-›SR &=~(TIM_SR_UIF);// сброс ф.прерывания
SWITCH_PIN(PC8);
// for (i=0;i‹40;i++) { __NOP();}
} |
Настроено на сработку с частотой 125 000 Гц. И действительно замеряю частотомером частоту на РС8 - около 62кГц. Все сходиться!
Далее в обработчик должен добавиться несложный код: с десяток простых проверок и выставление нужных флажков. И теперь дабы приблизительно сэмитировать время выполнения этого кода раскомментирую строчку
for (i=0;i‹40;i++) { __NOP();}
По моим приблизительным рассчетам :
Код:
|
{
u32 i;
TIM2-›SR &=~(TIM_SR_UIF);// сброс ф.прерывания +4clk
SWITCH_PIN(PC8); +12clk
for (i=0;i‹40;i++) { __NOP();}
// i++ (+1clk
// i‹40 +1clk
// jmp +1clk)*40
} |
В итоге 4+12+3*40=136clk плюс вход/выход (12clk +12 clk ) = 160 clk.
Для корректной работы обработчика требуется с Fck=24МГц: f24M/f125K=192 clk , т.е. получается запас тактов еще должен быть!
Активных обработчиков которые забирали время больше нет, майн по идее ничего не сьедает.
Асм-листинг Keil мне не дает, поэтому как там в реальности я даже не могу посмотреть. Оптимизация стоит на (-O0). Может быть в этом дело?
Хотелось бы услышать в чем я не прав.
Но главный вопрос в том , как еще можно расчитать время выполнения обработчика, не прибегая к частотомеру ?