




已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
現(xiàn)場總線控制系統(tǒng),第3講 Neuron C 語言與I/O對象,信息學(xué)院自動化系 凌志浩,內(nèi)容簡介 1 Neuron C 簡介 2 Neuron C 編程及技巧 3 節(jié)點間通信 3.1 網(wǎng)絡(luò)變量 3.2 顯示報文 4 輸入輸出對象,1 Neuron C 簡介,Neuron芯片的應(yīng)用程序是用Neuron C編寫的 。 Neuron C是建立在ANSI C的基礎(chǔ)上的,與之相比有如下三方面擴展功能: (1)一種新的語句類型when,引入事件并定義任務(wù)事件的執(zhí)行順序。 (2)新增加了37種數(shù)據(jù)類型,34種輸入/輸出對象,2個定時器/計數(shù)器對象,大大簡化了設(shè)備控制器的用法。 (3)網(wǎng)絡(luò)變量的內(nèi)部消息傳送機制和其他消息處理機制 。 它是將程序樣例建立在事件上的。也即應(yīng)用程序是被發(fā)生在網(wǎng)絡(luò)當(dāng)中或指定設(shè)備上的事件所觸發(fā)的。因此網(wǎng)絡(luò)自己是被事件驅(qū)動的。,1.1 對ANSI C 的擴展包括,(1)一個內(nèi)部多任務(wù)調(diào)度程序,它允許程序員以自然的方式描述事件驅(qū)動的任務(wù),同時控制這些任務(wù)的優(yōu)先級的執(zhí)行。 (2)將I/O對象直接映射到處理器的I/O能力。 (3)網(wǎng)絡(luò)變量對象定義:提供一種簡單的實現(xiàn)節(jié)點之間數(shù)據(jù)共享的方法。 (4)when語句:引入事件并定義這些事件所對應(yīng)的任務(wù)。 (5)顯式消息傳遞( explicit message ):用于直接對LonTalk協(xié)議的底層進行訪問。 (6)秒及毫秒級軟件定時器對象。 (7)函數(shù)庫:當(dāng)調(diào)用時,可以執(zhí)行事件檢查、管理輸入/輸出、網(wǎng)上發(fā)送或接收消息以及控制Neuron芯片的各種功能。 (8)Neuron C中有三個ANSI包含文件:、 。,1.2 Neuron C 支持的變量的類型,(1) 整型(整型常數(shù)或整型變量) int 、short int、long int、unsinged int 、signed(可省略) int (2)字符型(字符型常數(shù)或字符型變量) unsigned char(8位)、 signed char (8位) (3) typedef enum FALSE、TRUE boolean (4)其他,1.3 Neuron C 變量定義,(1)Neuron C和ANSI C支持的變量定義如下 簡單的數(shù)據(jù)類型 int a,b,c ;char a; 數(shù)據(jù)類型 typedef unsigned long ULONG; 枚舉 enum hueRED,GREEN,BLUE 指針 char *p; 函數(shù) int f(int a, int b) 數(shù)組 int a4 結(jié)構(gòu)和共用體 struct char name10; int age; char addr10; ,(2)Neuron C中附加定義的對象,I/O對象: IO_0 output bit alarm 定時器: mtimer led_on_timer 網(wǎng)絡(luò)變量:network input int net_is_car 消息標(biāo)簽:msg_tag command,1.4 編譯指令,NEURON C允許通過#pragma編譯指令進行編譯器擴充。#pragma可用來設(shè)置一個Neuron 芯片的系統(tǒng)資源以及節(jié)點參數(shù),諸如緩存器數(shù)及其大小,接收事務(wù)數(shù)等。也可用于對特定的Neuron芯片參數(shù)進行控制,這些指令可在源文件的任何位置出現(xiàn)。 例:#pragma enable_io_pull_ups 可使IO4-IO7的上拉使能,2 Neuron C 編程及技巧,2.1 調(diào)度程序 Neuron 芯片的任務(wù)調(diào)度是由事件驅(qū)動的:當(dāng)一個給定的條件判斷為“真”時,與該事件有關(guān)的代碼被執(zhí)行(稱為任務(wù)被執(zhí)行)。調(diào)度程序允許定義任務(wù),該任務(wù)作為特定事件的結(jié)果而被運行,如:輸入管腳的改變、接收一個網(wǎng)絡(luò)變量的新值、或定時器溢出等。也可以指定某些任務(wù)是具有優(yōu)先級的任務(wù),以便能得到優(yōu)先服務(wù)。,(1) when語句,事件由when語句來定義,when語句包含一個表達式,當(dāng)表達式為真時,表達式后面的代碼段被執(zhí)行。 例:when(timer_expires(led_timer) /當(dāng)定時器溢出時執(zhí)行下列任務(wù) io_out(io_led,OFF); 在任務(wù)執(zhí)行后,時間溢出事件被清除。當(dāng)led_timer再次溢出,when子句判斷為真,任務(wù)又將執(zhí)行;否則,任務(wù)被忽略。,A. 多個when子句可與一個任務(wù)發(fā)生關(guān)聯(lián),when(reset) when(io_change(io_switch) when(!timer_expires) when(x= =3) . ,B. when子句不能嵌套,如下為錯誤: when(io_changes(io_switch) when(x= =3) ,()when子句語法,priority prompt_safe when(event) task priority(優(yōu)先級) :可選擇項 prompt_safe:可選項,如使用即便應(yīng)用程序處于占先模式,仍然允許調(diào)度程序執(zhí)行相關(guān)的when任務(wù) 。 event:可是預(yù)定的事件也可是有效的 Neuron C 表達式。 task:是Neuron 的復(fù)合語句,任務(wù)同void函數(shù)體等同,也即它不能返回一個值.,()when語句中的事件類型,分為兩種:預(yù)定義事件和用戶定義事件 預(yù)定義事件:使用編譯器內(nèi)部固有的關(guān)鍵字,包括輸入引腳狀態(tài)變化、網(wǎng)絡(luò)變量修改、定時器溢出以及消息的接收等。 用戶定義事件:可以是任何有效的Neuron C表達式。 例: when(msg_arrives) /正確 when(online) /正確 when(msg_arrives & flag = =TURE) /正確,()when語句的調(diào)度,調(diào)度程序?qū)σ唤Mwhen子句的判斷過程是一個循環(huán)往復(fù)的過程,每一個when語句都由調(diào)度程序檢測,如果為真,則與其相關(guān)聯(lián)的任務(wù)就被執(zhí)行。如果when語句為假(FALSE),調(diào)度程序?qū)⒗^續(xù)檢查后面的when語句,在檢查完最后一個when語句后,調(diào)度程序返回頂部重復(fù)執(zhí)行上述過程。 例如: (其中只有為真) when() A when() B when() C when() D ,()優(yōu)先級when子句,如when子句選用priority關(guān)鍵字,相比無優(yōu)先級的when子句,調(diào)度程序?qū)哂袃?yōu)先級的when子句的判斷次數(shù)要頻繁的多。優(yōu)先級when語句在每次調(diào)度程序運行時以指定的順序被檢查。如果任何優(yōu)先級when語句被檢測為真,則與它相對應(yīng)的任務(wù)就被執(zhí)行,然后調(diào)度程序又重新回到優(yōu)先級 when語句隊列頭,從頭開始檢測優(yōu)先級when語句。 使用優(yōu)先級when語句必須仔細考慮。因為優(yōu)先級when語句太多的話,將使無優(yōu)先級的when語句根本沒機會執(zhí)行。如果一個優(yōu)先級when語句在大部分時間里都為真,則它將獨占處理器時間。,()預(yù)定義事件關(guān)鍵字,flush_completes 、 offline 、 online 、 wink、io_changes、 io_in_ready、io_out_ready、reset、timer_expires、io_update_occurs、msg_arrives、msg_completes、nv_update_fails、nv_update_succeeds等等。 預(yù)定義事件還可以作為子表達式放置在if 、while 、for語句的控制表達式中,這種方法稱為直接事件處理。 例: mtimer t; when(event) if(timer_expires(t) io_out(io_led,OFF); ,2.2 定時器,Neuron 可以使用兩種類型的軟件定時器對象:毫秒定時器和秒定時器。 毫秒定時器提供一個計時范圍為164000毫秒的定時器。 秒定時器提供一個計時范圍為 165535秒的定時器。 它們和Neuron芯片上兩個硬件定時器計時器無關(guān),由網(wǎng)絡(luò)處理器實現(xiàn)(15個)。,() 定時器的定義,mtimer repeating timer-name= initial-value 毫秒定時器 stimer repeating timer-name=initial-value 秒定時器 repeating: 為可選項,如果定時器溢出,定時器將自動開始重新計時。使用該選項,即使應(yīng)用不能立即響應(yīng)該終止事件,精確的時間間隔也能夠被保留。 timer-name:為定時器指定的名字 init-value: 為可選項,指定當(dāng)加電或者復(fù)位時賦給定時器的值。如果不提供該初始值,定時器的值被置為0。,例,stimer led_timer; /定義秒定時器led_timer when(reset) led_timer=5; when(t = =50) led_timer=0; /關(guān)閉秒定時器 ,(2) 時間溢出事件,語法: timer_expires ( 定時器名) 定時器名:是可選項,由它來指定所要檢查的具體的定時器。如沒有該選項,該事件是一個未加限定的timer_expires事件。它與其它預(yù)定義事件不同的是,其它的某個掛起事件只為真一次,而對未加限定的timer_expires事件,只要任何一個定時器已經(jīng)終止,未加限定的timer_expires將一直保持為真。該事件只有當(dāng)檢測到特定的定時器終止事件時才能被清除 stimer led_timer; when(timer_expires(led_timer) io_out(io_led,OFF);,如果程序中有多個定時器,對每個具體的定時器都要作檢查,以便這個終止事件被清除。例如: mtimer x; mtimer y; mtimer z; when( timer_expires(x) when(timer_expires(y) when(timer_expires(z) ,另外也可采用如下的方法: when(timer_expires) if(timer_expires(x) else if(timer_expires(y) else if(timer_expires(z) ,2.3 輸入輸出,對未定義的I/O引腳也就是不用的引腳,默認為無效狀態(tài),即高阻狀態(tài)。如果引腳不用,應(yīng)設(shè)計上拉電阻,對IO4IO7可使用enable_io_pullups編譯指令,加上軟件實現(xiàn)的上拉電阻。為避免使用上拉電阻,可將不用的管腳定義為輸出管腳。為實現(xiàn)I/O,可使用內(nèi)嵌的I/O函數(shù):io_out( ) 、 io_in( )、 io_select( ) 、 io_select_dirction( ) 、 io_change_init( ) 、io_set_clock( ) 等。,(1)I/O對象的定義,說明一個I/O對象,完成了兩件事: 1在哪個或哪幾個管腳上將實現(xiàn)什么類型的I/O操作。 2 將I/O對象的名字和硬件連在一起。 語法: pin type option io-object-name ; pin :IO0IO10中的一個,同一個引腳可以出現(xiàn)在多個 I /O對象定義中 type:I/O對象類型 option:是可選的I/O參數(shù),不同I/O對象有不同的選項,(2)定義I/O對象的指導(dǎo)原則,(1) 最多定義16個I/O對象 (2) Neurowire、I2C、磁卡、磁跡1以及串行I/O對象是互斥的。在一個程序中可以說明一個或多個該組中的某一種I/O對象。 (3)定時器/計數(shù)器對象定義了的引腳不能再定義 為移位I/O對象。 (4)定時器/計數(shù)器1可以有多到4個的輸入對象供選擇(多路復(fù)用輸入對象)。 (5)并行和muxbus I/O對象要求使用所有的I/O管腳,任何一個這種類型的I/O對象被說明后,就不能再說明其它I/O對象類型。,(3)I/O對象的重疊使用,可能同一引腳要定義為多種I/O對象 例: IO_4 input nibble io_all_points; IO_4 input bit io_point_1; IO_5 input bit io_point_2; IO_6 input bit io_point_3; IO_7 input bit io_point_4; 允許一個程序在同一個操作中讀相鄰的4個引腳或分別讀每個引腳(比特I/O)。,(4) I/O函數(shù)及事件,輸入對象的訪問可以采用兩種方法: 1顯式的調(diào)用io_in( )函數(shù)。 2. 判斷與該對象有關(guān)的事件 輸出對象的訪問方法: 調(diào)用io_out( )函數(shù),內(nèi)嵌的I/O函數(shù),io_in ( ) return-value =io_in(io-object-name,args) /從I/O對象讀取數(shù)據(jù) io_out ( ) 當(dāng)信號要發(fā)送到某個設(shè)備時,使用 io_out (io-object-name,output-value,agrs) / 向一個I/O對象寫數(shù)據(jù),與I/O有關(guān)的事件,代替顯式調(diào)用io_in( )函數(shù)的方法 使用預(yù)定義事件: io_changes( ) io_update_occurs( ) 僅用于輸入對象,在檢測時,io_update_occurs和io_changes事件都隱含的執(zhí)行io_in( )函數(shù),該函數(shù)包括對象的輸入值。任務(wù)可以通過使用關(guān)鍵字input_value訪問這個輸入值。,1) io_changes事件,語法:io_changes(io-object-name)by|to expr 當(dāng)從I/O對象讀到的值改變時,該事件判斷為真。值的改變有三種類型: 改變?yōu)槟持付ǖ闹担?to ) 至少改變一指定的量(by 絕對值) 任意改變(無限制) 參考值是上次事件判斷為真時讀取的值,對于無限制的io_changes事件,如果當(dāng)前值與引用值不同時就意味著發(fā)生了一個狀態(tài)的改變.對于定時器/計數(shù)器輸入設(shè)備有一個新的值并且該值與以前的值不同時,io_changes事件才發(fā)生。,IO_0 input bit push_button; when(io_changes(push_button) to 0) IO_7 input pulsecount total_ticks; when(io_changes(total_ticks) by 100) ,例,對于定時器/計數(shù)器對象,io_changes事件發(fā)生于: 雙斜率輸入:轉(zhuǎn)換完成時事件發(fā)生 定期及周期輸入:如果測量時間與上次測量時間相比已發(fā)生改變時事件發(fā)生。 脈沖計數(shù)輸入:如果脈沖計數(shù)的值與上次計數(shù)相比已發(fā)生改變,則事件發(fā)生。,2) io_update_occurs事件,語法: io_update_occurs (io-object-name) 當(dāng)輸入對象(io-object-name)讀取的值發(fā)生改變時,io_update_occurs事件為真。該事件只能用在某些定時器/計數(shù)器的輸入對象中。對事件的定時依賴于輸入對象的類型 。,例如,雙斜率輸入:轉(zhuǎn)換完成且值發(fā)生變化時,該事件發(fā)生 定期及周期輸入:事件發(fā)生在定時度量結(jié)束時 脈沖計數(shù)輸入:每0.839秒事件發(fā)生一次,即當(dāng)一個新的脈沖計數(shù)值有效時。,3)input_value變量,long int類型,內(nèi)嵌變量,可象任何其他的C變量一樣使用. 例: when(io_changes(io_switch_in) nv_switch_state= (input_value= = SWITCH_ON)? ST_ON:ST_OFF ; 例中可以根據(jù) input_value的值設(shè)置網(wǎng)絡(luò)變量 nv_switch_state的值。 input_value 只有在io_changes和io_update_occurs事件發(fā)生后才有效。 有兩種方法可以幫助你確定輸入值是否為新值。,3 節(jié)點間通信,3.1 網(wǎng)絡(luò)變量 概述 (1)可定義為輸入或輸出 (2)基于Neuron節(jié)點定義62個,基于非Neuron節(jié)點可定義4096個 (3)實現(xiàn)節(jié)點間通信、數(shù)據(jù)共享 (4)由LonTalk協(xié)議實現(xiàn),被稱為隱式消息 (5)類型相同的網(wǎng)絡(luò)變量才能建立I/O連接 (6)不用考慮消息的打包、發(fā)送及接收,簡化編程,縮短開發(fā)周期。,3.1.1 網(wǎng)絡(luò)變量的說明,network input | output type identifier = initial-value; network input | output type identifier array-bound = initializer-list,input、output :輸出/輸入網(wǎng)絡(luò)變量 identifier:用戶定義的網(wǎng)絡(luò)變量名 初值:(initial-value)指定一個初值,說明,Type: 網(wǎng)絡(luò)變量的數(shù)據(jù)類型,(1)signedlong int (2) unsigned long int (3)signedshort int (4) unsigned short int (5)signed char (6) unsinged char (7)枚舉 (9)標(biāo)準(zhǔn)網(wǎng)絡(luò)變量(SNVT) (8)以上類型構(gòu)成的結(jié)構(gòu)體、數(shù)組(最多62個元素) SNVT: 是一組與數(shù)據(jù)的單位(如攝氏、伏、米等)相關(guān)聯(lián)的預(yù)定義網(wǎng)絡(luò)變量類型,同時SNVT 還定義了網(wǎng)絡(luò)變量值的范圍以及類型標(biāo)識號ID。目前,已定義了的標(biāo)準(zhǔn)網(wǎng)絡(luò)變量有255種。,例,network input SNVT_temp temp_set_point; network output SNVT_lev_disc primary_heater; network output int current_temp; network output boolean bind_info(priority) fire_aalarm; network output boolean bind_info priority(nonconfig) fire_aalarm;,3.1.2 網(wǎng)絡(luò)變量的連接,網(wǎng)絡(luò)變量的連接是獨立于節(jié)點上的Neuron C 應(yīng) 用的。網(wǎng)絡(luò)變量的連接由網(wǎng)絡(luò)管理工具中稱為連 接器(Binder)的部分來建立。Binder是LonBuilder網(wǎng)絡(luò)管理程序、LonMaker安裝工具或其它網(wǎng)絡(luò)管理工具的一部分。 連接器首先找共享共同網(wǎng)絡(luò)變量的所有節(jié)點。然 后對每個網(wǎng)絡(luò)變量,連接器給所有相應(yīng)的節(jié)點分配 地址,以保證信息從正確的地方來,到正確的地方 去。 is_bound( )函數(shù)用來確定網(wǎng)絡(luò)變量是否連接到 其它任何的網(wǎng)絡(luò)變量 。,3.1.3 網(wǎng)絡(luò)變量事件,有4個和網(wǎng)絡(luò)變量相關(guān)的預(yù)定義的事件: nv_update_completes (network-var) nv_update_fails (network-var) nv_update_occurs (network-var) 只用于輸入網(wǎng)絡(luò)變量 nv_update_succeeds (network-var) 其它三個事件,當(dāng)輸出網(wǎng)絡(luò)變量被更新時,用于輸出網(wǎng)絡(luò)變量,當(dāng)輸入網(wǎng)絡(luò)變量被輪循時,應(yīng)用于輸入網(wǎng)絡(luò)變量 。 network-var :可用網(wǎng)絡(luò)變量名、網(wǎng)絡(luò)變量數(shù)組名或網(wǎng)絡(luò)變量數(shù)組元素來限定 例如: network_varindex,如事件被一個數(shù)組名限定,事件將對每個數(shù)組元素發(fā)生一次 。, nv_update_occurs (network-var)事件,network-var:如果省略,事件對任何網(wǎng)絡(luò)變量更新都為 真。當(dāng)輸入網(wǎng)絡(luò)變量收到一個新值,nv_update_occurs事 件為真。 例 network input SNVT_temp tempSetPoint; when(nv_update_occurs(tempSetPoint) primaryHeader= (curTemptempSetPoint)?ST_ON:ST_OFF; , nv_update_completes (network-var)事件,network-var:可是網(wǎng)絡(luò)變量名、網(wǎng)絡(luò)變量數(shù)組名或網(wǎng)絡(luò)變量數(shù)組元素,也可沒有。 用于: (1)輸出網(wǎng)絡(luò)變量更新完成 (2)被輪循的輸入網(wǎng)絡(luò)變量操作完成 無論成功還是失敗,只要完成該事件都判斷為真。 例:network output int humidity; humidity=32; when(nv_update_completes(humidity) , nv_update_fails和nv_update_succeeds,nv_update_fails(network-var) 當(dāng)一個網(wǎng)絡(luò)變量更新或輪循失敗后,nv_update_fails事件為真。如果沒有為該事件指定相應(yīng)的網(wǎng)絡(luò)變量,那么該節(jié)點上任何網(wǎng)絡(luò)變量的更新或輪循失敗該事件都檢測為真。如果多個網(wǎng)絡(luò)變量被指定,則每一個網(wǎng)絡(luò)變量更新或輪循失敗都使該事件為真。 nv_update_succeeds(network-var) 同樣當(dāng)輸出網(wǎng)絡(luò)變量更新已被成功地發(fā)送或來自所有寫出節(jié)點的輪循都已被接收到,nv_update_succeeds事件為真。,三個節(jié)點網(wǎng)絡(luò)示意圖,開關(guān) 節(jié)點,nv_switch_state,nv_lamp_state,電燈 節(jié)點,電燈 節(jié)點,nv_lamp_state,一個輸出網(wǎng)絡(luò)變量控制兩個輸入網(wǎng)絡(luò)變量,開關(guān)節(jié)點,#pragma enable_io_pullups; #include network output SNVT_lev_disc nv_switch_state=ST_OFF; #define BUTTON_DOWN 1 #define BUTTON_UP 0 IO_4 input bit ioButton=BUTTON_UP; / I/O任務(wù) When(io_changes(ioButton)to BUTTON_DOWN) nv_switch_state=(nv_switch_state!=ST_OFF)? ST_OFF:ST_ON; ,電燈節(jié)點,network input SNVT_lev_disc nv_lamp_state=ST_OFF; #define LED_ON 1 #define LED_OFF 0 IO_0 output bit ioLED=LED_OFF; /修改任務(wù)-修改電燈的狀態(tài),用網(wǎng)絡(luò)變量的值作為電燈的新狀態(tài) when(nv_update_occurs(nv_lamp_state) io_out(ioLED,(nv_lamp_state!=ST_OFF)?LED_ON:LED_OFF); ,3.2 顯式報文 3.2.1 顯式報文與網(wǎng)絡(luò)變量的比較,(1)顯式報文有一個可變大小的數(shù)據(jù)域,一個給定的網(wǎng)絡(luò)變量 數(shù)據(jù)域的大小是一個常數(shù)。 (2)顯式報文提供了請求/響應(yīng)機制,使得在一個節(jié)點上的應(yīng)用 可以引起另一個節(jié)點的應(yīng)用來響應(yīng)它. (3)顯式報文使用的E2PROM表空間比網(wǎng)絡(luò)變量少,用的代碼空 間比網(wǎng)絡(luò)變量要多 . (4)顯式報文是從一個節(jié)點向另一個節(jié)點傳送信息的更復(fù)雜的 方法。程序員必須顯示地構(gòu)造、發(fā)送和接收顯示報文。而報文 的屬性例如服務(wù)類型、認證和優(yōu)先級是在編譯時定義的,在節(jié) 點安裝后是不能通過網(wǎng)絡(luò)管理工具配置的。,3.2.2 顯式報文,操作步驟 Neuron C 功能 (1) 構(gòu)造一個報文 msg_out對象 (2) 發(fā)送一個報文 msg_send() 函數(shù) msg_cancel() 函數(shù) (3) 接收一個報文 msg_arrives 事件 msg_receive函數(shù) msg_in 對象 (4) 發(fā)送報文后的確認服務(wù) msg_completes 事件 msg_succeeds 事件 msg_fails 事件,3.2.3 構(gòu)造一個報文,報文對象名字:msg_out 發(fā)送:使用msg_send( )函數(shù) 注意: 在同一時間,只有一個輸出報文(或響應(yīng))和一個輸入 報文(或響應(yīng))是可用的。程序不能同時建造兩個報文, 也不能同時發(fā)送它們。并且兩個輸入報文不能同時被分析。,(1)msg_out 對象定義,struct boolean priority_on; /優(yōu)先級消息TRUE,缺省為FALSE msg_tag tag; /報文標(biāo)簽該域是必須的 int code; /消息代碼,為數(shù)字報文碼,該域必須的 int dataMAXDATA; /報文包含的數(shù)據(jù)(缺省沒有), /該域是可選的 建議MAXDATA228 boolean authenticated; /報文是證實的為TRUE,缺省為FALSE service_type service; /服務(wù)類型(缺省為確認服務(wù)) msg_out_addr dest_addr; msg_out;,typedef enumACKD=0,UNACKD_RPT=1, UNACKD=2,REQUSET=3service_type; service:為下列服務(wù)之一 (1) ACKD(缺省值)-確認服務(wù) (2) UNACKD -非確認服務(wù) (3) UNACKD_RPT-非確認重發(fā)(報文發(fā)送多次) (4) REQUEST-請求/響應(yīng)服務(wù)。當(dāng)報文使用該服務(wù)被發(fā)送,則接收節(jié)點返回一個響應(yīng)給發(fā)送節(jié)點,發(fā)送節(jié)點處理這個響應(yīng)。 dest_addr:在msg_out對象中是一個可選域,如果用顯示地址發(fā)送報文,則應(yīng)用程序給該域賦值 。,(2)發(fā)送報文,void msg_send(void); /其用msg_out對象發(fā)送報文 例如: msg_tag motor; # define MOTOR_ON 0 # define ON_FULL 100 when (io_changes(switch1)to ON) / 給電動機發(fā)送一個報文 msg_out.tag = motor; msg_out.code = MOTOR_ON; /消息代碼是0 msg_out.data0 = ON_FULL; msg_send(); ,void msg_cancel(void) 該函數(shù)取消為msg_out對象構(gòu)造的報文并釋放分配給它 的緩沖區(qū),允許構(gòu)造另外的報文,它無參數(shù)、無返回值。 如果構(gòu)造了報文還沒有發(fā)送出去,在任務(wù)退出前報文被自 動取消。這個函數(shù)用來取消優(yōu)先級和非優(yōu)先級報文。 (3)接收一個報文 程序通常通過預(yù)定義事件when(msg_arrives)接收一個 報文。msg_receive( )函數(shù)也可用來接收一個消息。收到的 消息可在msg_in對象中得到。,取消發(fā)送,例,If(offline() /被請求脫機 msg_cancel(); else msg_send(); ,struct int code; / 報文碼 int len; / 報文數(shù)據(jù)的長度 int dataMAXDATA; / 報文數(shù)據(jù) boolean authenticated; / 如認證通過為真 service_type service; msg_in_addr addr; boolean duplicate; / 接收消息是一個重發(fā)的請求消息 unsigned rcvtx; /接收事務(wù) ID,在節(jié)點的事務(wù)數(shù)據(jù)庫中使用它。 msg_in;,msg_arrives 事件,msg_arrives(message-code)事件 message-code:是一個可選的整數(shù)報文代碼。如果省略這 個參數(shù),收到任何報文,事件都為真。當(dāng)報文到達時, msg_arrives事件為真。這個事件可以由報文的發(fā)送者指 定一個限定的報文碼。這時只有當(dāng)包含指定碼的報文到達 時,事件才為真。當(dāng)既使用非限定的msg_arrives事件又 使用限定的msg_arrives事件時,則必須指定 #pragma scheduler_reset編譯指令,以便在所有的限定 事件when語句之后處理非限定事件when語句 。,例 :#pragma scheduler_reset when (msg_arrives(1) io_out(sprinkler, ON); when (msg_arrives(2) io_out(sprinkler, OFF); when (msg_arrives) / 處理意料之外的消息 / 什么也不做,只是仍掉它 注意:使用msg_arrives事件接收消息的程序,應(yīng)該考慮到接收意料之外的消息。例如某個節(jié)點的服務(wù)引腳向所有節(jié)點發(fā)送,但只有網(wǎng)絡(luò)管理工具對該消息有興趣并處理該消息。否則未處理的消息永遠停留在隊列前面,造成阻塞。,boolean msg_receive (void) 函數(shù),msg_receive( )函數(shù)接收一個消息到msg_in對象,如果收到一 個新的報文,函數(shù)返回真,否則返回假。 (1)如果在報文隊列中沒有報文,該函數(shù)并不等待。 (2)如果在一個任務(wù)中收到多個報文,正如在旁路模式,它可能需要使用這個函數(shù)。 (3)如果收到的是已接收的消息,先接收的消息將被刪掉以釋放它所占的緩存空間。 (4)該函數(shù)不能用在一個when子句表達式中。 例: if(msg_receive() . msg_free(); ,開關(guān)、燈節(jié)點,開關(guān)程序,#define LAMP_ON 1 #define LAMP_OFF 2 #define OFF 0 #define ON 1 IO_4 input bit io_switch_in; msg_tag TAG_OUT; /聲明消息標(biāo)簽 when(reset) io_change_init(io_switch_in); when(io_changes(io_switch_in) msg_out.code=(input_value=ON)?LAMP_ON:LAMP_OFF; msg_out.tag=TAG_OUT; msg_send(); ,燈程序,#define LAMP_ON 1 #define LAMP_OFF 2 #define OFF 0 #define ON 1 IO_0 output bit io_lamp_control; when(msg_arrives) switch(msg_in.code) case LAMP_ON: io_out(io_lamp_control,ON ); break; case LAMP_OFF: io_out(io_lamp_control,OFF ); break; ,4.Neuron 芯片應(yīng)用I/O對象,4.1 Neuron芯片I/O對象類型 I/O對象簡單的講就是一個定義的輸入或輸出波形,也可看成是存放在ROM 中供用戶程序訪問的已編寫好的固件例程,如同Windows編程中的各種控件,可直接使用。用戶可通過io_out( )和io_in( )系統(tǒng)調(diào)用來訪問這些I/O對象,并在程序執(zhí)行期間完成輸入/輸出操作。,Neuron芯片通過11只引腳(IO0-IO10)與應(yīng)用指定的外部硬件相連,稱這11只引腳為應(yīng)用I/O。 這些引腳可以以最少的外接電路實現(xiàn)多種靈活的輸入輸出功能。其中IO4-IO7可通過編程使用芯片內(nèi)部的上拉電阻、IO0-IO3有高電流吸收能力、IO0IO7具有低電平檢測鎖存器。IO0-IO10有TTL電平輸入??梢远x一個或多個引腳作為I/O對象。Neuron芯片共有34種不同的I/O對象,分為以下四類:,應(yīng)用I/O,(1)直接I/O對象: 基于I/O管腳的邏輯電平,(2) 并行雙向I/O對象,并行I/O對象用于高速雙向輸入、輸出數(shù)據(jù),當(dāng)定義并行I/O對象時,必須定義用全部的I/O對象引腳。,(3) 串行I/O對象 用來實現(xiàn)在一個管腳上串行的數(shù)據(jù)傳輸,(4) 定時器/計數(shù)器 I/O 對象,4.2 I/O對象介紹 4.2.1 直接I/O對象,(1)比特I/O對象 (bit) 這種I/O對象類型用于讀或控制單個管腳的邏輯狀態(tài),IO0IO10都可分別配置成單個的比特輸入或輸出端口,0相當(dāng)于低電平而1相當(dāng)于高電平。輸入信號電平是TTL電平,比特輸入可從外接的邏輯電路例如觸點式表決器以及類似的電路中讀取與TTL電平兼容的邏輯信號。比特輸出信號電平是CMOS 電平,可驅(qū)動外接的與CMOS電平兼容的邏輯電路。如開關(guān)晶體管、燈等。也可驅(qū)動較高電流的外部設(shè)備如步進電機等。程序可動態(tài)的改變端口的輸入、輸出方向。IO0-IO3 具有較高的高電流(20mA)吸收能力,使得它們能直接驅(qū)動多個I/O設(shè)備。IO4IO7具有可編程上拉電阻。,比特對象定義,pin input bit o_object_name; pin output bit o_object_name(=initial_output_level); initial_output_level:初始狀態(tài),缺省為0 IO_1 input bit io_switch_1; unsigned int switch_on_off; . when(io_changes(io_swtich_1) switch_on_off=input_value; ,IO_2 output bit io_led; unsigned int led_on_off; when() Io_out(io_led,led_on_off); ,(2)電平檢測輸入對象(leveldetect),IO0IO7可分別配置為電平檢測輸入端口,用于檢測某一輸入端輸入的邏輯為“0”的電平。它能鎖存輸入引腳的負跳變,即使該負脈沖很窄,對于10Mhz的輸入時鐘每200ns輸入狀態(tài)在硬件上被鎖存一次(時間間隔與輸入時鐘速度成比例),可捕獲任何電平輸入。該事件由值代表,當(dāng)讀取時被清為零。只要輸入管腳電平停留在邏輯,每個io_in( )調(diào)用將返回值.用于俘獲短持續(xù)時間的事件。,對象定義,pininput leveldetect io-name; 例: IO_5 input leveldetect io_edge_trigger; when(io_changes(io_edge_trigger) to 1) /任務(wù)將在每次引腳IO_5變?yōu)殡娖綍r執(zhí)行 ,4.2.2 串行I/O對象 (1)同步串行I/O對象(Neurowire),Neurowire可實現(xiàn)與外部器件的同步全雙工串行數(shù)據(jù)格式的傳送,它可作為主控收發(fā)器(提供同步時鐘)或被控收發(fā)器(接收同步時鐘)。只要遵循SPI或National Semiconductors Microwire TM的接口器件,都可以作為Neurowire的外接器件。例如A/D、D/A以及顯示驅(qū)動器等。,1) 引腳配置如下:,主控方式 被控方式,語法:,IO_8 neurowire masterslaveselect(pin)timeout(pin) kbaud(const-expr)clockedge(+/-) io-name; (1)IO_8:必須指定IO_8,片選IO0-IO7。 (2)master:由IO8提供時鐘; slave:IO8為輸入管腳,最大輸入時鐘為18kbps,占空比為50/50,此時Neuron輸入時鐘為10MHz。速度與輸入時鐘成正比。 (3)select:為 master指定片選管腳(IO0IO7)。數(shù)據(jù)輸出前,片選為低電平,數(shù)據(jù)輸出后為高電平。 (4)timeout:為 slave 指定一個超時管腳(IO0IO7)每當(dāng)Neuron芯片等待時鐘的上升沿或下降沿時,將檢查該管腳的邏輯電平。如果檢測到邏輯電平1,則傳輸被終止。這樣就允許使用外部超時信號或內(nèi)部生成的超時信號來限制傳輸?shù)某掷m(xù)時間。 (5)kbaud為master指定比特率,const-expr的結(jié)果可以為1,10,或20。對于10Mhz的Neuron芯片輸入時鐘缺省為20kbps。不能用于 Slave。 (6)clockedge(+/-):時鐘信號的極性,缺省為上升沿 。,(2) RS232半雙工異步串行I/O對象(Serial),用于異步串行數(shù)據(jù)格式數(shù)據(jù)傳輸,實現(xiàn)半雙工的EIA-232(RS232)通信,傳輸格式為:1位始位,8位數(shù)據(jù)位,1位停止位。 輸入串行I/O對象將等待被接收的數(shù)據(jù)幀的真正的開始,直到已經(jīng)等待了接收20個字符所需要的時間結(jié)束,如果在這段時間內(nèi)沒有輸入發(fā)生則返回0。當(dāng)已收到全部的字節(jié)數(shù)或已超過接收20個字符所需要的時間但仍未接收到數(shù)據(jù)時,輸入終止。輸入串行I/O對象將在無效停止位或奇偶校驗位時停止接收數(shù)據(jù)。在波特率為2400bps,輸入超時為83ms。,串行輸入:必須為IO8 串行輸出:必須為IO10, 串行輸入模式只提供1位緩存和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信托產(chǎn)品設(shè)計及風(fēng)險評估考核試卷
- 玻璃纖維增強塑料在建筑模板的應(yīng)用考核試卷
- 物理流體力學(xué)與航空技術(shù)考核試卷
- 網(wǎng)紅甜品品牌全國加盟授權(quán)及統(tǒng)一原料供應(yīng)保障合同
- 智能家居系統(tǒng)技術(shù)支持與售后服務(wù)協(xié)議
- 高性能工業(yè)機器人示教器租賃與操作手冊定制合同
- 荷塘蓮藕種植與農(nóng)產(chǎn)品物流合作委托經(jīng)營管理合同
- 微信小程序金融理財功能定制開發(fā)及服務(wù)協(xié)議
- 電商平臺會員積分體系設(shè)計與會員權(quán)益保障服務(wù)協(xié)議
- 消防設(shè)備工程配套銷售與安全咨詢合同
- 醫(yī)師執(zhí)業(yè)變更注冊申請審核表
- 2023建筑施工承插型套扣式鋼管腳手架安全技術(shù)規(guī)程
- (完整版)各檔口單品菜品毛利率核算表
- 信息隱藏技術(shù)全套教學(xué)課件
- 常見顱腦急癥的CT、MRI診斷
- 2023年云南省昆明市中考作文真題解析及欣賞:堅持的力量
- 2023年江蘇泰州市第四人民醫(yī)院招考聘用高層次人才11人模擬備考試卷(共1000題含答案解析)
- 工會換屆選舉請示樣式
- 七年級音樂上冊 《青少年管弦樂隊指南》教學(xué)課件
- GB/T 22465-2008紅花籽油
- 巴菲特三大經(jīng)典演講之二-1998年佛羅里達大學(xué)商學(xué)院演講
評論
0/150
提交評論