在 VxWorks 5.5.1 中,您可以使用 execute 命令运行脚本。在 VxWorks 6.7 中不再支持执行命令。如果有替代品,现在有人吗?我是从内部代码而不是命令行专门谈论的。
3 回答
通过大量研究,似乎有几种方法可以实现这一点,但没有一种与之前的执行命令完全相同。正如我在下面的评论中所说的那样,执行命令不是官方的 API 调用。
1) 可以使用 shellCmdExec,但大多数是从 shell 任务内部调用的。2)我们选择采用的解决方案——从我们的启动脚本中调用它
3)还有一种黑客方式:
fd = open("/y/startup.go", 0, 0) /* 打开你要执行的脚本/ v=shellFromNameGet("tShell0") /获取shell id */
/* 使用 shellinOutGet 保存 shell 的标准输入/shellInOutSet (v, fd, -1, -1) /设置 shell 的标准输入到文件 */
/* 在这里你应该恢复标准(事先做一个 shellInOutGet)。在 shell 完成脚本后执行此操作。我会说你的脚本应该在 ti 完成后增加一个变量。*/
关闭(fd)
VxWorks内核程序员指南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 节。
您可以在串行驱动程序层中执行此操作。试试下面的代码。它显示了如何将文本发送到 shell 的输入。
例如,
pass_to_sio("memShow; ifconfig"); 在你的 c 代码中。
-> sp pass_to_sio, "memShow; ifconfig" 在 shell 中。
pass_to_sio("< test.scr"); 如果要运行脚本文件,请在您的 c 代码中。
-> sp pass_to_sio,如果要运行脚本文件,请在 shell 中使用“<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);
}