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

 
 
> Подскажите по хитрой функции работы с таймерами в lcp111x
Сергей Б
сообщение Jan 5 2014, 12:06
Сообщение #1


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

Группа: Свой
Сообщений: 80
Регистрация: 14-04-06
Из: Russia, Orel
Пользователь №: 16 115



Разбираюсь с проектом DMX512/RDM
Заинтересовала функция работы с таймером

Код
void bsp_get_sys_uptime(uint32_t *psec_cnt, uint16_t *pmsec_cnt)
{
    // we do not want to disable the systick interrupt, so we have to deal
    // with a systick during the execution of this function
    uint32_t sec_cnt_1  = sys_seconds_cnt;
    uint16_t msec_cnt_1 = sys_millisec_cnt;
    uint32_t sec_cnt_2  = sys_seconds_cnt;
    uint16_t msec_cnt_2 = sys_millisec_cnt;
    if ((sec_cnt_1 == sec_cnt_2) && (msec_cnt_2 < msec_cnt_1))
    {
        sec_cnt_2 += 1;
    }
    *psec_cnt  = sec_cnt_2;
    *pmsec_cnt = msec_cnt_2;
}


переменные sys_seconds_cnt и sys_millisec_cnt инкрементируются в SysTick прерывании.
Зачем нужна такая функция?

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

код перывания
Код
void TickHandler(void)
{
    uint32_t i;
    uint32_t millisec_increment = 1000 / SYS_TICK_RATE_HZ;

    sys_millisec_cnt += millisec_increment;
    if (sys_millisec_cnt >= 1000)
    {
        sys_millisec_cnt -= 1000;
        sys_seconds_cnt++;
    }
    for (i=0; i<NR_OF_MSEC_COUNTERS; i++)
    {
        app_millisec_cnt[i] += millisec_increment;
    }
}

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jan 5 2014, 22:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



1. Это даже не обсуждаетсяwink.gif
2. Опять не так

время 1 - 999

считали 1, потом 999, потом 1, прерывание (становится 2 - 0), считали 0

секунды совпадают, берем меньшие миллисекунды получаем 1 - 0, не верно. Если миллисекунды изменяются только на 1,то ваш алгоритм первоначальный с 3 чтениями подходит, если миллисекунды меняются на заданный интервал отличный от 1, или в обратную сторону, то надо 4 считывания и проверку как у ТС в примере.

3. да это и не важно%)





Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 6 2014, 04:11
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Golikov A. @ Jan 6 2014, 04:53) *
Если миллисекунды изменяются только на 1,то ваш алгоритм первоначальный с 3 чтениями подходит, если миллисекунды меняются на заданный интервал отличный от 1, или в обратную сторону, то надо 4 считывания и проверку как у ТС в примере.

Второй вариант подходит для любых шагов инкремента миллисекунд. С симметричным распределением джиттера, если это важно дальнейшему алгоритму. В обратную сторону чтобы счётчики изменялись - даже не рассматривается, т.к. не обоснована необходимость.

Сообщение отредактировал GetSmart - Jan 6 2014, 11:25


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 05:43
Рейтинг@Mail.ru


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