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()确认任务状态。