1. 任务创建与删除

任务说明

本案例演示在VxWorks实时操作系统中创建与删除任务的基本方法。目标是通过调用taskSpawn()创建一个简单任务,观察其执行与状态变化,再通过taskDelete()将其删除,验证任务生命周期管理的核心API用法。

核心实现

/* taskCreateDelete.c - VxWorks任务创建与删除示例 */
#include <vxWorks.h>
#include <taskLib.h>
#include <stdio.h>

/* 任务入口函数:打印任务信息后延时退出 */
void demoTask(void)
{
    printf("Demo task started, task ID = 0x%x\n", (unsigned int)taskIdSelf());
    taskDelay(sysClkRateGet() * 2);  /* 延时2秒模拟工作 */
    printf("Demo task about to exit\n");
}

/* 主测试函数:创建任务,观察状态,然后删除 */
STATUS taskCreateDeleteDemo(void)
{
    int taskId;
    char taskName[] = "tDemo";

    /* 创建任务:优先级100,栈大小2000字节 */
    taskId = taskSpawn(taskName, 100, 0, 2000,
                       (FUNCPTR)demoTask, 0,0,0,0,0,0,0,0,0,0);
    if (taskId == ERROR)
    {
        printf("taskSpawn failed, errno = 0x%x\n", (unsigned int)errnoGet());
        return ERROR;
    }
    printf("Task created, ID = 0x%x\n", (unsigned int)taskId);

    /* 延时1秒后查询任务状态 */
    taskDelay(sysClkRateGet() * 1);
    printf("Task state after 1s: ");
    if (taskIdVerify(taskId) == OK)
        printf("exists (ready or delayed)\n");
    else
        printf("not found\n");

    /* 删除任务 */
    if (taskDelete(taskId) == OK)
        printf("Task deleted successfully\n");
    else
    {
        printf("taskDelete failed, errno = 0x%x\n", (unsigned int)errnoGet());
        return ERROR;
    }

    /* 验证任务已不存在 */
    if (taskIdVerify(taskId) == ERROR)
        printf("Verification: task no longer exists\n");

    return OK;
}

编译与运行

在VxWorks开发环境中,将上述代码编译链接到VxWorks镜像或作为可加载模块。在VxWorks shell中执行:

ld < taskCreateDelete.o
taskCreateDeleteDemo()

验证方法

运行后观察串口输出,预期看到以下顺序的打印信息:

Task created, ID = 0x...
Demo task started, task ID = 0x...
Task state after 1s: exists (ready or delayed)
Demo task about to exit
Task deleted successfully
Verification: task no longer exists

通过条件:taskSpawn()返回有效任务ID;任务入口函数demoTask被执行并打印信息;taskDelete()返回OK;删除后taskIdVerify()确认任务已不存在。若任务在删除前已完成执行(2秒延时后退出),则taskDelete()可能返回ERROR(任务已不存在),此时应观察到taskIdVerify()返回ERROR,同样证明任务生命周期管理正确。

关键说明

  • taskSpawn()参数依次为:任务名、优先级、选项、栈大小、入口函数及最多10个入口参数。本示例未使用扩展选项,置0即可。
  • taskDelay()参数为时钟tick数,sysClkRateGet()获取系统时钟频率,用于将秒转换为tick。
  • 删除任务时若任务已自行退出,taskDelete()会返回ERROR并设置errno为S_objLib_OBJ_ID_ERROR,这是正常现象,可通过taskIdVerify()确认任务状态。