我是VxWorks OS的新手,因此,如果我对幕后事物的理解与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。但是,令我烦恼的是,当我从开发机(使用python脚本)写入in端口时,读取在董事会上的召唤有点交错(我想知道这是否是引用它的正确方法)。这很可能是由于UART输入缓冲区(或某些缓冲区)上的硬件缓冲区空间不足所致。如果这就是我正在做的事情,那么通常这不是什么大问题。

但是,如前所述,我试图将接收到的整个字符流复制到一个公共内存缓冲区(当然由互斥锁保护)中,然后再由另一个任务读取该缓冲区,然后通过另一个串行端口(在内存环回(如果您愿意)

代替前面提到的读取调用的错综复杂,我想到了只要持有要从Inport读取的字符并且没​​有字符读取的互斥量,就释放互斥量,既然这是VxWorks,请执行显式taskDelay(0)安排下一个就绪任务(我的其他任务)。但是,由于这是阻塞读取,因此(按预期方式)我被困在read调用上,因此其他线程再也没有机会执行。

我确实考虑过检查缓冲区是否已满,然后进行显式的任务切换,但是,如果您有更好的主意,我会听到的。

也只是为了从内核的角度看待这种交错的读取操作的工作原理,我在读取之前和之后立即使用time(NULL)调用对其进行了计时。令人惊讶的是,第一个块显示了一个数字,此后的每个其他块(如果它是来自外部的同一数据块的一部分)都显示为0。有人能解释一下吗?

渴望听到

最佳答案

我没有评论的50个代表点,但是没有连接环回电缆,测试串行环回行为的唯一方法就是将uart切换到环回模式。这通常意味着需要更改特定的硬件部件驱动程序。

10-04 13:28