создание последовательной петли под VxWorks - PullRequest
0 голосов
/ 03 июля 2018

Я довольно новичок в ОС VxWorks и, следовательно, не возражаю против объяснений, если я не понимаю свое понимание скрытых вещей, когда они отличаются от более традиционных ОС, таких как Linux и тому подобное. После всего этого позвольте мне начать свой настоящий вопрос.

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

И я использую обычные вызовы открытия, чтения и записи в моем приложении VxWorks (кстати, я думаю , что это часть кода приложения, когда я вызываю функции из usrAppInit.c несмотря на то, что я даже могу вызывать подпрограммы драйвера отсюда! (Это из-за плоской модели памяти по сравнению с Linux ?? Во всяком случае).

Теперь я открыл эти порты на VxWorks в неблокирующем режиме, и вот фрагмент кода, который настраивает один из портов:

if( (fdIn = open(portstrIn, O_RDONLY | O_NOCTTY, 0) ) == ERROR) {
    return 1;
}

if(((status = ioctl(fdIn, FIOSETOPTIONS, OPT_RAW))) == ERROR)
{
    return 1;
}

/* set the baud rate to 115200
 */

if((status = ioctl(fdIn, FIOBAUDRATE, 115200)) == ERROR)
{
   return 1;
}

/* set the HW options
 */

if((status = ioctl(fdIn, SIO_HW_OPTS_SET, (CS8 | 0 | 0))) == ERROR)
{
    return 1;
}

И аналогично выходной порт также настроен. Эти два являются частью двух отдельных задач, порожденных с использованием taskSpawn, и имеют одинаковый приоритет 100. Однако меня раздражает то, что, когда я пишу в порт in from моей машины dev (используя скрипт python), чтение колл на доске get вроде в шахматном порядке (интересно, это правильный способ ссылаться на него). Скорее всего, это связано с короткой доступностью аппаратного буферного пространства во входном буфере UART (или чем-то подобным). Это обычно не большая проблема, если это все, что я делаю.

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

Вместо вышеупомянутого ошеломления вызовов чтения, я подумал о том, чтобы удерживать мьютекс до тех пор, пока есть символы для чтения из Inport, и когда нет символов для чтения, освободите мьютекс, и так как это VxWorks , сделайте явное taskDelay(0), чтобы запланировать следующую готовую задачу (моя другая задача). Однако, поскольку это блокирующее чтение, я (как и ожидалось) застрял в вызове чтения, из-за которого мой другой поток никогда не получает возможности выполнить.

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

Также, просто чтобы посмотреть, как эта ступенчатая операция чтения работает с точки зрения ядра, я рассчитал ее с помощью вызова time(NULL) непосредственно перед и сразу после чтения. Удивительно, но самый первый блок показывает число, а каждый второй после этого (если это часть того же блока данных, поступающего извне) показывает 0. Может ли кто-нибудь объяснить это тоже?

Стремится услышать

1 Ответ

0 голосов
/ 08 июля 2018

У меня нет 50 точек повторения для комментирования, но без подключенного кабеля с обратной связью единственный способ, которым вы можете прийти к тестированию поведения последовательной обратной связи, - это переключить UART в режим обратной связи. Это часто означает внесение изменений в конкретный драйвер аппаратной части.

...