Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 05:57:00
Лекция 11:

Лабораторная работа №10. Настройка и запуск задач FreeRTOS

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

10.3 Задание к лабораторной работе

Для выполнения работы требуется:

  1. Подготовить проект с настроенной FreeRTOS для QEMU.
  2. Реализовать задачи, согласно требованиям.
  3. Запустить программу в эмуляторе и убедиться в работоспособности задач.

В лабораторной работе необходимо разработать два набора задач для программы. Каждая задача осуществляет мигание светодиодом. В первом наборе задач светодиод и период мигания задаются в теле задачи. Во втором наборе требуется реализовать одну задачу, которая вызывается необходимое количество раз с передачей параметров. Оба набора задач должны выполнять одинаковый функционал. Для выбора реализуемого набора задач предлагается использовать условную компиляцию. Порядок работы со светодиодами:

  • Количество светодиодов 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 Описание последовательности выполнения работы

Для выполнения задания необходимо:

  1. Настроить среду для работы согласно инструкции из п. 10.2.1.
  2. Вычислить параметры вашего варианта задания.
  3. С помощью функций управления задачами FreeRTOS модифицировать поведение светодиодов.
  4. Выполнить сборку и запуск модифицированного примера, зафиксировать результат работы в отчете.

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 Вопросы для контроля

  1. В чем отличие ОС общего назначения от ОСРВ?
  2. Что необходимо определить для создания задачи во FreeRTOS?
  3. Какие состояния задач есть во FreeRTOS?
< Лекция 10 || Лекция 11: 12 || Лекция 12 >