2. 编写第一个VxWorks应用
任务目标
在VxWorks 7环境中创建第一个应用程序:编写一个打印"Hello World"的任务,交叉编译生成可下载的模块(.out文件),并通过FTP或WindShell将其加载到目标机(或仿真器VxSim)上运行,验证任务正确执行并输出预期字符串。
环境与依赖
- VxWorks 7 + Workbench(或VxWorks 6.9 + Workbench 3.x)
- 已创建并启动的VxWorks目标机(或VxSim仿真器),且网络可达
- 目标机已启用FTP服务器或WindShell调试通道
- BSP开发包(如x86、ARM或VxSim)已正确安装
实现代码
创建一个C文件 hello.c,定义入口函数 helloTask,该函数被注册为内核任务启动点。使用标准POSIX接口 printf 输出信息,任务完成后自我挂起(不返回),避免任务异常退出。
/* hello.c - 第一个VxWorks应用 */
#include <vxWorks.h>
#include <stdio.h>
#include <taskLib.h>
/* 任务入口函数 */
void helloTask(void)
{
/* 打印信息到控制台/串口 */
printf("Hello World from VxWorks!\n");
printf("Task ID: 0x%x, Name: %s\n",
(unsigned int)taskIdSelf(), taskName(taskIdSelf()));
/* 任务执行完毕后自我挂起,避免任务函数返回导致错误 */
taskSuspend(taskIdSelf());
}
/* 通过taskSpawn创建并启动hello任务 */
STATUS startHelloTask(void)
{
int taskId;
taskId = taskSpawn("tHello", /* 任务名 */
100, /* 优先级 */
VX_FP_TASK, /* 选项:浮点任务 */
0x2000, /* 栈大小 8KB */
(FUNCPTR)helloTask, /* 入口函数 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
if (taskId == ERROR) {
printf("Failed to spawn hello task (errno=0x%x)\n", errnoGet());
return ERROR;
}
return OK;
}
编译与下载
编译(Workbench中):
- 新建下载型工程(Downloadable Kernel Module Project),选择对应BSP。
- 将
hello.c加入工程,编译生成hello.out。
下载到目标机(两种方式任选):
- 方式A(FTP): 在目标机Shell中执行
ftp命令从主机获取文件,或使用Workbench的Target > Load Module直接加载。 - 方式B(WindShell): 在Workbench的WindShell中执行:
ld < hello.out
加载成功后调用:
startHelloTask()
验证方法
在目标机控制台/串口终端观察输出。若看到以下两行内容,则任务创建、编译、下载、运行全链路正确:
Hello World from VxWorks!
Task ID: 0x3a3f3c0, Name: tHello
同时可在WindShell中执行 i 命令查看任务列表,确认 tHello 处于 SUSPEND 状态,说明任务已正常启动并完成打印后主动挂起,无异常退出。
常见问题
- 编译报错找不到vxWorks.h: 检查工程属性中是否正确选择了BSP开发包,且包含路径已指向BSP的
h目录。 - 加载失败(errno=0x10001): 目标机内存不足或模块与内核版本不匹配,确认编译时选择的BSP与目标机运行的VxWorks镜像一致。
- 任务未打印: 确认目标机串口/控制台重定向已配置,或使用
printf输出被日志任务缓冲,可尝试在任务中加入ioTaskStdSet重定向标准输出。