Форум разработчиков электроники ELECTRONIX.ru: Глобальный счетчик милисекунд. - Форум разработчиков электроники ELECTRONIX.ru

Jump to content

  • (4 Pages)
  • +
  • 1
  • 2
  • 3
  • 4
  • You cannot start a new topic
  • You cannot reply to this topic

Глобальный счетчик милисекунд. Rate Topic: -----

#16 User is offline   Jenya7 Icon

  • Профессионал
  • PipPipPipPipPip
  • Group: Участник
  • Posts: 1 778
  • Joined: 29 марта 12

Posted 13 июня 2018 - 09:41

Цитата(AlexandrY @ Jun 13 2018, 12:02) <{POST_SNAPBACK}>
У Kinetis есть 64-х битный lifetimer на базе PIT. Так что хватит на всю жизнь с точностью в 16 ns


PIT не имеет пределителя. его невозможно настроить на 1 милисекундный тик.

можно через второй таймер но второй таймер генерирует прерывание - а я этого хочу избежать.

Код
// Timer 2
PIT_LDVAL2 = 0x00000009; // setup Timer 2 for 10 counts
PIT_TCTRL2 = TIE; // enable Timer 2 interrupt
PIT_TCTRL2 |= CHN; // chain Timer 2 to Timer 1
PIT_TCTRL2 |= TEN; // start Timer 2
// Timer 1
PIT_LDVAL1 = 0x23C345FF; // setup Timer 1 for 600 000 000 cycles
PIT_TCTRL1 = TEN; // start Timer 1

This post has been edited by Jenya7: 13 июня 2018 - 09:56

0

#17 User is offline   jcxz Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Свой
  • Posts: 5 228
  • Joined: 03 июля 08

Posted 13 июня 2018 - 09:48

Цитата(Jenya7 @ Jun 13 2018, 09:41) <{POST_SNAPBACK}>
PIT не имеет пределителя. его невозможно настроить на 1 милисекундный тик.

2 AlexandrY: неужто у супер-пупер кинетиса нету таймера с хотя-бы 20-битным прескалером? или возможности использования в качестве такого прескалера другого таймера (concatenating)? smile3046.gif
0

#18 User is offline   Сергей Борщ Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Модераторы
  • Posts: 8 455
  • Joined: 15 мая 06

Posted 13 июня 2018 - 11:03

QUOTE (Jenya7 @ Jun 13 2018, 09:41) <{POST_SNAPBACK}>
PIT не имеет пределителя. его невозможно настроить на 1 милисекундный тик
Что мешает считать в тиках таймера?

На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
0

#19 User is offline   ViKo Icon

  • Универсальный солдатик
  • PipPipPipPipPipPip
  • Group: Модераторы
  • Posts: 8 634
  • Joined: 01 ноября 05

Posted 13 июня 2018 - 11:25

Цитата(Jenya7 @ Jun 11 2018, 07:27) <{POST_SNAPBACK}>
Это очень удобно и работать с переменной просто но мне не нравиться парадигма прерывания програмы каждую милисекунду.

Допустим, тактовая частота процессора 120 МГц. На вход в прерывание и выход тратим по 12 тактов. На инкремент счетчика, пусть, еще 12 тактов. Итого:
36 / 120 000 = 0,0003
Вы боитесь потерять производительность на 0,03%? rolleyes.gif
0

#20 User is offline   AlexandrY Icon

  • Ally
  • PipPipPipPipPipPip
  • Group: Модераторы
  • Posts: 6 232
  • Joined: 19 января 05

Posted 13 июня 2018 - 11:55

Цитата(jcxz @ Jun 13 2018, 09:48) <{POST_SNAPBACK}>
2 AlexandrY: неужто у супер-пупер кинетиса нету таймера с хотя-бы 20-битным прескалером? или возможности использования в качестве такого прескалера другого таймера (concatenating)? smile3046.gif

Так это и есть после конкатенации. Но при этом атомарное чтение.
0

#21 User is offline   Jenya7 Icon

  • Профессионал
  • PipPipPipPipPip
  • Group: Участник
  • Posts: 1 778
  • Joined: 29 марта 12

Posted 13 июня 2018 - 12:00

Цитата(ViKo @ Jun 13 2018, 14:25) <{POST_SNAPBACK}>
Допустим, тактовая частота процессора 120 МГц. На вход в прерывание и выход тратим по 12 тактов. На инкремент счетчика, пусть, еще 12 тактов. Итого:
36 / 120 000 = 0,0003
Вы боитесь потерять производительность на 0,03%? rolleyes.gif


я не боюсь потерять производительность. я не хочу чтоб у меня прерывание молотило кажую милисекунду. если вам это не мешает то вы счастливый человек. sm.gif

Цитата(Сергей Борщ @ Jun 13 2018, 14:03) <{POST_SNAPBACK}>
Что мешает считать в тиках таймера?
это типа шутка?

0

#22 User is offline   ViKo Icon

  • Универсальный солдатик
  • PipPipPipPipPipPip
  • Group: Модераторы
  • Posts: 8 634
  • Joined: 01 ноября 05

Posted 13 июня 2018 - 12:05

Цитата(Jenya7 @ Jun 13 2018, 12:00) <{POST_SNAPBACK}>
я не боюсь потерять производительность. я не хочу чтоб у меня прерывание молотило кажую милисекунду. если вам это не мешает то вы счастливый человек. sm.gif

Как может мешать нечто с нагрузкой 0,03%? laughing.gif
Из-за неоптимального кода можно потерять куда больше.
Прерывание лишнего тока не ест, помех не создает. Все ОС используют прерывание от системного таймера.
0

#23 User is offline   Jenya7 Icon

  • Профессионал
  • PipPipPipPipPip
  • Group: Участник
  • Posts: 1 778
  • Joined: 29 марта 12

Posted 13 июня 2018 - 12:25

Цитата(ViKo @ Jun 13 2018, 15:05) <{POST_SNAPBACK}>
Как может мешать нечто с нагрузкой 0,03%? laughing.gif
Из-за неоптимального кода можно потерять куда больше.
Прерывание лишнего тока не ест, помех не создает. Все ОС используют прерывание от системного таймера.

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

#24 User is offline   adnega Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Свой
  • Posts: 2 724
  • Joined: 14 мая 07

Posted 13 июня 2018 - 12:35

Jenya7, вы по все видимости начинающий разработчик - прислушайтесь к советам опытных МК-программистов.

Зачем вам аппаратный таймер, если вы от него даже прерываний боитесь? Это две крайности.
Нужно сделать аппаратный таймер для счета программного счетчика с интервалом 1 или 10 мс.
Затем все миллисекундные задержки и выше делать программно. Только так.
Если у вас какая-то неприязнь к такому решению, то вы в чем-то заблуждаетесь - можете высказать свои "фи", и мы вас переубедим.
Повторюсь, у Cortex-ов есть специальный таймер SysTick, и 99% проектов использует его
для миллисекундных и выше задержек, с программным отсчетом времени.
Задержки на микросекунды и ниже уже могут потребовать аппаратный таймер.
Использование аппаратного таймера жестко привязывает проект к данной архитектуре и данному камню - проект будет
слабо переносимым и склонным к аппаратным конфликтам с другими библиотеками и т.п.

Насколько я понимаю, ТС хочет сделать некую инициализацию, чтоб потом вычитывать из некого регистра число, равное числу миллисекунд.
Желательно, чтоб регистр был 32-битным. Вроде, у LPC17xx таймеры были 32 битными с 32-битным предделителем.

Цитата(Jenya7 @ Jun 13 2018, 12:25) <{POST_SNAPBACK}>
у меня есть критические секции. можно сказать очень критические. я не могу их сделать атомик, мне другие прерывания важны.

У Cortex-M есть NVIC, который может делать вложенные прерывания с приоритетами.
Если 32-битная переменная выровненная, то доступ к ней будет атомарным.
Но я так понял, что из счетчика миллисекунд бы будете только вычитывать.
0

#25 User is offline   ViKo Icon

  • Универсальный солдатик
  • PipPipPipPipPipPip
  • Group: Модераторы
  • Posts: 8 634
  • Joined: 01 ноября 05

Posted 13 июня 2018 - 12:36

Цитата(Jenya7 @ Jun 13 2018, 12:25) <{POST_SNAPBACK}>
у меня есть критические секции. можно сказать очень критические. я не могу их сделать атомик, мне другие прерывания важны.

Такие критические, что 0,3 мкс не могут подождать? Не верю.
0

#26 User is offline   adnega Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Свой
  • Posts: 2 724
  • Joined: 14 мая 07

Posted 13 июня 2018 - 12:38

Цитата(Jenya7 @ Jun 13 2018, 12:25) <{POST_SNAPBACK}>
можно сказать очень критические

Можете подробнее рассказать о них?
Это не норма, такие вещи нужно делать аппаратно и/или подбирать соответствующее аппаратное решение.
Я уже 10 лет не пользуюсь запретом/разрешением прерываний, а проектов сделал очень много. ЧЯДНТ?
0

#27 User is offline   Jenya7 Icon

  • Профессионал
  • PipPipPipPipPip
  • Group: Участник
  • Posts: 1 778
  • Joined: 29 марта 12

Posted 13 июня 2018 - 12:41


adnega так что вы предлагаете? я честно говоря так и не понял.
по моему вот этого
Цитата
Нужно сделать аппаратный таймер для счета программного счетчика с интервалом 1 или 10 мс.
я и пытаюсь добиться.

0

#28 User is offline   jcxz Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Свой
  • Posts: 5 228
  • Joined: 03 июля 08

Posted 13 июня 2018 - 12:52

Цитата(Jenya7 @ Jun 13 2018, 12:00) <{POST_SNAPBACK}>
это типа шутка?

Не шутка. Так все и делают... кроме вас почему-то... laughing.gif

Цитата(adnega @ Jun 13 2018, 12:35) <{POST_SNAPBACK}>
Jenya7, вы по все видимости начинающий разработчик - прислушайтесь к советам опытных МК-программистов.

Ага, уже лет N как начинающий и всё не могущий начать biggrin.gif
0

#29 User is offline   adnega Icon

  • Гуру
  • PipPipPipPipPipPip
  • Group: Свой
  • Posts: 2 724
  • Joined: 14 мая 07

Posted 13 июня 2018 - 13:15

Цитата(Jenya7 @ Jun 13 2018, 12:41) <{POST_SNAPBACK}>
по моему вот этогоя и пытаюсь добиться.

Дык, настраиваете SysTick на генерацию прерываний с интервалом 1 мс, а в обработчике прерывания делаете
Код
maintimer++;

, где maintimer - 32-битная переменная, в которой будут лежать миллисекунды.
0

#30 User is offline   Jenya7 Icon

  • Профессионал
  • PipPipPipPipPip
  • Group: Участник
  • Posts: 1 778
  • Joined: 29 марта 12

Posted 13 июня 2018 - 13:17

Цитата(adnega @ Jun 13 2018, 16:15) <{POST_SNAPBACK}>
Дык, настраиваете SysTick на генерацию прерываний с интервалом 1 мс, а в обработчике прерывания делаете
Код
maintimer++;

, где maintimer - 32-битная переменная, в которой будут лежать миллисекунды.


мда... ну вобщем тему можно закрывать. признаюсь был не прав.
0

  • (4 Pages)
  • +
  • 1
  • 2
  • 3
  • 4
  • You cannot start a new topic
  • You cannot reply to this topic

1
0