В VxWorks 5.5.1 вы могли запустить скрипт с помощью команды execute. В VxWorks 6.7 команда выполнения больше не поддерживается. Есть ли у кого сейчас замена? Я конкретно говорю о внутреннем коде, а не о командной строке.
Выполнение сценария из внутреннего кода в VxWorks 6.7
Ответы (3)
В результате многочисленных исследований выяснилось, что есть несколько способов сделать это, но ни один из них не является точно таким же, как команда выполнения из предыдущего примера. Как я уже говорил в комментарии ниже, команда execute не является официальным вызовом API.
1) Можно использовать shellCmdExec, но большинство из них вызывается из задачи оболочки. 2) Решение, которое мы выбираем для использования - это вызов его из нашего сценария запуска.
3) И способ взлома:
fd = open("/y/startup.go", 0, 0) /* откройте сценарий, который вы хотите выполнить / v=shellFromNameGet("tShell0") / Получите идентификатор оболочки. */
/* Используйте shellinOutGet для сохранения стандартного ввода оболочки / shellInOutSet (v, fd, -1, -1)/ Установить стандартное значение оболочки в файл */
/* Здесь следует восстановить стандартный in (предварительно сделать shellInOutGet). Сделайте это после того, как оболочка будет выполнена со сценарием. Я бы сказал, что ваш скрипт должен увеличивать переменную, когда это делается. */
близко (фд)
В руководстве программиста 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 документа.
Вы можете сделать это на уровне последовательного драйвера. Попробуйте следующий код. Он показывает, как отправить текст на ввод оболочки.
Например,
pass_to_sio("memShow; ifconfig"); в вашем коде c.
-> sp pass_to_sio, "memShow; ifconfig" в оболочке.
pass_to_sio("‹ test.scr"); в вашем коде c, если вы хотите запустить файл сценария.
-> 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);
}