首页 文章

在VxWorks下创建一个串行环回

提问于
浏览
0

如果我与Linux等之类的传统操作系统不同,我对内幕事物的理解有所不同,我会介意解释 . 有了这个,让我开始我的实际问题 .

我正在尝试创建一个环回测试,用于测试我对板上串行UART驱动程序所做的更改 . 由于我不想使用交叉电缆实际在外部短接两个UART端口,因此我已将这两个端口连接到我的开发机器 . 一个从开发机器的角度配置为输出端口(因此作为板上的输入端口),另一个配置为输入端口(板上的输出端口) . 我实际上是使用共享内存缓冲区进行环回,我使用互斥锁进行保护 . 因此板上有两个线程,其中一个从输入端口读取,将数据复制到共享存储器,另一个从存储器读取并通过输出端口发送 .

我在我的VxWorks应用程序中使用常规的打开,读取和写入调用(顺便说一下,我认为它是应用程序代码的一部分,因为我从_1789420调用函数,而不是因为我甚至可以从这里调用驱动程序!)是不是因为平板内存模型与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.然而,令我恼火的是,当我从我的dev机器(使用python脚本)写入in端口时,读取调用董事会有点交错(我想知道这是否是正确的方式来引用它) . 这很可能是由于UART输入缓冲区(或某些此类)上的硬件缓冲区空间不足 . 如果这就是我正在做的事情,那就不是问题了 .

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

代替上面提到的读取调用的交错,只要有从Inport读取的字符并且一旦没有要读取的字符,我就会想要持有互斥锁,释放互斥锁,因为这是VxWorks,所以显式 taskDelay(0) 来安排下一个准备好的任务(我的另一个任务) . 但是由于这是一个阻塞读取,我(正如预期的那样)停留在读取调用上,因为我的其他线程永远不会有机会执行 .

我确实想过检查缓冲区是否已满,然后进行显式任务切换,但是如果你们中有任何人有更好的想法,我会全力以赴 .

另外,为了看看这个 staggered 读取的东西是如何从内核的角度来看的,我在读取之前和之后使用 time(NULL) 调用来计时 . 令人惊讶的是,第一个块显示了一个数字,之后的每个其他块(如果它是来自外部的相同数据块的一部分)显示0.有人可以解释这个吗?

热衷于听到

1 回答

  • 0

    我没有50个重复点用于评论,但如果没有附加环回电缆,你可以测试串行环回行为的唯一方法是将uart切换到环回模式 . 这通常意味着更改特定的硬件部件驱动程序 .

相关问题