在 VxWorks 6.7 中从内部代码执行脚本

发布于 2024-09-03 15:27:48 字数 95 浏览 4 评论 0原文

在VxWorks 5.5.1 中,您可以使用execute 命令运行脚本。在VxWorks 6.7中,不再支持执行命令。现在有谁可以换吗?我具体是从内部代码而不是命令行谈论的。

In VxWorks 5.5.1 you could run a script using the execute command. In VxWorks 6.7 the execute command is no longer supported. Does anyone now if there is a replacement? I am specifically talking about from inside code not command line.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱格式化 2024-09-10 15:27:48

通过大量研究,似乎有几种方法可以实现此目的,但没有一种方法与之前的执行命令完全相同。正如我在下面的评论中所说,执行命令不是官方 API 调用。

1) shellCmdExec 可以使用,但大多数是从 shell 任务内部调用的。
2) 我们选择采用的解决方案 - 从我们的启动脚本中调用它

3) 一种 hack 方式:

fd = open("/y/startup.go", 0, 0) /* 打开你想要的脚本执行/
v=shellFromNameGet("tShell0") /
获取 shell id */

/* 使用 shellinOutGet 保存 shell 的标准输入 /
shellInOutSet (v, fd, -1, -1) /
设置 shell 的标准 in 到文件 */

/* 这里你应该恢复标准 in (事先做一个 shellInOutGet)。在 shell 使用脚本完成后执行此操作。我想说的是,当 ti 完成时,你的脚本应该增加一个变量。 */

关闭(fd)

Through much research it appears like there are a few ways to accomplish this but none is exactly the same as the execute command from before. As I stated in the comment below it turns out that the execute command is not an official API call.

1) shellCmdExec can be used but most be called from inside the shell task.
2) The solution we choose to employ - which is to call it from within our startup script

3) And a hack way:

fd = open("/y/startup.go", 0, 0) /* open the script you want to execute /
v=shellFromNameGet("tShell0") /
Get the shell i.d. */

/* Use shellinOutGet to save off the standard in of the shell /
shellInOutSet (v, fd, -1, -1) /
Set the standard in of the shell to the file */

/* Here you should restore the standard in (do a shellInOutGet beforehand). Do it after the shell is done with the script. I would say that your script should increrment a variable when ti is done. */

close(fd)

囍孤女 2024-09-10 15:27:48

VxWorks Kernel程序员指南6.7中有一个解决方案,问题是它对我不起作用,但它可以帮助你:

    shellGenericInit ("INTERPRETER=Cmd", 0, NULL, &shellTaskName, FALSE, FALSE,fdScript, STD_OUT, STD_ERR); do
    taskDelay (sysClkRateGet ());
    while (taskNameToId (shellTaskName) != ERROR); close (fdScript);

检查文档的第15.2.15节。

There's a solution in the VxWorks Kernel programmer's guide 6.7, the problem is that it did not work for me, but it could help you:

    shellGenericInit ("INTERPRETER=Cmd", 0, NULL, &shellTaskName, FALSE, FALSE,fdScript, STD_OUT, STD_ERR); do
    taskDelay (sysClkRateGet ());
    while (taskNameToId (shellTaskName) != ERROR); close (fdScript);

Check Section 15.2.15 of the document.

ι不睡觉的鱼゛ 2024-09-10 15:27:48

您可以在串行驱动程序层中完成此操作。尝试以下代码。它展示了如何将文本发送到 shell 的输入。

例如,

pass_to_sio("memShow; ifconfig");在你的c代码中。

-> sp pass_to_sio, "memShow; ifconfig" 在 shell 中。

pass_to_sio("< test.scr");如果您想运行脚本文件,请在您的 C 代码中添加。

->如果要运行脚本文件,请在 shell 中 sp pass_to_sio, "< test.scr"。

void pass_to_sio(char *input)
{
    int old_priority;

    taskPriorityGet(taskIdSelf(),&old_priority);

    taskPrioritySet(taskIdSelf(),250); /* task priority must be lower than tShell0 */

    NS16550_CHAN *pChan = &ns16550Chan[0]; /* this line depends on your BSP */

    while (input != NULL && *input != NULL)
    {
        (*pChan->putRcvChar) (pChan->putRcvArg, *input);
        input++;
    }

    (*pChan->putRcvChar) (pChan->putRcvArg, '\r');

    taskPrioritySet(taskIdSelf(),old_priority); 
}

You can do it in the serial driver layer. Try the following code. It shows how to send text to the shell's input.

For example,

pass_to_sio("memShow; ifconfig"); in your c code.

-> sp pass_to_sio, "memShow; ifconfig" in the shell.

pass_to_sio("< test.scr"); in your c code if you want to run a script file.

-> sp pass_to_sio, "< test.scr" in the shell if you want to run a script file.

void pass_to_sio(char *input)
{
    int old_priority;

    taskPriorityGet(taskIdSelf(),&old_priority);

    taskPrioritySet(taskIdSelf(),250); /* task priority must be lower than tShell0 */

    NS16550_CHAN *pChan = &ns16550Chan[0]; /* this line depends on your BSP */

    while (input != NULL && *input != NULL)
    {
        (*pChan->putRcvChar) (pChan->putRcvArg, *input);
        input++;
    }

    (*pChan->putRcvChar) (pChan->putRcvArg, '\r');

    taskPrioritySet(taskIdSelf(),old_priority); 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文