1 S3C2410硬件平臺簡(jiǎn)介 S3C2410是韓國三星公司生產(chǎn)的新一代高性能微處理器,它是基于ARM920T內核的16/32位RISC處理器.主要應用于嵌入式系統中。 S3C2410擁有強大的數據處理能力.又有著(zhù)低成本.低功耗等優(yōu)點(diǎn).在各種手持及移動(dòng)設備上的應用越來(lái)越廣泛,基于其平臺的程序功能也越來(lái)越復雜。于是,在其平臺上架構多線(xiàn)程的操作系統已成為越來(lái)越多系統設計者的訴求,本文介紹多線(xiàn)程在S3C2410上的具體實(shí)現過(guò)程。 2 系統結構分析 串行端口的本質(zhì)功能足作為CPU和串行設備問(wèn)的編碼轉換器,一般微機內都配有通信適配器,使計算機能夠與其他具有RS232C串口的計算機或設備進(jìn)行通信。本系統主要目的是實(shí)現宿主機與目標機之間的近距離串行通信,采用的宿主機是Intel X86架構的Red Hat Linux 9.03環(huán)境PC機,而目標機是ARM架構的開(kāi)發(fā)板。 本系統中目標機開(kāi)發(fā)板的內核采用的是三星的S3C2410,該開(kāi)發(fā)板采用核心板加底板的模式.核心板接口采用DIMM200標準連接器.工作非?煽,可穩定運行在203 MHz的時(shí)鐘頻率下。其外設非常豐富.功能強大.完全可以滿(mǎn)足設計需要。串口線(xiàn)采用常用的RS 232C型接口模式。能實(shí)現計算機與開(kāi)發(fā)板間的數據傳輸與控制。 3 系統硬件結構原理 串行通信可以在DOS或Windows環(huán)境下進(jìn)行?梢杂脜R編或高級語(yǔ)言編寫(xiě)通信程序,本文介紹如何在Linux操作系統下來(lái)實(shí)現串口間的通信。 在串口通信的實(shí)現過(guò)程中。要保證數據傳輸的可靠性和穩定性.其硬件設計是必不可少的,本文中選用S3C2410芯片作為核心器件。S3C2410芯片是SAMSUNG公司16/32位的RISC處理器。采用ARM920T內核,內部具有2個(gè)獨立的UART控制器以及分開(kāi)的16 kB的指令Cache和16 kB數據Cache,每個(gè)控制器支持的最高波特率可達到230.4 kb/s。S3C2410芯片的這些特點(diǎn),為實(shí)現在“nux操作系統下計算機與開(kāi)發(fā)板問(wèn)的串口通信提供了可靠的保證;赟3C2410的嵌入式串口通信的硬件結構原理如圖1所示。 ![]() 圖1 系統硬件結構原理圖 宿主機計算機系統中,在Linux操作系統下編寫(xiě)好串口通信的程序.通過(guò)JTAG接口模塊下載至目標機即開(kāi)發(fā)板中,在相應的軟件控制命令下.通過(guò)串行接口線(xiàn)即町實(shí)現宿主機與目標機問(wèn)數據的發(fā)送和接收。目標機中電源模塊提供了開(kāi)發(fā)板系統工作所需的正常電壓。各種數據信息町以通過(guò)液晶顯示模塊及時(shí)顯示出來(lái).還可以通過(guò)鍵盤(pán)控制模塊來(lái)實(shí)現對日標機操作的控制,外擴存儲器模塊町以由FLASH或SDRAM構成,當然作為一個(gè)完整的系統.還必須配有其他外圍電路,以保證系統的正常工作。 4 軟件實(shí)現 串口通信軟件的設計是系統成功運行的關(guān)鍵,如何保證通信的效率、可靠性、實(shí)時(shí)性以及節約系統的資源足設計者關(guān)心的問(wèn)題,因此通信協(xié)議的定義、軟件外發(fā)的結構設計、程序開(kāi)發(fā)工具的選擇在系統設計中極其重要。PC端串口通信程序的開(kāi)發(fā)是基于Windows環(huán)境面向對象的設計方法,開(kāi)發(fā)環(huán)境選用vc++,實(shí)現的方法有多種,對此作介紹的文獻也較多。在此不詳述。對于單片機端的串口通信程序,有文獻介紹基于匯編語(yǔ)言的程序框架,但基于分層結構的C語(yǔ)苦實(shí)現卻少有介紹。下面將具體介紹在Keil C51中,分層結構框架下串口全雙工通信程序的設計與實(shí)現。 4.1 通信協(xié)議口波特率 基于串I=1的通信模式有間步通信和異步通信兩種,這取采用的是異步串行通信。在通信過(guò)程中,單片機應處理以下問(wèn)題: (1)識別命令。PC機將命令傳送給單片機,單片機能夠識別不同的命令而且根據不同的命令內容完成不同的操作。(2)識別數據。單片機能識別附加在命令后的數據。傳送數據的最大位數由設置的緩沖區大小決定。(3)出錯處理。包括識別無(wú)效命令和處理通信錯誤。當啦片機接收到系統沒(méi)有定義過(guò)的命令.或者收到的命令不符合預先定義的格式時(shí)。它應該做出響應.向系統報錯并能進(jìn)行錯誤處理,錯誤類(lèi)型編號應事先定義。(4)正確應答。當單片機系統接收到一條沒(méi)有通信錯誤且符合通信協(xié)議的信息時(shí),應根據所接收的命令進(jìn)行相應操作,并把操作結果返回PC機.如發(fā)一個(gè)“OK”信息以示確認。 PC機應處理的問(wèn)題:(1)采集單片機發(fā)送的數據,如某設備模塊的狀態(tài)信息;(2)接收單片機的正常響應和錯誤響應信息,若足錯誤響應信息,應根據錯誤類(lèi)型,以處理。由于控制的設備模塊可能有多個(gè),通過(guò)對設備模塊統一編址,給不同的設備設置唯一的16位地址加以區分。這樣在PC機和單片機進(jìn)行數據傳送時(shí),雙方能夠識別數據的來(lái)源及需控制的對象。如表1所樂(lè )為通信協(xié)議格式示例.由PC機傳輸命令協(xié)議和單片機響應協(xié)議組成。 ![]() 表1 通信協(xié)議示例 4.2 單片機通信軟件的分層設計 單片機系統的軟件開(kāi)發(fā)環(huán)境為Keil C51。與匯編語(yǔ)言相比.C語(yǔ)言在結構性、可讀性、可維護性上有明顯的優(yōu)勢.更利于程序移植和擴展。串口通信程序采用分層結構。即將程序按層次分為物理層、驅動(dòng)層,應用層,分層設計有以下優(yōu)點(diǎn):(1)與主機通信的串口程序支持接收和發(fā)送并發(fā)處理(主動(dòng)發(fā)送和被動(dòng)查詢(xún)設備并存),利于提高通信效率及數據處琿的實(shí)時(shí)性。(2)當單片 機只有一個(gè)串口而以串口通信方式控制的設備模塊有多個(gè)時(shí)。必需對串口擴展,為了簡(jiǎn)化硬件則需用軟件實(shí)現模擬的串口。因此系統內部應有支持I/O口模擬串口操作的軟件實(shí)現。標準串I/O和模擬串口在物理實(shí)現上有區別,但采用統一的對外封裝,以提高程序的封裝性和模塊化祥度。(3)防止由于串口操作向在流程中獨占CPU資源.避免漏檢狀態(tài)信息等現象發(fā)生。 三層程序的主要功能及C語(yǔ)言實(shí)現如下所述: (1)驅動(dòng)層:也稱(chēng)抽象層,在該層定義串口基本操作結構;诖私Y構實(shí)現不同方式下的串口設計,包括中斷方式下的串口實(shí)現和I/O口模擬方式下的串口實(shí)現。雖然兩種方式的底層實(shí)現有所區別。但足驅動(dòng)層屏蔽不同串口操作的物理細節,簡(jiǎn)化應用層對串口的操作。串口的結構定義如下: typedef struct Serial { void (* pfSetBaudRate)(unsigned long baud_rate); //設置串口波特率 void (*pfOpen)(void); //串口打開(kāi) void (*pfClose)(void); //串口關(guān)閉 unsigned (*pfGetChar)(unsigned char *c); //從接收緩存中取一個(gè)數 void (*pfPutChar)(unsigned char c); //發(fā)送一個(gè)字節 void (*pfPutStr)(unsigned char *tmp_str, unsigned char tmp_len); //發(fā)送一串數 }Cserial; (2)物理層:在該層針對不同的串口實(shí)體.完成不同的物理操作.如單片機串口初始化、I/O模擬串口方式下的定時(shí)器初始化、I/O中斷初始化等。其作用是給不同的串口操作模式提供支撐。針對標準全雙工串口和模擬串口兩類(lèi)不同的物理實(shí)現方式.設計不同的串口實(shí)體(包含內部執行每類(lèi)串口的底層操作及相關(guān)基本的外部初始化等操作),不同的實(shí)現方式,綁定不同的操作函數指針.指針指向不同的操作。兩種串口實(shí)體封裝成統一的串口基礎類(lèi),使程序具有更強的通用性和擴展性。在物理層采用循環(huán)FIFO雙緩沖隊列對接收和發(fā)送的數據進(jìn)行緩存、讀取,緩沖區循環(huán)FIFO操作方式與中斷方式下接收和發(fā)送數據的結合使用,保證了數據處理的可靠性、實(shí)時(shí)性。,由于篇幅所限.下面只給出了緩沖區結構和相關(guān)指針的聲明程序示例代碼: typedef struct Fifo { unsigned char *m_buf;//定義緩沖區首地址 unsigned int m_bufsize;//定義緩沖區大小 unsigned int m_wp; //寫(xiě)入數據 unsigned int m_rp; //讀出數據 )CFifo; unsigned char(fFifoPush)(CFifo *me, unsigned char c);//數據入隊 unsigned char(fFifoPop)(CFifo *me);//數據出隊 void fFifolnit(CFifo *me, unsigned char * tmp_buf,unsigned int tmp_size);//初始化 (3)應用層:完成對單片機系統初始化。包括串口驅動(dòng)結構實(shí)體的初始化。然后按統一的串口驅動(dòng)層接口對串口操作而不關(guān)心其物理實(shí)現方式,如波特率設置、串口開(kāi)關(guān)、收發(fā)數據等,循環(huán)接收、處理串口的命令和數據.處理單片機的I/O 口操作等。以下為主應用程序基本架構.本爾例為系統接收串口數據后。直接返回主機。 extern CSerial xdata mSerial; //在物理層,已聲明該串口實(shí)體 void main(void) { EA=0;//禁止中斷 Uart_Init(); //串口初始化 mSerial.pfSetBaudRate(9600);//設置波特率為9600bps mSerial.pfOpen(); //打開(kāi)串口 //⋯其它初始化程序, EA=l: //開(kāi)放中斷 while(1){ if(mSefial.pfGetchar(&i))mSerial.pfPutchar(i) } //⋯其它循環(huán)檢測、處理程序 } 5 小結 本文作者創(chuàng )新點(diǎn)足詳細地說(shuō)明了基于S3C2410的嵌入式系統串口全雙工通信軟件分層設計的實(shí)現,描述了單片機與PC機仝雙工串口通信的通信協(xié)議,以及存keil C51下的程序實(shí)現。應用征明.該方法可以極大地提高程序的封裝性和模塊化程度.增強了串口傳送數據時(shí)系統收發(fā)、處理數據的并發(fā)性和實(shí)時(shí)性.同時(shí)也提高了編程效率。該方法已成功應用于安防監控系統、I/O檢測模塊、安全模塊等系統.運行結果良好。對于其它基于串口通信的智能設備控制.具有參考意義。 作者:劉智國,張海春 來(lái)源:《微計算機信息》(嵌入式與SOC)2009年第4-2期 |