我是VxWorks OS的新手,因此如果我对幕后事物的理解与Linux等类似的传统操作系统有所不同,我不会介意解释。顺便说一句,让我开始我的实际问题。
我正在尝试创建一个回送测试,以测试对板上串行UART驱动程序所做的更改。由于我不想使用交叉电缆在外部实际短路两个UART端口,因此我将这两个端口都连接到了我的开发机。从开发人员的角度来看,一个配置为输出端口(因此配置为开发板上的输入端口),另一个配置为输入端口(开发板上的输出端口)。我实际上是使用共享内存缓冲区进行回送,使用互斥锁来保护它。因此,板上有两个线程,其中一个从输入端口读取,将数据复制到共享内存,另一个从内存中读取并通过输出端口发送。
而且我正在VxWorks应用程序中使用 regular 打开,读取和写入调用(通过我 think 的方式,这是我调用函数时应用程序代码的一部分从usrAppInit.c
开始,尽管我什至可以从这里调用驱动程序例程(这是由于 flat 相对于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口写入python的in端口时,板上的read调用有点 staggered (我想知道这是否是引用它的正确方法)。这很可能是由于UART输入缓冲区(或某些缓冲区)上的硬件缓冲区空间不足所致。如果这就是我正在做的,这通常通常没什么问题。
但是,如前所述,我试图将接收到的整个字符流复制到一个公共内存缓冲区(当然由互斥锁保护)中,然后由另一个任务读取该缓冲区,然后通过另一个串行端口重新传输(排序)如果有的话,进行内存环回)
代替前面提到的读取调用的错综复杂,我想到了保持互斥锁,只要要从Inport中读取字符,并且一旦没有字符读取就释放互斥锁,因为这是VxWorks ,执行明确的taskDelay(0)
来安排下一个就绪任务(我的其他任务)。但是,由于这是阻塞读取,因此(按预期方式)我被困在read调用上,因此我的其他线程再也没有机会执行。
我确实考虑过检查缓冲区是否已满,然后进行显式任务切换,但是如果你们中的任何一个有更好的主意,我都很高兴。
也只是为了从内核的角度看待这种交错读取操作的工作原理,我在读取之前和之后立即使用time(NULL)
调用对其进行了计时。令人惊讶的是,第一个块显示了一个数字,此后的每个其他块(如果它是来自外部的同一数据块的一部分)显示为0。有人可以解释吗?
渴望听到
答案 0 :(得分:0)
我没有50个评论点,但是没有连接回送电缆,测试串行回送行为的唯一方法是将uart切换到回送模式。这通常意味着需要更改特定的硬件部件驱动程序。