Компоненты и технологии • №2 '2011 компоненты


КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 10 '2011



Pdf көрінісі
бет128/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   121   122   123   124   125   126   127   128   129
Kurniz

99
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 10 '2011
www.kite.ru
компоненты
микроконтроллеры
* В функцию автоматически передается дескриптор таймера в виде аргумента xTimer. */
void vAutoReloadTimerFunction(xTimerHandle xTimer) {
/* Сигнализировать о выполнении.
* Вывести сообщение о текущем времени, прошедшем с момента запуска планировщика. */
printf(“AutoReload timer. Time = %d sec\n\r”, xTaskGetTickCount() / configTICK_RATE_HZ);
/* Увеличить период работы периодического таймера на 1 секунду */
uiAutoReloadTimerPeriod += 1000 / portTICK_RATE_MS;
/* Установить новый период работы периодического таймера.
* Время тайм-аута (3-й аргумент) обязательно должно быть 0!
* Так как внутри функции таймера нельзя вызывать блокирующие API-функции. */
xTimerChangePeriod(xTimer, uiAutoReloadTimerPeriod, 0);
}
/*-----------------------------------------------------------*/
/* Функция интервальных таймеров.
* Нескольким экземплярам интервальных таймеров соответствует одна-единственная функция.
* Эта функция автоматически вызывается при истечении времени любого из связанных с ней таймеров.
* Для того чтобы выяснить, время какого таймера истекло, используется идентификатор таймера. */
void vOneShotTimersFunction(xTimerHandle xTimer) {
/* Указатель на идентификатор таймера */
unsigned portBASE_TYPE *pxTimerID;
/* Получить идентификатор таймера, который вызывал эту функцию таймера */
pxTimerID = pvTimerGetTimerID(xTimer);
/* Различные действия в зависимости от того, какой таймер вызывал функцию */
switch (*pxTimerID) {
/* Сработал интервальный таймер 1 */
case ID_TIMER_1:
/* Индикация работы + текущее время */
printf(“\t\t\t\tOneShot timer ID = %d. Time = %d sec\n\r”, *pxTimerID, xTaskGetTickCount() / configTICK_RATE_HZ);
/* Запустить интервальный таймер 2 */
xTimerStart(xOneShotTimers[1], 0);
break;
/* Сработал интервальный таймер 2 */
case ID_TIMER_2:
/* Индикация работы + текущее время */
printf(“\t\t\t\tOneShot timer ID = %d. Time = %d sec\n\r”, *pxTimerID, xTaskGetTickCount() / configTICK_RATE_HZ);
/* Запустить интервальный таймер 3 */
xTimerStart(xOneShotTimers[2], 0);
break;
case ID_TIMER_3:
/* Индикация работы + текущее время */
printf(“\t\t\t\tOneShot timer ID = %d. Time = %d sec\n\r”, *pxTimerID,
xTaskGetTickCount() / configTICK_RATE_HZ);
puts(“\n\r\t\t\t\tAbout to delete AutoReload timer!”);
fflush();
/* Удалить периодический таймер.
* После этого активных таймеров в программе не останется. */
xTimerDelete(xAutoReloadTimer, 0);
break;
}
}
/*-----------------------------------------------------------*/
/* Точка входа в программу. */
short main( void )
{
unsigned portBASE_TYPE i;
/* Создать периодический таймер.
* Период работы таймера = 1 секунда.
* Идентификатор таймера не используется (0). */
xAutoReloadTimer = xTimerCreate(“AutoReloadTimer”, uiAutoReloadTimerPeriod, pdTRUE, 0,
vAutoReloadTimerFunction);
/* Выполнить сброс периодического таймера ДО запуска планировщика.
* Таким образом, он начнет отсчет времени одновременно с запуском планировщика. */
xTimerReset(xAutoReloadTimer, 0);
/* Создать 3 экземпляра интервальных таймеров.
* Период работы таймеров = 12 секунд.
* Каждому из них передать свой идентификатор.
* Функция для них всех одна — vOneShotTimersFunction(). */
for (i = 0; i < NUMBER_OF_TIMERS; i++) {
xOneShotTimers[i] = xTimerCreate(“OneShotTimer_n”, 12000 / portTICK_RATE_MS, pdFALSE,
(void*) &uxOneShotTimersIDs[i], vOneShotTimersFunction);
}
/* Выполнить сброс только первого интервального таймера.
* Именно он начнет отсчитывать время сразу после запуска планировщика.
* Остальные 2 таймера после запуска планировщика останутся в пассивном состоянии. */
xTimerReset(xOneShotTimers[0], 0);
/* Индицировать текущее время.
* Оно будет равно 0, так как планировщик еще не запущен. */
printf(“Timers start! Time = %d sec\n\r\n\r”, xTaskGetTickCount() / configTICK_RATE_HZ);
/* Запуск планировщика.
* Автоматически будет создана задача обслуживания таймеров.
* Таймеры, которые были переведены в активное состояние (например, вызовом xTimerReset())
* ДО этого момента, начнут отсчет времени. */
vTaskStartScheduler();
return 1;
}
/*-----------------------------------------------------------*/
Для корректной компиляции учебной программы конфигураци-
онный файл FreeRTOSConfig.h должен содержать следующие строки:


Достарыңызбен бөлісу:
1   ...   121   122   123   124   125   126   127   128   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет