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

 
 
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

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 11:43
Рейтинг@Mail.ru


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