SWD Software Ltd. - официальный дистрибьютор QNX на территории России и стран бывшего СССР Операционная система реального времени QNX
Инструменты для создания надёжных встраиваемых систем и
интеллектуальных устройств любой сложности
QNX Software Systems - разработчик встраиваемой операционной системы QNX
Информационные брошюры
Статьи и публикации
Обзоры
Операционные системы
Графические интерфейсы
Средства разработки
Прикладные системы на базе ОС QNX
Разное
Конкурсные статьи
Техническая литература
Материалы конференций QNX-Россия
Полезные ссылки
Блог QNX
Главная страница > Материалы > Статьи и публикации > Прикладные системы на базе ОС QNX > Драйвер CAN-устройств на основе архитектуры многопотокового менеджера ресурсов ОСРВ QNX6 Сделать страницу стартовой Послать ссылку коллеге Версия для печати

Драйвер CAN-устройств на основе архитектуры многопотокового менеджера ресурсов ОСРВ QNX6

Сорочинский Игорь Владиславович, инженер, НИЛ СДКУ, РГУПС.
Криволапов Сергей Владимирович, научный сотрудник, НИЛ СДКУ, РГУПС.

Описываемый в данной статье менеджер ресурса (драйвер) предназначен для работы в операционной системе QNX 6.x с адаптерами полевой последовательной шины CAN (Controller Area Network).
Особенности решения технологических задач потребовали реализации дополнительных возможностей по сравнению с известными на сегодняшний день драйверами. Необходимы были дополнительные требования к его программному интерфейсу с прикладными клиентскими задачами:

  • возможность одновременного подключения нескольких клиентов, с различными способами взаимодействия (с блокировкой или без нее) и правами доступа;
  • необходимость получения всеми клиентами всех принятых сообщений.

А так же особенности аппаратной реализации используемых адаптеров привели к необходимости написания собственного драйвера.

Аппаратная реализация адаптера

Адаптеры CAN104D и CANPC527D производства фирмы <Каскод> построены по двухканальной схеме на базе CAN-контроллера Intel 82527, реализующего физический интерфейс ISO 11898, и имеют гальванически изолированный физический интерфейс.

Данные адаптеры функционально полностью аналогичны и отличаются только используемой для подключения к компьютеру шиной: PC104 и ISA соответственно.

Из особенностей аппаратной реализации адаптера, наиболее важными являются:

  • наличие на плате адаптеров двух независимых CAN-контролеров;
  • поддержка 11-и 29-битных идентификаторов сообщения;
  • отображение регистров CAN-контроллеров в основную память;
  • возможность конфигурирования базового адреса диапазона используемой памяти и номеров используемых прерываний с помощью установленных на плате адаптеров переключателей.

Структурно каждый CAN-контроллер Intel 82527 состоит из регистров управления и пятнадцати маскируемых регистров данных размером по 8 байт. Четырнадцать из них общего назначения, и могут конфигурироваться для приема или передачи в зависимости от требований задачи. Пятнадцатый специализирован только на прием, имеет теневой буфер и может маскироваться отдельно.

Как показал опыт, не всякий адрес, задаваемый переключателями на плате адаптеров из допустимого диапазона, будет работать корректно. Все зависит от объема памяти установленной на графическом адаптере, использующемся в компьютере. При этом значение начального базового адреса должно устанавливаться в старшем диапазоне адресов. Эти издержки отображения регистров CAN-контроллера в основную память с лихвой окупаются простотой и скоростью работы с внутренними регистрами платы адаптера.

Поскольку, со стороны программного обеспечения, нет никаких различий при работе с вышеуказанными адаптерами, в дальнейшем, будет идти речь только об одном устройстве.

Программная организация драйвера

При создании драйвера использовался высокоуровневый механизм обработки сообщений микроядра, известный под названием менеджер ресурсов. Внутреннее устройство драйвера представлено на рисунке.

Структурная схема драйвера

Рис. Структурная схема драйвера

Так как к драйверу может быть подключено несколько процессов-клиентов, взаимодействие с которыми должно происходить одновременно и независимо, наиболее подходящей для применения была технология многопотокового менеджера ресурсов с использованием динамического пула потоков.

Потоки обработки взаимодействия с клиентами и обработки прерываний от адаптера образуют пул потоков драйвера, который создается с помощью функции thread_pool_create().

При открытии клиентом одного из файлов CAN-устройства функцией open(), драйвер вносит его в динамический список подключенных клиентов.

При вызове клиентом функции write() для передачи сообщения в CAN-устройство в одном из потоков пула вызывается функция обработки io_write(), которая заносит сообщение в свободный для передачи регистр CAN-контроллера и блокирует поток функцией pthread_cond_timedwait() в ожидании прерывания от CAN-контроллера. Функция обработки прерывания после проверки соответствующих регистров разблокирует клиента и передает ему признак успешной или неудачной передачи сообщения.

При приеме сообщения CAN-контроллером возникает прерывание, которое обрабатывается внутри микроядра. При этом одним из потоков пула будет получен импульс, приоритет которого позволяет обработать прерывание в первую очередь по сравнению с остальными потоками, обслуживающими запросы клиентов. Этот поток заносит сообщение в приемный кольцевой буфер и посылает импульс (но уже с обычным приоритетом) для вызова в другом потоке пула функции-обработчика принятых сообщений. Обработчик вначале посылает уведомление всем клиентам, ожидающим получения нотификации после вызова ими функции ionotify(), а затем выбирает из динамического списка подключенных клиентов тех, которые были блокированы на функции read() и отсылает им полученные сообщения.

Запуск драйвера

В QNX 6.x драйвер может быть запущен и остановлен в любое время. При запуске, драйвер регистрирует префиксы в пространстве имен путей /dev/can0 : /dev/canN, в зависимости от опций командной строки. Опционально задается, сколько плат должен обслуживать драйвер, какие контроллеры надо активировать и какие у них будут имена, базовые адреса памяти, номера прерываний, скорость CAN шины и размеры приемных буферов. Ниже, показан пример задания параметров в командной строке.

devn-can527D [опции]* [ioaddr[,irq0,irq1[,brate0,brate1]]]* &

Опции:

-q num (decimal) размер приемного буфера (по умолчанию 256)
-c num (decimal) 1=только /dev/can0 , 2=только /dev/can1,
0=оба выключены (по умолчанию оба включены)

Параметры:

ioaddr (hex) базовый адрес физической памяти
irq0 (decimal) номер прерывания для устройства /dev/can0
irq1 (decimal) номер прерывания для устройства /dev/can1
brate0 (decimal) скорость шины CAN в Кбит/с устройства /dev/can0
brate1 (decimal) скорость шины CAN в Кбит/с устройства /dev/can1
Скорость шины CAN может принимать только значения: 500, 250, 125, 100, 50, 20, 10 Кбит/с.

При запуске драйвера с опциями по умолчанию:

devn-can527D &
будут смонтированы два устройства /dev/can0 и /dev/can1 с базовыми адресами физической памяти 0xD8000 и 0xD8100 (адрес второго устройства в каждом адаптере всегда смещен на 0x100 относительно первого, из-за особенностей аппаратной реализации), номерами прерывания 5 и 7 соответственно. Скорость общения по CAN шине будет составлять у каждого из устройств 125 Кбит/с, а размер приемного буфера 256 сообщений по 8 байт каждый.

Если запустить драйвер со следующими параметрами:

devn-can527D DC000,10,11 -q64 DC200,10,7,100,50 -c2 DC400 &

то будет смонтировано пять устройств. У первых двух будут адреса 0xDC000 и 0xDC100, как это указанно в первом параметре командной строки. Следующие два параметра говорят о номерах прерывания для них: 10 и 11 соответственно. Четвертый параметр -q64 определяет размер приемного буфера (64 сообщения) для второй пары устройств: /dev/can2 и /dev/can3. Восьмой и девятый параметры показывают скорость CAN шины для этой пары: 100 Кбит/с и 50 Кбит/с соответственно. Десятый параметр отключает первое устройство третьей пары, таким образом, остается только /dev/can5 с адресом 0xDC500 (одиннадцатый параметр). Все пропущенные опции означают установку их по умолчанию. Ниже коротко показаны устройства, которые будут смонтированы и их основные параметры.

/dev/can0 is addr=0xDC000, irq=10, bit rate=125, queue=256
/dev/can1 is addr=0xDC100, irq=11, bit rate=125, queue=256
/dev/can2 is addr=0xDC200, irq=10, bit rate=100, queue=64
/dev/can3 is addr=0xDC300, irq=7, bit rate=50, queue=64
/dev/can5 is addr=0xDC500, irq=7, bit rate=125, queue=256

Организация взаимодействия с "клиентами" драйвера

Интерфейс общения с клиентами построен на стандартных POSIX функциях, таких как: open(), close(), read(), write(), ionotify(). Размер посылаемого сообщения должен быть кратен размеру структуры canmsg_t. Процессы пользователей могут открывать файлы CAN-устройств с блокировкой, без блокировки или с использованием нотификации, при этом с любой формой доступа, в произвольной комбинации.

Для иллюстрации приведен пример, который выводит на экран все сообщения, пришедшие по шине в /dev/can0 устройство. В конце печатается дата и время прихода сообщения, которое драйвер сохраняет в структуре canmsg_t.

#pragma pack(1)

#define CAN_MSG_LENGTH 8

typedef struct //Структура идентификатора сообщения
{unsigned char id0;
unsigned char id1;
unsigned char id2;
unsigned char id3;
}Devid;

typedef struct //Структура сообщения пересылаемого между
//драйвером и клиентом
{unsigned int flags; //Дополнительная информация
struct timespec timestamp; //Дата и время прихода
//сообщения
Devid dev; //Идентификатор сообщения
unsigned char lendata; //Длина данных передаваемых
//по шине CAN
unsigned char data[CAN_MSG_LENGTH]; //Данные
//передаваемые по шине CAN
}canmsg_t;

int main(int argc, char **argv)
{
int fd, size, i;
canmsg_t msg;

//открытие устройства /dev/can0 на чтение
if((fd = open("/dev/can0", O_RDONLY)) == -1)
{
printf("error open /dev/can0 ");
exit(EXIT_FAILURE);
}

for(;;)
{
//чтение из устройства /dev/can0 с блокировкой
if((size = read(fd, &msg, sizeof(msg))) == -1)
printf("error read /dev/can0 ");
else
{
//печать идентификатора сообщения
printf( "%02X%02X %02X%02X:",
msg.dev.id0 & 0x1F, msg.dev.id1,
msg.dev.id2, msg.dev.id3);

//печать данных
for(i=0; i printf(" %02X", msg.data[i]);

//печать даты и времени прихода сообщения
printf(" %s,%d", ctime(&msg.timestamp.tv_sec),
msg->timestamp.tv_nsec);
printf(" ");
}
}

exit 0;
}

Для задания параметров работы CAN контроллера и внутренних модулей драйвера используется функция devctl(), с помощью которой можно динамически изменять следующие параметры:

  • отключение / подключение устройства к шине CAN;
  • скорость передачи данных шины CAN;
  • размер циклических приемных буферов.

Особенности программной архитектуры драйвера

Отличительной особенностью описываемого драйвера является процедура общения с клиентами - сообщения из приемного буфера одновременно рассылаются всем открытым на чтение клиентам. При этом не имеет значения, каким способом подключился клиент (с блокировкой, без блокировки или по уведомлениям), расположен он с другими клиентами в одном процессе или даже узле, подключен к одному или нескольким устройствам.
Для обработки прерываний от CAN устройства используются потоки из динамического пула. Вызов функции обработчика прерывания происходит при получении импульса от микроядра, который повышает приоритет потока по сравнению с приоритетами остальных потоков пула. Таким образом, нет необходимости в создании статических специализированных, предназначенных только для ожидания и обработки прерываний потоков (по числу подключенных устройств), которые существуют на всем протяжении работы драйвера. В случае использования динамического пула, потоки создаются и уничтожаются по мере необходимости, причем не при возникновении обрабатываемых событий, а заранее, что обеспечивает минимальное время задержки до начала обработки события.

Отладка и перенос проекта в QNX Momentics 6.3.0

На этапе написания драйвера выявились проблемы со стабильностью работы отладчика в интегрированной среде разработки QNX Momentics 6.2.0. Так, в отладчике практически невозможно было просмотреть содержимое регистров контроллера Intel 82527 напрямую - структура, указывающая на адрес, полученный от функции mmap_device_memory(). Спасало положение просмотр дампа памяти. Ситуация кардинально изменилась после перехода на QNX Momentics 6.3.0. Просмотр содержимого регистров контроллера I82527, расположенного на плате адаптера, не вызывало зависания IDE, да и общая стабильность как отладчика, так и самой IDE значительно возросла. Перенос проекта выполнялся без помощи встроенных средств переноса. Был создан новый пустой проект в IDE 6.3.0, в который при помощи команды Import были перенесены файлы с исходными текстами драйвера.

Окончательная отладка драйвера производилась на одноплатном промышленном компьютере с установленным на нем адаптером CAN104D формата PC104. Целевая система была соединена локальной сетью с компьютером разработчика по протоколу TCP/IP. Хочется отметить, что удобство работы в интегрированных средствах разработки, при таком расположении адаптера, практически не отличалось от работы, когда отладка производилась на одном компьютере.

Тестирование драйвера

Проверка работоспособности драйвера производилась на маломощных, по современным меркам, малогабаритных встраиваемых промышленных компьютерах с процессором Cyrix 300 МГц и 128 Мбайт оперативной памяти. На этих компьютерах все радиаторы без охлаждающих вентиляторов! Скорость CAN шины бала установлена 125 Кбит/с. В этих условиях драйвер показал уверенную и стабильную работу. В процессе проверки выяснилось, что при 5 - 6 активных клиентах и генерируемом трафике почти на пределе пропускной способности шины, наблюдалась потеря небольшого числа сообщений. Увеличение размера приемных буферов с 32 до 256 сообщений, позволило решить эту проблему.

Заключение

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

Список литературы

1. ISO 11898 Road vehicles - Interchange of digital information - Controller area network (CAN) for high-speed communication. 1993-11-15.
2. 82527 Serial Communications Controller. Architectural Overview. - Intel Corporation, 1996.
3. Роб Кёртен, Введение в QNX Neutrino 2. Санкт-Петербург. "Петрополис", 2001.
4. QNX Neutrino RTOS. System Architecture - QNX Software System Ltd., 2002.
5. QNX Neutrino RTOS. Programmer's Guide. - QNX Software System Ltd., 2002.

Рассказать друзьям:

     Рейтинг@Mail.ru