新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于uC/OS的嵌入式系統(tǒng)通信接口設(shè)計(jì)

基于uC/OS的嵌入式系統(tǒng)通信接口設(shè)計(jì)

作者: 時(shí)間:2011-07-15 來(lái)源:網(wǎng)絡(luò) 收藏

1 引言

隨著微電子技術(shù)的不斷創(chuàng)新和發(fā)展,已經(jīng)廣泛滲透到科學(xué)和技術(shù)的各個(gè)領(lǐng)域,如:工程設(shè)計(jì)、數(shù)碼產(chǎn)品、國(guó)防軍事、自動(dòng)化控制領(lǐng)域。是指將應(yīng)用程序、操作系統(tǒng)與計(jì)算機(jī)硬件集成在一起的系統(tǒng)。它以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ),而且軟硬件可以裁剪,因而是能滿足應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積和功耗的嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。

常用的主機(jī)與嵌入式外設(shè)的有RS232、USB、1394及10/100M以太網(wǎng)等接口。RS232接口被廣泛用于不同速度設(shè)備與主機(jī)通信,有使用廣泛,驅(qū)動(dòng)程序豐富,可靠性好等優(yōu)點(diǎn)。

本文以一個(gè)已開發(fā)成功的手持嵌入式儀器的RS232作為實(shí)例,詳細(xì)說(shuō)明了上位機(jī)和下位機(jī)通信程序的開發(fā)原理和過(guò)程,對(duì)類似的開發(fā)有很大的借鑒意義。

2 嵌入式通信系統(tǒng)結(jié)構(gòu)

嵌入式處理器有許多種流行的處理器核,本文采用Piliphs公司的LPC2210,它是基于一個(gè)支持實(shí)時(shí)仿真和跟蹤的16/32位ARM7TDMI-S CPU。對(duì)代碼規(guī)模有嚴(yán)格控制的應(yīng)用可使用16位Thumb模式將代碼規(guī)模降低超過(guò)30%,而性能的損失卻很小。

由于LPC2210的144腳封裝、極低的功耗、多個(gè)32位定時(shí)器、8路10位ADC、PWM輸出以及多達(dá)9個(gè)外部中斷使它們特別適用于工業(yè)控制、醫(yī)療系統(tǒng)、訪問(wèn)控制和電子收款機(jī)(P)。通過(guò)配置總線,LPC2210最多可提供76個(gè)GPIO。由于內(nèi)置了寬范圍的串行,LPC2210也非常適合于通信網(wǎng)關(guān)、協(xié)議轉(zhuǎn)換器、嵌入式軟件調(diào)制解調(diào)器以及其它各種類型的應(yīng)用。更詳細(xì)的資料見參考文獻(xiàn)[1]

500)this.style.width=500;" border=0>

3、嵌入式實(shí)時(shí)操作系統(tǒng)μC/-II的移植

對(duì)于大多數(shù)手持嵌入式儀器而言,采用公開源碼的操作系統(tǒng)μC/-II是最好的選擇,μC/OS-II是一個(gè)完整、可移植、可固化及可裁減占先實(shí)時(shí)多任務(wù)內(nèi)核。代碼簡(jiǎn)潔經(jīng)典,可靠性高。

μC/OS-II可以大致分為內(nèi)核、任務(wù)處理、時(shí)間處理、任務(wù)同步與通信、與CPU的接口等五部分。內(nèi)核(OSCore.c)是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初始化、系統(tǒng)運(yùn)行、中斷處理、時(shí)鐘節(jié)拍、任務(wù)調(diào)度和事件處理等多任務(wù)。任務(wù)處理部分(OSTask.c)是與任務(wù)操作密切相關(guān)的,包括任務(wù)的建立、刪除、掛起、恢復(fù)等。時(shí)鐘部分(OSTime.c)定義μC/OS-II的最小時(shí)鐘單位是Timetick(時(shí)鐘節(jié)拍)。任務(wù)同步和通信部分包括信號(hào)郵箱、郵箱隊(duì)列和時(shí)間 標(biāo)志等部分,主要用于任務(wù)間的互相聯(lián)系和對(duì)臨界資源的訪問(wèn)。與CPU接口部分是指μC/OS-II針對(duì)所使用的CPU的移植部分,主要包括中斷級(jí)任務(wù)切換的底層實(shí)現(xiàn)、任務(wù)級(jí)任務(wù)切換的底層實(shí)現(xiàn)、時(shí)鐘節(jié)拍的產(chǎn)生和處理、中斷和相關(guān)處理部分等內(nèi)容。

μC/OS-II除了良好的穩(wěn)定性和安全性以外,很重要的特點(diǎn)就是對(duì)多任務(wù)管理的優(yōu)異表現(xiàn)。μC/OS-II可以管理多達(dá)64個(gè)任務(wù)。除了8個(gè)μC/OS-II自用的任務(wù)以外,用戶的應(yīng)用程序最多可有56個(gè)任務(wù)。用戶可以通過(guò)系統(tǒng)提供的任務(wù)結(jié)構(gòu)來(lái)自行創(chuàng)立任務(wù)。更詳細(xì)的資料見參考文獻(xiàn)[4]。

本實(shí)例就是通過(guò)創(chuàng)建通信任務(wù)來(lái)實(shí)現(xiàn)下位機(jī)的通信。代碼如下:

/* 創(chuàng)建任務(wù)receive */

OSTaskCreate(TaskUart0Recieve, (void *)0,TaskComStk[TaskStkLengh - 1], 20 );

4 嵌入式RS232通信軟件設(shè)計(jì)

軟件部分的設(shè)計(jì)包括上、下位機(jī)通信協(xié)議的制訂、上位機(jī)程序和單片機(jī)程序的編寫。其中上位機(jī)程序以Visual BASIC為開發(fā)工具,單片機(jī)程序用ANSIC C編寫。

4.1 上位機(jī)與下位機(jī)通信協(xié)議的制訂

上位機(jī)與下位機(jī)之間的數(shù)據(jù)交換必須遵循一定的通信協(xié)議,通信雙方才能按照該協(xié)議解析所傳輸?shù)臄?shù)據(jù)。就本設(shè)計(jì)而言,規(guī)定串口數(shù)據(jù)幀為1起始位,8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)奇偶校驗(yàn)位,波特率為115200bps。

為了實(shí)現(xiàn)大文件的傳送,我們將文件切成塊,以二進(jìn)制方式傳送,這樣就使得任意大小的文件都可傳送,并且對(duì)系統(tǒng)的資源消耗最小。所制訂的通信協(xié)議為:

幀頭為6個(gè)字節(jié),具體規(guī)定如下:

a.消息幀數(shù)據(jù)格式: 1 0 A B X X ,其中 10 為消息標(biāo)識(shí), AB表示文本長(zhǎng)度, L=A*100+B, XX為配位字符,可以是任意值。

b.控制幀數(shù)據(jù)格式: 0 1 A B M N ,其中 01為控制標(biāo)識(shí), AB為請(qǐng)求標(biāo)識(shí), MN為附加標(biāo)識(shí), 11表示請(qǐng)求對(duì)方接收文件, M表示描述字串中文件名子串的長(zhǎng)度, N表示描述字串中文件大小子串的長(zhǎng)度, 10通知對(duì)方放棄傳輸, 00通知文件傳輸完畢, 01請(qǐng)求對(duì)方發(fā)送數(shù)據(jù), MN為10請(qǐng)求發(fā)送下一個(gè), MN為00請(qǐng)求重發(fā)。

c.數(shù)據(jù)幀數(shù)據(jù)格式: 0 0 A B M N, 其中 00 為數(shù)據(jù)標(biāo)識(shí),, AB表示數(shù)據(jù)長(zhǎng)度,L=A*100+B, MN為校驗(yàn),M*100+N=A+B。

前導(dǎo)幀使通信雙方保持同步,當(dāng)PC機(jī)發(fā)送數(shù)據(jù)時(shí),先將請(qǐng)求對(duì)方接收控制幀給下位機(jī),收到應(yīng)答幀后開始傳送;當(dāng)PC機(jī)接收數(shù)據(jù)時(shí),同樣地,先將請(qǐng)求對(duì)方發(fā)送控制幀給下位機(jī),下位機(jī)收到幀后開始傳送。

4.2 上位機(jī)軟件的編寫

上位機(jī)是一個(gè)數(shù)據(jù)發(fā)送與接收的終端,上位機(jī)軟件的功能是:使計(jì)算機(jī)與能夠通過(guò)RS232接口標(biāo)準(zhǔn)收發(fā)數(shù)據(jù)。由于Visual BASIC是一種易學(xué)易用的面向?qū)ο蟮某绦蛟O(shè)計(jì)工具,因而采用它來(lái)編寫上位機(jī)程序。在上位機(jī)程序中要能夠?qū)τ?jì)算機(jī)串行口的硬件進(jìn)行操作。本設(shè)計(jì)通過(guò)串行通信組件MsComm實(shí)現(xiàn)串行通信功能。在設(shè)計(jì)中還需要使用其它一些組件如CommandButton、TextBox、CommonDialog等來(lái)完成軟件界面的設(shè)計(jì)。界面如下:

500)this.style.width=500;" border=0>

4.3 下位機(jī)程序設(shè)計(jì)

通信任務(wù)代碼如下:

/*******************************************************************

** 函數(shù)名稱: TaskUart0Recieve

** 功能描述: μCOS-II的任務(wù)。從UART0接收并處理數(shù)據(jù)。通信調(diào)度程序!

** 輸 入: pdata 任務(wù)附加參數(shù)(指針)

** 輸 出: 無(wú)

*******************************************************************/

void TaskUart0Recieve(void *pdata)

{ uint8 bytTest[6];

uint32 i, intTest;

char strReceive[100];

pdata = pdata; /* 避免編譯警告 */

for (;;)

{ for (i = 0; i 6; i++)bytTest[i] = UART0Getch();/* 接收數(shù)據(jù)幀頭6Byte */

if((bytTest[0] == 1)(bytTest[1] == 0)){ //收到信息幀

intReceiveLen = bytTest[2] * 100 + bytTest[3];

for (i = 0; i intReceiveLen ; i++)strReceive[i] = UART0Getch();

}

else if(( bytTest[0] == 0)( bytTest[1] == 1)) //收到控制幀

{intTest = bytTest[2] * 100 + bytTest[3]; //控制幀分析

switch(intTest)

{ case 101: //對(duì)方請(qǐng)求接收新文件

intReceiveLen = bytTest[4];

i = 0;

do{strFileName[i++] = UART0Getch(); //'接收文件名信息

}while (i intReceiveLen);

intReceiveLen = bytTest[5];

i = 0;

do{strReceive[i++] = UART0Getch(); //接收文件長(zhǎng)度信息

}while (i intReceiveLen);

intFileLenth = atol(strReceive); //文件長(zhǎng)度

FileReceiveManager(0); //receive

break;

case 100:break; //對(duì)方通知放棄傳輸

case 1: //對(duì)方請(qǐng)求發(fā)送數(shù)據(jù)

if( bytTest[4] == 1){ //請(qǐng)求發(fā)送數(shù)據(jù)包

intDataNumber++;

if (intDataNumber >= intDataCount)

FileSendManager(4); //發(fā)送完成信號(hào)

else

FileSendManager(1); //發(fā)送新一幀數(shù)據(jù)

}

else

FileSendManager(2); //重發(fā)上一幀數(shù)據(jù)

break;

case 0: //接收到傳輸完畢信號(hào)

FileReceiveManager(4);

break;

}

}

else if( (bytTest[0] == 0)(bytTest[1] == 0)) //收到數(shù)據(jù)幀

{intTest = bytTest[4] * 100 + bytTest[5];

intReceiveLen = bytTest[2] * 100 + bytTest[3]; //數(shù)據(jù)字節(jié)數(shù)

i = 0;

do{ b_char[intFileReceiveLenth + i++ ] = UART0Getch();// 一幀數(shù)據(jù)

}while (i intReceiveLen);

if(intTest == (bytTest[2] + bytTest[3])) //根據(jù)校驗(yàn)和作出響應(yīng)

FileReceiveManager(1); //校驗(yàn)和正確請(qǐng)求發(fā)送新數(shù)據(jù)

else

FileReceiveManager(2); //校驗(yàn)和錯(cuò)請(qǐng)求重新發(fā)送

}

else if( (bytTest[0] == 1)(bytTest[1] == 1)) //發(fā)送數(shù)據(jù)到PC

FileSendManager(0); //發(fā)數(shù)據(jù)

}

} /* 關(guān)于UART0Getch() 請(qǐng)參看參考文獻(xiàn)[2] */

/* 文件發(fā)送管理 void FileSendManager(uint32 intFlag) 根據(jù)接收端的請(qǐng)求發(fā)送文件 */

/*文件接收管理void FileReceiveManager(uint32 intFlag) 處理接收到的文件數(shù)據(jù) */

以上兩函數(shù),限于篇幅,具體代碼略。

5 結(jié)束語(yǔ)

本文闡述了嵌入式系統(tǒng)的概念及嵌入式通信系統(tǒng)的結(jié)構(gòu)。在設(shè)計(jì)中,作者充分地發(fā)揮了/OS-II的多任務(wù)管理功能,為實(shí)現(xiàn)通信功能而單獨(dú)分配了一個(gè)優(yōu)先級(jí)較低的任務(wù),使得下位機(jī)在與主機(jī)通信的同時(shí),能繼續(xù)自己的工作,真正實(shí)現(xiàn)了實(shí)時(shí)多任務(wù);此外,為了實(shí)現(xiàn)大文件的傳送,我們將文件切成塊,以二進(jìn)制方式傳送,這樣就使得任意大小的文件都可傳送,并且對(duì)系統(tǒng)的資源消耗最小,對(duì)于嵌入式系統(tǒng),這是很有意義的。最后,為了便于參考,給出了在一個(gè)裁剪的/OS-II操作系統(tǒng)環(huán)境下,實(shí)現(xiàn)系統(tǒng)與主機(jī)通信的下位機(jī)程序源碼。

參考文獻(xiàn):

[1] LPC221016/32-bit ARM microcontroller with 10-bit ADC and external memory interface Rev. 01 — 09 February 2004 ,Philips Semiconductors

[2] ARM嵌入式系統(tǒng)實(shí)驗(yàn)教程(二),廣州周立功單片機(jī)技術(shù)有限公司,2005.

[3] 劉承廣,常宇健,楊衛(wèi)東,施博學(xué). OS-II在車載GPS移動(dòng)終端中的應(yīng)用.  

  微計(jì)算機(jī)信息(旬刊).2005;21(2):103-104

[4] Labrosse Jean J. 嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ. 邵貝貝譯. 第2版. 北京:北京航空航天大學(xué)出版社, 2003

作者簡(jiǎn)介

羅永道,1969.9,男,漢,北京理工大學(xué) 光學(xué)工程專業(yè) 在讀博士

EMail : lyd@bit.edu.cn

羅 徽,1972.7,男,漢,昆明理工大學(xué) 計(jì)算機(jī)應(yīng)用專業(yè) 在讀碩士;

廖寧放,1960.1,男,漢,教授,博士生導(dǎo)師 北京理工大學(xué)

通信地址:北京市海淀區(qū)中關(guān)村南大街5號(hào) 北京理工大學(xué) 信息科學(xué)技術(shù)學(xué)院顏色科學(xué)與工程國(guó)家專業(yè)實(shí)驗(yàn)室 郵編:100081

數(shù)字通信相關(guān)文章:數(shù)字通信原理


通信相關(guān)文章:通信原理




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉