#uart #multitasking #vxworks
#uart #многозадачность #vxworks
Вопрос:
Я пытаюсь написать тест обратной связи UART в командной строке. Сначала я использовал ‘devs‘, чтобы найти последовательный порт: / tyCo /0. Затем я открыл последовательный порт для чтения / записи: fd=open(«/ tyCo/0»,2).
Поскольку read() выглядит как блокирующий вызов, я попытался создать задачу для выполнения чтения: sp(read, fd, amp; W, 0x10), где W=malloc(0x10).
Я пытался написать в fd: write (fd, «ПРИВЕТ», 5) но когда я отображаю содержимое в amp; W, я получаю мусор.
Когда я перечисляю запущенные задачи, я вижу задачу, которую я создал для чтения, которая находится в «ОЖИДАНИИ» и имеет приоритет 100. Я использовал taskPrioritySet(), чтобы назначить ему разные приоритеты, но безрезультатно.
Я надеялся, что созданная мной задача, которую я хотел бы немедленно заблокировать при вызове функции read(), проснется при выполнении функции write().
Есть идеи о том, как я мог бы выполнить тест обратного цикла UART командной строки?
Ответ №1:
вызов чтения блокируется, как вы предлагаете, но блокируется только в том случае, если нечего читать. Таким образом, вам не нужно создавать для этого задачу, ее можно просто вызвать из командной строки (и если она блокируется из-за отсутствия ввода, вы можете прервать вызов и перезапустить задачу командной строки, отправив CTRL-C через терминал)
Другой момент заключается в том, что W — это указатель, который указывает на выделенную память. Нет необходимости принимать его адрес (и я не уверен, обрабатывает ли оболочка VxWorks адресную ссылку на свои переменные)
В качестве отказа от ответственности, в настоящее время у меня нет системы для тестирования этих шагов ниже. Но, выполнив именно то, что вы пытаетесь сделать, вот как это должно выглядеть.
Подводя итог, это должно быть MWE:
fd=open("/tyCo/0",2)
W=malloc(0x10)
write(fd,"HELLO",5)
read(fd, W, 0x10)
d W
В качестве дополнительного примечания, tyCo / 0 часто является последовательным портом, который используется для связи с оболочкой VxWorks. Поэтому убедитесь, что вы действительно используете правильное имя порта.
Чтобы проверить операции с fileDescriptors, вы можете отключить последовательный порт и открыть файл в качестве теста. По крайней мере, вы будете уверены, что можете читать и записывать в FileDescriptor, как ожидалось.
fd=open("testFile",2)
W=malloc(0x10)
write(fd,"HELLO",5)
read(fd, W, 0x10)
d W