Лабораторная работа №10. Настройка и запуск задач FreeRTOS
10.3 Задание к лабораторной работе
Для выполнения работы требуется:
- Подготовить проект с настроенной FreeRTOS для QEMU.
- Реализовать задачи, согласно требованиям.
- Запустить программу в эмуляторе и убедиться в работоспособности задач.
В лабораторной работе необходимо разработать два набора задач для программы. Каждая задача осуществляет мигание светодиодом. В первом наборе задач светодиод и период мигания задаются в теле задачи. Во втором наборе требуется реализовать одну задачу, которая вызывается необходимое количество раз с передачей параметров. Оба набора задач должны выполнять одинаковый функционал. Для выбора реализуемого набора задач предлагается использовать условную компиляцию. Порядок работы со светодиодами:
- Количество светодиодов n = max(k, 2 + (a % 4));
- Период зажигания первого светодиода T[0] = a * t;
- Период зажигания последующих светодиодов: T[i+1] = T[i] + b * t;
- Скважность формируемых сигналов 50%.
где а = номер варианта, b = количество букв в фамилии студента, t - базовый период, принимаемый как 200 тиков процессора, k - количество доступных для работы светодиодов. Для эмуляции в эмуляторе предлагается выводить строку, обозначающую мигание определенного светодиода. Максимальное количество светодиодов k предлагается принять равным 5 при эмуляции. Для остановки выполнения программы используется стандартное в ОС Linux сочетание клавиш для остановки выполнения программы Ctrl+C.
10.3.1 Описание последовательности выполнения работы
Для выполнения задания необходимо:
- Настроить среду для работы согласно инструкции из п. 10.2.1.
- Вычислить параметры вашего варианта задания.
- С помощью функций управления задачами FreeRTOS модифицировать поведение светодиодов.
- Выполнить сборку и запуск модифицированного примера, зафиксировать результат работы в отчете.
10.3.2 Пример выполнения задания на защиту
//#define USE_PARAMETERS_IN_TASKS #ifndef USE_PARAMETERS_IN_TASKS void parameter_task_function_1(void *pvParameters) { while(1) { vSendString("Toggle 1"); vTaskDelay(25000); } } void parameter_task_function_2(void *pvParameters) { while(1) { vSendString("Toggle 2"); vTaskDelay(50000); } } void parameter_task_function_3(void *pvParameters) { while(1) { vSendString("Toggle 3"); vTaskDelay(100000); } } int main_tasks(){ xTaskCreate((TaskFunction_t )parameter_task_function_1, (const char* )"LED1_Task", (uint16_t )512, (void* )NULL, (UBaseType_t )2, (TaskHandle_t* )NULL); xTaskCreate((TaskFunction_t )parameter_task_function_2, (const char* )"LED2_Task", (uint16_t )512, (void* )NULL, (UBaseType_t )2, (TaskHandle_t* )NULL); xTaskCreate((TaskFunction_t )parameter_task_function_3, (const char* )"LED3_Task", (uint16_t )512, (void* )NULL, (UBaseType_t )2, (TaskHandle_t* )NULL); vTaskStartScheduler(); return 0; } #else typedef struct { int num; char* text; } lab_task_data; char* names[] = {"Toggle 1", "Toggle 2", "Toggle 3"}; lab_task_data data[3]; void parameter_task_function(void *pvParameters) { lab_task_data* config = (lab_task_data*)pvParameters; while(1) { vSendString(config->text); vTaskDelay(config->num); } } int main_tasks(){ for(int i=0;i<3;i++){ data[i].num = 100*(250*<<i); data[i].text = names[i]; xTaskCreate((TaskFunction_t )parameter_task_function, (const char* )names[i], (uint16_t )512, (void* )&data[i], (UBaseType_t )2, (TaskHandle_t* )NULL); } vTaskStartScheduler(); return 0; } #endif int main(){ main_tasks(); while(1); }
Каждая из этих программ выполняет мигание светодиодами. Каждый светодиод мигает с определенной частотой, заданной параметром задержки.
10.4 Вопросы для контроля
- В чем отличие ОС общего назначения от ОСРВ?
- Что необходимо определить для создания задачи во FreeRTOS?
- Какие состояния задач есть во FreeRTOS?