Почему я теряю данные при использовании канала vxWorks? - PullRequest
0 голосов
/ 23 сентября 2008

Я использую каналы для передачи информации между двумя задачами vxWorks.

Вот пример кода:


Init()
{
   fd = open("/pipe/mydev", O_RDWR, 0777);
...
}

taskRx()
{
   ...
   len = read(fd, rxbuf, MAX_RX_LEN);
   ...
}
taskTx()
{
   ...
   len = write(fd, txbuf, txLen);
   ...
}

Если мы отправляем сообщение длиннее, чем MAX_RX_LEN (т.е. txLen> MAX_RX_LEN), мы делаем 2 чтения, чтобы получить остаток сообщения.

Мы заметили, что при втором чтении не было получено никаких данных!

Почему это?

1 Ответ

2 голосов
/ 23 сентября 2008

Механизм канала VxWorks основан на не потоке (в отличие от именованных каналов unix).

Это слой поверх средства очереди сообщений vxWorks. Таким образом, он имеет те же ограничения, что и очередь сообщений: при чтении из канала вы действительно читаете все сообщение. Если в вашем приемном буфере недостаточно места для хранения полученных данных, переполнение просто отбрасывается.

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

...