время выполнения команды

Тема в разделе "Arduino & Shields", создана пользователем СВиктор, 23 мар 2016.

  1. Понимаю что тема избитая, но все же.
    Время выполнения команды ардуино 1 такт, 2 такта или n тактов.
    Кварц 16 Мгц.
    1 такт - 1/16 000 000 гц * 1 000 000 (мкс) = 0,0625 мкс

    т.е. 1 тактовые команды выполняются за 0,0625 мкс,
    2 тактовые за 0,125 мкс
    и т.д.

    Это так?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

  3. это радует, на всякий случай уточнил, потому что в pic умножаем еще на 4
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    А вам быстродействие настолько принципиально, что приходится такты считать?
     
  5. Угол зажигания на машине, на шкиву 60 зубов, т.е. каждый зуб 6 градусов, при оборотах 6000 отсчет уже между зубьями проходит за 166 мкс. Поэтому и такты считать, чтобы не пропустить следующий отсчет
     
  6. Unixon

    Unixon Оракул Модератор

    Может пора сменить микроконтроллер на более адекватный задаче?
     
  7. Sindbad

    Sindbad Гик

    И Ардуино IDE не самый лучший инструмент для подсчета каждого такта.
    Вот интересное исследование сколько времени съедают только вызовы loop(): http://arduino.ru/forum/programmirovanie/chastota-vyzovov-loop
    Также нужно помнить, что команды работы АЦП и записи в EEPROM требуют существенно больше одного такта.
     
  8. я думаю для посчета угла и минимальных действий должно хватить, задачи сделать инжектор с кучей датчиков не стоит, а для отслеживания нескольких датчиков, да и то не в аналоговом режиме вполне достаточно
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    вот фрагмент из моего проекта, где есть отладочный расчет времени выполнения чего-то:
    Код (C++):
    #define PROCTIME   // закомментировать после отладки


    #ifdef PROCTIME              // Проверяем, сколько времени занимает выполнение функции
      long processTime = millis();
    #endif

    // здесь делаем что-то

    #ifdef PROCTIME
      Serial.print("Execution time: \t\t\t");
      Serial.print(millis() - processTime);
      Serial.println(" ms\n");
    #endif
     
  10. Unixon

    Unixon Оракул Модератор

    Вы этим отдельные такты советуете измерять? :)
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    нет, это скелет для дальнейшей работы ТС ;)
    Ну и миллисекунды можно заменить на микросекунды, для большинства применений точности хватит.
     
  12. Unixon

    Unixon Оракул Модератор

    Если уж так нужно узнать время выполнения, запускаете 16-битный таймер с prescaler=1, делаете, что нужно, останавливаете таймер, считываете его значение, из этого вычитаете значение таймера, соответствующее пустому действию (если оно не равно 0). При этом действие не должно занимать более 64k тактов, т.е. ~4мс при 16 МГц.
     
  13. Onkel

    Onkel Гуру

    я вставляю команду пин(какой нибуль)=1 в начале и пин=0 в конце сегмента, длительность которого нужно измерить, и смотрю на осциллографе.
     
    Megakoteyka и ИгорьК нравится это.
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    Самый простой и надежный способ, особенно, если дергать пин через регистр, а не библиотечной командой.
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    166 мкс/62,5 нс = 2656 тактов - уйма времени, если работать напрямую с регистрами.
     
  16. Вот и я о том же
     
    Последнее редактирование: 24 мар 2016
  17. Megakoteyka

    Megakoteyka Оракул Модератор

  18. Onkel

    Onkel Гуру

    конечно через регистр, я с библиотечными командами и не дружу, например PINB.1=1; и PINB.1=0;
    Очень удобно, когда минимизируешь время обработки прерывания