具体划分如图2所示:
图2 系统软件结构和模块划分
3 系统软件详细设计
3.1 用户层与内核层的通信设计
用户层与内核层在嵌人式Linux系统中属于两个相对独立的空间,两个空间之间不能直接进行通信和数据交换。嵌入式Linux系统进行Xenomai实时化改造后,管道通信、消息队列和共享内存等全部保留。用户层与内核层通过管道通信进行连接,在内核层建立管道后,在用户层可以通过读取设备文件进行管道读写。
内核层创建及读写管道如下:
int rt_pipe_create (RT_ PIPE *pipe, const char*name, int minor,siu t poolsize); //创建管道
ssize t rt_pipe_receive (RT_PIPE *pipe, RT_PIPE_MSG **msgp, RTIME timeout);
//从管道接收一条信息;
ssize_t rt_pipe_send (RT_PIPE *pipe, RT_PIPE_MSG *msg, size_tsize, int mode);
//向管道发送一条信息
用户层读写管道如下:
int PipeO=open("/dev/ntp0",O_RDWR);
//打开管道文件
int write(int handle, void *buf, int nbyte);
//向管道文件写入数据
int read(int handle, void *buf, int nbyte);
//读取管道文件数据
3.2 用户层的设计
友好的人机界面是数控必须具备的功能,用户层的主要任务就是提供人机交互界面。通过比较市面上流行的GUI开发软件Qt/Embedded,MiniGUI, UC/GUI和Nano-X,结合Linux特性,本数控系统选用Qt/Embedded进行界面程序的开发。Qt/E是一个完整的基于framebuffer的GUI系统,它用C++编写,对用C语言程序有很好的兼容性,有着丰富的API函数库和图形处理功能,界面开发与图形驱动分开,易于开发和移植,同时它也是开源软件。
设计过程中,根据用户层的划分,把位置、刀补、程序等界面采用单独的QWidget设计,每个界面都有自己的头文件和cpp文件,所有界面公用一个数据结构,将各个界面通用的参数放到一起,设置一个主Mainwindow,用于系统初始化、界面切换、变量初始化以及加载系统信息等功能。主界面中对按键的处理也是相当重要的,开发过程中充分利用Qt中的按键事件,设计过程中区分按下及释放事件,并单独编写按键更新程序。具体如下:
void mainWindow::keyPressEvent(QKeyEvent *k}
void mainWindow::keyReleaseEvent(QKeyEvent *k)
void mainWindow::keyUpdateQ
用户层设计过程中着重要考虑的就是各个界面之间的通信问题,各界面之间充分利用Qt特有的信号与槽的通信机制,在界面之间进行信号发送和槽函数调用。具体实现如下:
signals: void mySignal(); //信号
public slots: void mySlotQ; //槽函数
bool QObject::connect(const QObject*sender,
const char*signal, const QObject*receiver,
const char * member);//信号与槽函数的连接