在VxWorks下怎样用startup的启动脚本,大家应该都知道,举个例子:

需要define下面的两个宏:

#define INCLUDE_SHELL
#define INCLUDE_STARTUP_SCRIPT 

usrConfig.c中会调用:

#ifdef INCLUDE_STARTUP_SCRIPT
    usrStartupScript (startupScriptFieldSplit (sysBootParams.startupScript));
#endif

这里可能会遇到一个问题,就是sata/sd/usb 之类的不工作。原因是这个函数是在usrRoot根任务下执行的,优先级是0,而sata/sd/usb 之类的会创建一个自己相应的任务去维护这些设备,显然只有当root任务执行完后这些任务才会开始执行,所以调到usrStartupScript的时候,sata/sd/usb 之类还没有准备好,当然无法正常工作了,解决办法有很多,比如在usrStartupScript 之前加taskDelay(),让sata/sd/usb 之类的任务先运行,我推荐的一种方法是: 在这个函数里多open几次这个设备,第一次肯定不成功,第二次应该就可以了:

实现代码如下:
        int times= 0;

        fd = ERROR;
        while ((++times<= 10) && (fd == ERROR))
        {
            fd = open (fileName, O_RDONLY, 0);

            if (fd == ERROR)
            {
               
                if (times== 1)
                {
                    printf ("Waiting for driver to mount\n");
                }
                else if (times== 10)
                {
                    printf("\n");
                }
                else
                {
                    printf(".");
                   
                    taskDelay(sysClkRateGet());
                }
            }
        }

把文件放在BSP目录下,然后修改bootrom里的startup参数即可。

boot device          : fs
processor number     : 0
host name            : host
file name            : /sd0:0/vxWorks.st
user (u)             : target
ftp password (pw) (blank = use rsh): vxTarget
flags (f)            : 0x0
target name (tn)     : hjj
startup script (s)   : start.txt
other (o)            : qefcc