gpt4 book ai didi

在VxWorks下创建串行环回

转载 作者:行者123 更新时间:2023-11-30 16:30:26 27 4
gpt4 key购买 nike

我对 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 输入缓冲区(或其他类似情况)上硬件缓冲区空间的可用性不足。如果这就是我所做的一切,那么这通常不是什么大问题。

然而,正如前面所解释的,我试图将整个接收到的字符流复制到一个公共(public)内存缓冲区(当然由互斥锁保护)中,然后由另一个任务读取,然后通过另一个串行端口重新传输(排序)如果你愿意的话,可以使用内存环回)

为了代替前面提到的读取调用的交错,我想到只要有字符要从 Inport 读取,就保留互斥体,一旦没有字符要读取,就释放互斥体,因为这是 VxWorks ,执行显式 taskDelay(0) 来安排下一个就绪任务(我的其他任务)。然而,由于这是一个阻塞读取,我(如预期)卡在读取调用上,因此我的其他线程永远没有机会执行。

我确实考虑过检查缓冲区是否已满,然后进行显式任务切换,但是如果你们中有人有更好的想法,我会洗耳恭听。

另外,为了从内核的角度了解这个交错读取的工作方式,我在读取之前和之后使用time(NULL)调用对其进行计时读。令人惊讶的是,第一个 block 显示一个数字,之后的所有其他 block (如果它是来自外部的同一数据 block 的一部分)显示 0。有人能解释一下吗?

很想听

最佳答案

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

关于在VxWorks下创建串行环回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com