- 相關(guān)推薦
基于Vxworks實時操作系統(tǒng)的串口通信程序設(shè)計與實現(xiàn)
摘要:結(jié)合嵌入式實時操作系統(tǒng)VxWorks實現(xiàn)風(fēng)洞測控系統(tǒng)的實際應(yīng)用,以其中的串口通信為例,討論了在VxWorks下實現(xiàn)串口通信的關(guān)鍵技術(shù),給出了基本原理、環(huán)境配置和程序示例。
關(guān)鍵詞:VxWorks; 實時操作系統(tǒng); 嵌入式操作系統(tǒng);串行通信
[Abstract] Combining with the application of wind tunnel measure and control system with embedded real-time operating system VxWorks , with the serial communication in it as an example ,the key techniques about realization of the serial communication in VxWorks are discussed. Communication mechanism, environment configure and corresponding program examples are provided.
[Key words] VxWorks;RTOS;embedded operating system; Serial Communication
1前言
目前市場上比較著名的實時操作系統(tǒng)有:VxWorks、PSOS、Nucleus、QNX、VRTX、Windows CE、Palm 0S、Lynx0S等。 其中,VxWorks是一個具有微內(nèi)核、可裁剪的高性能強(qiáng)實時操作系統(tǒng),在實時操作系統(tǒng)市場上處于領(lǐng)先地位。它以其良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中,如衛(wèi)星通訊、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國的 F-16戰(zhàn)斗機(jī)、B-2 隱形轟炸機(jī)和愛國者導(dǎo)彈上,甚至火星探測器上都使用了VxWorks實時操作系統(tǒng)。在嵌入式實時操作系統(tǒng)中使用串口通信,不僅可擴(kuò)展嵌入式設(shè)備通信能力,而且可擴(kuò)大其應(yīng)用范圍。
2 VxWorks簡介
VxWorks是由wRS(wind River Systems,Inc.)公司開發(fā)的一套具有微內(nèi)核、高性能、可伸縮的實時操作系統(tǒng),支持廣泛的網(wǎng)絡(luò)通信協(xié)議,并能夠根據(jù)用戶的需求進(jìn)行組合,其開放式的結(jié)構(gòu)和對工業(yè)標(biāo)準(zhǔn)的支持使開發(fā)者只需做最少的工作即可設(shè)計出有效的適合于不同用戶要求的系統(tǒng)。除了性能出眾的操作系統(tǒng)之外,wRS公司還提供了優(yōu)秀的實時操作系統(tǒng)開發(fā)工具Tornado。Tornado由三個高度集成的部分組成:Tornado工具,一整套強(qiáng)有力的交叉開發(fā)工具;VxWorks運行系統(tǒng),是運行在目標(biāo)機(jī)上的高性能、可裁剪的實時操作系統(tǒng);連接目標(biāo)機(jī)和宿主機(jī)的通信選項,加以太網(wǎng)、串行線路、在線仿真等。Tornado能夠支持Windows、Unix等流行的工作平臺和PowerPC、X86、ARM等幾乎所有的目標(biāo)處理器,所提供的工具可用于所有目標(biāo)機(jī),并具有兩種調(diào)試模式(系統(tǒng)模式和任務(wù)模式)。除了基本的功能和開發(fā)工具外,Tornado還具有先進(jìn)的系列網(wǎng)絡(luò)產(chǎn)品,極大地擴(kuò)展了Tornado的網(wǎng)絡(luò)特性,并增強(qiáng)了嵌人式微處理器的網(wǎng)絡(luò)特性。[1]
3 串口通信基本原理
串口在嵌入式系統(tǒng)當(dāng)中是一類重要的數(shù)據(jù)通信接口,其本質(zhì)功能是作為CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從CPU經(jīng)過串行端口發(fā)送出去時,字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位;在接收數(shù)據(jù)時,串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出資源申請要求(打開串口),通信完成后必須釋放資源(關(guān)閉串口)。
串口通信的優(yōu)點是開發(fā)簡單,在傳輸數(shù)據(jù)量不大、要求速度不高而傳輸距離較大的通信場合得到廣泛應(yīng)用。
在VxWorks中,將I/O系統(tǒng)設(shè)計成為任何類型的設(shè)備提供一個簡單、統(tǒng)一、獨立于設(shè)備的接口,任何對于串口的操作都可以視為對一個文件的操作,而不必了解串口設(shè)備或程序驅(qū)動實現(xiàn)的細(xì)節(jié)。在串口通信軟件的設(shè)計中,當(dāng)串口初始化完成后,在使用之前利用open()打開相應(yīng)串口,然后進(jìn)行配置。
VxWorks提供終端和偽終端設(shè)備驅(qū)動。Tty驅(qū)動針對實終端;pty針對仿真終端的程序。Tty設(shè)備有兩種操作模式:raw模式和line模式。在raw模式下,每個剛從設(shè)備輸入的字符對讀者都是有效的;在line模式下所有輸入字符被存儲,直到NEWLINE字符輸入。設(shè)備選項字使用帶FIOSETOPTIONS 功能的ioctl()程序來設(shè)置。[2]
配置完成后,依據(jù)串口打開時的讀寫標(biāo)志,調(diào)用函數(shù)write()、read()對串口進(jìn)行只讀操作、只寫操作或同時進(jìn)行讀寫操作。
為提高數(shù)據(jù)接收的實時性,可采用中斷方式,利用VxWorks提供的select函數(shù)的事件觸發(fā)機(jī)制,將讀串口的任務(wù)阻塞使其一直等待數(shù)據(jù),當(dāng)有數(shù)據(jù)來到的時候該任務(wù)會立刻自動響應(yīng),提高系統(tǒng)的實時性。
4 環(huán)境配置
在本實時應(yīng)用系統(tǒng)中采用486機(jī)作為目標(biāo)機(jī),串口通信時目標(biāo)機(jī)VxWorks系統(tǒng)啟動盤的制作步驟:
(1) 修改通用配置文件\Tornadotargetconfigpc486config.h。在config.h文件中加入以下宏定義:
#define INCLUDE_WDB
#define INCLUDE_WDB_TTY_TEST
#undef WDB_COMM_TYPE
#define WDB_COMM_TYPE WDB_COMM_SERIAL /*定義通信方式為串口聯(lián)結(jié)*/
#define WDB_TTY_CHANNEL 1 /*通道號*/
#define WDB_TTY_BAUD 9600 /*串口速率,可設(shè)置至38400*/
#define WDB_TTY_DEV_NAME "tyCo/1"
#define CONSOLE_TTY 0
#define DEFAULT_BOOT_LINE "fd=0,0(0,0)hostname:/fd0/vxWorks h=主機(jī)
ip e=目標(biāo)機(jī)ip u=主機(jī)上的登錄用戶名"
(2) 在Tornado集成環(huán)境中執(zhí)行菜單命令Project > Make PC486 > Common Targets > clean刪除以前生成的文件,執(zhí)行菜單命令Project > Make PC486 > Boot Rom Targets > bootrom_uncmp編譯鏈接生成bootrom_uncmp ;再選擇VxWorks Target,編譯生成vxworks;
(3) 拷貝\Tornadotargetconfigpc486bootrom_uncmp至\Tornadohostbin下
(4) 重命名文件bootrom_uncmp為bootrom;
(5) 準(zhǔn)備一張已格式化的空盤插入軟驅(qū);
(6) 在目錄\Tornadohostbin下執(zhí)行命令 mkboot a: bootrom;
(7)拷貝\Tornadotargetconfigpc486VxWorks至軟盤;
(8) 將系統(tǒng)制作盤插入目標(biāo)機(jī)軟驅(qū),加電啟動目標(biāo)機(jī)即載入VxWorkst系統(tǒng)。[3]
5程序示例
5.1 在程序中加入下列頭文件
#include <vxWorks.h>
#include "strLib.h"
#include <string.h>
#include <sioLib.h>
#include <ioLib.h>
#include <stdio.h>
#include <ioctl.h>
#include <selectLib.h>
#include "types/vxTypesOld.h"
5.2 打開串口
int open_com1(void) //打開串口1函數(shù)
{ int sfd;//串口設(shè)備文件描述符
sfd =open(”/tyCo/0”,0_RDWR,0);//打開串口并返回串口設(shè)備文件描述符
if(sfd ==ERROR) //如果不能打開串口1則打印出錯信息
printf("You can’t open port com1 !");