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


Передача параметра в задачу при ее создании



Pdf көрінісі
бет21/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   17   18   19   20   21   22   23   24   ...   129
Kurniz

Передача параметра в задачу при ее создании
На этом подготовительный этап можно считать завершенным. 
Как говорилось в [1], при создании задачи с помощью API-функции 
xTaskCreate() есть возможность передать в функцию, реализующую 
задачу, произвольный параметр.
Разработаем учебную программу № 1, которая будет создавать два 
экземпляра одной задачи. Чтобы каждый экземпляр задачи выполнял 
уникальное действие, передадим в качестве параметра строку симво-
лов и значение периода, которое будет сигнализировать о том, что 
задача выполнена. Для этого следует отредактировать файл main.c:
#include
#include
#include
#include “FreeRTOS.h”
#include “task.h”
/* Структура, содержащая передаваемую в задачу информацию */
typedef struct TaskParam_t {
char 
string[32]; /* строка */
long 
period;
/* период */
} TaskParam;
/* Объявление двух структур TaskParam */
TaskParam xTP1, xTP2;
/*-----------------------------------------------------------*/
/* Функция, реализующая задачу */
void vTask( void *pvParameters )
{
volatile long ul;
volatile TaskParam *pxTaskParam;
/* Преобразование типа void* к типу TaskParam* */
pxTaskParam = (TaskParam *) pvParameters;
for( ;; )
{
/* Вывести на экран строку, переданную в качестве параметра при создании задачи */
puts( (const char*)pxTaskParam->string );
рис. 4. Работа демонстрационного проекта в среде Windows
рис. 5. Минимально необходимый набор исходных и заголовочных файлов
в среде Open Watcom


98
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 4 '2011
компоненты
микроконтроллеры
/* Задержка на некоторый период Т2*/
for( ul = 0; ul < pxTaskParam->period; ul++ )
{
}
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
/* Точка входа. С функции main() начнется выполнение программы. */
short main( void )
{
/* Заполнение полей структуры, передаваемой Задаче 1 */
strcpy(xTP1.string, “Task 1 is running”);
xTP1.period = 10000000L;
/* Заполнение полей структуры, передаваемой Задаче 2 */
strcpy(xTP2.string, “Task 2 is running”);
xTP2.period = 30000000L;
/* Создание Задачи 1. Передача ей в качестве параметра указателя на структуру xTP1 */
xTaskCreate( vTask, /* Функция, реализующая задачу */
( signed char * ) “Task1”,
configMINIMAL_STACK_SIZE,
(void*)&xTP1, /* Передача параметра */
1,
NULL );
/* Создание Задачи 2. Передача ей указателя на структуру xTP2 */
xTaskCreate( vTask, ( signed char * ) “Task2”, configMINIMAL_STACK_SIZE, (void*)&xTP2, 1, NULL ); 
/* Запуск планировщика */
vTaskStartScheduler();
return 1;
}
Выполнив сборку проекта и запустив на выполнение полученный 
исполнимый файл rtosdemo.exe, можно наблюдать результат работы 
учебной программы № 1 (рис. 6).
Задача 2 выводит сообщение о своей работе в три раза реже, чем 
Задача 1. Это объясняется тем, что в Задачу 2 было передано значение 
периода в 3 раза большее, чем в Задачу 1. Таким образом, передача 
различных параметров в задачи при их создании позволила добиться 
различной функциональности отдельных экземпляров одной задачи.


Достарыңызбен бөлісу:
1   ...   17   18   19   20   21   22   23   24   ...   129




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

    Басты бет