-
常用的库
#include <taskLib.h> // 任务
#include <msgQLib.h> // 消息队列
#include <semLib.h> // 信号量
#include <ioLib.h> // IO
#include <wdLib.h> // 看门狗
#include <logLib.h> // 信息输出
#include <socket.h> // 网络套接字
-
IO系统:ioLib.h
1. 系统中的IO设备,包括键盘、串口、文件等,都统一的接口访问。第一步通常都是先得到文件描述符,然后进行读写或者设置工作,最后关闭文件描述符。
create:建立文件
open:得到文件或设备的文件描述符
read:读文件或设备
Ioctl:设置参数
remove:删除文件
2. 内存文件
memDrv() - 初始化伪内存设备
memDevCreate() - 建立伪内存设备
memDevCreateDir() - 建立一组伪内存设备
memDevDelete() - 删除伪内存设备
例如:
Init() {
uchar_t buffer[1024];
Int fd;
memDrv();
memDevCreate(“/mem/mem1”, buffer, sizeof(buffer));
If ((fd = open(“/mem/mem1”, O_RDWR, 0644) != ERROR) {
write(fd, &data, sizeof(data));
.....
close(fd);
}
memDevDelete(“/mem/mem1”);
}
3. 通过select函数实现多个IO监听:selectLib.h
当等待多个IO时,我们可以使用select函数,fd为文件描述符:
int select(
int width, // 最大的fd,或直接FD_SETSIZE(2048)
fd_set *pReadFds, // 读的fd集合
fd_set *pWriteFds, // 写的fd集合
fd_set *pExceptFds, // NULL
struct timeval * pTimeOut // 等待时间,NULL = forever
)
还有几个宏:
FD_SET(fd, &fdset) 设置fd的监听位
FD_CLR(fd, &fdset) 清除fd的监听位
FD_ZERO(&fdset) 清除所有监听位
FD_ISSET(fd, &fdset) fd是否有数据
例子,其中MAX意为取最大值:
Init()
{
srruct fd_set readFds;
int fds[4];
int width;
fds[0] = open(..);
...;
...;
fds[3] = open(..);
width = MAX(fds[0], ... ..., fds[3]) + 1;
// forever
FD_ZERO(&readFds); // 设置fd_set结构
FD_SET(fds[0], &readFds);
FD_SET(fds[1], &readFds);
FD_SET(fds[2], &readFds);
FD_SET(fds[3], &readFds);
if(select(width, &readFds, NULL, NULL, NULL) == ERROR)) {
close(fds[0];
...;
...;
close(fds[3]);
return;
}
for (i = 0; i < 4; i++) {
if (FD_ISSET(fds[i], &readFds)) {
// 进行读写操作
}
}
}
多任务环境编程
1. 任务控制:taskLib.h
taskSpawn() - 创建任务
taskInit() - 初始化任务
taskActivate() - 激活已经初始化的任务
exit() - 在任务中结束
taskDelete() - 删除任务
taskSuspend() - 挂起任务
taskResume() - 恢复挂起的任务
taskRestart() - 重新启动任务
taskPrioritySet() - 改变任务优先级
taskPriorityGet() - 获取任务优先级
taskLock() - 禁止任务调度
taskUnlock() - 允许任务调度
taskSafe() - 保护任务不被删除
taskUnsafe() - 解除保护
taskDelay() - 延时
taskIdSelf() - 获取当前任务的ID
taskIdVerify() - 任务ID是否存在
taskTcb() - 得到任务控制块
taskOptionsSet() - 改变任务选项
taskOptionsGet() - 得到任务当前的选项
taskRegsSet() - 设定任务TCB中寄存器的信息
taskRegsGet() - 得到任务TCB中寄存器的信息
taskName() - 得到任务名称
taskNameToId() - 由名称得到ID
taskIdDefault() - 设置默认的任务ID
taskIsReady() - 任务是否就绪
taskIsSuspended() - 任务是否挂起
taskIdListGet() - 得到活动的任务列表
2. 任务互斥----信号量:semLib.h
semGive() - 释放一个信号量
semTake() - 获取一个信号量,会阻塞
semFlush() - 使所有阻塞在这个信号量上的任务变为就绪状态
semDelete() - 删除一个信号量
1)二进制信号量:semBCreate
可用于任务同步和互斥,但常用于任务同步
2)互斥信号量:semMCreate
用于任务互斥
3)计数信号量:semCCreate
多实例资源的访问控制
3. 任务同步
1)消息队列:msgQLib.h
msgQCreate() - 创建消息队列
msgQDelete() - 删除消息队列
msgQSend() - 发送消息
msgQReceive() - 接受消息,会阻塞
msgQNumMsgs() - 得到消息队列中的消息数
2)管道:ioLib.h
pipeDevCreate() - 创建管道
pipeDevDelete() - 删除管道
3)二进制信号量
4)事件:eventLib.h
发送事件要制定目标任务ID
eventReceive() - 等待事件
eventSend() - 发送事件
eventClear() - 清除当前任务的事件
五、watch dog:wdLib.h
系统提供了看门狗定时器,
wdCreate() - 创建看门狗
wdDelete() - 删除
wdStart() - 启动
wdCancel() - 停止
六、网络编程:sockLib.h
使用标准的BSD Socket套接字,使用TCP/UDP协议进行通信
socket() - 创建套接字
bind() - 绑定端口和IP
listen() - 监听模式
connect() - 主动连接
accept() - 接受连接
connectWithTimeOut() - 超时功能的connect函数
sendto() - 发送
send() - 发送
sendMsg() - 发送
recvfrom() - 接收
recv() - 接收
recvmsg() - 接收
setsockopt() - 设定套接字参数
getsockopt() - 得到套接字参数
getsockname() - 得到套接字名称
getpeername() - 得到连接的对点的名称
shutdown() - 关闭连接
七、 异常处理
1. errorLib.h
32位有符号整数,1~500被系统占用,其他程序内可用,
errnoGet() - 得到当前任务的错误号
errnoOfTaskGet() - 得到指定任务的错误号
errnoSet() - 设定当前任务的错误号
errnoOfTaskSet() - 设定指定任务的错误号
2. 信号:sigLib.h
signal() - 指定信号的入口函数
raise() - 发送信号给当前任务
kill() - 发送信号给指定任务
八、中断:iv.h
x86的0X0~0xf号中断对应VxWorks中0X20~0X2f号中断
以9号中断为例:
初始化中断:
initConnect(INUM_TO_IVEC(9+0X20), Int9Handler, 0); // 绑定中断函数
sysIntEnablePIC(9); // 使能9号中断
中断函数原型:
void Int9Handler(int param); // 注意中断函数中不要调用阻塞函数