реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Глобальный счетчик милисекунд.
Jenya7
сообщение Jun 11 2018, 04:27
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть програма для Kinetis K10.
В ней есть глобальный счетчик милисекунд который инкрементируется каждую милисекунду в прерывании.
Код
void TI1_OnInterrupt(LDD_TUserData *UserDataPtr)
{
   globalSysTimer++;
}
И на основе этой переменной строятся таймауты и периодические циклы.
Это очень удобно и работать с переменной просто но мне не нравиться парадигма прерывания програмы каждую милисекунду.
У Kinetis есть аппаратный таймер (FlexTimer Module (FTM)) 16 бит - это дает нам 65536 милисекунд до переполнения что конечно очень мало для нормальной работы.
Что поинтересней можно придумать для Cortex-M4?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 11 2018, 07:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Ничего страшного.
Я обычно делаю 10 мс, но при помощи SysTick. В Cortex именно этот таймер используется для этих целей.

Цитата(Jenya7 @ Jun 11 2018, 07:27) *
это дает нам 65536 милисекунд до переполнения что конечно очень мало для нормальной работы.

А что значит "нормальная работа"? Переполнения конечно же нужно обрабатывать.
При 32-битном счетчике переполнения будут каждые 49 дней, но их тоже нужно обрабатывать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 11 2018, 08:35
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jun 11 2018, 13:34) *
Ничего страшного.
Я обычно делаю 10 мс, но при помощи SysTick. В Cortex именно этот таймер используется для этих целей.


А что значит "нормальная работа"? Переполнения конечно же нужно обрабатывать.
При 32-битном счетчике переполнения будут каждые 49 дней, но их тоже нужно обрабатывать.


ничего страшного если управляем елочной гирляндой.
раз в 49 дней это не каждую минуту.

Сообщение отредактировал Jenya7 - Jun 11 2018, 08:36
Go to the top of the page
 
+Quote Post
Serge V Iz
сообщение Jun 11 2018, 14:52
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 3-05-18
Пользователь №: 103 639



В мире "больших" вычислительных систем для решения этой проблемы попытались выдумать HPET, это там где к часто тикающему таймеру прилагается не один, а несколько регистров компаратора, организующих очередь запланированных в будущем событий. А когда емкости этой очереди не хватает, она дополняется еще программно реализованной очередью "тех кто будет еще дальше в будущем". "Аппаратная" очередь может быть и одноместной, религиозных запретов тут нет )

Только счет регулярных интервалов времени тут, само собой, отпадает. См. также tickless systems.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2018, 08:37
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



а как я устанавливаю период тика в SysTick? я что то не нашел никаких прескайлер регистров
Код
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

    SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
    NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
    SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
    SysTick_CTRL_TICKINT_Msk   |
    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
    return (0);                                                  /* Function successful */
}

Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 12 2018, 09:14
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jun 12 2018, 11:37) *
а как я устанавливаю период тика в SysTick? я что то не нашел никаких прескайлер регистров

Может, поискать в документации? Там все очевидно: и источник, и делитель.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2018, 09:24
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jun 12 2018, 14:14) *
Может, поискать в документации? Там все очевидно: и источник, и делитель.

покажите где тут делитель
http://infocenter.arm.com/help/index.jsp?t...a/Babieigh.html
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 12 2018, 11:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jun 12 2018, 12:24) *
покажите где тут делитель

Цитата
The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads, that is wraps to, the value in the SYST_RVR register on the next clock edge, then counts down on subsequent clocks.

Перевожу: есть 24-битный вычитающий таймер. Когда он досчитает до нуля, то перегружается значением из SYST_RVR.
Таким образом можно получить периодические прерывания, а в них уже работать с софтовыми интервалами.
Обращаю внимание на бит CLKSOURCE регистра SYST_CSR. Он выбирает источник тактирования.
У STM32, например, можно тактировать от HCLK или HCLK / 8 за счет этого бита.
Цитата
The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock (HCLK), configurable in the SysTick Control and Status Register.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2018, 11:47
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jun 12 2018, 17:14) *
Перевожу: есть 24-битный вычитающий таймер. Когда он досчитает до нуля, то перегружается значением из SYST_RVR.
Таким образом можно получить периодические прерывания, а в них уже работать с софтовыми интервалами.
Обращаю внимание на бит CLKSOURCE регистра SYST_CSR. Он выбирает источник тактирования.
У STM32, например, можно тактировать от HCLK или HCLK / 8 за счет этого бита.

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

извиняюсь - милисекунд.

Сообщение отредактировал Jenya7 - Jun 12 2018, 16:01
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 12 2018, 13:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jun 12 2018, 14:47) *
мне нужен аппаратный счетчик микросекунд

Дык, микро- или мили- секунд?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 12 2018, 13:19
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



милли-
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 12 2018, 13:25
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ViKo @ Jun 12 2018, 16:19) *
милли-

У ТС именно "мили". Нужно понять что это значит.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 05:39
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



все так грустно? только мне на планете Земля нужны временные метки в проекте?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2018, 05:57
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Jun 12 2018, 16:17) *
или мили- секунд?

Миля - единица длины, секунда - времени. Даже как-то затрудняюсь вот так ставить между ними знак '-'. biggrin.gif

Цитата(adnega @ Jun 12 2018, 16:25) *
У ТС именно "мили". Нужно понять что это значит.

С точки зрения физики: значение разницы расстояния и времени пока не исследовано biggrin.gif

Цитата(Jenya7 @ Jun 13 2018, 08:39) *
все так грустно? только мне на планете Земля нужны временные метки в проекте?

нет. Только у Вас это вызывает трудности laughing.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 13 2018, 06:02
Сообщение #15


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Jun 11 2018, 07:27) *
Это очень удобно и работать с переменной просто но мне не нравиться парадигма прерывания програмы каждую милисекунду.
У Kinetis есть аппаратный таймер (FlexTimer Module (FTM)) 16 бит - это дает нам 65536 милисекунд до переполнения что конечно очень мало для нормальной работы.
Что поинтересней можно придумать для Cortex-M4?

У Kinetis есть 64-х битный lifetimer на базе PIT. Так что хватит на всю жизнь с точностью в 16 ns
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 06:41
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(AlexandrY @ Jun 13 2018, 12:02) *
У 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 - Jun 13 2018, 06:56
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2018, 06:48
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

2 AlexandrY: неужто у супер-пупер кинетиса нету таймера с хотя-бы 20-битным прескалером? или возможности использования в качестве такого прескалера другого таймера (concatenating)? smile3046.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 13 2018, 08:03
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 13 2018, 08:25
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Допустим, тактовая частота процессора 120 МГц. На вход в прерывание и выход тратим по 12 тактов. На инкремент счетчика, пусть, еще 12 тактов. Итого:
36 / 120 000 = 0,0003
Вы боитесь потерять производительность на 0,03%? rolleyes.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 13 2018, 08:55
Сообщение #20


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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

Так это и есть после конкатенации. Но при этом атомарное чтение.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 09:00
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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


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

Цитата(Сергей Борщ @ Jun 13 2018, 14:03) *
Что мешает считать в тиках таймера?
это типа шутка?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 13 2018, 09:05
Сообщение #22


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Как может мешать нечто с нагрузкой 0,03%? laughing.gif
Из-за неоптимального кода можно потерять куда больше.
Прерывание лишнего тока не ест, помех не создает. Все ОС используют прерывание от системного таймера.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 09:25
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

у меня есть критические секции. можно сказать очень критические. я не могу их сделать атомик, мне другие прерывания важны.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 13 2018, 09:35
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

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

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

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

У Cortex-M есть NVIC, который может делать вложенные прерывания с приоритетами.
Если 32-битная переменная выровненная, то доступ к ней будет атомарным.
Но я так понял, что из счетчика миллисекунд бы будете только вычитывать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 13 2018, 09:36
Сообщение #25


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Такие критические, что 0,3 мкс не могут подождать? Не верю.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 13 2018, 09:38
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Можете подробнее рассказать о них?
Это не норма, такие вещи нужно делать аппаратно и/или подбирать соответствующее аппаратное решение.
Я уже 10 лет не пользуюсь запретом/разрешением прерываний, а проектов сделал очень много. ЧЯДНТ?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 09:41
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075




adnega так что вы предлагаете? я честно говоря так и не понял.
по моему вот этого
Цитата
Нужно сделать аппаратный таймер для счета программного счетчика с интервалом 1 или 10 мс.
я и пытаюсь добиться.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2018, 09:52
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jun 13 2018, 12:00) *
это типа шутка?

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

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

Ага, уже лет N как начинающий и всё не могущий начать biggrin.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 13 2018, 10:15
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

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

, где maintimer - 32-битная переменная, в которой будут лежать миллисекунды.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2018, 10:17
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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


мда... ну вобщем тему можно закрывать. признаюсь был не прав.
Go to the top of the page
 
+Quote Post
pokk
сообщение Jun 17 2018, 03:37
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Раньше, тоже делал счет миллисекунд из прерывания, но последнее время стал использовать такой способ
http://we.easyelectronics.ru/Soft/samyy-pr...nyy-taymer.html
Только максимальное значение миллисекунд, которое можно задать зависит от таймера.
А для сильно большой задержки, использую RTC, настроил что бы счетчик работал по секундам и считываю его, также. (только это относиться для stm32f1x, для stm32f4x RTC совсем другая )
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 18 2018, 05:02
Сообщение #32


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(pokk @ Jun 17 2018, 08:37) *
Раньше, тоже делал счет миллисекунд из прерывания, но последнее время стал использовать такой способ
http://we.easyelectronics.ru/Soft/samyy-pr...nyy-taymer.html
Только максимальное значение миллисекунд, которое можно задать зависит от таймера.
А для сильно большой задержки, использую RTC, настроил что бы счетчик работал по секундам и считываю его, также. (только это относиться для stm32f1x, для stm32f4x RTC совсем другая )


у меня таймера не хватало. в Кинетесе они кривые. кроме LPTM. освободил LPTM. он 16-битный приходиться приращивать в прерывании
Код
void LPTMR0_IRQHandler(void)
{
    LPTMR0_CSR |= LPTMR_CSR_TCF_MASK;
    
    ovf_count++;
    added_val = 0xFFFF * ovf_count;
}

uint32_t SYSTIME_GetSystemTime(void)
{    
    unsigned long cnt;
    LPTMR0_CNR = 0;       // write any value to the counter register so that it puts its present counter value into a temporary register
    cnt = LPTMR0_CNR;    // read the value from the temporary register
    return (cnt + added_val);
}


Сообщение отредактировал Jenya7 - Jun 18 2018, 05:03
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 18 2018, 06:40
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А почему SysTick не используете?
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 20 2018, 04:42
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Jenya7 @ Jun 11 2018, 09:27) *
У Kinetis есть аппаратный таймер (FlexTimer Module (FTM)) 16 бит - это дает нам 65536 милисекунд до переполнения что конечно очень мало для нормальной работы.

Этого мало? Это позволяет делать/контролировать задержки до 65 секунд без какого либо контроля переполнения, в лоб, без бубнов и танцев. Если нужно делать задержки измеряемые в секундах (например 1000 секунд, или 10000000 секунд), то можно отдельный таймер аппаратный завести с тактом 1 мс и переполнением после 1000 мс, в прерывании ++globalSec . Или вообще использовать RTC.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 20 2018, 18:54
Сообщение #35


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



В K10 4-канальный 32-битный PIT (программируемый интервальный таймер) есть - делай счётчики интервалов какие хошь (; Впрочем, ТС сознался, что был не прав.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 21 2018, 05:12
Сообщение #36


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jun 18 2018, 11:40) *
А почему SysTick не используете?

объяснил это в первом посте.

Цитата(juvf @ Jun 20 2018, 09:42) *
Этого мало? Это позволяет делать/контролировать задержки до 65 секунд без какого либо контроля переполнения, в лоб, без бубнов и танцев. Если нужно делать задержки измеряемые в секундах (например 1000 секунд, или 10000000 секунд), то можно отдельный таймер аппаратный завести с тактом 1 мс и переполнением после 1000 мс, в прерывании ++globalSec . Или вообще использовать RTC.


у него нет пределителя - я не могу создать тик с периодом и 1 миллисекунду.



Цитата(Obam @ Jun 20 2018, 23:54) *
В K10 4-канальный 32-битный PIT (программируемый интервальный таймер) есть - делай счётчики интервалов какие хошь


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

Цитата(Obam @ Jun 20 2018, 23:54) *
Впрочем, ТС сознался, что был не прав.

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


Сообщение отредактировал Jenya7 - Jun 21 2018, 05:14
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 05:15
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jun 21 2018, 08:12) *
у него нет пределителя

Вы опять за старое.
У него есть период, и за счет периода вы создадите 1 мс.
С периодом 1 мс у вас будет шагать не таймер, а вызываться обработчик прерывания, в котором будет to_1ms++.
Для этого подойдет любой таймер, но есть же специальный SysTick. Почему его не используют некоторые?
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 05:24
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(adnega @ Jun 21 2018, 10:15) *
Вы опять за старое.
У него есть период, и за счет периода вы создадите 1 мс.
С периодом 1 мс у вас будет шагать не таймер, а вызываться обработчик прерывания, в котором будет to_1ms++.
Писал же ТС, что у него сейчас так и есть, но он не хочет раз в 1 мс падать в прерывание, а хочет сделать аппаратный миллисекундный таймер.


Цитата(Jenya7 @ Jun 21 2018, 10:12) *
у него нет пределителя - я не могу создать тик с периодом и 1 миллисекунду.
vs
Цитата
16 бит - это дает нам 65536 милисекунд до переполнения
как это? 16 битный таймер дает переполнение через 65536 милисекунд, но тик у этого таймера не равен 1 мс???
Проблема решена, и слава богу!!! wink.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 21 2018, 05:44
Сообщение #39


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



ТС не умеет задавать такое значение в SysTick таймер, чтобы тот перезагружался с периодом 1 мс. Учиться, учиться и еще раз...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 21 2018, 05:44
Сообщение #40


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Jun 21 2018, 10:15) *
Вы опять за старое.
У него есть период, и за счет периода вы создадите 1 мс.
С периодом 1 мс у вас будет шагать не таймер, а вызываться обработчик прерывания, в котором будет to_1ms++.
Для этого подойдет любой таймер, но есть же специальный SysTick. Почему его не используют некоторые?


вы вообще читали тему? первый мой пост? ради чего была создана тема?

Я НЕ ХОЧУ ГЕНЕРИРОВАТЬ ПРЕРЫВАНИЯ КАЖДУЮ МИЛЛИСЕКУНДУ.

все. эту руку я сбрасываю.

Сообщение отредактировал Jenya7 - Jun 21 2018, 05:47
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 21 2018, 05:51
Сообщение #41


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



То есть, мои аргументы, что вы теряете 0.03% производительности, вам не понять?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 21 2018, 05:59
Сообщение #42


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(ViKo @ Jun 21 2018, 10:51) *
То есть, мои аргументы, что вы теряете 0.03% производительности, вам не понять?


да хрен с ней спроизводительностью. хоть 5%. дело не в ней. у меня бегут важные таски. критические можно сказать. и я не хочу прерывать их каждую миллисекунду.может ничего страшного не произойдет. но зачем мне дополнительные, неоправданные как я считаю, риски?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 06:02
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jun 21 2018, 08:44) *
Я НЕ ХОЧУ ГЕНЕРИРОВАТЬ ПРЕРЫВАНИЯ КАЖДУЮ МИЛЛИСЕКУНДУ.

Вы можете объяснить почему? Это вполне естественная вещь для МК, но вы категорически ее отвергаете.
Вы бы поменьше секретничали, а то нам в соседних ветках достается, что за вас додумывают недосказанное.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 06:23
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(adnega @ Jun 21 2018, 11:02) *
Вы можете объяснить почему?
зачем это объяснять? ТС и так уже всё объяснил. У меня было такое.... сделал таймер с тиком в 1 мс и отрубил прерывания. Полностью аппаратный миллисекундный таймер.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 21 2018, 06:28
Сообщение #45


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А через каждые 10 мс прерываться рискнете? Тоже нормальный период для RTOS.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 06:32
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(juvf @ Jun 21 2018, 09:23) *
У меня было такое.... сделал таймер с тиком в 1 мс и отрубил прерывания.

А если бы не отрубил прерывания, то что?
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 06:37
Сообщение #47


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(adnega @ Jun 21 2018, 11:32) *
А если бы не отрубил прерывания, то что?

А они мне зачем? У меня есть полностью аппаратный таймер, зачем мне программный таймер и обработчик прерывания? Вы наверно аппратный RTC(или UART/SPI/PWM/...) не будете пользовать, т.к. можно сделать программный, с календарем, с кучей будильников, ведь программный RTC займет всего 0,003% ресурсов!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 07:05
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(juvf @ Jun 21 2018, 09:37) *
А они мне зачем? У меня есть полностью аппаратный таймер, зачем мне программный таймер и обработчик прерывания?

Допускаю, что есть эксклюзивные задачи, в которых одного таймера до 65 мс достаточно, но в общем случае вариант
с 1мс-прерыванием гораздо универсальнее.
В некоторых библиотеках я вообще пришел к двум/трем функциям
on_init() - один раз при инициализации МК
on_mainloop() - внутри mainloop`а
on_timer() - внутри 10мс-таймера
Решение гибкое, воспроизводимое на множестве камней и архитектур. Никаких дополнительный аппаратных требований,
типа таймер с предделителем таким-то и т.п.
Я не против исключений из правил, но их не стоит выдавать за правило.
Я на atmega8 вообще без аппаратных таймеров делал программный UART-TX тупо nop-ами формировал задержку,
и работало-ведь, но я же объявляю это нормой. Сделать софтовый 1мс таймер настолько просто, что грех от этого отказываться.
И мне не понятно зачем? ТС говорил, что у него какие-то критические секции есть... думаю, больное место там.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 21 2018, 07:12
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Jun 21 2018, 10:05) *
И мне не понятно зачем? ТС говорил, что у него какие-то критические секции есть... думаю, больное место там.

Я думаю - там весь код одно сплошное больное место. Судя по постам ТСа... biggrin.gif
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 07:26
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(adnega @ Jun 21 2018, 12:05) *
Допускаю, что есть эксклюзивные задачи, в которых одного таймера до 65 мс достаточно,
65536 мс. не 65 мс, а 65 ТЫСЯЧ мс, это 65 секунд. И таймер один, но одновременно всяких интервалов и периодов можно задавать хоть сотню (как и на программном). Решение гибкое, воспроизводимое на множестве камней и архитектур. Никаких дополнительный аппаратных требований программных обработчиков, программного кода, настроек NVIC и т.п. Если зашли в критическую секцию (остановили прерывания), то таймер продолжит считать.

Цитата
тупо nop-ами формировал задержку .... я же объявляю это нормой
опечатка?

Цитата
И мне не понятно зачем?
Не знаю как объяснить? зачем в МК аппаратная перефирия? можно всё программно сделать, без таймеров, на ноп-ах и ногодрыгах.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 09:12
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(juvf @ Jun 21 2018, 10:26) *
зачем в МК аппаратная перефирия? можно всё программно сделать, без таймеров, на ноп-ах и ногодрыгах.

Я за полную загрузку периферии. В Cortex все унифицировали: есть одинаковый для всех SysTick и одинаковый NVIC.
За это переживать не надо.
Никогда не приходилось запрещать прерывания, а задачи решал самые разные. Для этого есть NVIC с ключевой буквой N,
типа вложенных прерываний с гибкой настройкой приоритетов. Недавно обсуждали SVC вместо критических секций.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 21 2018, 16:08
Сообщение #52


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



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

Долгие годы программирования "железа" должны были научить пользоваться документацией на это "железо" wink.gif

Цитата(Jenya7 @ Jun 21 2018, 08:12) *
то же самое - у него нет пределителя - я не могу создать тик с периодом и 1 миллисекунду.

RefMan на подсемейство K10: про PIT гл. 41 (всего 12 стр) разд. 41.4.3 волшебные слова "Chain mode" - тик будет с любым периодом. Редко у чего бывает "предделитель" в 32 разряда.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th August 2025 - 06:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.02635 секунд с 7
ELECTRONIX ©2004-2016