1. 创建第一个VxWorks任务

任务目标

本案例演示如何在VxWorks实时操作系统中使用taskSpawn()创建并启动一个简单任务。任务启动后打印自身名称、任务ID与优先级,验证任务已进入就绪态并被调度执行。

实现代码

/* first_task.c - VxWorks第一个任务示例 */
#include <vxWorks.h>
#include <taskLib.h>
#include <stdio.h>

/* 任务体:打印任务信息 */
void firstTask(void)
{
    /* 获取当前任务ID,并查询任务名与优先级 */
    TASK_ID selfId = taskIdSelf();
    char taskName[20];
    int priority;

    taskNameGet(selfId, taskName);
    priority = taskPriorityGet(selfId, NULL);

    printf("任务[%s]已启动,任务ID: 0x%x,优先级: %d\n",
           taskName, (unsigned int)selfId, priority);

    /* 任务循环,保持任务存活 */
    while (1)
    {
        taskDelay(sysClkRateGet()); /* 延时1秒 */
    }
}

/* 初始化入口:由shell或启动脚本调用 */
void firstTaskInit(void)
{
    /* 创建并启动任务 */
    taskSpawn("tFirst",      /* 任务名 */
              100,           /* 优先级(数值越小优先级越高) */
              0x00000000,    /* 选项:默认 */
              0x2000,        /* 栈大小(字节) */
              (FUNCPTR)firstTask, /* 任务入口函数 */
              0, 0, 0, 0, 0, 0, 0, 0, 0, 0); /* 10个参数,未使用填0 */

    printf("任务tFirst已创建并启动\n");
}

运行与验证

环境要求:VxWorks 6.x/7.x开发环境,已连接目标机或使用VxWorks Simulator。

  1. 将first_task.c添加到VxWorks镜像工程(或下载模块到目标机)。
  2. 在VxWorks shell中调用初始化函数:
firstTaskInit

验证方法:观察shell输出,若看到类似以下内容,说明任务创建成功并已被调度执行:

任务tFirst已创建并启动
任务[tFirst]已启动,任务ID: 0x3a3f3c0,优先级: 100

随后在shell中执行i命令查看系统任务列表,应能看到tFirst处于READY或DELAY状态(因任务内循环延时,通常显示为DELAY),确认任务持续存活。

关键说明

  • taskSpawn()参数依次为:任务名、优先级、选项、栈大小、入口函数及最多10个入口参数。本案例入口函数无参数,故全部填0。
  • 任务体内使用taskIdSelf()获取自身ID,taskNameGet()与taskPriorityGet()查询任务属性,用于打印验证。
  • 任务末尾的while(1)循环防止任务退出,使任务在系统中持续可见,便于后续观察与管理。