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

 
 
> Подскажите по хитрой функции работы с таймерами в 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
Ответов
GetSmart
сообщение Jan 5 2014, 21:45
Сообщение #2


.
******

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



Добавлю.
1. Переменные-счётчики секунд и мсек должны быть ессно волатильными.

2. Если бы считанные значения времени использовались для алгоритмов ЦОС (что такое DMX512/RDM - не знаю в деталях), то можно было бы и четвёртую переменную считывать из начального примера. Тогда если секунды не совпадают, то в качестве миллисекунд брать последние (вместо ранее предложеного обнуления), а если секунды совпадают, то брать ранее прочитанные. Это при сохранении исходной последовательности чтения переменных.

3. Непонятно, зачем в заголовке темы указание на LPC111x.

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


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



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

 


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


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