我对 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。然而,令我烦恼的是,当我从我的开发机器(使用 python 脚本)写入输入端口时,读取在板上打电话有点
交错(我想知道这是否是正确的引用方式)。这很可能是由于 UART 输入缓冲区(或其他类似情况)上硬件缓冲区空间的可用性不足。如果这就是我所做的一切,那么这通常不是什么大问题。 但是,正如前面所解释的,我试图将整个接收到的字符流复制到一个公共内存缓冲区(当然由互斥锁保护)中,然后由另一个任务读取,然后通过另一个串行端口(有点像串行端口)重新传输。如果你愿意的话,在内存环回中)
代替前面提到的交错读取调用,我想到只要有要从 Inport 读取的字符就持有互斥体,一旦没有要读取的字符,就释放互斥体,因为这是 VxWorks,所以明确的
taskDelay(0)
来安排下一个就绪任务(我的其他任务)。然而,由于这是一个阻塞读取,我(如预期)卡在读取调用上,因此我的其他线程永远没有机会执行。
我确实考虑过检查缓冲区是否已满,然后进行显式任务切换,但是如果你们中的任何人有更好的想法,我洗耳恭听。也只是为了从内核的角度了解这个
staggered 读取是如何工作的,我在读取之前和之后使用 time(NULL)
调用对其进行计时。令人惊讶的是,第一个块显示一个数字,之后的所有其他块(如果它是来自外部的同一数据块的一部分)显示 0。有人能解释一下吗?