关于VXWORKS任务
建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问,
有高手帮忙讲解下,谢谢了
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;
}
}
。。。。。。。。。。。。。省略
[解决办法]
不懂,帮顶
[解决办法]
progStart()又是哪个函数来调用的????主函数在哪里呀
看可下载型工程代码真是一头雾水,,,
[解决办法]
一般有个USERAPPINIT函数 那个函数相当于主函数 其实VXWORKS的启动过程之前还是很多的 最重要的应该是根任务的启动
[解决办法]
从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行?
还是在 tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,(FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);后直接跳到com函数执行?
[解决办法]
1.vxworks下的用户程序一般在当前工程目录下的usrAppInit.C void usrAppInit (void)函数中添加函数入口
2.taskSpawn 发起一个任务,其实就相当于发起一个进程。几个任务都是并行执行的。
[解决办法]
不好意思,楼上的意思,是这样的吗
tidCom=taskSpawn ("com", 200, 0, STACK_SIZE,
(FUNCPTR) com,0,0,0,0,0,0,0,0,0,0);
........................
任务com等依次创建好了之后,这几个任务就开始并行的执行。。
具体这几个任务的调用就由操作系统内核wind来调用了吗?
用户只要做好这几个任务的通信协调就可以了吗?
看贯了以前的顺序选择循环的结构,这点总是想不通。。
[解决办法]
在看vxworks手册提到 有以下四中状态 pend ready delay suspend ,并且详细讲了他们之间的转换,怎么没有running 态啊 ,记得操作系统 书里都讲到有运行态的,那么在vxworks取得CPU运行权的任务是什么态啊
[解决办法]
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下开启几个线程有点相似,但和线程不是同一个概念。
[解决办法]
你好,写完vxworks代码后,要到tornado 集成开发环境里调试
先compile 你的源文件,然后再build 生成.out文件
之后下载到仿真目标机内(这里也就是tornado环境提供的虚拟目标机),然后点开vxsim仿真环境,
在shell里输入 progStart 就可以开始运行程序了,并创建四个任务,而这四个任务的running是靠wind内核调试的,基于优先级抢占调度或者同级时间片轮转调度完成。
其实这是操作系统内部维护的,main函数是在操作系统里,我们是看不到的。