[VxWorks] 关于VXWORKS任务

lisongying658   2009-9-21 22:12 楼主
建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问,
有高手帮忙讲解下,谢谢了

1.程序入口在哪里?从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行?
还是在  tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,(FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);后直接跳到com函数执行?

2.程序是什么结构,顺序,选择,循环??觉得更想循环,可是在progStart中并没有WHILE循环?

STATUS progStart (void)
    {
    syncSemId = semBCreate (SEM_Q_FIFO, SEM_EMPTY);
    dataSemId = semBCreate (SEM_Q_FIFO, SEM_EMPTY);

    nodeListGuardSemId = semMCreate (  SEM_Q_PRIORITY
                                | SEM_INVERSION_SAFE
                                | SEM_DELETE_SAFE);


     /* the I/O mode is output and I/O init set bard */
     *(unsigned int *)0x03ff5000 = 0xffffffff;
     InitUART(0,0x500);
    /*creat tasks*/
    tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,
        (FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);

    tidSong = taskSpawn ("song", 210, 0, STACK_SIZE,
        (FUNCPTR) song,0,0,0,0,0,0,0,0,0,0);

    tidPlay = taskSpawn ("music", 220, 0, STACK_SIZE,
        (FUNCPTR) play,0,0,0,0,0,0,0,0,0,0);
    tidLight = taskSpawn ("light", 230, 0, STACK_SIZE,
        (FUNCPTR) light,0,0,0,0,0,0,0,0,0,0);

    return (OK);
    }

/*************************************************************************
*
* progStop - stops the program
*
* Call this routine to end it all.
*/

void progStop (void)
    {
    taskDelete (tidCom);
    taskDelete (tidPlay);
    taskDelete (tidSong);
    taskDelete (tidLight);

    semDelete (dataSemId);
    semDelete (syncSemId);
    semDelete (nodeListGuardSemId);


    /* My, aren't we tidy! */

    printf ("BYE!TSCHUESS!ADIEU!\n");
    return;
    }

/*the led is lighted one after anther*/
void light(void)
{ while (1)
{
        LED_2_ON;
         delay(65536);
        LED_2_OFF;
        LED_3_ON;
         delay(65536);
        LED_3_OFF;
        LED_4_ON;
         delay(65536);
        LED_4_OFF;
        LED_1_ON;
         delay(65536);
        LED_1_OFF;
        LED_4_ON;
         delay(65536);
        LED_4_OFF;
        LED_3_ON;
         delay(65536);
        LED_3_OFF;

}
}

。。。。。。。。。。。。。省略

回复评论 (9)

不懂,帮顶
点赞  2009-9-21 22:49
progStart()又是哪个函数来调用的????主函数在哪里呀
看可下载型工程代码真是一头雾水,,,
点赞  2009-9-21 22:56
一般有个USERAPPINIT函数 那个函数相当于主函数   其实VXWORKS的启动过程之前还是很多的 最重要的应该是根任务的启动
点赞  2009-9-22 00:18
从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行?
还是在  tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,(FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);后直接跳到com函数执行?
点赞  2009-9-22 16:44
1.vxworks下的用户程序一般在当前工程目录下的usrAppInit.C void usrAppInit (void)函数中添加函数入口
2.taskSpawn 发起一个任务,其实就相当于发起一个进程。几个任务都是并行执行的。
点赞  2009-9-22 17:10
不好意思,楼上的意思,是这样的吗
tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,
        (FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);
........................

任务com等依次创建好了之后,这几个任务就开始并行的执行。。
具体这几个任务的调用就由操作系统内核wind来调用了吗?
用户只要做好这几个任务的通信协调就可以了吗?

看贯了以前的顺序选择循环的结构,这点总是想不通。。

点赞  2009-9-22 21:47
在看vxworks手册提到 有以下四中状态  pend ready delay suspend ,并且详细讲了他们之间的转换,怎么没有running 态啊 ,记得操作系统 书里都讲到有运行态的,那么在vxworks取得CPU运行权的任务是什么态啊
点赞  2009-9-22 22:09
tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,
        (FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);

    tidSong = taskSpawn ("song", 210, 0, STACK_SIZE,
        (FUNCPTR) song,0,0,0,0,0,0,0,0,0,0);

    tidPlay = taskSpawn ("music", 220, 0, STACK_SIZE,
        (FUNCPTR) play,0,0,0,0,0,0,0,0,0,0);
    tidLight = taskSpawn ("light", 230, 0, STACK_SIZE,
        (FUNCPTR) light,0,0,0,0,0,0,0,0,0,0);
vxWorks系统并行执行这四个函数。
你在其显示界面上输入“i”命令将看到这个四个任务的名称,说明这个四个任务同时存在,四个任务执行的机制有vxWorks系统内核控制。
这和window下开启几个线程有点相似,但和线程不是同一个概念。
点赞  2009-9-23 18:19
你好,写完vxworks代码后,要到tornado 集成开发环境里调试

先compile 你的源文件,然后再build 生成.out文件

之后下载到仿真目标机内(这里也就是tornado环境提供的虚拟目标机),然后点开vxsim仿真环境,

在shell里输入   progStart  就可以开始运行程序了,并创建四个任务,而这四个任务的running是靠wind内核调试的,基于优先级抢占调度或者同级时间片轮转调度完成。

其实这是操作系统内部维护的,main函数是在操作系统里,我们是看不到的。
点赞  2010-3-16 23:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复