Перейти к содержанию
    

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

У 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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это очень удобно и работать с переменной просто но мне не нравиться парадигма прерывания програмы каждую милисекунду.

Допустим, тактовая частота процессора 120 МГц. На вход в прерывание и выход тратим по 12 тактов. На инкремент счетчика, пусть, еще 12 тактов. Итого:

36 / 120 000 = 0,0003

Вы боитесь потерять производительность на 0,03%? :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, тактовая частота процессора 120 МГц. На вход в прерывание и выход тратим по 12 тактов. На инкремент счетчика, пусть, еще 12 тактов. Итого:

36 / 120 000 = 0,0003

Вы боитесь потерять производительность на 0,03%? :rolleyes:

 

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

 

Что мешает считать в тиках таймера?
это типа шутка?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Как может мешать нечто с нагрузкой 0,03%? :laughing:

Из-за неоптимального кода можно потерять куда больше.

Прерывание лишнего тока не ест, помех не создает. Все ОС используют прерывание от системного таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как может мешать нечто с нагрузкой 0,03%? :laughing:

Из-за неоптимального кода можно потерять куда больше.

Прерывание лишнего тока не ест, помех не создает. Все ОС используют прерывание от системного таймера.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Зачем вам аппаратный таймер, если вы от него даже прерываний боитесь? Это две крайности.

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

Затем все миллисекундные задержки и выше делать программно. Только так.

Если у вас какая-то неприязнь к такому решению, то вы в чем-то заблуждаетесь - можете высказать свои "фи", и мы вас переубедим.

Повторюсь, у Cortex-ов есть специальный таймер SysTick, и 99% проектов использует его

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

Задержки на микросекунды и ниже уже могут потребовать аппаратный таймер.

Использование аппаратного таймера жестко привязывает проект к данной архитектуре и данному камню - проект будет

слабо переносимым и склонным к аппаратным конфликтам с другими библиотеками и т.п.

 

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

Желательно, чтоб регистр был 32-битным. Вроде, у LPC17xx таймеры были 32 битными с 32-битным предделителем.

 

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

У Cortex-M есть NVIC, который может делать вложенные прерывания с приоритетами.

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

Но я так понял, что из счетчика миллисекунд бы будете только вычитывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно сказать очень критические

Можете подробнее рассказать о них?

Это не норма, такие вещи нужно делать аппаратно и/или подбирать соответствующее аппаратное решение.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

adnega так что вы предлагаете? я честно говоря так и не понял.

по моему вот этого

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это типа шутка?

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по моему вот этогоя и пытаюсь добиться.

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

maintimer++;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

maintimer++;

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...